参考:STM32控制NRF24L01无线模块进行通信
具体操作寄存器工作原理请上B站:
无线模块NRF24L01
注意:
**//注意:以下两个步骤十分重要,千万不要写错SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平 注意这里是空闲状态是低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第1个跳变沿数据被采样**
1、NRF24L01引脚说明:
CE:RX或TX模式选择
CSN:SPI片选信号
SCK:SPI时钟
MOSI:SPI数据输入 ,即主器件数据输出,从器件数据输入。
MISO:SPI数据输出 ,即主器件数据输入,从器件数据输出。
IRQ:可屏蔽中断脚
- 在CSN为低电平的情况下,CE协同CONFIG寄存器共同决定NRFL2401的状态。
- IRQ在中断时变成低电平。TxFIFO发送完毕且收到ACK时、RxFIFO收到数据、达到最大重发次数时会产生中断。
2、NRF24L01采用SPI通信协议:
- 采用主从方式工作,全双工,同步(需要时钟线)通信总线
- SCK信号线只由主设备控制,且数据为一位一位的进行传送
- SPI的数据输入和数据输出线独立
- MOSI:主机输出,从机输入。M:Master(主机),S:Slavel(从机)
- MISO:主机输入,从机输出
- 没有指定的流控制,没有应答机制确认是否接收到数据
- MOSI的意思就是说如果此芯片作为主机时,该引脚(MOSI引脚)就是输出,如果此芯片作为从机时,该引脚(MOSI)引脚就是输入。MISO与其类似的道理。
- 由于SPI采用两个移位寄存器来实现数据的交换,所以在八个时钟过后,主机的数据会发送到从机中,同时,从机的数据也会发送到主机中。
3、底层驱动时序图:
- 数据为先发高位,再发低位,在时钟SCK的上升沿,数据发送出去。
- 每次通信前,需要先发送命令位,即图中的C7-C0。
- S7-S0为status寄存器位。
- D7-D0为数据位。
3、相关指令操作:
- R_REGISTER:读寄存器指令,指令格式为000A AAAA,其中AAAAA为要读取的寄存器地址,使用时,只需要让该指令逻辑或上寄存器地址即可,或者让该指令加上寄存器地址。
- W_REGISTER:写寄存器指令,用法与读指令类似。
4、相关读写驱动程序:
(1)同步读写程序:
/****************************************************************************************************
/*功能:NRF24L01的 SPI同步读写时序
/****************************************************************************************************/
uchar SPI_RW(uchar reg)//在发送一字节的同时,还会收到一字节的数据
{uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (reg & 0x80); // 主机发送一字节数据的最高位reg = (reg << 1); // 主机将要发送的数据左移一位。注意SPI通信是先发高位,再发低位SCK = 1; // 拉高SCK时钟线reg |= MISO; // 获取从机发给主机的一位数据,将其放到主机寄存器的最低位SCK = 0; // 拉低SCK时钟线}return(reg); // 返回从机发给主机的数据
}
(2)读取寄存器内的内容的程序
/****************************************************************************************************
/*功能:NRF24L01的SPI读寄存器时序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{uchar reg_val;CSN = 0; // 片选信号拉低,低电平有效SPI_RW(reg); // 选择将要读的寄存器地址reg_val = SPI_RW(0); // 读取寄存器内的数据信息,此时又向被读的寄存器内写入了数据0,其实写多少都不影响我们对该寄存器内容的读操作。CSN = 1; // 片选信号拉高,终止SPI通信return(reg_val); // 返回寄存器里的内容
}
SPI相关基础知识:
- SPI Serial Peripheral interface 串行外围设备接口
- 它是一种高速的、全双工、同步的通信总线
- 同步的:有单独的时钟线
- 全双工:发送和接收也分别是独立的通信线
- SPI一般采用四根线通信
(1)SCLK:时钟信号
(2)CS:从设备片选信号,由主设备控制
(3)MOSI:主设备数据输出,从设备数据输入
(4)MISO:主设备数据输入,从设备数据输出
注:MOSI引脚的意思是说,如果当前设备是主机(Master)时,此引脚(MOSI)就是输出引脚,如果当前设备是从机(Slavel)时,此引脚(MOSI)就是输入引脚。
1、SPI内部结构简明图
由上图我们可以看出,主机和从机通过MOSI和MISO两根线进行相连,并且主从机内部都有一个移位寄存器。主从机共用一个时钟信号线,故称其为同步通信。SPI通信是按位进行的,即一个时钟只发送一位数据,且先发送高位再发送低位。当一个时钟上升沿到来时,主机的一位数据发送到从机,同时从机的一位数据也发送到了主机,即一个时钟脉冲的作用下,主从机实现了一位数据的交换,当八个时钟脉冲之后,主从机就实现了一个字节的交换,也就是说主机在向从机发送一个字节数据的同时,从机也会给主机发送一个字节的数据,这就是SPI通信的基本原理,和其他通信协议还是有区别的。
2、SPI通信原理总结:
- 硬件上为4根线
- 主机和从机都有一个串行移位寄存器,主机通过向他的SPI串行移位寄存器写入一个字节来发起一次传输。
- 串行移位寄存器通过MOSI信号线将字节传送给从机,从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
- 外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。