SPI协议
SPI(Serial Peripheral Interface)串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和E2PROM、FLASH、实时时钟、数字信号处理器等器件的通信,它主要是主从方式通信,通常只有一个主机和数个从机。
SPI接口一般使用四条信号线通信:
MOSI(主输出从输入),MISO(主输入从输出),SCLK(时钟,必须的,其他信号线可以删减),CS(片选,CS引脚拉低选中该设备)
MSB与LSB:
首先传输一个字节的高位(MSB),最后传输该字节的低位(LSB),而SPI默认是MSB,但是多个字节的话是低字节先传输。
提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号CS进行管理。
数据线通过时钟线的边沿触发数据输出以及采样 根据CPOL和CPHA的不同可自定义是上升沿触发数据输出还是数据采样
时钟极性(CPOL)决定时钟SCLK空闲时间的电平:
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
时钟相位(CPHA)定义数据的采集时间:
CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样,在第二个边沿数据输出
CPHA=1,在时钟的第一个跳变沿(上升沿或下降沿)进行数据输出,在第一个边沿数据采样
如:CPOL=1,CPHA=1
此时SCLK空闲时间时为高电平,在第一个边沿时即SCLK从高电平拉到低电平的下降沿时进行数据输出,在第二个边沿时即从低电平拉到高电平的上升沿时进行数据采样。
对于下图的时序,我们易得出图中的SCLK的空闲电平为低电平,即CPOL=0;在时钟的第一个边沿(上升沿)进行数据输出(MOSI输出C7-C0),时钟的第二个边沿(下降沿)进行数据采样(MISO采样S7-S0),即CPHA=1;
综上,此时CPOL=0;CPHA=1;
要结束SPI协议就将SCLK拉回空闲态所处的电平状态。
一主多从
NRF24L01:
原理:利用单片机把它配置为接收模式或发送模式,还可以配置频道、地址、每次发送的字节数、是否带CRC校验、功率等。配置成发送模式以后,用单片机把要发送的数据写进去,它就会自动把数据发出去;配置成接收模式以后,单片机通过观察它的IRQ引脚,就可以知道是否接收到数据,IRQ为低电平,说明接收到了数据,单片机可以通过SPI口把接收到数据取出来。
注:CE引脚在配置前拉低,配置完成后拉高
**初始化流程:**首先得配置GPIO
1.选择通道并选择有效数据宽度
2.写入TX地址
3.写入RX地址,注意一致
4.使能自动ACK
5.使能通道的接收地址
6.设置自动重发配置(一个寄存器中包含延时时长与最大自动重发次数)
7.设置射频信道(共有125个信道,每个信道间隔1MHZ,默认02为2402MHZ,00即2400MHZ即2.4GHZ)
8.设置射频配置(包含发射接收功率,速率等)
9.配置工作模式(CONFIG寄存器选择发送还是接收模式,)
10.清除发送及接收的FIFO缓存
变更工作模式后最好清除发送及接收的FIFO缓存
两个2.4G模块成功通讯需要配置成信道、地址(目标对方地址TX_ADDR、本地接收地址通道0 RX_ADDR_P0)、数据宽度、速率相同
写寄存器数据:先发送要写入寄存器的地址,再发送寄存器要修改的数据
【要写入寄存器的地址组成:寄存器操作指令|寄存器地址(|表运算符按位或)】
读寄存器状态:发送要读出的寄存器地址,之后发送0xFF空操作同时会接收寄存器的数据
发送流程(带ACK):
主机发送数据,从机接收数据后发送ACK信号,主机收到ACK信号(通过接收管道0接收)后完成一次完整发送并产生TX DS中断且状态寄存器接收标志位置高(这需要配置CONFIG寄存器),且数据包一次最多发送32字节数据(Byte0用于统计数据包长度,Byte1-31是用户操作位)