nRF24L01复位问题,忒惨~~
小菜这几天调试nRF24L01,功能都能实现,不过发了个困扰了我两天的问题:只有上电开始 nRF24L01才能正常工作,单是对单片机复位nRF24L01就工作不了,用示波器观察看出:中断脚IRQ一直被拉低,我用的IRQ下降沿作为AVR单片机的中断信号,现在上我的nRF24L01初始化函数,看有哪位仁兄能给我点建议!!
使用M128晶振 11.0592M
SPI速度:系统二分频
void nRF24L01_SPI_Initialization(void)
{
unsigned char temp;
CE_DDR = 1;
DDRG |= 0x10;
CE_PORT = 0;//初始化为待机模式
CSN_PORT_1;//非选择
MOSI_PORT = 1;
MISO_PORT = 1;
SCK_PORT = 0;
MOSI_DDR = 1;
MISO_DDR = 0;
SCK_DDR = 1;
SPCR = 0x50; // SPI允许,主机模式,MSB方式,查询方式,极性方式00,1/4系统时钟频率
SPSR = 0x01;
temp = SPSR;
temp = SPDR; // 清除SPI中断标志位,使SPI空闲
}
void nRF24L01_Initialization(void)
{
nRF24L01_Write_register(0x00,0x00);
delay_ms(100);
nRF24L01_Write_register(0x00,0x0F); //nrf上电,设为接收模式16位CRC,响应所有中断
nRF24L01_Write_register(0x01,0x01); //通道0 自动应答允许
nRF24L01_Write_register(0x02,0x01); //通道0 接收允许
nRF24L01_Write_register(0x03,0x03); //地址宽度为5字节
nRF24L01_Write_register(0x04,0x0E); //等待250+86us 自动重发15次
nRF24L01_Write_register(0x05,30); //设置工作频率,发送和接收必须一样
nRF24L01_Write_register(0x06,0x0F); //传输速率2M 发射功率0dBm
nRF24L01_Write_register_nData(0x0A,5,Address);//设置接收地址
nRF24L01_Write_register_nData(0x10,5,Address); //设置发送地址地址
nRF24L01_Write_register(0x11,32); //32字节有效数据
}
//24L01中断为低电平触发,可使用下降沿做为单片机触发信号
void INT4_24L01_Initialization(void)
{
EICRB |= 0x02; //INT4 下降沿触发
EIMSK |=0x10;
SFIOR |= 0x04;
DDRE.4= 0;
PORTE.4 = 1;
}
芯片资料上对掉电模式信号时这么描述的:
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544946.jpg
(原文件名:状态1.jpg)
这里是这么解释的:
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544947.jpg
(原文件名:状态2.jpg)
小菜是这么理解的:掉电后必须重新配置功能寄存器,才能进入发送或接收模式,单片机复位后都对nRF2401重新配置了的,我觉得应该不会是这个问题,不知道哪位大侠遇到这个问题是怎么解决的,能否给小菜点意见?? 24l01响应所有中断后,有没有清其寄存器啊?07寄存器 有的 没进一次中断都会清中断标志的 时间不多了用了个mos管当电源开关现在我们又不用考虑成本 试下在说吧 回复【2楼】Npng 卷心菜
-----------------------------------------------------------------------
用查询 别用中断~~ 兄弟。。你的问题和我一模一样啊!!!连一个字都不差!!! 我也是这个问题,用的是nRF24L01+,难道就没有人有解决方案么…… 我的也是,每次要NRF24L01重新上电才工作~~~ nRF24L01_Write_register(0x00,0x00);
delay_ms(100);
nRF24L01_Write_register(0x01,0x01); //通道0 自动应答允许
nRF24L01_Write_register(0x02,0x01); //通道0 接收允许
nRF24L01_Write_register(0x03,0x03); //地址宽度为5字节
nRF24L01_Write_register(0x04,0x0E); //等待250+86us 自动重发15次
nRF24L01_Write_register(0x05,30); //设置工作频率,发送和接收必须一样
nRF24L01_Write_register(0x06,0x0F); //传输速率2M 发射功率0dBm
nRF24L01_Write_register_nData(0x0A,5,Address);//设置接收地址
nRF24L01_Write_register_nData(0x10,5,Address); //设置发送地址地址
nRF24L01_Write_register(0x11,32); //32字节有效数据
nRF24L01_Write_register(0x00,0x0F); //nrf上电,设为接收模式16位CRC,响应所有中断
我按照这样写 貌似解决了这个问题。./emotion/em003.gif
一开始没有写这句nRF24L01_Write_register(0x00,0x00); 出现和楼主一摸一样的问题。不知其他人是怎么解决的./emotion/em025.gif NFR2401,正打算玩这个,学习了!记号! 用 JLink.exe 命令行 >r 然后再>g (用jlink复位stm32).还是会出现楼主的问题。
只能重新上电,这样用着慌兮兮的…… 初始化的时候 再增加一条 SPI_CMD(FLUSH_RX);
应该可以解决这个问题。./emotion/em020.gif 如果用中断一定要把中断设成低电平触发。中断里面读sta状态再写回去,这样在中断里IRQ自动被nRF24L01拉高。{:huffy:} 你看下状态寄存器 是不是发生了最大重发中断了 也会拉低你的中断脚的 初始化后,清一下中断 acmilann 发表于 2011-10-26 15:54
nRF24L01_Write_register(0x00,0x00);
delay_ms(100);
nRF24L01_Write_register(0x01,0x01); / ...
呦西,谢谢楼主,终于解决问题了 我也遇到过一样的问题
纠结中的我,观望一下, acmilann 发表于 2011-10-26 15:54
nRF24L01_Write_register(0x00,0x00);
delay_ms(100);
nRF24L01_Write_register(0x01,0x01); / ...
一人一个不同的问题, 我加上你的代码,我的程序都跑不动了。 煮酒fu 发表于 2014-7-10 11:44
一人一个不同的问题, 我加上你的代码,我的程序都跑不动了。
我也遇到了同样的问题,不知道都是怎么解决的呢? 问题解决了,就是楼主提到的那个问题,从POWERDOWN模式到tx模式,延时时间要够长~ 感谢 我也是,一番发一个数据之后必须断电重启后才能发数据
页:
[1]