Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #define UBLB(a,b) ( ( (a) << 8) | (b) )
00021 #define UBLB19(a,b) ( ( (a) << 16 ) | (b) )
00022
00023 class SPIComms
00024 {
00025 public:
00026 SPIComms()
00027 {
00028 pinMode(SPIDATAOUT, OUTPUT);
00029 pinMode(SPIDATAIN, INPUT);
00030 pinMode(SPICLOCK,OUTPUT);
00031 pinMode(SPISLAVESELECT,OUTPUT);
00032 digitalWrite(SPISLAVESELECT,HIGH);
00033 SPCR = B01010011;
00034 }
00035
00036 char Transfer(char data)
00037 {
00038 int timeout=0;
00039 SPDR = data;
00040 while (!(SPSR & (1<<SPIF)))
00041 {
00042 timeout++;
00043 if (timeout > 1000)
00044 {
00045 Errorln("SPI timeout");
00046 return(0);
00047 }
00048 };
00049 return SPDR;
00050 }
00051
00052 char Read(byte register_name)
00053 {
00054 char in_byte;
00055 register_name <<= 2;
00056 register_name &= B11111100;
00057
00058 digitalWrite(SCPSELECT,LOW);
00059 Transfer(register_name);
00060 in_byte = Transfer(0x00);
00061 digitalWrite(SCPSELECT,HIGH);
00062 return(in_byte);
00063 }
00064
00065
00066 unsigned int Read16(char register_name)
00067 {
00068 byte in_byte1;
00069 byte in_byte2;
00070 unsigned int in_word;
00071
00072 register_name <<= 2;
00073 register_name &= B11111100;
00074
00075 digitalWrite(SCPSELECT,LOW);
00076 Transfer(register_name);
00077 in_byte1 = Transfer(0x00);
00078 in_byte2 = Transfer(0x00);
00079 digitalWrite(SCPSELECT,HIGH);
00080 in_word = UBLB(in_byte1,in_byte2);
00081 return(in_word);
00082 }
00083
00084 void Write(char register_name, char register_value)
00085 {
00086 register_name <<= 2;
00087 register_name |= B00000010;
00088
00089 digitalWrite(SCPSELECT,LOW);
00090 Transfer(register_name);
00091 Transfer(register_value);
00092 digitalWrite(SCPSELECT,HIGH);
00093 }
00094 };
00095
00096 SPIComms SPI;
00097