amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 1500|回复: 12

NRF24L01对STC15L2K60S2的INT3不能中断,接一下地就好了

[复制链接]
发表于 2015-8-20 16:21:45 | 显示全部楼层 |阅读模式
NRF24L01的IRQ接到STC15L2K60S2的外部中断INT3(P37),上电进入不了中断程序,没法读数据,但是用镊子把P37脚接地一下,就好了,然后就可以正常接收数据了。但是一断电再上电,又不能接收数据了,又要把P37短接地才行,不知道是怎么回事

外部中断3的初始化代码
void Ext3Init(void)//外部中断3
{
        INT_CLKO |= 0x20;//打开外部中断3
        EA = 1;
}

外部中断服务函数
void Ext3Isr(void) interrupt 11//外部中断3服务函数
{
        EA = 0;
        sta=SPI_Read(READ_REG+STATUS);        // 读取状态寄存其来判断数据接收状况       
        if(RX_DR)//接收完成
        {
                CE = 0;                
                SPI_Read_Buf(RD_RX_PLOAD,NRF24L01_RxBuf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer          
                NRF24L01_ClearRxFIFO();//清除RXFIFO
                NRF24L01_Rev_OK = 1;//NRF数据接收完成标志
        }
        if(TX_DS)//发送完成
        {
                NRF24L01_ClearTxFIFO();//清除TXFIFO
        }
        if(MAX_RT)//发送失败
        {
                NRF24L01_ClearTxFIFO();//清除TXFIFO
        }

        SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        CE = 1;//启动接收
        EA = 1;       
}

希望各位给分析一下
发表于 2015-8-20 16:38:02 | 显示全部楼层
先断开,用示波器看看NRF24L01的IRQ脚有没有对应的电平变化过来!你单片机端中断初始化不完全,还有最好把脚配置成输入模式!
 楼主| 发表于 2015-8-20 16:47:31 | 显示全部楼层
weare 发表于 2015-8-20 16:38
先断开,用示波器看看NRF24L01的IRQ脚有没有对应的电平变化过来!你单片机端中断初始化不完全,还有最好把 ...

1.如果用查询方式读取数据,一切都正常

2.查询方式读取数据时,示波器显示IRQ引脚有下降沿电平变化,中断方式时示波器显示IRQ的电平一直为高电平

3.INT3引脚(P37)已设置成高阻输入模式
    P3M0 = 0x00;
    P3M1 = 0x80;//INT3

4.中断方式时,上电进入不了中断,但是把中断管脚接一下地,就可以进入中断,然后一切就正常了,可以正常读取数据,
   但是再次上电后,问题依然是这样
发表于 2015-8-20 16:59:56 | 显示全部楼层
huaidan2088 发表于 2015-8-20 16:47
1.如果用查询方式读取数据,一切都正常

2.查询方式读取数据时,示波器显示IRQ引脚有下降沿电平变化,中 ...

那这样就不是很清楚了,可以试试外部中断0或者中断1行不行!
发表于 2015-8-20 22:28:44 | 显示全部楼层
STC官网的库函数例程有中断的测试程序,你试试,不会有问题的。
 楼主| 发表于 2015-8-21 16:17:23 | 显示全部楼层
小李非刀 发表于 2015-8-20 22:28
STC官网的库函数例程有中断的测试程序,你试试,不会有问题的。

每次上电之后,用镊子给中断管脚一个低电平,然后就可以正常中断收发数据了,一断电又不行了,还要外部给个低电平才行
发表于 2015-8-21 21:02:43 | 显示全部楼层
用中断方式时,示波器测测量信号是否正常?24L01是否能拉低单片机引脚?断开24L01和单片机中断的连接再测呢
 楼主| 发表于 2015-8-24 13:23:15 | 显示全部楼层
bit NRF24L01_RxPacket(uchar *rx_buf)
{
        bit flag=0;       
        sta=SPI_Read(READ_REG+STATUS);        // 读取状态寄存其来判断数据接收状况           //寄存器前面要加是读还是写
        if(RX_DR)                                // 判断是否接收到数据  如果置1则说明接到数据并且放置在接收缓存器
        {
            CE = 0;                
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer         
                SPI_Write_Reg(FLUSH_RX,NOP);//清除RXFIFO
                flag =1;                        //读取数据完成标志
        }
        SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        CE = 1;                          //很重要!启动接收!
        return flag;
}

这个接收数据包函数放到main()函数里进行查询接收,一切正常,可以正常接收

但是放到定时器中断里查询,就接收不到数据了
这时,状态寄存器sta=SPI_Read(READ_REG+STATUS);读出来的全是零
一直解决不了
 楼主| 发表于 2015-8-24 13:25:21 | 显示全部楼层
目前就只能在main()函数里进行查询接收才能用,但是整个项目又不能把接收包函数放到main()里来用
发表于 2015-8-24 14:49:53 | 显示全部楼层
对于IO口查询,不管在哪里查询,原则上是一样。
如果在主函数查询正常,在定时器中断查询不正常,则一般是软件逻辑的问题。

STC的小四轴和大四轴我都用24L01,我试了定时器中断查询或外中断读取,都没有问题,并没有LZ说的情况。
 楼主| 发表于 2015-8-24 18:39:12 | 显示全部楼层
小李非刀 发表于 2015-8-24 14:49
对于IO口查询,不管在哪里查询,原则上是一样。
如果在主函数查询正常,在定时器中断查询不正常,则一般是 ...

定时器查询搞定了,单片机用的是内部24Mhz时钟频率,NRF24L01的SPI最大速率是10M,加个延时就可以了

可是依然不明白同一个函数放在main()里可以,放在定时器中断里就不可以,main()里是一直查询,定时器是10ms查一下

中断方式还是不可以,测试了中断0和中断3,都是一上电接收到数据不中断,必须要用镊子把中断管脚接一下地,然后就可以正常中断了

断电后再上电,又是这样
发表于 2015-8-24 22:08:03 | 显示全部楼层
单片机初始化时间长了,NRF24L01中断早己过了。上电先调用一次中断服务
 楼主| 发表于 2015-8-25 17:01:55 | 显示全部楼层
问题解决了,之所以不能中断是因为在NRF24L01的初始化函数里CE=0了,芯片一直处于待机状态,
但是在中断里接收数据完毕之后会CE=1让芯片再次进入激活状态,所以没进中断之前芯片一直待机,
根本就没有接收数据,当然就发生不了中断了。这就是为什么必须要用镊子把中断管脚接地触发一下的原因了,
触发中断就会执行中断函数就会CE=1,不然芯片初始化之后一直是CE=0的
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-20 23:04

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表