SPI是串行外围总线接口,高速的全双工,同步的通信总线,其在芯片上占用四根引脚。
MISO:主设备数据输入,从设备数据输出;
MOSI:主设备输出,从设备输入;
SCLK:时钟信号,由主设备产生
CS:片选信号
两个非常重要的参数:
CPOL:时钟极性 ;0表示空闲时的电平时低电平,1表示空闲时的电平是高电平。
CPHA:时钟相位;0表示数据在第一个时钟跳变沿,1表示第一个时钟跳变沿采集数据。
- /*
- ** 函数名: nRF24L01_WriteReg
- ** 返回值: None
- ** 参 数 : (1)uint8 addr--寄存器地址
- ** (2)uint8 value--写入值
- ** 说 明 : nRF24L01寄存器写函数
- */
- void nRF24L01_WriteReg(uint8 addr, uint8 value)
- {
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|WR); //SPI写地址命令
- SPI_Write_OneByte(value); //SPI写数据
- CSN_ON(); //CS片选拉高
- }
nRF24L01读寄存器函数:
- /*
- ** 函数名: nRF24L01_ReadReg
- ** 返回值: value--读取寄存器值
- ** 参 数 : addr--寄存器地址
- ** 说 明 : nRF24L01寄存器读函数
- */
- uint8 nRF24L01_ReadReg(uint8 addr)
- {
- uint8 value;
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|RR); //SPI写地址命令
- value = SPI_Read_OneByte(); //SPI读数据
- CSN_ON(); //CS片选拉高
- return value;
- }
- /*
- ** 函数名: nRF24L01_WriteReg
- ** 返回值: None
- ** 参 数 : (1)uint8 addr--寄存器地址
- ** (2)uint8 value--写入值
- ** 说 明 : nRF24L01寄存器写函数
- */
- void nRF24L01_WriteReg(uint8 addr, uint8 value)
- {
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|WR); //SPI写地址命令
- SPI_Write_OneByte(value); //SPI写数据
- CSN_ON(); //CS片选拉高
- }
- nRF24L01读寄存器函数:
- /*
- ** 函数名: nRF24L01_ReadReg
- ** 返回值: value--读取寄存器值
- ** 参 数 : addr--寄存器地址
- ** 说 明 : nRF24L01寄存器读函数
- */
- uint8 nRF24L01_ReadReg(uint8 addr)
- {
- uint8 value;
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|RR); //SPI写地址命令
- value = SPI_Read_OneByte(); //SPI读数据
- CSN_ON(); //CS片选拉高
- return value;
- }
- /*
- ** 函数名: nRF24L01_WriteReg
- ** 返回值: None
- ** 参 数 : (1)uint8 addr--寄存器地址
- ** (2)uint8 value--写入值
- ** 说 明 : nRF24L01寄存器写函数
- */
- void nRF24L01_WriteReg(uint8 addr, uint8 value)
- {
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|WR); //SPI写地址命令
- SPI_Write_OneByte(value); //SPI写数据
- CSN_ON(); //CS片选拉高
- }
- nRF24L01读寄存器函数:
- /*
- ** 函数名: nRF24L01_ReadReg
- ** 返回值: value--读取寄存器值
- ** 参 数 : addr--寄存器地址
- ** 说 明 : nRF24L01寄存器读函数
- */
- uint8 nRF24L01_ReadReg(uint8 addr)
- {
- uint8 value;
- CSN_OFF(); //CS片选拉低
- SPI_Write_OneByte(addr|RR); //SPI写地址命令
- value = SPI_Read_OneByte(); //SPI读数据
- CSN_ON(); //CS片选拉高
- return value;
- }
四种工作模式:
Mode 0 CPOL=0, CPHA=0
Mode 1 CPOL=0, CPHA=1
Mode 2 CPOL=1, CPHA=0
Mode 3 CPOL=1, CPHA=1常使用Mode0和Mode3,即在上升沿进行数据的采样和锁存
COPL:时钟极性。表示在没有数据传输时时钟的空闲状态电平。
0:SCK 引脚在空闲状态为低电平
1:SCK 引脚在空闲状态为高电平
CPHA:时钟相位。表示在第几个时钟边沿进行采样。
0:SCK 时钟的第一个边沿进行数据位采样,数据在第一个时钟边沿被锁存。
1:SCK 时钟的第二个边沿进行数据位采样,数据在第二个时钟边沿被锁存。