From: travisutk Date: Tue, 15 Jun 2010 01:28:10 +0000 (+0000) Subject: Beginning Chipcon SPI support. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=c1c46f33e0a5c2f926c30cd66d0072cc03aa1434 Beginning Chipcon SPI support. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@629 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/firmware/apps/radios/cc.c b/firmware/apps/radios/cc.c new file mode 100644 index 0000000..e1cb9bb --- /dev/null +++ b/firmware/apps/radios/cc.c @@ -0,0 +1,158 @@ +/*! \file ccspi.c + \author Travis Goodspeed + \brief Chipcon SPI Register Interface +*/ + +//Higher level left to client application. + +#include "platform.h" +#include "command.h" + +#include +#include +#include + +#include "ccspi.h" +#include "spi.h" + + +#define RADIOACTIVE SETCE +#define RADIOPASSIVE CLRCE + +//! Set up the pins for CCSPI mode. +void ccspisetup(){ + SETSS; + P5DIR&=~MISO; + P5DIR|=MOSI+SCK; + DIRSS; + DIRCE; + + //Begin a new transaction. + CLRSS; + SETSS; +} + +//! Read and write an CCSPI byte. +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) + SETMOSI; + else + CLRMOSI; + byte <<= 1; + + SETCLK; + + /* read MISO on trailing edge */ + byte |= READMISO; + CLRCLK; + } + + return 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 +} + +//! Handles a Chipcon SPI command. +void ccspihandle(unsigned char app, + unsigned char verb, + unsigned long len){ + unsigned long i; + + //Drop CE to passify radio. + RADIOPASSIVE; + //Raise !SS to end transaction, just in case we forgot. + SETSS; + ccspisetup(); + + switch(verb){ + //PEEK and POKE might come later. + case READ: + case WRITE: + CLRSS; //Drop !SS to begin transaction. + for(i=0;i