打印
[STM32F0]

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

[复制链接]
1157|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常亮,不闪烁
请问这是什么原因,如何排除故障。
void SPI_NRF_TX_DATAS(u8* TBuff,u16 ByteNUM)
{
        u8 Status[1];
        Status[0] = NRF_IRQ;//读取nRF设备的中断引脚的电平值
        while(Status[0])        //如无中断触发则写数据
        {
                NRF_CE_LOW;
                SPI_NRF_Write(SPI2,WR_TX_PLOAD,TBuff,ByteNUM);        //发送数据
                NRF_CE_HIGH;
                Status[0] = NRF_IRQ;
        }
        NRF_CE_LOW;        
        Delay_ms(1);
        SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值

        NRF_CE_HIGH;
        if(Status[0]&TX_DS)
        {
LED_Close(1);//熄灭LED1
                Delay_ms(500);
                Status[0] = 0xfe;
                SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,Status,1);        //清楚中断标志
        }
        SPI_NRF_Write(SPI2,FLUSH_TX,TBuff,0);
        SPI_NRF_Read(SPI2,nRF_READ_REG+STATUS,Status,1);//读取Status寄存器值
}



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

        NRF_CE_LOW;                                        //禁能设备
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + TX_ADDR,TX_RX_ADDR,5);        //配置发送地址
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + RX_ADDR_P0,TX_RX_ADDR,5);//配置通道0地址
        TX_Array[0]=0x00;
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_AA, TX_Array, 1);//禁能自动应答
        TX_Array[0]=0x00;
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + EN_RXADDR, TX_Array, 1);                                                 //禁能通道
        TX_Array[0]=0x00;
    SPI_NRF_Write(SPI2,nRF_WRITE_REG + SETUP_RETR, TX_Array, 1);                                                //禁能自动重发
        TX_Array[0]=40;
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_CH, TX_Array, 1);                                                        //配置通信频率
        TX_Array[0]=0x07;
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + RF_SETUP, TX_Array, 1);                                                   //配置发射功率
        TX_Array[0]=0x0e;
        SPI_NRF_Write(SPI2,nRF_WRITE_REG + CONFIG, TX_Array, 1);                                                           // 主发送功能,设备上电
        TX_Array[0]=0xfe;        //1111 xxxx STATUS
        SPI_NRF_Write(SPI2,nRF_WRITE_REG+STATUS,TX_Array,1);

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

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

void Delay_us(uint16_t x)
{        
        Delay_ms(1);
}
之前的程序中,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
void init_nRF24L01(void)
{
    inerDelay_us(100);
         CE=0;                    // chip enable
         CSN=1;                   // SpI disable
         SCK=0;                   // SpI clock line init high
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                                                      //频道0自动,ACK应答禁止【修改】
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                                                 //允许接收地址只有频道0,
        SPI_RW_Reg(WRITE_REG + RF_CH, 40);                                                        //设置信道工作为2.4G,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                                 //设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                                                   //设置发射速率1MHz,发射功率为最大值0dB
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                                                   // IRQ收发完成中断响应,16位CRC,主【接收】
        CE = 1;
}
/******************************************/
void init_int0()
{
        EA=1;                           //开启总中断
        EX0=1;                        //开启外部中断0
}
中断服务函数
void ISR_int0(void) interrupt 0
{
        R_S_Byte(0x01);
        sta=SPI_Read(STATUS);
        if(RX_DR)                                                   //检测接收中断产生
        {
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);        //从RX_FIFO中读出接收载荷
                flag=1;
        }
        if(MAX_RT)
        {
                SPI_RW_Reg(FLUSH_TX,0);
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);                                                //清除中断标志
        R_S_Byte(0x02);
}
想请教,这个我怎么一步步排查问题。发送端已经可以正确检测到TX_DS的0->1的变化。

使用特权

评论回复
板凳
feiyinglala|  楼主 | 2016-5-9 23:31 | 只看该作者
二姨带来了好运气吧,后来发现是电压问题导致。之前是用5V的USB供电,实际给的电压是5.7V,改到3.3V供电就好多了。目前又遇到问题是,发送端在不停发包,但是接收端光能收到两个正常的包,然后就一直收00,00,00....!
希望能早日搞妥

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

224

帖子

1

粉丝