学习NRF24L01遇到好多问题,最不懂的就是SPI写时序函数,这是我在网上看到的代码,他们都这样写
/***************************************************************************
函数名称:SPI写时序函数
函数功能:NRF24L01的SPI写时序
***************************************************************************/
sbit MOSI=P1^0;
sbit MISO=P1^1;
.
.
.省略其它程序,看重点的
uchar SPI_RW(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
MOSI = (dat & 0x80);
dat = (dat << 1);
SCK = 1;
dat |= MISO; //看不懂为什么这样写
SCK = 0;
}
return(dat); //***********不知道返回什么************//
}
问题1:在网上看到,NRF24L01模块是全双工传输,在MOSI装好数据的同时,模块也将自己的状态信息放在MISO上,当时钟线置1,模块接收与发送数据。可是MISO发来的数据是什么?是STATUS状态寄存器的值吗?
问题2:dat |= MISO; dat为什么要这样写?这又跟第一个问题有关了,究竟MISO是什么信息。还有返回值dat是什么?有什么用?
麻烦路过的朋友发表一些见解,有时候看评论会激发很多灵感的。在下感激不尽!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
接收端初始化时要设置为接收模式,即SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //此后就不要更改它,
CE = 1; //确保它一直处于接收模式
然后再while循环里面判断IRQ是不是等于0,
while(1)
{
if(IRQ==0)
{
这里写接收数据后数据的处理,就是将它存放在你自定义的数组里
记得将IRQ清0;
}
}
为什么这样写,你得去查看模块说明书,在CONFIG寄存器第六位那里说,RX_DR产生中断会置IRQ为低电平,
这就说明接收到数据会置IRQ为低电平,而你在while循环前又是设置为接收模式,就是一直处于接收,一有数
据到来就置IRQ为低电平。
不知能不能解答你的问题。
一周热门 更多>