NRF24L01

版权声明:本文为博主原创文章,如需转载,请注明出处 https://blog.csdn.net/qq_36554582/article/details/86494232

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信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
  • 外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

猜你喜欢

转载自blog.csdn.net/qq_36554582/article/details/86494232