最近在捣鼓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没有意义。 
还请指教。 
 
 
 
 
 
 
 
 
 |   
     
  
 |