最近在捣鼓NRF24L01,学习网上的代码时有个疑问。
这个是手册上NRF24L01读和写操作的时序图,我看网上的代码读写都写在一起了
//=============================================
//SPI读写函数,,同时从MISO引脚读取一个字节
//=============================================
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI = (num & 0x80); //往MOSI引脚写入一个字节
num = (num << 1);
SCK = 1;
num |= MISO;
SCK = 0;
}
return(num);
}
在写寄存器的时候用了下面的代码
//=============================================
//SPI写寄存器函数。主要功能:往reg中写入value
//附加功能:返回寄存器的状态字
//=============================================
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;
status = SPI_RW(reg);
SPI_RW(value);
CSN = 1;
return(status);
}
//====================================
status = SPI_RW(reg); 这个代码我一直没搞明白
我觉得应该先写,再读的顺序应该才对。
而SPI_RW(num);这个函数是写的同时返回读的值,读的值没什么意义吧?
再具体点,假设reg为0x01,因为0x01二进制位00000001
那么SPI_RW(reg)函数可以用下面图表表示
序号 写入 读出----------------------------1 0 A
2 0 B
3 0 C
4 0 D
5 0 E
6 0 F
7 0 G
8 0 H
-----------------------------------
返回的结果(二进制)是ABCDEFGH,我认为这个结果是不确定的,因为写入的值还没有写完,怎么能确定读出的值呢?
所以我认为status = SPI_RW(reg)的 status没有意义。
还请指教。
|