X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Fspi%2Fspi.c;h=cba47969b6ffc924e301694a479373082c65e036;hp=3da313539d8a9059a93f7d32d8454d0586b7c005;hb=c16ef9294fa7c938283a44a9a1d268fd88cd4ea8;hpb=ba4e9392ba615ed84d47576fe973057f89bb8998;ds=sidebyside diff --git a/firmware/apps/spi/spi.c b/firmware/apps/spi/spi.c index 3da3135..cba4796 100644 --- a/firmware/apps/spi/spi.c +++ b/firmware/apps/spi/spi.c @@ -17,8 +17,7 @@ //This could be more accurate. //Does it ever need to be? #define SPISPEED 0 -#define SPIDELAY(x) -//delay(x) +#define SPIDELAY(x) delay(x) //! Set up the pins for SPI mode. @@ -26,10 +25,13 @@ void spisetup(){ SETSS; P5DIR|=MOSI+SCK+BIT0; //BIT0 might be SS P5DIR&=~MISO; + DIRSS; //Begin a new transaction. + CLRSS; SETSS; + } @@ -46,14 +48,15 @@ unsigned char spitrans8(unsigned char byte){ else CLRMOSI; byte <<= 1; - + + //SPIDELAY(100); SETCLK; + //SPIDELAY(100); /* read MISO on trailing edge */ byte |= READMISO; CLRCLK; } - return byte; } @@ -219,15 +222,90 @@ void spiflash_erasesector(unsigned long adr){ } +//! Wake an EM260 Radio +void em260_wake(){ + //debugstr("Waking EM260."); + #define RST BIT6 + P2DIR|=RST; + SETRST; + delay(1024); + + CLRRST;//Wake chip. + while(P4IN&1); + SETRST;//Woken. + //debugstr("EM260 is now awake."); + delay(1024); //DO NOT REMOVE, fails without. +} +//! Handle an EM260 exchange. +void spi_rw_em260(u8 app, u8 verb, u32 len){ + unsigned long i; + u8 lastin; + + P4DIR=0; //TODO ASAP remove P4 references. + P4OUT=0xFF; + P4REN=0xFF; + + //See GoodFETEM260.py for details. + //The EM260 requires that the host wait for the client. + + /* + if((~P4IN)&1) + debugstr("Detected HOST_INT."); + */ + + em260_wake(); + + em260woken: + + SETMOSI; //Autodetected SPI mode. + CLRSS; //Drop !SS to begin transaction. + //Host to slave. Ignore data. + for(i=0;i