[求助] NRF24L01模块 IRQ一直为高电平怎么办

neie故人   2016-11-10 21:47 楼主
求大神们帮帮忙,万分感谢。
按照手册,IRQ变低电平有三种情况,为什么我的一直为高。

void TX_Mode(uchar * BUF)
{
CE = 0;

  SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);        //写发送地址
  SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, TX_ADR_WIDTH);    //写接收地址
  SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                     //写数据到TX FIFO
  SPI_Write_Reg(WRITE_REG + EN_AA, 0x01);                              // 通道0自动应答
  SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);                          // 使能通道0接收
SPI_Write_Reg(WRITE_REG + STATUS, 0x0e);                             //状态寄存器复位
  SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0x05);                         // 自动重发延时,次数
  SPI_Write_Reg(WRITE_REG + RF_CH, 93);                                //射频通道
  SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);                           //传输速率2Mbps,发射功率0dBm
  SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x0e);                         // CRC使能,发送模式,上电

  CE = 1;

}

回复评论 (13)

有什么问题希望大神们能指出
点赞  2016-11-10 21:51
void CHECKFASONG(uchar DATA)
{
        TX_BUF[0] = DATA;
        TX_Mode(TX_BUF);       
        Check_ACK();       
}

uchar Check_ACK()
{
        while(IRQ);
        sta = SPI_RW( NOP );           
        if(MAX_RT)
                SPI_RW(FLUSH_TX);       
        SPI_Write_Reg(WRITE_REG + STATUS, sta);         
        IRQ = 1;
        if(TX_DS)
                return(0x00);
        else
                return(0xff);
}
点赞  2016-11-10 21:53
用指令清除中断状态啊
点赞  2016-11-11 13:40
引用: huo_hu 发表于 2016-11-11 13:40
用指令清除中断状态啊

我理解的是NRF模块自动给IRQ置零
是理解错误了么,因为我看其他程序也没有写指令清除
点赞  2016-11-11 20:08
好像是同步就交换了,记不清楚了
点赞  2016-11-12 00:08
引用: huo_hu 发表于 2016-11-12 00:08
好像是同步就交换了,记不清楚了

同步 达到最大重发次数,都能使IRQ置0
点赞  2016-11-12 00:28
引用: huo_hu 发表于 2016-11-12 00:08
好像是同步就交换了,记不清楚了

不知道老师能不能加个qq或者微信指导下
点赞  2016-11-12 00:52
什么条件产生IRQ是通过之前的指令配置的,清除irq状态有专门的指令。
总的工作流程是
1:配置irq,启动
2:irq中断到来,给nrf发送取状态指令,根据返回值里判定产生irq原因
3:清除irq状态
4:处理
nrf的这个irq是多个中断源复用的,比较简单的情况是你只配置了一个条件,就不用取状态判断,直接清除就行了。
点赞  2016-11-12 18:26
引用: huo_hu 发表于 2016-11-12 18:26
什么条件产生IRQ是通过之前的指令配置的,清除irq状态有专门的指令。
总的工作流程是
1:配置irq,启动
...

这两天调试发现其实是NRF模块可能没连接上,不知道是不是硬件的原因

SPI_Write_Buf(WRITE_REG+TX_ADDR,buff1,5);
SPI_Read_Buf(READ_REG+TX_ADDR,buff2,5);

读出的数据不等于写入的数据
点赞  2016-11-12 18:40
SPI时序    单片机频率为22MHZ,所以加入了for循环用于分频,不知道是否有错误
uchar SPI_RW(uchar byte)
{
    uchar i,j;
    for(i=0; i<8; i++)
    {
        MOSI = (byte & 0x80);
        byte <<= 1;
        SCK = 1;
        for(j=1;j<200;j++)
        {
            _nop_();
        }
        byte |= MISO;
        SCK = 0;
        for(j=1;j<200;j++)
        {
            _nop_();
        }
    }
    return(byte);
}
点赞  2016-11-12 19:01
引用: neie故人 发表于 2016-11-12 18:40
这两天调试发现其实是NRF模块可能没连接上,不知道是不是硬件的原因

SPI_Write_Buf(WRITE_REG+TX_ADDR ...

发现自己单片机初始化函数有点问题,现状SPI_Write_Buf和SPI_Read_Buf都可以使用。
通过写config寄存器为0x0e,应该时配置了IRQ中断吧
点赞  2016-11-12 19:28
调试spi先看时钟有信号没,接着看器件回送的数据(用示波器看信号),有的话再调整一下极性(四种情况)必成功。
点赞  2016-11-12 21:55
引用: huo_hu 发表于 2016-11-12 21:55
调试spi先看时钟有信号没,接着看器件回送的数据(用示波器看信号),有的话再调整一下极性(四种情况)必 ...

好的,谢谢了
点赞  2016-11-12 22:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复