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 txdata(app,verb,1); //Just sending some response back to client
193 //Wait until a packet is received
195 //Turn on LED 2 (green) as signal
196 PLED2DIR |= PLED2PIN;
197 PLED2OUT &= ~PLED2PIN;
199 //Put radio in TX mode
204 //Load the jamming packet.
205 //TODO try to preload this to get faster effects
207 ccspitrans8(CCSPI_TXFIFO);
208 char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0};
209 //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
210 for(i=0;i<pkt[0];i++)
214 //Transmit the packet.
216 ccspitrans8(0x04); //STXON
218 msdelay(100); //Instead of waiting for pulse on SFD
221 ccspitrans8(0x09); //SFLUSHTX
224 //Turn off LED 2 (green) as signal
225 PLED2DIR |= PLED2PIN;
226 PLED2OUT |= PLED2PIN;
228 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
231 case CCSPI_REFLEX_SEQNUM:
234 //Has there been an overflow in the RX buffer?
235 //TODO do we really need to check this??
237 //debugstr("Clearing overflow");
239 ccspitrans8(0x08); //SFLUSHRX
243 //Wait until a packet is received
245 //Turn on LED 2 (green) as signal
246 PLED2DIR |= PLED2PIN;
247 PLED2OUT &= ~PLED2PIN;
249 //Get the orignally received packet, up to the seqnum field.
251 ccspitrans8(CCSPI_RXFIFO | 0x40);
253 cmddata[i]=ccspitrans8(0xde);
257 ccspitrans8(0x08); //SFLUSHRX
259 //Send the sequence number of the jammed packet back to the client
260 //itoa(cmddata[3], byte, 16);
262 txdata(app,verb,cmddata[3]);
264 //Put radio in TX mode
271 ccspitrans8(CCSPI_TXFIFO);
272 char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef};
273 for(i=0;i<pkt[0];i++)
277 //Transmit the packet.
279 ccspitrans8(0x04); //STXON
281 msdelay(200); //Instead of examining SFD line status
284 ccspitrans8(0x09); //SFLUSHTX
287 //Turn off LED 2 (green) as signal
288 PLED2DIR |= PLED2PIN;
289 PLED2OUT |= PLED2PIN;
291 //TODO the firmware stops staying in this mode after a while, and stops jamming... need to find a fix.
297 ccspitrans8(CCSPI_SFLUSHTX);
305 //Wait for last packet to TX.
306 //while(ccspi_status()&BIT3);
310 ccspitrans8(CCSPI_TXFIFO);
311 for(i=0;i<cmddata[0];i++)
312 ccspitrans8(cmddata[i]);
315 //Transmit the packet.
317 ccspitrans8(0x04); //STXON
320 //Wait for the pulse on SFD, after which the packet has been sent.
326 ccspitrans8(0x09); //SFLUSHTX
331 debugstr("Can't TX a packet with SFD and FIFOP definitions.");
336 debugstr("Not yet supported in CCSPI");