利用NRF24L01+ STM32F4进行传感器组网, 关闭了自动应答功能,利用时隙分配,进行节点轮询(设节点6ms一个周期,0号节点在收到基站启动信号后使能定时器,1号节点在收到启动信号后 延迟3ms使能定时器,两个节点是同时收到启动信号的,这样正好错开3ms)。现在存在一个问题,当使用单个节点时,数据传输没有问题,一切正常;但使用双节点时,基站接收2-3秒消息后(此期间有串口输出),无消息输出(无串口打印输出),这不知道为什么??
节点地址(两个节点都是一样的地址,只是利用定时器错开了发送时间):
- const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
- const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x00}; //接收地址
复制代码
基站地址:
- const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x00}; //发送地址
- const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //接收地址
复制代码
节点读模式转换函数(与基站同样):
- void RX_Mode(void)
- {
- Clr_NRF24L01_CE;
- NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
- NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
-
- NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA,0x00); //失能通道0的自动应答
- NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
- NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,100); //设置RF通信频率
- NRF24L01_Write_Reg(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
- NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
- NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG1, 0x3f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
- Set_NRF24L01_CE;
- }
复制代码
节点写模式转换函数(与基站同样):
- void TX_Mode(void)
- {
- Clr_NRF24L01_CE;
- NRF24L01_Write_Buf(SPI_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址
- NRF24L01_Write_Buf(SPI_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
- NRF24L01_Write_Reg(SPI_WRITE_REG+EN_AA,0x00); //失能通道0的自动应答
- NRF24L01_Write_Reg(SPI_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址
- NRF24L01_Write_Reg(SPI_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
- NRF24L01_Write_Reg(SPI_WRITE_REG+RF_CH,100); //设置RF通道为40,AD转换测试,暂时设置为40
- NRF24L01_Write_Reg(SPI_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
- NRF24L01_Write_Reg(SPI_WRITE_REG+CONFIG1,0x3e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
- Set_NRF24L01_CE;
- }
复制代码
节点发送函数(与基站同样):
- u8 Wireless_Send_Data(u8 *txbuf){
- u8 ret = 0;
- TX_Mode();
- delay_us(200);
- ret = NRF24L01_TxPacket(txbuf);
- delay_us(200);
- RX_Mode();
- delay_us(200);
- return ret;
- }
- u8 NRF24L01_TxPacket(u8 *txbuf)
- {
- u8 state;
- u32 timeout = 0;
- Clr_NRF24L01_CE;
- NRF24L01_Write_Reg(FLUSH_TX,NOP); //刷新发送缓冲器千万不要去掉,否则数据有时候不更新
- NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
- Set_NRF24L01_CE; //启动发送
- while(timeout <2000)
- {
- timeout++;
- }
- state=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
- NRF24L01_Write_Reg(SPI_WRITE_REG+STATUS,0x7E); //清除TX_DS或MAX_RT中断标志
- if(state&TX_OK) //发送完成
- {
- return TX_OK;
- }
- return 0xff; //其他原因发送失败
- }
复制代码
基站NRF24L01+接收信号中断函数:
- void EXTI1_IRQHandler(void){
- u8 RX_Status;
- if(EXTI_GetITStatus(EXTI_Line1) != RESET){
- RX_Status=NRF24L01_RxPacket(rev_buf);
- if(RX_Status == 0){
- rev_buf[27] = '\0';
- Uart1_SendString(rev_buf);
- }
- EXTI_ClearITPendingBit(EXTI_Line1);
- }
- }
复制代码
基站串口打印函数:
- void Uart1_SendString(u8 *str)
- {
- while(*str)
- {
- USART_SendData(USART1,*str); //将*str从USARTx发送出去
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕
- str++; //str的地址增加1,到下一个字符
- }
- }
复制代码
0
已退回5积分
|
|
|
|