单片机:STC89C52RC 无线模块:NRF24L01+ (注意带加号)
本人在网上找了N多代码,就是不能成功。接收端始终接收不到数据包,接收端采用中断方式接收。
就是一个发一个收;
发送端初始化如下:
***it IRQ =P3^2;
***it MISO =P1^3;
***it MOSI =P1^4;
***it SCK =P1^5;
***it CSN =P1^6;
***it CE =P1^7;
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //
}
发送模式
void TX_Mode()
{
CE = 0;
inerDelay_us(10);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 写入发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);// 为了应答接收设备,接收通道0地址和发送地址相同
SPI_RW_Reg(WRITE_REG + EN_AA,0x00);// 0x01); // 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电
CE = 1;
inerDelay_us(130);
}
发送函数:
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
CE=1; //置高CE,激发数据发送
inerDelay_us(100);
}
接收端:
***it IRQ =P3^2;
***it MISO =P1^3;
***it MOSI =P1^4;
***it SCK =P1^5;
***it CSN =P1^6;
***it CE =P1^7;
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //
}
接收模式设置:
void RX_Mode(void)
{
CE = 0;
inerDelay_us(100)
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//0x01); // 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0X40);//0x40);//40); // 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
CE = 1; // 拉高CE启动接收设备
inerDelay_us(200);
}
采用中断方式接收。IRQ连接P3^2引脚
void NRF_IRQ() interrupt 0 //视乎从来没有进入中断函数
{
cnt++;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(WRITE_REG+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
LCD_Clear();//清屏
LCD_Write_String(1,0,uchartostr(cnt,str))//只是看看收到有没有中断
if(cnt==250)
cnt=1;
Delay(10);
}
|