Bryan Edelman
/
nrfl2041
nrfl2041 NOT WORKING
Diff: main.cpp
- Revision:
- 0:da73b7c64384
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Oct 06 14:46:08 2010 +0000 @@ -0,0 +1,310 @@ +//Bryan Edelman +//edelmanb@colorado.edu +//2/24/2010 +#include "mbed.h" +#include "nRF24L01.h" +//spi comms with nrf24l01+ chip. ms bit first, LSbyte first! +//or with below to get correct code +//-------------------------------------------------------------------------------------- + +//---------------------------Settable Configurations--------------------------------------- +#define PAYLOAD_LENGTH 1 // Byte data packet length +#define CHANNEL 0x10 //Channel to transmit on +#define regCONFIG ( (1 << MASK_TX_DS) | (1<<EN_CRC) | (1<<CRCO) | (1<<MASK_MAX_RT) ) //defualt config +#define regRF_SETUP ( (0<<RF_DR_HIGH)|(3<<RF_PWR)) +#define ADDRESS_LENGTH 0x01 + +//------------------------------------------------------------------------------------------ +volatile int temp_byte1=0,temp_byte2=0,temp_byte3=0,temp_byte4=0,temp_byte5=0,temp_byte=0; //for reading spi results +SPI spi(p5, p6, p7); // mosi, miso, sclk +//RX Module +DigitalOut rx_cs(p29); +DigitalOut rx_ce(p30); +DigitalIn rx_irq(p28); +//TX Module +DigitalOut tx_cs(p23); +DigitalOut tx_ce(p24); +DigitalIn tx_irq(p22); + +DigitalOut led1(LED1); //debug led +Serial pc(USBTX, USBRX); // tx, rx + +bool PTX0 = 0; +bool PTX1 = 1; + +//*****************************Function Definitions********************** +void setup_rx(); +void setup_tx(); +void setup(); +uint8_t getStatusRX(); +uint8_t getStatusTX(); +bool dataReady(); //working +void configRegTX(uint8_t reg, uint8_t value); //working +void configRegRX(uint8_t reg, uint8_t value); //working +uint8_t readRegTX(uint8_t reg); //working +uint8_t readRegRX(uint8_t reg); //working +void sendData(uint8_t data_byte); +void transmitSync(uint8_t * dataout,uint8_t len); //not implemented yet +uint8_t getData(); +//************************************************************************ + +//****************************Funciton Implementations******************** +void setup() { + //setup pins, SPI format and speed.... + rx_ce =0; // rx chip enable low + rx_cs =1; // rx cs line high please + tx_ce = 0;// tx chip enable low + tx_cs =1; // tx cs line high please + spi.format(8,0); // 8 bits per write, mode 0 + spi.frequency(1000000); //1 megahurtz note: doesnt work lower + led1=0; + wait(.1); //startup time + /* pc.printf(" RX Registers \nConfig = %x \n",readRegRX(CONFIG)); + pc.printf("enaa = %x \n",readRegRX(EN_AA)); + */pc.printf("enrxadr = %x \n",readRegRX(EN_RXADDR)); + /*pc.printf("aw= %x \n",readRegRX(SETUP_AW)); + pc.printf("retr = %x \n",readRegRX(SETUP_RETR)); + pc.printf("rf ch = %x \n",readRegRX(RF_CH)); + pc.printf("rf setup = %x \n",readRegRX(RF_SETUP)); + pc.printf("rx pw 0 = %x \n",readRegRX(RX_PW_P0)); + pc.printf("rx pw 1 = %x \n\n",readRegRX(RX_PW_P1)); + + pc.printf(" TX Registers \nConfig = %x \n",readRegTX(CONFIG)); + pc.printf("enaa = %x \n",readRegTX(EN_AA)); + pc.printf("aw= %x \n",readRegTX(SETUP_AW)); + pc.printf("retr = %x \n",readRegTX(SETUP_RETR)); + pc.printf("rf ch = %x \n",readRegTX(RF_CH)); + pc.printf("rf setup = %x \n",readRegTX(RF_SETUP)); + pc.printf("tx addy = %x \n",readRegTX(TX_ADDR));*/ + +} +void setup_rx() { + uint8_t regConfig =0, regRfChan=0, regRfSetup=0, status=0; + + configRegRX(CONFIG,regCONFIG|(1<<PWR_UP)|(1<<PRIM_RX)); ///setup to receive, irq on recieve, CRC 2 byte, power up + configRegRX(RF_CH, CHANNEL); //set channel # + configRegRX(RF_SETUP,regRF_SETUP); //no continuos carrier, 250Kbps, 0dBm + + rx_cs =0; + spi.write(WRITE|RX_ADDR_P0); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + rx_cs =1; + + regConfig =readRegRX(CONFIG); + regRfChan =readRegRX(RF_CH); + regRfSetup =readRegRX(RF_SETUP); + + rx_cs =0; + spi.write(READ|RX_ADDR_P0); + temp_byte1=spi.write(NOP); + temp_byte2=spi.write(NOP); + temp_byte3=spi.write(NOP); + temp_byte4=spi.write(NOP); + temp_byte5=spi.write(NOP); + rx_cs =1; + + rx_cs =0; + spi.write(FLUSH_RX); + rx_cs =1; + + status=getStatusRX(); + configRegRX(STATUS, status|(1 << TX_DS) | (1 << MAX_RT)); + status=getStatusRX(); + + pc.printf("RX Config Register = %x \n RX Channel # = %x \n RX RF Setup Reg = %x \n RX Status Reg = %x \n ", regConfig, regRfChan, regRfSetup, status); + pc.printf("RX address = %x%x%x%x%x \n", temp_byte5,temp_byte4,temp_byte3,temp_byte2,temp_byte1); + rx_ce=1; //set to recieve mode + return; +} + +void setup_tx() { + uint8_t regConfig =0, regRfChan=0, regRfSetup=0, status=0; + + configRegTX(CONFIG,regCONFIG|(1<<PWR_UP)|(0<<PRIM_RX)); + configRegTX(RF_CH,CHANNEL); + configRegTX(RF_SETUP,regRF_SETUP); + + regConfig =readRegTX(CONFIG); + regRfChan =readRegTX(RF_CH); + regRfSetup =readRegTX(RF_SETUP); + + tx_cs =0; + spi.write(WRITE|TX_ADDR); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + spi.write(0x51); + tx_cs =1; + + tx_cs =0; + spi.write(READ|TX_ADDR); + temp_byte1=spi.write(NOP); + temp_byte2=spi.write(NOP); + temp_byte3=spi.write(NOP); + temp_byte4=spi.write(NOP); + temp_byte5=spi.write(NOP); + tx_cs =1; + + status=getStatusTX(); + configRegTX(STATUS, status|(1 << TX_DS) | (1 << MAX_RT)); + + tx_cs =0; + spi.write(FLUSH_TX); + tx_cs =1; + + status=getStatusTX(); + + pc.printf("TX Config Register = %x \n TX Channel # = %x \n TX RF Setup Reg = %x \n TX Status Reg = %x \n ", regConfig, regRfChan, regRfSetup, status); + pc.printf("TX address = %x%x%x%x%x \n", temp_byte5,temp_byte4,temp_byte3,temp_byte2,temp_byte1); + + tx_ce=0; + return; +} + +uint8_t getStatusTX() { + uint8_t status=0; + tx_cs = 0; + spi.write(READ|STATUS); + status =spi.write(NOP); + tx_cs =1; + return status; +} +uint8_t getStatusRX() { + uint8_t status=0; + rx_cs = 0; + spi.write(READ|STATUS); + status =spi.write(NOP); + rx_cs =1; + return status; +} +bool dataReady() { + uint8_t status = getStatusRX(); + return (status & (1 << RX_DR)); +} +void configRegTX(uint8_t reg, uint8_t value) { + tx_cs=0; + spi.write(WRITE|reg); + spi.write(WRITE|value); + tx_cs=1; +} +void configRegRX(uint8_t reg, uint8_t value) { + rx_cs=0; + spi.write(WRITE|reg); + spi.write(WRITE|value); + rx_cs=1; +} +void sendData(uint8_t data) { + uint8_t status; + status = getStatusTX(); + PTX1=1; + while (PTX1) { + status = getStatusTX(); + + if ((status & ((1 << TX_DS) | (1 << MAX_RT)))) { + PTX1 = 0; + break; + } + tx_ce=0; + + PTX1 = 1; + configRegTX(CONFIG, regCONFIG | ( (1<<PWR_UP) | (0<<PRIM_RX) ) ); // Set to transmitter mode , Power up + + tx_cs = 0; // Pull down chip select + spi.write( FLUSH_TX ); // Write cmd to flush tx fifo + tx_cs = 1; // Pull up chip select + + //pc.printf("TX status before = %x \n", getStatusTX()); + //pc.printf("data to be sent = %x \n", data); + tx_cs = 0; // Pull down chip select + spi.write(W_TX_PAYLOAD); // Write cmd to write payload + spi.write(data); // Write payload + tx_cs = 1; // Pull up chip select + // pc.printf("TX FIFO status = %x \n", readRegTX(FIFO_STATUS));// + tx_ce=1; // Start transmission + wait(.005); //50uS delay + tx_ce=0; + // wait(1);// + // pc.printf("TX FIFO status = %x \n", readRegTX(FIFO_STATUS));// + // pc.printf("TX status after = %x \n", getStatusTX()); + configRegTX(STATUS,getStatusTX()|(1 << TX_DS) | (1 << MAX_RT)); //clear sent bit + return; + } +} +void transmitSync(uint8_t * dataout,uint8_t len) { //later.... + uint8_t i; //test me! + pc.printf("length = %i \n", len); + for (i = 0;i < len;i++) { + spi.write(dataout[i]); + + } + pc.printf("i = %i \n",i); + return; +} +uint8_t getData() +// Reads payload bytes into data array +{ + uint8_t data_byte=0; + rx_cs = 0; // Pull down chip select + spi.write(R_RX_PAYLOAD); // Send cmd to read rx payload + data_byte=spi.write(NOP); // Read payload + rx_cs = 1; // Pull up chip select + configRegTX(STATUS,(1<<RX_DR)); // Reset status register + return data_byte; +} +uint8_t readRegTX(uint8_t reg) +{ + uint8_t reg_value=0; + tx_cs = 0; + spi.write(READ|reg); + reg_value=spi.write(NOP); + tx_cs = 1; + return reg_value; +} +uint8_t readRegRX(uint8_t reg) +{ + uint8_t reg_value=0; + rx_cs = 0; + spi.write(READ|reg); + reg_value = spi.write(NOP); + rx_cs = 1; + return reg_value; +} +//************************************************************************ +int main() { + uint8_t data_to_send =0x55; + setup(); + setup_rx(); + setup_tx(); + wait(.1); + pc.printf("Setup Complete \n"); + + configRegRX(RX_PW_P0,PAYLOAD_LENGTH); + configRegRX(RX_PW_P1,PAYLOAD_LENGTH); + //address widths + configRegTX(SETUP_AW,0x03); + configRegRX(SETUP_AW,0x03); + + configRegTX(SETUP_RETR,0<<ARC); + configRegRX(ENAA_P0,0x00); //Disable all AA + configRegRX(EN_RXADDR, 0x3F); //ENable only pipe 0 + + + //send some data + //pc.printf("data sent \n\n"); + configRegTX(RF_CH,0x00); + uint8_t i =0; + while (!dataReady()) { + pc.printf("FIFO status = %x \n i = %i \n", readRegRX(FIFO_STATUS), i); + wait(.01); + sendData(data_to_send); + ++i; + configRegTX(RF_CH,i); + } + led1=1; + pc.printf("This is data recieved: %x \n", getData()); +}