Bryan Edelman
/
nrfl2041
nrfl2041 NOT WORKING
main.cpp
- Committer:
- pillsburydoughboy
- Date:
- 2010-10-06
- Revision:
- 0:da73b7c64384
File content as of revision 0:da73b7c64384:
//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()); }