📄 nrf2401_0.cpp
字号:
#include "NRF2401.h"#define TX 1//***************************************************#define TX_ADR_WIDTH 5 // 5 unsigned chars TX(RX) address width#define TX_PLOAD_WIDTH 20 // 20 unsigned chars TX payload#include "WProgram.h"void setup();void loop();void _ISR();unsigned char keyscan(void);void flash(unsigned char *key);void init_io(void);void delay_ms(volatile unsigned int m);unsigned char SPI_RW(unsigned char Byte);unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value);unsigned char SPI_Read(unsigned char reg);unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes);void RX_Mode(void);void TX_Mode(void);unsigned char TX_ADDRESS[TX_ADR_WIDTH] = { 0x34,0x43,0x10,0x10,0x01}; // Define a static TX addressunsigned char rx_buf[TX_PLOAD_WIDTH];unsigned char tx_buf[TX_PLOAD_WIDTH];unsigned char flag;//***************************************************void setup() { SPI_DIR = ( CE + SCK + CSN + MOSI); SPI_DIR &=~ ( IRQ + MISO); attachInterrupt(1, _ISR, FALLING); init_io();#if TX TX_Mode();#else RX_Mode();#endif }void loop() { unsigned char status=0; unsigned char key=0; for(;;) {#if TX //********************************************/ key=keyscan(); tx_buf[0]=key; status=SPI_Read(STATUS); if(status&MAX_RT) { SPI_RW_Reg(FLUSH_TX,0); } SPI_RW_Reg(WRITE_REG+STATUS,status);// clear RX_DR or TX_DS or MAX_RT interrupt flag SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //********************************************/#else //********************************************/ status=SPI_Read(STATUS); if(status&RX_DR) // if receive data ready (RX_DR) interrupt { SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer flag=1; } SPI_RW_Reg(WRITE_REG+STATUS,status);// clear RX_DR or TX_DS or MAX_RT interrupt flag if(flag) // finish received { flag=0; // set flag=0 delay_ms(1); } flash(rx_buf); //********************************************/#endif //********************************************** }}void _ISR(){}//==============================================unsigned char keyscan(void){ unsigned char KEY_LINE[]= { 0x08,0x10,0x20 }; unsigned char KEY_ROW[]= { 0x01,0x02,0x04 }; unsigned char i=0,f=0,key=0; KEY_DIR = (KEY_LINE[0]+KEY_LINE[1]+KEY_LINE[2]); KEY_DIR &=~ (KEY_ROW[0]+KEY_ROW[1]+KEY_ROW[2]); for(i=0;i<7;) { KEY_PORT=KEY_LINE[i]; for(f=1;f<4;f++) { if(KEY_IN&KEY_ROW[f-1]) { key=f+i; return (key); } } i+=3; } return(0);}//==============================================void flash(unsigned char *key){ LED_DIR=0xff; unsigned char LED_LINE[]= { 0x08,0x10,0x20 }; unsigned char LED_ROW[]= { 0x01,0x02,0x04 }; unsigned char i=0; unsigned char f=0; unsigned char flash=key[0]; if(flash) { LED_PORT=LED_LINE[0]; } else { LED_PORT=LED_LINE[1]; }}/************************************************** * Function: init_io(); * Description: * flash led one time,chip enable(ready to TX or RX Mode), * Spi disable,Spi clock line init high **************************************************/void init_io(void){ SPI_PORT&=~CE; // chip enable SPI_PORT|=CSN; // Spi disable SPI_PORT&=~SCK; // Spi clock line init high}/************************************************** **************************************************/void delay_ms(volatile unsigned int m) // 16MHz Xtal, close to ms value{ volatile unsigned int n=0; { for(;m>0;m--) { for(n=943;n>0;n--) { } } }}/**************************************************//************************************************** * Function: SPI_RW(); * * Description: * Writes one unsigned char to nRF24L01, and return the unsigned char read * from nRF24L01 during write, according to SPI protocol/**************************************************/unsigned char SPI_RW(unsigned char Byte){ unsigned char i; for(i=0;i<8;i++) // output 8-bit { if(Byte&0x80) { SPI_PORT |=MOSI; // output 'unsigned char', MSB to MOSI } else { SPI_PORT &=~MOSI; } SPI_PORT|=SCK; // Set SCK high.. Byte <<= 1; // shift next bit into MSB.. if(SPI_IN & MISO) { Byte |= 1; // capture current MISO bit } SPI_PORT&=~SCK; // ..then set SCK low again } return(Byte); // return read unsigned char}/**************************************************//************************************************** * Function: SPI_RW_Reg(); * * Description: * Writes value 'value' to register 'reg'/**************************************************/unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value){ unsigned char status; SPI_PORT&=~CSN; // CSN low, init SPI transaction status = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. SPI_PORT|=CSN; // CSN high again return(status); // return nRF24L01 status unsigned char}/**************************************************//************************************************** * Function: SPI_Read(); * * Description: * Read one unsigned char from nRF24L01 register, 'reg'/**************************************************/unsigned char SPI_Read(unsigned char reg){ unsigned char reg_val; SPI_PORT&=~CSN; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue SPI_PORT|=CSN; // CSN high, terminate SPI communication return(reg_val); // return register value}/**************************************************//************************************************** * Function: SPI_Read_Buf(); * * Description: * Reads 'unsigned chars' #of unsigned chars from register 'reg' * Typically used to read RX payload, Rx/Tx address/**************************************************/unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes){ unsigned char status,i; SPI_PORT&=~CSN; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status unsigned char for(i=0;i<bytes;i++) { pBuf[i] = SPI_RW(0); // Perform SPI_RW to read unsigned char from nRF24L01 } SPI_PORT|=CSN; // Set CSN high again return(status); // return nRF24L01 status unsigned char}/**************************************************//************************************************** * Function: SPI_Write_Buf(); * * Description: * Writes contents of buffer '*pBuf' to nRF24L01 * Typically used to write TX payload, Rx/Tx address/**************************************************/unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes){ unsigned char status,i; SPI_PORT&=~CSN; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status unsigned char for(i=0;i<bytes; i++) // then write all unsigned char in buffer(*pBuf) { SPI_RW(*pBuf++); } SPI_PORT|=CSN; // Set CSN high again return(status); // return nRF24L01 status unsigned char}/**************************************************//************************************************** * Function: RX_Mode(); * * Description: * This function initializes one nRF24L01 device to * RX Mode, set RX address, writes RX payload width, * select RF channel, datarate & LNA HCURR. * After init, CE is toggled high, which means that * this device is now ready to receive a datapacket./**************************************************/void RX_Mode(void){ SPI_PORT&=~CE; 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 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 unsigned chars) & Prim:RX. RX_DR enabled.. SPI_PORT|=CE; // Set CE pin high to enable RX device // This device is now ready to receive one packet of 16 unsigned chars payload from a TX device sending to address // '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.}/**************************************************//************************************************** * Function: TX_Mode(); * * Description: * This function initializes one nRF24L01 device to * TX mode, set TX address, set RX address for auto.ack, * fill TX payload, select RF channel, datarate & TX pwr. * PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. * * ToDo: One high pulse(>10us) on CE will now send this * packet and expext an acknowledgment from the RX device./**************************************************/void TX_Mode(void){ SPI_PORT&=~CE; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans... SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 unsigned chars) & Prim:TX. MAX_RT & TX_DS enabled.. SPI_PORT|=CE;}int main(void){ init(); setup(); for (;;) loop(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -