显然对于nRF24L01来说上升沿输入,下降沿输出。也即是说:MCU在时钟信号的上升沿时写(write),下降沿时读(read).

单字节读时序:
1 /*
2 **函数名 : SPI_Read_OneByte
3 **返回值 : temp--SPI读取的一字节数据
4 **  : None
5 **  : 下降沿读数据,每次读取 1 bit
6 */
7 uint8 SPI_Read_OneByte(void)
8 {
9   uint8 i;
10   uint8 temp = 0;
11  
12   for(i=0;i<8;i++)
13   {
14   temp <<= 1;      //读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为:
15                     //读取最后1byte的最后一位(LSB)之后,不能再左移了
16   SCK = 1;       
17   if(MISO)          //读取最高位,保存至最末尾,通过左移位完成读整个字节
18     temp |= 0x01;
19     else
20     temp &= ~0x01;
21   SCK = 0;          //下降沿来了(SCK1-->0)MISO上的数据将发生改变,稳定后读取存入temp
22   }
23  
24   return temp;
25 }
单字节写时序:
26 /*
27 **函数名 : SPI_Write_OneByte
28 **返回值 : None
29 **  : u8_writedata--SPI写入的一字节数据
30 **  : 上升沿写数据,每次写入 1 bit
31 */
32 void SPI_Write_OneByte(uint8 u8_writedata)
33 {
34   uint8 i;
35  
36   for(i=0;i<8;i++)
37   {
38     if(u8_writedata & 0x80)      //判断最高位,总是发送最高位
39     MOSI_ON;                    //MOSI输出1,数据总线准备数据1
40     else
41     MOSI_OFF;                  //MOSI输出0,数据总线准备数据0
42    
43     SCK = 1;                    //上升沿来了(SCK0-->1),数据总线上的数据写入到器件
44     u8_writedata <<= 1;          //左移抛弃已经输出的最高位
45     SCK = 0;                    //拉低SCK信号,初始化为0
46   }
47 }
在此基础可以写出nRF24L01寄存器的读写函数。
nRF24L01寄存器写入函数:
48 /*
49 **函数名: nRF24L01_WriteReg
50 **返回值: None
51 ** : (1)uint8 addr--寄存器地址
52 **        (2)uint8 value--写入值
53 ** : nRF24L01寄存器写函数
54 */
55 void nRF24L01_WriteReg(uint8 addr, uint8 value)
56 {
57     CSN_OFF();                  //CS片选拉低
58     SPI_Write_OneByte(addr|WR); //SPI写地址命令
59     SPI_Write_OneByte(value);  //SPI写数据
60     CSN_ON();                  //CS片选拉高
61 }
nRF24L01读寄存器函数:
62 /*
63 **函数名: nRF24L01_ReadReg
64 **返回值: value--读取寄存器值
65 ** : addr--寄存器地址
66 ** : nRF24L01寄存器读函数
67 */
68 uint8 nRF24L01_ReadReg(uint8 addr)
69 {
70     uint8 value;
71     CSN_OFF();                  //CS片选拉低
72     SPI_Write_OneByte(addr|RR);  //SPI写地址命令
73     value = SPI_Read_OneByte();  //SPI读数据
74     CSN_ON();                    //CS片选拉高
75     return value;
76 }

注:可以整合读写程序如下:
77 /*
78 **函数名 : SPI_WriteAndRead_OneByte
79 **返回值 : u8_readdata--SPI读取的一字节数据
80 ** : u8_writedata--SPI写入的一字节数据
81 ** : 上升沿写,下降沿读
82 */
83 uint8 SPI_WriteAndRead_OneByte(uint8 u8_writedata)
84 {
85   uint8 i;
86   uint8 u8_readdata = 0x00;
87    
88   for(i=write的返回值0;i<8;i++)
89   {
90     u8_readdata <<= 1;      //读取MISO 8次输入的值,存入u8_readdata
91      
92     if(u8_writedata & 0x80) //判断最高位,总是写最高位(输出最高位)
93       MOSI_ON;              //MOSI输出1,数据总线准备数据1
94     else
95       MOSI_OFF;            //MOSI输出0,数据总线准备数据0
96     u8_writedata <<= 1;    //左移抛弃已经输出的最高位
97      
98     SCK = 1;                //上升沿来了(SCK0-->1),数据总线上的数据写入器件
99     if(MISO)                //读取最高位,保存至最末尾,通过左移位完成读整个字节
100       u8_readdata |= 0x01;
101     else
102       u8_readdata &= ~0x01;
103        
104     SCK = 0;                //下降沿来了(SCK1-->0)MISO上将产生新的数据,读取存入u8——readdata
105   }
106   return u8_readdata;
107 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。