2 \author Travis Goodspeed
3 \brief Chipcon SPI Register Interface
5 Unfortunately, there is very little similarity between the CC2420
6 and the CC2500, to name just two of the myriad of Chipcon SPI
7 radios. Auto-detection will be a bit difficult, but more to the
8 point, all high level functionality must be moved into the client.
11 //Higher level left to client application.
15 #include <stdlib.h> //added for itoa
23 //! Handles a Chipcon SPI command.
24 void ccspi_handle_fn( uint8_t const app,
28 // define the ccspi app's app_t
29 app_t const ccspi_app = {
41 "\tThe CCSPI app adds support for the Chipcon SPI register\n"
42 "\tinterface. Unfortunately, there is very little similarity\n"
43 "\tbetween the CC2420 and the CC2500, to name just two of the\n"
44 "\tmyriad of Chipcon SPI radios. Auto-detection will be a bit\n"
45 "\tdifficult, but more to the point, all high level functionality\n"
46 "\tmust be moved into the client.\n"
49 //! Set up the pins for CCSPI mode.
56 P4OUT|=BIT5; //activate CC2420 voltage regulator
63 //Begin a new transaction.
68 //! Read and write an CCSPI byte.
69 u8 ccspitrans8(u8 byte){
70 register unsigned int bit;
71 //This function came from the CCSPI Wikipedia article.
74 for (bit = 0; bit < 8; bit++) {
75 /* write MOSI on trailing edge of previous clock */
84 /* read MISO on trailing edge */
94 u8 ccspi_regwrite(u8 reg, const u8 *buf, int len){
105 u8 ccspi_regread(u8 reg, u8 *buf, int len){
108 reg=ccspitrans8(reg);
110 *buf++=ccspitrans8(0);
116 //! Handles a Chipcon SPI command.
117 void ccspi_handle_fn( uint8_t const app,
122 //debugstr("Chipcon SPI handler.");
126 cmddata[0]|=0x40; //Set the read bit.
131 CLRSS; //Drop !SS to begin transaction.
133 cmddata[i]=ccspitrans8(cmddata[i]);
134 SETSS; //Raise !SS to end transaction.
135 txdata(app,verb,len);
143 //Has there been an overflow?
145 debugstr("Clearing overflow");
147 ccspitrans8(0x08); //SFLUSHRX
153 //Wait for completion.
158 ccspitrans8(CCSPI_RXFIFO | 0x40);
159 //ccspitrans8(0x3F|0x40);
160 cmddata[0]=0xff; //to be replaced with length
161 for(i=0;i<cmddata[0]+2;i++)
162 cmddata[i]=ccspitrans8(0xde);
167 ccspitrans8(0x08); //SFLUSHRX
169 //Only should transmit length of one more than the reported
170 // length of the frame, which holds the length byte:
171 txdata(app,verb,cmddata[0]+1);
177 debugstr("Can't RX a packet with SFD and FIFOP definitions.");
184 ccspitrans8(CCSPI_SFLUSHRX);
191 #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
192 txdata(app,verb,1); //Just sending some response back to client
194 //Wait until a packet is received
196 //Turn on LED 2 (green) as signal
197 PLED2DIR |= PLED2PIN;
198 PLED2OUT &= ~PLED2PIN;
200 //Put radio in TX mode
205 //Load the jamming packet.
206 //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes.
208 ccspitrans8(CCSPI_TXFIFO);
209 char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
210 //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
211 for(i=0;i<pkt[0];i++)
215 //Transmit the packet.
217 ccspitrans8(0x04); //STXON
219 msdelay(100); //Instead of waiting for pulse on SFD
222 ccspitrans8(0x09); //SFLUSHTX
225 //Turn off LED 2 (green) as signal
226 PLED2DIR |= PLED2PIN;
227 PLED2OUT |= PLED2PIN;
229 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
232 debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
236 case CCSPI_REFLEX_AUTOACK:
237 #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
238 //txdata(app, verb, 1);
242 //Has there been an overflow in the RX buffer?
244 //debugstr("Clearing overflow");
246 ccspitrans8(0x08); //SFLUSHRX
250 //Wait until a packet is received
252 //Turn on LED 2 (green) as signal
253 PLED2DIR |= PLED2PIN;
254 PLED2OUT &= ~PLED2PIN;
256 //Put radio in TX mode
257 //Note: Not doing this slows down jamming, so can't jam short packets.
258 // However, if we do this, it seems to mess up our RXFIFO ability.
262 //Load the jamming packet
264 ccspitrans8(CCSPI_TXFIFO);
265 char pkt[7] = {0x07, 0x01, 0x08, 0xff, 0xff, 0xff, 0xff};
266 for(i=0;i<pkt[0];i++)
269 //Transmit the jamming packet
271 ccspitrans8(0x04); //STXON
273 msdelay(200); //Instead of examining SFD line status
276 ccspitrans8(0x09); //SFLUSHTX
279 //Get the orignally received packet, up to the seqnum field.
281 ccspitrans8(CCSPI_RXFIFO | 0x40);
283 cmddata[i]=ccspitrans8(0xde);
287 ccspitrans8(0x08); //SFLUSHRX
289 //Send the sequence number of the jammed packet back to the client
290 //itoa(cmddata[3], byte, 16);
292 //txdata(app,verb,cmddata[3]);
294 //TODO turn on AUTOCRC for it to apply to the TX???
295 // this may overcome issues of bad crc / length issues?
296 //mdmctrl0 (0x11) register set bit 5 to true.
298 //Create the forged ACK packet
299 cmddata[0] = 6; //length of ack frame plus length
300 cmddata[1] = 0x02; //first byte of FCF
301 cmddata[2] = 0x00; //second byte of FCF
302 //[3] is already filled with the sequence number
306 int q = (crc ^ c) & 15; //Do low-order 4 bits
307 crc = (crc / 16) ^ (q * 4225);
308 q = (crc ^ (c / 16)) & 15; //And high 4 bits
309 crc = (crc / 16) ^ (q * 4225);
311 cmddata[4] = crc & 0xFF;
312 cmddata[5] = (crc >> 8) & 0xFF;
314 for(i=0;i<cmddata[0];i++) {
315 itoa(cmddata[i], byte, 16);
318 //Load the forged ACK packet
320 ccspitrans8(CCSPI_TXFIFO);
321 for(i=0;i<cmddata[0];i++)
322 ccspitrans8(cmddata[i]);
324 //Transmit the forged ACK packet
327 ccspitrans8(0x04); //STXON
329 msdelay(200); //TODO try doing this based on SFD line status instead
332 ccspitrans8(0x09); //SFLUSHTX
335 //TODO disable AUTOCRC here again to go back to promiscous mode
337 //Turn off LED 2 (green) as signal
338 PLED2DIR |= PLED2PIN;
339 PLED2OUT |= PLED2PIN;
341 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
343 debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
351 ccspitrans8(CCSPI_SFLUSHTX);
359 //Wait for last packet to TX.
360 //while(ccspi_status()&BIT3);
364 ccspitrans8(CCSPI_TXFIFO);
365 for(i=0;i<cmddata[0];i++)
366 ccspitrans8(cmddata[i]);
369 //Transmit the packet.
371 ccspitrans8(0x04); //STXON
374 //Wait for the pulse on SFD, after which the packet has been sent.
380 ccspitrans8(0x09); //SFLUSHTX
385 debugstr("Can't TX a packet with SFD and FIFOP definitions.");
390 debugstr("Not yet supported in CCSPI");