目录
- 1.SPI总线
- 2.SPI的寻址方式
- 3.SPI的工作原理总结
- 4.SPI的通讯过程
- 5.SPI的极性和相位
- 6.IIC和SPI的异同
- 7.stm32中SPI配置中常用的寄存器
- 8.stm32中相关库函数
1.SPI总线
SPI是串行外设接口的缩写,SPI是一种高速的、全双工、同步的串行通信协议;SPI采用主从方式工作,一般有一个主设备和一个或多个从设备;SPI需要至少4根线,分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCLK(时钟)、CS(片选),SPI使用引脚较少且布线方便,所以越来越多的芯片集成了这种通信协议。
注: SPI总线一般不能使用多个主机,因为多个SPI通信协议的总线占用的仲裁机制会弱一些。
2.SPI的寻址方式
当主设备要和某个从设备进行通信时,主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平,根据从机而定)表示选中从机设备。
CS使能信号的选择
比如说当主设备要和从设备2进行通信,(假如说使能信号是低电平)那么就会在从设备2的片选信号上发送0,那么在从设备1和其他从设备(如果有的话)的片选信号上就要发送1,以保证主设备和从设备2的正常通信。
如何看一个芯片上的片选信号是需要高电平使能还是低电平使能。每个芯片上对应的元器件上都会有丝印,如果丝印是CS,那么就表示高电平使能,如果丝印是CS上面加横杠,那就表示低电平使能。
3.SPI的工作原理总结
- 硬件上为4根线。
- 主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
- 串行一位寄存器通过MOSI信号线将字节传送给从机,从机也将自己的串行一位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
- 外设的写操作和读操作时同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个直接,就必须发送一个空字节来引发从机的传输。
4.SPI的通讯过程
SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑“1”,低电平表示逻辑“0”;一个字节传送完成后无需应答即可开始下一个字节的传送(SPI的通信方式是没有应答信号这个说法的);SPI采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送。
SPI的通信过程中,其中时钟信号处于下降沿的时候,发送器发送数据,当时钟信号变为上升沿以后,接收器接收数据,这就是一个周期,后面不断重复这个过程,当这个周期持续8次以后,就发送了一位字节的数据;此后如果还有数据要进行发送,那么发送过程并不会中断,会继续这8个周期进行数据的发送,其中是先发高位再发低位。
5.SPI的极性和相位
SPI总线有四种不同的工作模式,取决于极性(CPOL)和相位(CPHL)这两个因素
CPOL表示SCLK空闲时的状态
- CPOL=0时,空闲时SCLK为低电平
- CPOL=1时,空闲时SCLK为高电平
CPHA表示采样时刻
- CPHA=0时,每个周期的第一个时钟沿采样
- CPHA=1时,每个周期的第二个时钟沿采样
由于极性和相位的组合,那么SPI就有四种工作模式,分别为以下四种:
1.CPOL=0,CPHA=0
第一种情况表示时钟线在空闲的时候是低电平,并且在下降沿的时候,发送器发送数据,在上升沿的时候,接收器接收数据。
2.CPOL=0,CPHA=1
第二种情况表示时钟线在空闲的时候是低电平,并且在上升沿的时候,发送器发送数据,在下降沿的时候,接收器接收数据。
3.CPOL=1,CPHA=0
第三种情况表示时钟线在空闲的时候是高电平,并且在上升沿的时候,发送器发送数据,在下降沿的时候,接收器接收数据。
4.CPOL=1,CPHA=1
第四种情况表示时钟线在空闲的时候是高电平,并且在下降沿的时候,发送器发送数据,在上升沿的时候,接收器接收数据。
需要说明的是,对于一个特定的从设备来说,一般在出厂时就会将其设计为某种特定的工作模式;我们在使用该设备时就必须保证主设备的工作模式和该从设备保持一致,否则是无法进行通信的;所以我们需要对主设备CPOL和CPHA进行配置。
6.IIC和SPI的异同
相同点:
1.均采用串行、同步的方式。
2.均采用TTL电平,传输距离和应用场景类似。
3.均采用主从方式工作。
不同点:
1.IIC为半双工,SPI为全双工。
2.IIC有应答机制,SPI无应答机制。
3.IIC通过向总线广播从机地址来寻址,SPI通过向对应从机发送片选信号来寻址。
4.IIC的时钟极性和时钟相位固定,SPI的时钟极性和时钟相位可调。
7.stm32中SPI配置中常用的寄存器
8.stm32中相关库函数
主要是在spi.h中的库函数
关于spi在stm32中具体配置和使用,我在后期会单独写一篇博客。
总结: 以上内容就是我对于spi总线协议知识的了解,希望各位大佬能帮我指正出错误,不胜感激!!!