单片机:STC89C52RC无线模块:NRF24L01+(注意带加号)
本人在网上找了N多代码,就是不能成功。接收端始终接收不到数据包,接收端采用中断方式接收。
就是一个发一个收;
发送端初始化如下:
sbitIRQ=P3^2;
sbitMISO=P1^3;
sbitMOSI=P1^4;
sbitSCK=P1^5;
sbitCSN=P1^6;
sbitCE=P1^7;
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//
}
发送模式
voidTX_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);
}
发送函数:
voidnRF24L01_TxPacket(unsignedchar*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);
}
接收端:
sbitIRQ=P3^2;
sbitMISO=P1^3;
sbitMOSI=P1^4;
sbitSCK=P1^5;
sbitCSN=P1^6;
sbitCE=P1^7;
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//
}
接收模式设置:
voidRX_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引脚
voidNRF_IRQ()interrupt0//视乎从来没有进入中断函数
{
cnt++;
sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况
if(RX_DR)//判断是否接收到数据
{
CE=0;//SPI使能
SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer
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);
}
分 -->
|