nrf24l01.c
#include "NRF24L01.h"
#include "delay.h"
unsigned char sta; //״̬±êÖ¾
unsigned char TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //±¾µØµØÖ·
unsigned char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ·
unsigned char Tx_Buf[TX_PLOAD_WIDTH]= {0x00}; //·¢ËÍÊý¾Ý
unsigned char Rx_Buf[RX_PLOAD_WIDTH]= {0x00}; //½ÓÊÕÊý¾Ý
void NrfInit(void)
{
ROM_SysCtlPeripheralEnable(Nrf24l01Per1);
// ROM_SysCtlPeripheralEnable(Nrf24l01Per2);
ROM_SysCtlPeripheralEnable(Nrf24l01Per3);
/***************************ÊäÈëÅäÖÃ******************************/
ROM_GPIODirModeSet(Nrf24l01PORT1,Nrf24l01MISO,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(Nrf24l01PORT1, Nrf24l01MISO, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
/***************************Êä³öÅäÖÃ******************************/
ROM_GPIODirModeSet(Nrf24l01PORT1, Nrf24l01SCK|Nrf24l01SS|Nrf24l01MOSI, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet (Nrf24l01PORT1, Nrf24l01SCK|Nrf24l01SS|Nrf24l01MOSI, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
ROM_GPIODirModeSet(Nrf24l01PORT3, Nrf24l01CE, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet (Nrf24l01PORT3, Nrf24l01CE, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
Hign_24L01_CSN;
Low_24L01_CE;
Low_24L01_SCK;
delayms(250);
}
/************************************IO ¿ÚÄ£ÄâSPI×ÜÏß ´úÂë************************************************/
unsigned char SPI_RW(unsigned char byte)
{
unsigned char bit_ctr;
for(bit_ctr=0; bit_ctr<8; bit_ctr++)
{
// MOSI=(byte&0x80);
if(byte&0x80)
{
Hign_24L01_MOSI;
}
else
{
Low_24L01_MOSI;
}
//delayus(10);
byte=(byte<<1);
Hign_24L01_SCK; //ÉÏÉýÑØ
//delayus(10);
if(Read_24L01_MISO) //MISO
byte+=1; //ͬʱÓÃÒ»¸ö±äÁ¿À´Íê³ÉÊպͷ¢¡£
Low_24L01_SCK; //ϽµÑØ
//delayus(10);
}
return(byte); //·µ»ØÊÕµ½µÄÊý¾Ý
}
unsigned char SPI_RW_Reg (unsigned char reg,unsigned char value) // Ïò¼Ä´æÆ÷REGдһ¸ö×Ö½Ú£¬Í¬Ê±·µ»Ø״̬×Ö½Ú
{
unsigned char status;
// CSN=0;
Low_24L01_CSN;
status=SPI_RW(reg);
SPI_RW(value);
// CSN=1;
Hign_24L01_CSN;
return(status);
}
unsigned char SPI_Read (unsigned char reg )
{
unsigned char reg_val;
//CSN=0;
Low_24L01_CSN;
SPI_RW(reg);
reg_val=SPI_RW(0);
//CSN=1;
Hign_24L01_CSN;
return(reg_val);
}
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
unsigned char status,byte_ctr;
//CSN = 0; // Set CSN low, init SPI tranaction
Low_24L01_CSN;
status = SPI_RW(reg); // Select register to write to and read status byte
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
SPI_RW(*pBuf++);
//CSN = 1;
Hign_24L01_CSN; // Set CSN high again
return(status); // return nRF24L01 status byte
}
/*******************************½Ó*****ÊÕ*****Ä£*****ʽ*****´ú*****Âë*************************************/
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars)
{
unsigned char status,uchar_ctr;
//CSN = 0; // Set CSN low, init SPI tranaction
Low_24L01_CSN;
status = SPI_RW(reg); // Select register to write to and read status unsigned char
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //
//CSN = 1;
Hign_24L01_CSN;
return(status); // return nRF24L01 status uchar
}
/******************************************************************************************************/
//º¯Êý£ºunsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//¹¦ÄÜ£ºÊý¾Ý¶ÁÈ¡ºó·ÅÈçrx_buf½ÓÊÕ»º³åÇøÖÐ
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // ¶Áȡ״̬¼Ä´æÆäÀ´ÅжÏÊý¾Ý½ÓÊÕ×´¿ö
if(RX_DR) // ÅжÏÊÇ·ñ½ÓÊÕµ½Êý¾Ý
{
//CE = 0; //SPIʹÄÜ
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //¶ÁÈ¡Êý¾ÝÍê³É±êÖ¾
//delay(100);
}
SPI_RW_Reg(NRF24L01WRITE_REG+STATUS,sta); //½ÓÊÕµ½Êý¾ÝºóRX_DR,TX_DS,MAX_PT¶¼ÖøßΪ1£¬Í¨¹ýд1À´Çå³þÖжϱêÖ¾
return revale;
}
void TX_Mode(void)
{
//CE=0;
Low_24L01_CE;
SPI_RW_Reg(FLUSH_TX,0x00);
SPI_Write_Buf(NRF24L01WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_RW_Reg(NRF24L01WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(NRF24L01WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(NRF24L01WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans…1a
SPI_RW_Reg(NRF24L01WRITE_REG + RF_CH, 40); // Select RF channel 40
SPI_RW_Reg(NRF24L01WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
SPI_RW_Reg(NRF24L01WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //ÉèÖýÓÊÕÊý¾Ý³¤¶È£¬±¾´ÎÉèÖÃΪ2×Ö½Ú
SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0e);
//CE=1;
Hign_24L01_CE;
delayms(100);
}
void Transmit(unsigned char * tx_buf)
{
//CE=0; //StandBy Iģʽ
Low_24L01_CE;
SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // ×°ÔؽÓÊն˵ØÖ·
SPI_RW_Reg(FLUSH_TX,0x00);
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // ×°ÔØÊý¾Ý
SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0e); // IRQÊÕ·¢Íê³ÉÖжÏÏìÓ¦£¬16λCRC£¬Ö÷·¢ËÍ
//CE=1; //ÖøßCE£¬¼¤·¢Êý¾Ý·¢ËÍ
Hign_24L01_CE;
delayms(10);
}
/****************************************************************************************************/
//º¯Êý£ºvoid RX_Mode(void)
//¹¦ÄÜ£ºÊý¾Ý½ÓÊÕÅäÖÃ
/****************************************************************************************************/
void RX_Mode(void)
{
//CE=0;
Low_24L01_CE;
SPI_RW_Reg(FLUSH_RX,0x00);
//SPI_Write_Buf(NRF24L01WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_RW_Reg(NRF24L01WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
SPI_RW_Reg(NRF24L01WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
//SPI_RW_Reg(NRF24L01WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans…1a
SPI_RW_Reg(NRF24L01WRITE_REG + RF_CH, 40); // Select RF channel 40
SPI_RW_Reg(NRF24L01WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //ÉèÖýÓÊÕÊý¾Ý³¤¶È£¬±¾´ÎÉèÖÃΪ2×Ö½Ú
SPI_RW_Reg(NRF24L01WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0F);
Hign_24L01_CE;
delayms(130); //ºÃÏñûÓÐÒ²¿ÉÒÔ£¬AVR 22.1184M
}
然后是发送模块的主函数
u8 tx_Buf[32]={0x00};
int SysInit(void)
{
// u8 dmp_status;
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);//Ö÷ƵÅäÖÃΪ400/2/4 = 50
/**************************´®¿Ú³õʼ»¯*******************************/
UART0_Init(115200);
printf("……..UART_Success…….\r\n");
/**************************°´¼ü³õʼ»¯*******************************/
key_Init();
// /**************************LCD5110³õʼ»¯*******************************/
// LCD_init();
// LcdPutString(0,0,"MODE:");//ģʽ2
/**************************NRF³õʼ»¯*********************************************/
NrfInit();
TX_Mode();
}
int main (void)
{
// u8 distance;
// u8 angle;
// u8 i=0;
//
SysInit();
while (1)
{
tx_Buf[0] = 9;
Transmit(tx_Buf);
printf("·¢Ë͵ÄΪ%d\r\n",tx_Buf[0]);
DELAY_MS(1000);
}
}
接受端不停的发送同一个数据
接收模块
SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);//Ö÷ƵÅäÖÃΪ200/2.5=80M
/**************************´串口初始化¯*******************************/
UART0_Init(115200);
printf("……..UART_Success…….\r\n");
/**************************NRF³õʼ»¯*********************************************/
NrfInit();
RX_Mode();
while(rx_Buf[0]==0)
{ nRF24L01_RxPacket(rx_Buf);
}
printf("%d\r\n",rx_Buf[0]);
rx_Buf[0] =0;
printf("NRF24L01…success…..");
接收模块一直等待接受直到有值输入
实际调试过程中,只有将发送模块重新上电 才有输出 。且一次输出后,接收端复位并没有输出,只能再次将发送模块断电,发送模块若只是复位不重新上电也没有用。
请问有没有人遇到过这种问题 怎么解决的?
xyz549040622:
你的接收模块和发射模块都是好的嘛?有没有经过测试呢?