X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=6df045811068937ceffacd82136c5ae602630ff8;hp=bf68a58783d20eef379ddcd06535b8b5abe54c9a;hb=19c84b41b9fbde102aee56bc137a8a2885194ebf;hpb=2c299b308dca8a7667bacce7690fa6238492723f diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index bf68a58..6df0458 100644 --- a/firmware/apps/radios/ccspi.c +++ b/firmware/apps/radios/ccspi.c @@ -1,34 +1,64 @@ /*! \file ccspi.c \author Travis Goodspeed \brief Chipcon SPI Register Interface + + Unfortunately, there is very little similarity between the CC2420 + and the CC2500, to name just two of the myriad of Chipcon SPI + radios. Auto-detection will be a bit difficult, but more to the + point, all high level functionality must be moved into the client. */ //Higher level left to client application. #include "platform.h" #include "command.h" - -#include -#include -#include +#include //added for itoa #include "ccspi.h" #include "spi.h" +//! Handles a Chipcon SPI command. +void ccspi_handle_fn( uint8_t const app, + uint8_t const verb, + uint32_t const len); + +// define the ccspi app's app_t +app_t const ccspi_app = { + + /* app number */ + CCSPI, + + /* handle fn */ + ccspi_handle_fn, + + /* name */ + "CCSPI", -#define RADIOACTIVE SETCE -#define RADIOPASSIVE CLRCE + /* desc */ + "\tThe CCSPI app adds support for the Chipcon SPI register\n" + "\tinterface. Unfortunately, there is very little similarity\n" + "\tbetween the CC2420 and the CC2500, to name just two of the\n" + "\tmyriad of Chipcon SPI radios. Auto-detection will be a bit\n" + "\tdifficult, but more to the point, all high level functionality\n" + "\tmust be moved into the client.\n" +}; //! Set up the pins for CCSPI mode. void ccspisetup(){ - SETSS; - P5DIR&=~MISO; - P5DIR|=MOSI+SCK; + SPIDIR&=~MISO; + SPIDIR|=MOSI+SCK; DIRSS; DIRCE; - + + P4OUT|=BIT5; //activate CC2420 voltage regulator + msdelay(100); + + //Reset the CC2420. + P4OUT&=~BIT6; + P4OUT|=BIT6; + //Begin a new transaction. - CLRSS; + CLRSS; SETSS; } @@ -37,7 +67,7 @@ u8 ccspitrans8(u8 byte){ register unsigned int bit; //This function came from the CCSPI Wikipedia article. //Minor alterations. - + for (bit = 0; bit < 8; bit++) { /* write MOSI on trailing edge of previous clock */ if (byte & 0x80) @@ -45,79 +75,130 @@ u8 ccspitrans8(u8 byte){ else CLRMOSI; byte <<= 1; - + SETCLK; - + /* read MISO on trailing edge */ byte |= READMISO; CLRCLK; } - + return byte; } +//! Reflexively jam on the present channel. +void ccspireflexjam(u16 delay){ + unsigned long i; + #if defined(FIFOP) && defined(SFD) && defined(FIFO) && defined(PLED2DIR) && defined(PLED2PIN) && defined(PLED2OUT) + + prep_timer(); + debugstr("Reflex jamming until reset."); + debughex(delay); + txdata(CCSPI,CCSPI_REFLEX,1); //Let the client continue its business. + while(1) { + //Wait until a packet is received + while(!SFD){ + //Has there been an overflow in the RX buffer? + if((!FIFO)&&FIFOP){ + //debugstr("Clearing RX overflow"); + CLRSS; + ccspitrans8(0x08); //SFLUSHRX + SETSS; + } + } + //Turn on LED 2 (green) as signal + PLED2DIR |= PLED2PIN; + PLED2OUT &= ~PLED2PIN; + + + + //Wait a few us to send it. + delay_us(delay); + + //Transmit the packet. + CLRSS; + ccspitrans8(0x04); + SETSS; + + + //Load the next jamming packet. + //Note: attempts to preload this actually slowed the jam time down from 7 to 9 bytes. + CLRSS; + ccspitrans8(CCSPI_TXFIFO); + char pkt[5] = {0x05, 0, 0, 0, 0}; + //char pkt[15] = {0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0}; + //char pkt[12] = {0x0c, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef}; + for(i=0;i> 8) & 0xFF; + + for(i=0;i