天线|RF射频
直播中

周莹

7年用户 201经验值
私信 关注
[问答]

如何在一块战舰板上进行两个NRF24L01的通信实验?


        昨天发了个求助帖子,是关于 SPI1 使用 NRF24L01 的问题(http://www.openedv.com/posts/list/58288.htm)。最后终于搞好。



        下一步就是想进行 2.4G 无线通信实验了。战舰的板子也准备了两块,准备弄这个实验。两块板子靓照



        



        



        但是,感觉两块板子调试起来比较费劲。所以就像尝试下在一块 上进行2.4G收发实验。



        由于昨天已经在 SPI1 上连接了一个 NRF24L01,所以,在 SPI3 上连接另一个 NRF24L01。具体连接方式如下:



        



        



        SPI1:NRF24L01(实验中用于发射)



        



        C00:SPI1 CE(3)



        



        C02:SPI1 CSN(4)



        



        C08:SPI1 IRQ(8)



        



        A05:SPI1 SCK(5)



        



        A06:SPI1 MISO(7)



        



        A07:SPI1 MOSI(6)



        



        




        



        SPI3:NRF24L01(实验中用于接收)



        



        C03:SPI3 CE(3)



        



        C04:SPI3 CSN(4)



        



        C09:SPI3 IRQ(8)



        



        B03:SPI3 SCK(5)



        



        PB04:SPI3 MISO(7)



        



        PB05:SPI3 MOSI(6)



        




        现场连线情况(看个大概即可)



        

回帖(7)

李允麒

2020-4-23 07:29:12


        实验思路:

1、在 main 中每两秒发射一次数据,调试输出发射的数据内容。

2、在发射模块的 IRQ 中断(PC8)中,对发射情况进行调试输出。

3、在接收模块的 IRQ 中断(PC9)中,对接收情况进行调试输出,并调试输出接收的内容。

经过调试输出判断,NRF24L01 先进行发射,如果成功,会先在接收端产生 RX_OK 中断,然后是发送方产生 TX_OK 中断。如果发送不成功,仅在发送端产生 MAX_TX 中断。


相关代码


       
[C] 纯文本查看 复制代码
int main(void){  _Init();  while (1)  {    static u32 i = 0;    u8 lTxBuffer[33];    i++;    sprintf((char *)lTxBuffer, "%032d", i);    oDebug("RF1 => [%s]rn", lTxBuffer);    WIRELESS_SendPacket(WIRELESS1, lTxBuffer);    LED1 = !LED1;        Wait_s(2);  }}
       


NRF24L01 中为配合中断方式,做了些调整,代码如下


       
[C] 纯文本查看 复制代码
static bool WIRELESS1_IsIrqHandled;static bool WIRELESS2_IsIrqHandled;...void WIRELESS_IrqHandled(u8 aWhichWireless){  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_IsIrqHandled = TRUE; break;    case WIRELESS2: WIRELESS2_IsIrqHandled = TRUE; break;  }}void WIRELESS_SendPacket(u8 aWhichWireless, u8 *aBuffer){  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_CE = 0; WIRELESS1_IsIrqHandled = FALSE; break;    case WIRELESS2: WIRELESS2_CE = 0; WIRELESS2_IsIrqHandled = FALSE; break;  }  WIRELESS_WriteBuffer(aWhichWireless, NFR_WRITE_TX_PAYLOAD, aBuffer, WIRELESS_TX_PAYLOAD_WIDTH);  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_CE = 1; do { Wait_us(10);} while(WIRELESS1_IsIrqHandled == FALSE); break;    case WIRELESS2: WIRELESS2_CE = 1; do { Wait_us(10);} while(WIRELESS2_IsIrqHandled == FALSE); break;  }  return;   }
       

       


                中断处理代码如下:
       


               
