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
20 //! Handles a Chipcon SPI command.
21 void ccspi_handle_fn( uint8_t const app,
25 // define the ccspi app's app_t
26 app_t const ccspi_app = {
38 "\tThe CCSPI app adds support for the Chipcon SPI register\n"
39 "\tinterface. Unfortunately, there is very little similarity\n"
40 "\tbetween the CC2420 and the CC2500, to name just two of the\n"
41 "\tmyriad of Chipcon SPI radios. Auto-detection will be a bit\n"
42 "\tdifficult, but more to the point, all high level functionality\n"
43 "\tmust be moved into the client.\n"
46 //! Set up the pins for CCSPI mode.
53 P4OUT|=BIT5; //activate CC2420 voltage regulator
60 //Begin a new transaction.
65 //! Read and write an CCSPI byte.
66 u8 ccspitrans8(u8 byte){
67 register unsigned int bit;
68 //This function came from the CCSPI Wikipedia article.
71 for (bit = 0; bit < 8; bit++) {
72 /* write MOSI on trailing edge of previous clock */
81 /* read MISO on trailing edge */
91 u8 ccspi_regwrite(u8 reg, const u8 *buf, int len){
102 u8 ccspi_regread(u8 reg, u8 *buf, int len){
105 reg=ccspitrans8(reg);
107 *buf++=ccspitrans8(0);
113 //! Handles a Chipcon SPI command.
114 void ccspi_handle_fn( uint8_t const app,
120 //debugstr("Chipcon SPI handler.");
124 cmddata[0]|=0x40; //Set the read bit.
129 CLRSS; //Drop !SS to begin transaction.
130 j=cmddata[0];//Backup address.
132 cmddata[i]=ccspitrans8(cmddata[i]);
133 SETSS; //Raise !SS to end transaction.
134 cmddata[0]=j&~0x40;//Restore address.
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
171 //Only should transmit length of one more than the reported
172 // length of the frame, which holds the length byte:
173 txdata(app,verb,cmddata[0]+1);
179 debugstr("Can't RX a packet with SFD and FIFOP definitions.");
186 ccspitrans8(CCSPI_SFLUSHRX);
193 #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
194 txdata(app,verb,1); //Just sending some response back to client
196 //Wait until a packet is received
198 //Turn on LED 2 (green) as signal
199 PLED2DIR |= PLED2PIN;
200 PLED2OUT &= ~PLED2PIN;
202 //Put radio in TX mode
207 //Load the jamming packet.
208 //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes.
210 ccspitrans8(CCSPI_TXFIFO);
211 char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
212 //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
213 for(i=0;i<pkt[0];i++)
217 //Transmit the packet.
219 ccspitrans8(0x04); //STXON
221 msdelay(100); //Instead of waiting for pulse on SFD
224 ccspitrans8(0x09); //SFLUSHTX
227 //Turn off LED 2 (green) as signal
228 PLED2DIR |= PLED2PIN;
229 PLED2OUT |= PLED2PIN;
231 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
234 debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
238 case CCSPI_REFLEX_AUTOACK:
239 #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT)
240 //txdata(app, verb, 1);
244 //Has there been an overflow in the RX buffer?
246 //debugstr("Clearing overflow");
248 ccspitrans8(0x08); //SFLUSHRX
252 //Wait until a packet is received
254 //Turn on LED 2 (green) as signal
255 PLED2DIR |= PLED2PIN;
256 PLED2OUT &= ~PLED2PIN;
258 //Put radio in TX mode
259 //Note: Not doing this slows down jamming, so can't jam short packets.
260 // However, if we do this, it seems to mess up our RXFIFO ability.
264 //Load the jamming packet
266 ccspitrans8(CCSPI_TXFIFO);
267 char pkt[7] = {0x07, 0x01, 0x08, 0xff, 0xff, 0xff, 0xff};
268 for(i=0;i<pkt[0];i++)
271 //Transmit the jamming packet
273 ccspitrans8(0x04); //STXON
275 msdelay(200); //Instead of examining SFD line status
278 ccspitrans8(0x09); //SFLUSHTX
281 //Get the orignally received packet, up to the seqnum field.
283 ccspitrans8(CCSPI_RXFIFO | 0x40);
285 cmddata[i]=ccspitrans8(0xde);
289 ccspitrans8(0x08); //SFLUSHRX
291 //Send the sequence number of the jammed packet back to the client
292 //itoa(cmddata[3], byte, 16);
294 //txdata(app,verb,cmddata[3]);
296 //TODO turn on AUTOCRC for it to apply to the TX???
297 // this may overcome issues of bad crc / length issues?
298 //mdmctrl0 (0x11) register set bit 5 to true.
300 //Create the forged ACK packet
301 cmddata[0] = 6; //length of ack frame plus length
302 cmddata[1] = 0x02; //first byte of FCF
303 cmddata[2] = 0x00; //second byte of FCF
304 //[3] is already filled with the sequence number
308 int q = (crc ^ c) & 15; //Do low-order 4 bits
309 crc = (crc / 16) ^ (q * 4225);
310 q = (crc ^ (c / 16)) & 15; //And high 4 bits
311 crc = (crc / 16) ^ (q * 4225);
313 cmddata[4] = crc & 0xFF;
314 cmddata[5] = (crc >> 8) & 0xFF;
316 for(i=0;i<cmddata[0];i++) {
317 itoa(cmddata[i], byte, 16);
320 //Load the forged ACK packet
322 ccspitrans8(CCSPI_TXFIFO);
323 for(i=0;i<cmddata[0];i++)
324 ccspitrans8(cmddata[i]);
326 //Transmit the forged ACK packet
329 ccspitrans8(0x04); //STXON
331 msdelay(200); //TODO try doing this based on SFD line status instead
334 ccspitrans8(0x09); //SFLUSHTX
337 //TODO disable AUTOCRC here again to go back to promiscous mode
339 //Turn off LED 2 (green) as signal
340 PLED2DIR |= PLED2PIN;
341 PLED2OUT |= PLED2PIN;
343 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
345 debugstr("Can't reflexively jam without SFD, FIFO, FIFOP, and P2LEDx definitions - try using telosb platform.");
353 ccspitrans8(CCSPI_SFLUSHTX);
361 //Wait for last packet to TX.
362 //while(ccspi_status()&BIT3);
366 ccspitrans8(0x09); //SFLUSHTX
372 ccspitrans8(CCSPI_TXFIFO);
373 for(i=0;i<cmddata[0];i++)
374 ccspitrans8(cmddata[i]);
377 //Transmit the packet.
379 ccspitrans8(0x04); //STXON
382 //Wait for the pulse on SFD, after which the packet has been sent.
388 debugstr("Can't TX a packet with SFD and FIFOP definitions.");
393 debugstr("Not yet supported in CCSPI");