SPI是市面常见的通讯协议,是一种高速的全双工同步的通信总线,利用四根线控制,分别为
串行时钟线SCK,表示为当前控制的时钟信号,由主机控制,高位先行
主机输出从机输入MOIS
主机输入从机输出MISO
片选CS,可以表示为设备选择,当有多种从机设备时CS就可以作为控制信号,因此支持总线设备挂载多设备当CS为高电平的时候,MISO为高阻态保护主机
输出引脚配置位推挽输出,输入引脚配置位浮空或者上拉输入
主要负责的是三根线,分别是SCK,MOIS,MISO,SCK是主机控制通过发送时钟脉冲来确定上升沿和下降沿,通过不同设备来确定在时钟信号上升沿采集和下降沿采集,
解释完引脚的定义就可以说一下SPI 是怎么通信的,首先SPI是全双工的通信,所以在时序上面是通过两条线同时发送数据。在两个移位寄存器的数据交换中将数据传输
通信流程,就是当SPI主机先将CS拉低来来告诉从机准备通信,主机通过发送SCK时钟信号,来告诉从机上升沿接受下降沿发送,这个时候主机需要将要写入的数据发送到数据缓存区,缓存区经过移位寄存器,移位寄存器通过MOSI信号线将字节一位一位的发送给从机,同时从机的MISO接口接受到的数据经过移位寄存器一位一位的移到缓存区。
从机发送也是利用串行移位寄存器,通过MISO信号线将数据发送给主机,主机也通过MOSI接收到从机发来的数据,这样数据就通过同时交换完成。
通过两个移位寄存器的数据移位然后将数据发送给从机,通过移位寄存器的移动数据就可以将主机要发送的数据和从机要发送的数据发送成功,这个是主机发送从机也发送同时发送
也可以当主机发送,从机不发送,这样就需要配置从机发送,从机发送的数据不看他就行,
同理也可以主机不发送,从机发送,这样就需要主机设置0x00或者0xff来给从机发送数据,而从机正常发送数据,然后将数据存入缓存区内
总结就是SPI的通信原理其实就是两个移位寄存器,同时发送数据给对方,然后通过移位寄存器,相互将数据移位到对方,表示为发送一个字节接受一个字节。并将这个字节放入缓存区内
SPI 时序基本单元
起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
表示为片选的设备被选中然后低电平有效就可以开始进行数据传输
还有四种工作模式,在CPOL 时钟极性控制位,改位决定了SPI总线空闲时SCK时钟线的电平状态
CPL=0当SPI总线空闲SCK为低电平,CPL=1,当SPI总线空闲时,SCK时钟线为高电平
CPHA时钟相位控制位,该位决定了SPI总线上数据的采样位置
CPHA=0,SPI总线在时钟线的第一个跳变沿处采样数据
CPHA=1,SPI总线在时钟线的第二个跳变沿处采样数据
以上的四种状态表示为
CPOL表示控制SCK的空闲状况的高低电平
CPHA表示在在时钟的第几个边沿移出数据
模式1:CPOL=0空闲状态时,SCK为低电平 CPHA=1 SCK第一个边沿移出数据,第二个边沿移入数据,当CS片选位低电平时,主机SCK发送时钟脉冲,当一个边沿来临,就开始移出数据,第二个边沿就移出数据
模式0:CPOL=0 空闲状态时,SCK为低电平,CPHA=0,SCK第一个边沿移入数据,第二个边沿移出数据,因此如果SCK第一个边沿位低电平的时候,就需要提前移出数据,才能移入数据。可以理解为在0个边沿移出数据,在第1个边沿移入数据(模式0是比较常用的)
模式2:CPOL=1空闲状态时,SCK为高电平 CPHA=1 SCK第一个边沿移出数据,第二个边沿移入数据,当CS片选位低电平时,主机SCK发送时钟脉冲,当一个边沿来临,就开始移出数据,第二个边沿就移出数据
模式3:CPOL=0 空闲状态时,SCK为高电平,CPHA=0,SCK第一个边沿移入数据,第二个边沿移出数据,因此如果SCK第一个边沿位低电平的时候,就需要提前移出数据,才能移入数据。可以理解为在0个边沿移出数据,在第1个边沿移入数据
注意:SPI和IIC不同,没有第一个字节需要写入寄存器地址,而是有这对应的指令集,在SPI主机第一个发送的字节表示为指令,然后引导从机完成相应的功能,具体是需要看厂家的手册
在实际SPI编写中需要注意从机的指令地址,例如从机的读取地址是0x03,就需要主机发送0x03,然后接着发送字节进行交换看从机的设备手册如何写的,写入完数据,从机就可以开始发送数据给主机了通过移位寄存器,主机将数据接收到,这时主机需要设置输出为0xff或者0x00来和从机进行交换。