[C] 纯文本查看 复制代码
void EXTI9_5_IRQHandler(void){  // WIRELESS1 触发的中断  if(EXTI_GetITStatus(EXTI_Line8) == SET)  {    u8 lStatus = WIRELESS_ReadReg(WIRELESS1, NRF_READ_REG + NFR_STATUS);  // 读取状态寄存器的值    oDebug("RF1 => ");    if(lStatus & NFR_MAX_TX)                                 // 达到最大重发次数    {      WIRELESS_WriteReg(WIRELESS1, NFR_FLUSH_TX, 0xFF);      // 清除TX FIFO寄存器      oDebug("MAX_TXrn");    }        if(lStatus & NFR_TX_OK)                                  // 发送完成    {      oDebug("TX_OKrn");    }      if(lStatus & NFR_RX_OK)                                  // 接收完成    {      oDebug("RX_OKrn");    }        // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志    WIRELESS_WriteReg(WIRELESS1, NRF_WRITE_REG + NFR_STATUS, lStatus);    WIRELESS_IrqHandled(WIRELESS1);    EXTI_ClearITPendingBit(EXTI_Line8);  }    if(EXTI_GetITStatus(EXTI_Line9) == SET)  {    u8 lStatus = WIRELESS_ReadReg(WIRELESS2, NRF_READ_REG + NFR_STATUS);  // 读取状态寄存器的值    oDebug("RF2 => ");    if(lStatus & NFR_MAX_TX)                                 // 达到最大重发次数    {      WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_TX, 0xFF);      // 清除TX FIFO寄存器      oDebug("MAX_TXrn");    }        if(lStatus & NFR_TX_OK)                                  // 发送完成    {      oDebug("TX_OKrn");    }      if(lStatus & NFR_RX_OK)                                  // 接收完成    {      u8 lRxBuffer[33];      oDebug("RX_OK");      WIRELESS_ReadBuffer(WIRELESS2, NFR_READ_RX_PAYLOAD, lRxBuffer, WIRELESS_RX_PAYLOAD_WIDTH); // 读取数据      WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_RX, 0xFF);      // 清除RX FIFO寄存器            lRxBuffer[32] = 0;      oDebug("[%s]rn", lRxBuffer);    }    // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志    WIRELESS_WriteReg(WIRELESS2, NRF_WRITE_REG + NFR_STATUS, lStatus);    WIRELESS_IrqHandled(WIRELESS2);        EXTI_ClearITPendingBit(EXTI_Line9);  }}
               

               


                       

               



NRF24L01 中为配合中断方式,做了些调整,代码如下


       
[C] 纯文本查看 复制代码
static bool WIRELESS1_IsIrqHandled;static bool WIRELESS2_IsIrqHandled;...void WIRELESS_IrqHandled(u8 aWhichWireless){  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_IsIrqHandled = TRUE; break;    case WIRELESS2: WIRELESS2_IsIrqHandled = TRUE; break;  }}void WIRELESS_SendPacket(u8 aWhichWireless, u8 *aBuffer){  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_CE = 0; WIRELESS1_IsIrqHandled = FALSE; break;    case WIRELESS2: WIRELESS2_CE = 0; WIRELESS2_IsIrqHandled = FALSE; break;  }  WIRELESS_WriteBuffer(aWhichWireless, NFR_WRITE_TX_PAYLOAD, aBuffer, WIRELESS_TX_PAYLOAD_WIDTH);  switch(aWhichWireless)  {    case WIRELESS1: WIRELESS1_CE = 1; do { Wait_us(10);} while(WIRELESS1_IsIrqHandled == FALSE); break;    case WIRELESS2: WIRELESS2_CE = 1; do { Wait_us(10);} while(WIRELESS2_IsIrqHandled == FALSE); break;  }  return;   }
       

       


                中断处理代码如下:
       


               
[C] 纯文本查看 复制代码
void EXTI9_5_IRQHandler(void){  // WIRELESS1 触发的中断  if(EXTI_GetITStatus(EXTI_Line8) == SET)  {    u8 lStatus = WIRELESS_ReadReg(WIRELESS1, NRF_READ_REG + NFR_STATUS);  // 读取状态寄存器的值    oDebug("RF1 => ");    if(lStatus & NFR_MAX_TX)                                 // 达到最大重发次数    {      WIRELESS_WriteReg(WIRELESS1, NFR_FLUSH_TX, 0xFF);      // 清除TX FIFO寄存器      oDebug("MAX_TXrn");    }        if(lStatus & NFR_TX_OK)                                  // 发送完成    {      oDebug("TX_OKrn");    }      if(lStatus & NFR_RX_OK)                                  // 接收完成    {      oDebug("RX_OKrn");    }        // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志    WIRELESS_WriteReg(WIRELESS1, NRF_WRITE_REG + NFR_STATUS, lStatus);    WIRELESS_IrqHandled(WIRELESS1);    EXTI_ClearITPendingBit(EXTI_Line8);  }    if(EXTI_GetITStatus(EXTI_Line9) == SET)  {    u8 lStatus = WIRELESS_ReadReg(WIRELESS2, NRF_READ_REG + NFR_STATUS);  // 读取状态寄存器的值    oDebug("RF2 => ");    if(lStatus & NFR_MAX_TX)                                 // 达到最大重发次数    {      WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_TX, 0xFF);      // 清除TX FIFO寄存器      oDebug("MAX_TXrn");    }        if(lStatus & NFR_TX_OK)                                  // 发送完成    {      oDebug("TX_OKrn");    }      if(lStatus & NFR_RX_OK)                                  // 接收完成    {      u8 lRxBuffer[33];      oDebug("RX_OK");      WIRELESS_ReadBuffer(WIRELESS2, NFR_READ_RX_PAYLOAD, lRxBuffer, WIRELESS_RX_PAYLOAD_WIDTH); // 读取数据      WIRELESS_WriteReg(WIRELESS2, NFR_FLUSH_RX, 0xFF);      // 清除RX FIFO寄存器            lRxBuffer[32] = 0;      oDebug("[%s]rn", lRxBuffer);    }    // 清除 RX_DS,TX_DS 或 MAX_RT 中断标志    WIRELESS_WriteReg(WIRELESS2, NRF_WRITE_REG + NFR_STATUS, lStatus);    WIRELESS_IrqHandled(WIRELESS2);        EXTI_ClearITPendingBit(EXTI_Line9);  }}
               

               


                       

               

举报

贾小龙

2020-4-23 07:43:00


        用自己写的定制的串口助手查看输出情况,传输中有丢包的情况,具体问题还要分析。但是已经可以正常传输数据,单板双2.4G实验算是成功吧。



       

举报

段宜敏

2020-4-23 07:49:58
 赞一个,我是弄了双板,4个NRF24L01才可以双向通信,不过这样太占引脚了。如果只用2个NRF,就只能单向。(个人编程能力有限)
举报

张丹

2020-4-23 08:07:51

感觉如果实现双工,应该是半双工,只要安排好通信双方的收发顺序,对模块的发送接收模式进行实时切换,应该就可以一对儿进行双向通信了。
举报

更多回帖

相关问答

nRF24L01 无线通信
发帖
登录/注册
×
20
完善资料,
赚取积分