|
最近在做两轮小车,想用2401发送小车运行的一些数据,用来检测和调试。基本通讯完成,但是会有数据丢失 ,苦寻无果特来发帖讨教!!
1.发射端 TX
void TX_Mode(void) //模式设定
{
Clr_NRF24L01_CE; //拉低CE
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写发送地址 本地地址 5字节的地址宽度
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置通道0接收地址 5字节地址宽度
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 寄存器地址0x01
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_RXADDR,0x01); //接收数据通道0容许 用于应答 寄存器地址0x02
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+SETUP_RETR,0xf0);//设置自动重发间隔时间:4000us + 86us;最大自动重发次数:15次
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_CH,0x6e); // 设置信道工作为2.5GHZ,收发必须一致
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_SETUP,0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB 低噪声放大器增益
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+CONFIG,0x0e);
}
发送数据函数:
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
Clr_NRF24L01_CE; //拉低CE装载数据
NRF24L01_Write_Buf(NRF24L01_WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); //写数据到TX BUF 32个字节
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+CONFIG,0x0e); //配置状态寄存器
Set_NRF24L01_CE; // 升高启动发送
while(NRF24L01_IRQ!=0); //等待IRQ中断示意发送完成
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+STATUS,0xff); //清除TX_DS或MAX_RT中断标志 写1清楚中断
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(NRF24L01_FLUSH_TX,0xff); //清除TX FIFO寄存器
LED0=0; //此段代码用以数据丢失LED反馈显示
delay_ms(15);
LED0=1;
delay_ms(15);
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
LED1=0; //此段代码用以数据丢失LED反馈显示
delay_ms(5);
LED1=1;
delay_ms(5);
return TX_OK;
}
return 0xff;//其他原因发送失败
}
发送端主函数:
int main(void)
{
u8 Tx_Buf1[32];
int data=0;
SystemInit(); //系统时钟初始化为72M SYSCLK_FREQ_72MHz
delay_init(72); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //LED端口初始化
uart_init(9600); //串口初始化为9600
NRF24L01_Init(); //初始化2401
while (NRF24L01_Check()) //检验是读写否运行正常 器件正常返回0,非正常返回1
{
LED0=0;
delay_ms(300);
LED0=1;
delay_ms(300);
}
TX_Mode(); //发送模式
while(1) //不停地发送0~99
{
data++;
if(data==100)
data=0;
Tx_Buf1[1]=data;
NRF24L01_TxPacket(Tx_Buf1); // 发送命令数据
}
}
接收端配置函数:
void RX_Mode(void)
{
Clr_NRF24L01_CE;
NRF24L01_Write_Buf(NRF24L01_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_AA,01); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_CH,0x6e); //设置RF通信频率 2.5G~ wifi干扰??
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
Set_NRF24L01_CE; //CE为高,进入接收模式
}
判断数据到达读取处理函数:
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF24L01_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
{
Clr_NRF24L01_CE; //CE置低
NRF24L01_Read_Buf(NRF24L01_RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH); //读取数据
NRF24L01_Write_Reg(NRF24L01_FLUSH_RX,0xff); //清除RX FIFO寄存器
return 1;
}
Set_NRF24L01_CE;
return 0;//没收到任何数据
}
接收端主函数:
int main(void)
{
u8 Rx_Buf[32];
int i=0;
SystemInit(); //系统时钟初始化为72M SYSCLK_FREQ_72MHz
delay_init(72); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //LED端口初始化
uart_init(9600); //串口初始化为9600
NRF24L01_Init(); //初始化2401 SPI IO配置
while (NRF24L01_Check()) //检验是读写否运行正常
printf("2401 wrong!\r\n"),delay_ms(1000);
printf("2401 is ok!");
RX_Mode(); //接收模式
while(1)
{
if(NRF24L01_RxPacket(Rx_Buf)) //判断并且读取数据
for(i=0;i<32;i++) //打印32个数据Rx_Buf[0]~Rx_Buf[31]
AnBT_Uart1_Send_Char(Rx_Buf[i]); //串口打印数据
}
}
现在问题是发送0~99数据总会丢失那么几个数据(<=5个),发送时间间隔为10ms。
网上说WIFI有干扰啊,后我把2.4GHz改为2.5Ghz 问题没能解决
还有说 电源上面要焊接一个滤波电容。我买的成品,应该有焊接过的!
归根到底可能是我的程序配置的不对,望大神们给点拨一下,感觉不尽。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|