天线|RF射频
直播中

彭望琼

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

NRF24L01问题如何解决

tica, Tahoma, Arial, sans-serif;font-size:14px;line-height:24px;background-color:#f5f5f5;">自己做的两个STM32F405RG的板子,想用NRF24L01进行无线通讯。

编写的代码在早上的时候用一个板子收一个板子发是能够发送且受到数据的,单步调试验证过。

但将板子的收发功能对调就不能传输成功。。

单步调试发现程序运行到while(NRF24L01_IRQ!=0);就一直在等待。。。



然后配置如下:

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        

SPI_InitStructure.SPI_CRCPolynomial = 7;        

SPI_Init(SPI2, &SPI_InitStructure);



void NRF24L01_RX_Mode(void)

{

NRF24L01_CE=0;         

          NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

  

          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);   

          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);         

          NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);  

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);

          NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);

          NRF24L01_CE = 1;

}         

void NRF24L01_TX_Mode(void)

{         

NRF24L01_CE=0;            

           NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);

          NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);

          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);   

          NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);

          NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);      

          NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);

          NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e);   

NRF24L01_CE=1;

}   

回帖(7)

陈茗卓

2020-5-26 13:07:50
再调回去还可以用么?

你折代码看不出问题,怀疑是初始化的问题.
举报

高文利

2020-5-26 13:20:25

也不行了。它一直停在while(NRF24L01_IRQ!=0);这句上。

初始化的代码是用战舰的初始化

void NRF24L01_Init(void)

{        

        GPIO_InitTypeDef GPIO_InitStructure;

  SPI_InitTypeDef  SPI_InitStructure;



        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);       

           

        //scn???ì????????

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                 

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

         GPIO_Init(GPIOB, &GPIO_InitStructure);

         GPIO_SetBits(GPIOB,GPIO_Pin_12);                       

         //CE  pc11

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                 

         GPIO_SetBits(GPIOC,GPIO_Pin_11);

//IRQ C12

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;       

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;  

        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIOC, &GPIO_InitStructure);

                         

  SPI2_Init();                   

        SPI_Cmd(SPI2, DISABLE); 



        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  

        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               

        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               

        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;       

        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               

        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;               

        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       

        SPI_InitStructure.SPI_CRCPolynomial = 7;       

        SPI_Init(SPI2, &SPI_InitStructure); 

 

        SPI_Cmd(SPI2, ENABLE); 

                         

        NRF24L01_CE=0;                        

        NRF24L01_CSN=1;                       

                                   

}



void SPI2_Init(void)//??????SPI2

{

         GPIO_InitTypeDef GPIO_InitStructure;

  SPI_InitTypeDef  SPI_InitStructure;



        RCC_AHB1PeriphClockCmd(        RCC_AHB1Periph_GPIOB, ENABLE );

        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );       



        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

        GPIO_Init(GPIOB, &GPIO_InitStructure);



        GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);



         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15



        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  

        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               

        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               

        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //high?2edge?       

        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       

        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               

        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;               

        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

        SPI_InitStructure.SPI_CRCPolynomial = 7;       

        SPI_Init(SPI2, &SPI_InitStructure); 

 

        SPI_Cmd(SPI2, ENABLE); 

        SPI2_ReadWriteByte(0xff);

 

}   



这代码早上还好使,现在即使换过来也不行。在调试的时候它出现过一次status寄存器的值为0x2e,之后就一直停在等待发送的循环语句了
举报

李林

2020-5-26 13:34:09

用万用表检测IRQ电平,接收端是高低电平跳转,而发送端一直是低电平
举报

谭艳红

2020-5-26 13:39:43

你贴的是SPI初始化。。。。。。最好把2401初始化贴出来。。。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分