X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=6d72a69c67d7978cdbb0682e8be695536dddb890;hp=e1cb9bb8cdf7bafee225f1a0439484dddaf25700;hb=0c3db8ce9f40190ec063347e21ed382d5486cb67;hpb=5e2476a1d3fe898f77f6bca399bbff63bb420a2d diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index e1cb9bb..6d72a69 100644 --- a/firmware/apps/radios/ccspi.c +++ b/firmware/apps/radios/ccspi.c @@ -1,34 +1,66 @@ /*! \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; FIXME Does the new code work on Z1 and Telosb? + P4OUT|=BIT6;*/ + CLRCE; + SETCE; + //Begin a new transaction. - CLRSS; + CLRSS; SETSS; } @@ -37,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) @@ -45,79 +77,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