X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fradios%2Fccspi.c;h=a578c926338a01c5a26a79b8ff7758bef4084901;hp=dd86e8c154655d2b7b49852905c63ea94848f407;hb=f22686562a6c161be8a8c58bd83e46fa0c7ae1e8;hpb=e027df82b3f7b6c0ed428a504220e13ae02886e9 diff --git a/firmware/apps/radios/ccspi.c b/firmware/apps/radios/ccspi.c index dd86e8c..a578c92 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,10 +12,7 @@ #include "platform.h" #include "command.h" - -#include -#include -#include +#include //added for itoa #include "ccspi.h" #include "spi.h" @@ -52,14 +49,14 @@ void ccspisetup(){ 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; SETSS; @@ -70,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) @@ -78,14 +75,14 @@ u8 ccspitrans8(u8 byte){ else CLRMOSI; byte <<= 1; - + SETCLK; - + /* read MISO on trailing edge */ byte |= READMISO; CLRCLK; } - + return byte; } @@ -93,22 +90,22 @@ u8 ccspitrans8(u8 byte){ //! 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 +115,9 @@ void ccspi_handle_fn( uint8_t const app, uint8_t const verb, uint32_t const len){ unsigned long i; - + //debugstr("Chipcon SPI handler."); - + switch(verb){ case PEEK: cmddata[0]|=0x40; //Set the read bit. @@ -139,31 +136,260 @@ void ccspi_handle_fn( uint8_t const app, txdata(app,verb,0); break; case CCSPI_RX: - //Get the packet. - CLRSS; - ccspitrans8(CCSPI_RXFIFO); - for(i=0;i<32;i++) - cmddata[i]=ccspitrans8(0xde); - SETSS; - //no break - txdata(app,verb,32); +#ifdef FIFOP + //Has there been an overflow? + if((!FIFO)&&FIFOP){ + //debugstr("Clearing overflow"); + CLRSS; + ccspitrans8(0x08); //SFLUSHRX + SETSS; + } + + //Is there a packet? + if(FIFOP&&FIFO){ + //Wait for completion. + while(SFD); + + //Get the packet. + CLRSS; + ccspitrans8(CCSPI_RXFIFO | 0x40); + //ccspitrans8(0x3F|0x40); + cmddata[0]=0xff; //to be replaced with length + for(i=0;i> 8) & 0xFF; + + for(i=0;i