初学者对于NRF24L01的SPI读写时序的疑问?
时间:10-02
整理:3721RD
点击:
/*****************SPI时序函数******************************************/
unchar NRFSPI(unchar date)
{
unchar i;
for(i=0;i<8;i++) // 循环8次
{
if(date&0x80)
MOSI=1;
else
MOSI=0; // byte最高位输出到MOSI
date<<=1; // 低一位移位到最高位
SCLK=1;
if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01; // 读MISO到byte最低位
SCLK=0; // SCK置低
}
return(date); // 返回读出的一字节
}
/*****************SPI读取RXFIFO寄存器的值********************************/
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)
{ //寄存器地址//读取数据存放变量//读取数据长度//用于接收
unchar BackDate,i;
CSN=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址
for(i=0;i<DateLen;i++) //读取数据
{
RxDate[i]=NRFSPI(0); //??
}
CSN=1;
return(BackDate);
}
上面标注问号的是疑问之处,在写入要读取的寄存器地址,要读取数据,但是要调用函数NRFSPI要加形势参数,于是NRFSPI(0)。但是,NRFSPI(0)不是向NRF24L01发操作命令要读取config寄存器的数据吗?
数据手册 操作命令:R_REGISTER 000A AAAA 读配置寄存器;
那么在写完之后的下一个循环里,又一次NRFSPI(0),读到的应该是config寄存器的值,如此循环下去,读到的都会是config寄存器的值啊?
unchar NRFSPI(unchar date)
{
unchar i;
for(i=0;i<8;i++) // 循环8次
{
if(date&0x80)
MOSI=1;
else
MOSI=0; // byte最高位输出到MOSI
date<<=1; // 低一位移位到最高位
SCLK=1;
if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01; // 读MISO到byte最低位
SCLK=0; // SCK置低
}
return(date); // 返回读出的一字节
}
/*****************SPI读取RXFIFO寄存器的值********************************/
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)
{ //寄存器地址//读取数据存放变量//读取数据长度//用于接收
unchar BackDate,i;
CSN=0;//启动时序
BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址
for(i=0;i<DateLen;i++) //读取数据
{
RxDate[i]=NRFSPI(0); //??
}
CSN=1;
return(BackDate);
}
上面标注问号的是疑问之处,在写入要读取的寄存器地址,要读取数据,但是要调用函数NRFSPI要加形势参数,于是NRFSPI(0)。但是,NRFSPI(0)不是向NRF24L01发操作命令要读取config寄存器的数据吗?
数据手册 操作命令:R_REGISTER 000A AAAA 读配置寄存器;
那么在写完之后的下一个循环里,又一次NRFSPI(0),读到的应该是config寄存器的值,如此循环下去,读到的都会是config寄存器的值啊?