X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=a124b536cea22c4358dc1f2bd1fd63d88548da25;hp=cc44d4b5513789699310f13b15fe44ab5b39fedb;hb=4b4d432fa54e8130f216f97d1a976795f3c446a4;hpb=ba0e5551e39ee0d35f21cf42dfc8d645dfe63b79 diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index cc44d4b..a124b53 100644 --- a/firmware/apps/radios/ccspi.c +++ b/firmware/apps/radios/ccspi.c @@ -1,7 +1,7 @@ /*! \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 @@ -12,18 +12,15 @@ #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); + uint8_t const verb, + uint32_t const len); // define the ccspi app's app_t app_t const ccspi_app = { @@ -52,14 +49,16 @@ void ccspisetup(){ SPIDIR|=MOSI+SCK; DIRSS; DIRCE; - - P4OUT|=BIT5; //activate CC2420 voltage regulator + + //P4OUT|=BIT5; //activate CC2420 voltage regulator msdelay(100); - + //Reset the CC2420. - P4OUT&=~BIT6; - P4OUT|=BIT6; - + /*P4OUT&=~BIT6; FIXME Does the new code work on Z1 and Telosb? + P4OUT|=BIT6;*/ + CLRCE; + SETCE; + //Begin a new transaction. CLRSS; SETSS; @@ -70,7 +69,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) @@ -78,37 +77,140 @@ 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>1)&0xC0) // MSBits are high bits of 9-bit address. + // Read/!Write bit should be clear to write. + ); + + //Data goes here. + while(len--) + ccspitrans8(*data++); + + SETSS; +} + +//! Read bytes from the CC2420's RAM. Untested. +void ccspi_peekram(u16 addr, u8 *data, u16 len){ + CLRSS; + + //Begin with the start address. + ccspitrans8(0x80 | (addr & 0x7F)); + ccspitrans8(((addr>>1)&0xC0) // MSBits are high bits of 9-bit address. + | BIT5 // Read/!Write bit should be set to read. + ); + + //Data goes here. + while(len--) + *data++=ccspitrans8(0); + + SETSS; +} + +//! Updates the Nonce's sequence number. +void ccspi_updaterxnonce(u32 seq){ + +} + //! Writes a register u8 ccspi_regwrite(u8 reg, const u8 *buf, int len){ CLRSS; - + reg=ccspitrans8(reg); while(len--) ccspitrans8(*buf++); - + SETSS; return reg;//status } //! Reads a register u8 ccspi_regread(u8 reg, u8 *buf, int len){ CLRSS; - + reg=ccspitrans8(reg); while(len--) *buf++=ccspitrans8(0); - + SETSS; return reg;//status } @@ -118,9 +220,10 @@ void ccspi_handle_fn( uint8_t const app, uint8_t const verb, uint32_t const len){ unsigned long i; - + u8 j; + //debugstr("Chipcon SPI handler."); - + switch(verb){ case PEEK: cmddata[0]|=0x40; //Set the read bit. @@ -129,59 +232,327 @@ void ccspi_handle_fn( uint8_t const app, case WRITE: case POKE: CLRSS; //Drop !SS to begin transaction. + j=cmddata[0];//Backup address. for(i=0;i> 8) & 0xFF; + + for(i=0;i