NRF24l01<br />产品性能:<br />1) 2.4GHZ全球开放ISM频段免许可使用<br />2) 最高工作速率1Mbps,GFSK高效调制<br />3) 125个频道满足多点通讯和跳频通讯需求<br />4) 1.9-3.6V工作,低功耗,待机模式仅1uA.<br />5) 双通道数据接收,内置环行天线,体积仅17*34mm,通信距离在100m之内,软件编简单。<br />7) 内置硬件8/16位CRC校验,收发中断标志,每次可发28字节<br />备注:1。免费提供开发源代码<br /> 2。提供廉价开发套件<br /> 3。提供全面技术支持和即使方案<br /> 4。任何单片机都可实现对NRF系列模块的数据收发控制,<br /><br />#define uchar unsigned char<br />#define TX_ADR_WIDTH 5 // 5 bytes TX(RX) address width<br />#define TX_PLOAD_WIDTH 20 // 20 bytes TX payload<br /><br />uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address<br /><br />uchar rx_buf[TX_PLOAD_WIDTH]; //接收缓冲区<br />uchar tx_buf[TX_PLOAD_WIDTH]; //发送缓冲区<br /><br />uchar flag;<br />/**************************************************/<br /><br />//管脚定义<br />sbit CE = P1^0;<br />sbit CSN= P1^1;<br />sbit SCK= P1^2;<br />sbit MOSI= P1^3;<br />sbit MISO= P1^4;<br />sbit IRQ = P1^5;<br />/**************************************************/<br />uchar bdata sta;<br />sbit RX_DR =sta^6;<br />sbit TX_DS =sta^5;<br />sbit MAX_RT =sta^4;<br />/**************************************************/<br /><br />/**************************************************<br />Function: init_io();<br />Description:<br /> flash led one time,chip enable(ready to TX or RX Mode),<br /> Spi disable,Spi clock line init high<br />/**************************************************/<br />#define KEY 0xaa<br />void init_io(void)<br />{<br /> P0=KEY; // led light<br /> CE=0; // chip enable<br /> CSN=1; // Spi disable <br /> SCK=0; // Spi clock line init high<br /> P0=0xff; // led close<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: Inituart();<br /><br />Description:<br /> set uart working mode<br />/**************************************************/<br />void Inituart(void)<br />{<br /> TMOD = 0x20; //timer1 working mode 1<br /> TL1 = 0xfd; //f7=9600 for 16mhz Fosc,and ...<br /> TH1 = 0xfd; //...fd=19200 for 11.0592mhz Fosc<br /> SCON = 0xd8; //uart mode 3,ren==1<br /> PCON = 0x80; //smod=0<br /> TR1 = 1; //start timer1<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: init_int0();<br /><br />Description:<br /> enable int0 interrupt;<br />/**************************************************/<br />void init_int0(void)<br />{<br /> EA=1;<br /> EX0=1; // Enable int0 interrupt.<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: delay100();<br /><br />Description:<br /> delay 100ms<br />/**************************************************<br />void delay(uchar )<br />{<br /> uchar x;<br /> uchar y;<br /> for(x=0;x<100;x++)<br /> {<br /> for(y=0;y<100;y++)<br /> _nop_();<br /> }<br />}<br /><br />/**************************************************/<br />void delay_ms(unsigned int x)<br />{<br /> unsigned int i,j;<br /> i=0;<br /> for(i=0;i<x;i++)<br /> {<br /> j=108;<br /> ;<br /> while(j--);<br /> }<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: SPI_RW();<br /><br />Description:<br /> Writes one byte to nRF24L01, and return the byte read<br /> from nRF24L01 during write, according to SPI protocol<br />/**************************************************/<br />uchar SPI_RW(uchar byte)<br />{<br /> uchar bit_ctr;<br /> for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit<br /> {<br /> MOSI = (byte & 0x80); // output 'byte', MSB to MOSI<br /> byte = (byte << 1); // shift next bit into MSB..<br /> SCK = 1; // Set SCK high..<br /> byte |= MISO; // capture current MISO bit<br /> SCK = 0; // ..then set SCK low again<br /> }<br /> return(byte); // return read byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: SPI_RW_Reg();<br /><br />Description:<br /> Writes value 'value' to register 'reg'<br />/**************************************************/<br />uchar SPI_RW_Reg(BYTE reg, BYTE value)<br />{<br /> uchar status;<br /><br /> CSN = 0; // CSN low, init SPI transaction<br /> status = SPI_RW(reg); // select register<br /> SPI_RW(value); // ..and write value to it..<br /> CSN = 1; // CSN high again<br /><br /> return(status); // return nRF24L01 status byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: SPI_Read();<br /><br />Description:<br /> Read one byte from nRF24L01 register, 'reg'<br />/**************************************************/<br />BYTE SPI_Read(BYTE reg)<br />{<br /> BYTE reg_val;<br /><br /> CSN = 0; // CSN low, initialize SPI communication...<br /> SPI_RW(reg); // Select register to read from..<br /> reg_val = SPI_RW(0); // ..then read registervalue<br /> CSN = 1; // CSN high, terminate SPI communication<br /><br /> return(reg_val); // return register value<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: SPI_Read_Buf();<br /><br />Description:<br /> Reads 'bytes' #of bytes from register 'reg'<br /> Typically used to read RX payload, Rx/Tx address<br />/**************************************************/<br />uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)<br />{<br /> uchar status,byte_ctr;<br /><br /> CSN = 0; // Set CSN low, init SPI tranaction<br /> status = SPI_RW(reg); // Select register to write to and read status byte<br /><br /> for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)<br /> pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01<br /><br /> CSN = 1; // Set CSN high again<br /><br /> return(status); // return nRF24L01 status byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: SPI_Write_Buf();<br /><br />Description:<br /> Writes contents of buffer '*pBuf' to nRF24L01<br /> Typically used to write TX payload, Rx/Tx address<br />/**************************************************/<br />uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)<br />{<br /> uchar status,byte_ctr;<br /><br /> CSN = 0; // Set CSN low, init SPI tranaction<br /> status = SPI_RW(reg); // Select register to write to and read status byte<br /> for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)<br /> SPI_RW(*pBuf++);<br /> CSN = 1; // Set CSN high again<br /> return(status); // return nRF24L01 status byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: RX_Mode();<br /><br />Description:<br /> This function initializes one nRF24L01 device to<br /> RX Mode, set RX address, writes RX payload width,<br /> select RF channel, datarate & LNA HCURR.<br /> After init, CE is toggled high, which means that<br /> this device is now ready to receive a datapacket.<br />/**************************************************/<br />void RX_Mode(void)<br />{<br /> CE=0;<br /> SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device<br /><br /> SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0<br /> SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0<br /> SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40<br /> SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width<br /> SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR<br /> SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..<br /><br /> CE = 1; // Set CE pin high to enable RX device<br /><br /> // This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address<br /> // '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.<br /><br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: TX_Mode();<br /><br />Description:<br /> This function initializes one nRF24L01 device to<br /> TX mode, set TX address, set RX address for auto.ack,<br /> fill TX payload, select RF channel, datarate & TX pwr.<br /> PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.<br /><br /> ToDo: One high pulse(>10us) on CE will now send this<br /> packet and expext an acknowledgment from the RX device.<br />/**************************************************/<br />void TX_Mode(void)<br />{<br /> CE=0;<br /> <br /> SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01<br /> SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack<br /> SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload<br /><br /> SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0<br /> SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0<br /> SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...<br /> SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40<br /> SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR<br /> SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..<br /> CE=1;<br /><br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: check_ACK();<br /><br />Description:<br /> check if have "Data sent TX FIFO interrupt",if TX_DS=1,<br /> all led light and after delay 100ms all led close<br />/**************************************************<br />void check_ACK()<br />{<br /> uchar test;<br /> test=SPI_Read(READ_REG+STATUS); // read register STATUS's<br /> test=test&0x20; // check if have Data sent TX FIFO interrupt (TX_DS=1)<br /> if(test==0x20) // TX_DS =1<br /> {<br /> P0=0x00; // turn on all led<br /> delay100(); // delay 100ms<br /> P0=0xff;<br /> }<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: TxData();<br /><br />Description:<br /> write data x to SBUF<br />/**************************************************/<br />void TxData (uchar x)<br />{<br /> SBUF=x; // write data x to SBUF<br /> while(TI==0);<br /> TI=0;<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: CheckButtons();<br /><br />Description:<br /> check buttons ,if have press,read the key values,<br /> turn on led and transmit it; after transmition,<br /> if received ACK, clear TX_DS interrupt and enter RX Mode;<br /> turn off the led<br />/**************************************************/<br />void CheckButtons()<br />{<br /> uchar Temp,xx,Tempi;<br /><br /> P0=0xff;<br /> Temp=P0&KEY; //read key value from port P0<br /> if (Temp!=KEY)<br /> { <br /> delay_ms(10);<br /> Temp=P0&KEY; // read key value from port P0<br /> if (Temp!=KEY)<br /> {<br /> xx=Temp;<br /> Tempi=Temp>>1; // Left shift 4 bits<br /> P0=Tempi; // Turn On the led<br /> tx_buf[0]=Tempi; // Save to tx_buf[0]<br /> TX_Mode(); // set TX Mode and transmitting<br /> TxData(xx); // send data to uart<br /> //check_ACK(); // if have acknowledgment from RX device,turn on all led<br /> SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS)); // clear interrupt flag(TX_DS)<br /> delay_ms(500);<br /> P0=0xff; // Turn off the led <br /> RX_Mode(); // set receive mode<br /><br /> while((P0&KEY)!=KEY);<br /> }<br /> }<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: main();<br /><br />Description:<br /> control all subprogrammes;<br />/**************************************************/<br />void main(void)<br />{<br /> uchar xx;<br /> init_io(); // Initialize IO port<br /> Inituart(); // initialize 232 uart<br /> //init_int0(); // enable int0 interrupt<br /> RX_Mode(); // set RX mode<br /> while(1)<br /> {<br /> CheckButtons(); // scan key value and transmit<br /> sta=SPI_Read(STATUS); // read register STATUS's value<br /> if(RX_DR) // if receive data ready (RX_DR) interrupt<br /> {<br /> SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer<br /> flag=1;<br /> }<br /> if(MAX_RT)<br /> {<br /> SPI_RW_Reg(FLUSH_TX,0);<br /> }<br /> SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag<br /> if(flag) // finish received<br /> {<br /> flag=0; // set flag=0<br /> P0=rx_buf[0]; // turn on led<br /> delay_ms(500);<br /> P0=0xff; // turn off led<br /> xx=rx_buf[0]>>1;// right shift 4 bits<br /> TxData(xx); // send data to uart<br /> }<br /> }<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function: ISR_int0() interrupt 0;<br /><br />Description:<br /> if RX_DR=1 or TX_DS or MAX_RT=1,enter this subprogram;<br /> if RX_DR=1,read the payload from RX_FIFO and set flag;<br />/**************************************************/<br />void ISR_int0(void) interrupt 0<br />{<br /> sta=SPI_Read(STATUS); // read register STATUS's value<br /> if(RX_DR) // if receive data ready (RX_DR) interrupt<br /> {<br /> SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer<br /> flag=1;<br /> }<br /> if(MAX_RT)<br /> {<br /> SPI_RW_Reg(FLUSH_TX,0);<br /> }<br /> SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag<br />}<br />/**************************************************/<br /> <br /> 相关链接:<a href='http://auction1.taobao.com/auction/item_detail-0db2-ef522ffb8cf07027670369efebbdec65.jhtml'>http://auction1.taobao.com/auction/item_detail-0db2-ef522ffb8cf07027670369efebbdec65.jhtml</a> |
|