[STM32F0] STM32驱动NRF发数据,接收端检测不到中断

[复制链接]
1355|2
 楼主| feiyinglala 发表于 2016-5-6 20:37 | 显示全部楼层 |阅读模式
本帖最后由 feiyinglala 于 2016-5-6 22:58 编辑

当前存在的问题是用51驱动nR接收STM32驱动nRF发送的数据过程中,51一直检测不到模块的IRQ引脚的中断,具体代码见2楼
STM32驱动nRF发送数据,51驱动nRF接收数据,都禁能了自动应答。NRF的IRQ引脚接51的外部中断0接口,目前就是无法检测到IRQ的中断进来。

*************分割线:以下为第一个问题的描述,已经解决,当前需要解决的是接收端,代码见2楼************************
我的第一个问题是程序运行依赖仿真器的问题,已经初步找到症结了。
这几天在用STM32F051驱动nRF24L01发送数据,现在遇到一个奇怪的问题。电路板连接仿真器仿真时候运行正常,但是拔掉仿真器就不正常了。
我在程序中用SPI口驱动24L01发送完数据后,读取nRF的STATUS寄存器,如果其中TX_DS标志为1,则熄灭LED1,主循环中一直点亮LED.
仿真状态:让程序一直跑,LED1会一直闪烁
电路板单独运行:LED1常亮,不闪烁
请问这是什么原因,如何排除故障。
  1. void SPI_NRF_TX_DATAS(u8* TBuff,u16 ByteNUM)
  2. {
  3.         u8 Status[1];
  4.         Status[0] = NRF_IRQ;//读取nRF设备的中断引脚的电平值
  5.         while(Status[0])        //如无中断触发则写数据
  6.         {
  7.                 NRF_CE_LOW;
  8.                 SPI_NRF_Write(SPI2,WR_TX_PLOAD,TBuff,ByteNUM);        //发送数据
  9.                 NRF_CE_HIGH;
  10.                 Status[0] = NRF_IRQ;
  11.         }
  12.         NRF_CE_LOW;        
  13.         Delay_ms(1);
  14.         SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值

  15.         NRF_CE_HIGH;
  16.         if(Status[0]&TX_DS)
  17.         {
  18. LED_Close(1);//熄灭LED1
  19.                 Delay_ms(500);
  20.                 Status[0] = 0xfe;
  21.                 SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,Status,1);        //清楚中断标志
  22.         }
  23.         SPI_NRF_Write(SPI2,FLUSH_TX,TBuff,0);
  24.         SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值
  25. }



以下为初始化代码
  1. u8 TX_RX_ADDR[5]={0x34,0x43,0x10,0x10,0x01};

  2.         NRF_CE_LOW;                                        //禁能设备
  3.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + TX_ADDR,TX_RX_ADDR,5);        //配置发送地址
  4.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + RX_ADDR_P0,TX_RX_ADDR,5);//配置通道0地址
  5.         TX_Array[0]=0x00;
  6.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_AA, TX_Array, 1);//禁能自动应答
  7.         TX_Array[0]=0x00;
  8.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_RXADDR, TX_Array, 1);                                                 //禁能通道
  9.         TX_Array[0]=0x00;
  10.     SPI_NRF_Write(SPI2,nRF_WRITE_REG + SETUP_RETR, TX_Array, 1);                                                //禁能自动重发
  11.         TX_Array[0]=40;
  12.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_CH, TX_Array, 1);                                                        //配置通信频率
  13.         TX_Array[0]=0x07;
  14.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_SETUP, TX_Array, 1);                                                   //配置发射功率
  15.         TX_Array[0]=0x0e;
  16.         SPI_NRF_Write(SPI2,nRF_WRITE_REG + CONFIG, TX_Array, 1);                                                           // 主发送功能,设备上电
  17.         TX_Array[0]=0xfe;        //1111 xxxx STATUS
  18.         SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,TX_Array,1);

  19.         NRF_CE_HIGH;                //CE=1 使能设备
  20.         Delay_ms(1);                //延时

找到问题在哪里了,原来是systick函数中,us和ms延时函数的定义影响到了,但具体怎么导致这个问题的,我也解释不了
systick的配置SysTick_Config(SystemCoreClock/1000)
运行正常的配置
  1. void Delay_ms(__IO uint32_t nTime)
  2. {
  3.         TimingDelay = nTime;
  4.         while(TimingDelay != 0);
  5. }

  6. void Delay_us(uint16_t x)
  7. {        
  8.         Delay_ms(1);
  9. }
之前的程序中,ms同上,us延时的定义如下
void Delay_us(uint16_t x)
{
    TimingDelay = 1;
    while(TimingDelay!=0);
}


说明:芯片是STM32F051R8  系统:win7 64位  开发环境:uVersion V5.11
          下载器:J-LINK (USB口连到电脑,然后通过SWD连接电路板)





 楼主| feiyinglala 发表于 2016-5-6 22:49 | 显示全部楼层
本帖最后由 feiyinglala 于 2016-5-6 23:00 编辑

附上51驱动NRF的代码,现在问题是51这边一直检测不到IRQ的中断电平,调试中通过串口一直读取STATUS的值一直是0x0e,FIFO_STATUS一直是0x11
  1. void init_nRF24L01(void)
  2. {
  3.     inerDelay_us(100);
  4.          CE=0;                    // chip enable
  5.          CSN=1;                   // SpI disable
  6.          SCK=0;                   // SpI clock line init high
  7.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收端地址
  8.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                                                      //频道0自动,ACK应答禁止【修改】
  9.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                                                 //允许接收地址只有频道0,
  10.         SPI_RW_Reg(WRITE_REG + RF_CH, 40);                                                        //设置信道工作为2.4G,收发必须一致
  11.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                                 //设置接收数据长度,本次设置为32字节
  12.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                                                   //设置发射速率1MHz,发射功率为最大值0dB
  13.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                                                   // IRQ收发完成中断响应,16位CRC,主【接收】
  14.         CE = 1;
  15. }
  16. /******************************************/
  17. void init_int0()
  18. {
  19.         EA=1;                           //开启总中断
  20.         EX0=1;                        //开启外部中断0
  21. }
中断服务函数
  1. void ISR_int0(void) interrupt 0
  2. {
  3.         R_S_Byte(0x01);
  4.         sta=SPI_Read(STATUS);
  5.         if(RX_DR)                                                   //检测接收中断产生
  6.         {
  7.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);        //从RX_FIFO中读出接收载荷
  8.                 flag=1;
  9.         }
  10.         if(MAX_RT)
  11.         {
  12.                 SPI_RW_Reg(FLUSH_TX,0);
  13.         }
  14.         SPI_RW_Reg(WRITE_REG+STATUS,sta);                                                //清除中断标志
  15.         R_S_Byte(0x02);
  16. }
想请教,这个我怎么一步步排查问题。发送端已经可以正确检测到TX_DS的0->1的变化。

 楼主| feiyinglala 发表于 2016-5-9 23:31 | 显示全部楼层
二姨带来了好运气吧,后来发现是电压问题导致。之前是用5V的USB供电,实际给的电压是5.7V,改到3.3V供电就好多了。目前又遇到问题是,发送端在不停发包,但是接收端光能收到两个正常的包,然后就一直收00,00,00....!
希望能早日搞妥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

224

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部