显然对于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; //下降沿来了(SCK从1-->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; //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件
44 u8_writedata <<= 1; //左移抛弃已经输出的最高位
45 SCK = 0; //拉低SCK信号,初始化为0
46 }
47 }
在此基础可以写出nRF24L01寄存器的读写函数。
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; //上升沿来了(SCK从0-->1),数据总线上的数据写入器件
99 if(MISO) //读取最高位,保存至最末尾,通过左移位完成读整个字节
100 u8_readdata |= 0x01;
101 else
102 u8_readdata &= ~0x01;
103
104 SCK = 0; //下降沿来了(SCK从1-->0),MISO上将产生新的数据,读取存入u8——readdata
105 }
106 return u8_readdata;
107 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论