〇 写在前面
本人本科硕士皆是天坑专业,后自学转行去做了嵌入式软件开发,曾在华为和大疆等公司任职。
在转行自学的过程中,困难艰辛不必多说,幸运的是得到了网上很多大佬的帮助。现在不敢说小有所成,也算是偶有心得,回顾一路以来的困顿苦恼,决定把自己的一些经验拙见写成博客带给大家,希望能够帮助大家。也欢迎大家积极留言互动问问题,看到消息都会回复的。
最后,如果觉得文章有用或者能够帮助到你,麻烦点个赞给个关注支持一下,你的点赞关注是对我的最大肯定和支持,也是我不断创作的动力,同时也让我满足一下虚荣心,哈哈~
一 啥是SPI
SPI 全称是Serial Peripheral interface(串行外围设备接口),由摩托罗拉首次定义并开发。
二 硬件连接
1. 架构
spi采用的是主从模式,在spi通讯系统中,有且只有一个主机(master),可以有一个或者多个从机(slave)。
2. 信号线与连接
spi接口一般有4条信号线,分别是:
- SCLK (Serial Clock):时钟信号线,由主设备产生,用于同步数据传输。
- MOSI (Master Out Slave In):主设备输出从设备输入的数据线。
- MISO (Master In Slave Out):主设备输入从设备输出的数据线。
- SS (Slave Select):片选信号线,用于选择特定的从设备。每个从设备都有独立的SS线。
连接线如图:
三 spi模式
这里引入时钟极性和时钟相位的概念:
- 时钟极性(CPOL, Clock Polarity)
时钟极性有0和1之分,当CPOL=0时,SCLK 信号在空闲时为低电平。CPOL=1时,表示 SCLK 信号在空闲时为高电平。 - 时钟相位(CPHA,Clock Phase)
时钟相位也有0和1之分,当CPHA=0时,表示数据在 SCLK 信号的第一个边沿(上升沿或下降沿)被采样。当CPHA=1时,表示数据在 SCLK 信号的第二个边沿(下降沿或上升沿)被采样。
CPHA与CPOL组合,则有四种采样模式,如下表:
spi模式 | CPOL | CPHA | 解析 |
---|---|---|---|
0 | 0 | 0 | 空闲时SCK为低电平,数据在SCLK上升沿采样,下降沿传输 |
1 | 0 | 1 | 空闲时SCK为低电平,数据在SCLK下降沿采样,上升沿传输 |
2 | 1 | 0 | 空闲时SCK为高电平,数据在SCLK下降沿采样,上升沿传输 |
3 | 1 | 1 | 空闲时SCK为高电平,数据在SCLK上升沿采样,下降沿传输 |
图解:
- CPHA = 1时:
- CPHA = 0时:
注: 实际上当SS信号拉低后,master立刻产生sclk信号,并非如图在下一个完整周期才产生信号,图解只是为了更清晰的呈现采样过程。
四 通信流程帧格式
以上图,master与slave0通信为例,且CPOL=1,CPHA = 1。
1.空闲状态
- SCKL为高电平
- MOSI和MISO的电平取决于硬件。当被置为高组态时,其信号处于不确定的状态。当连接上拉或者下拉电阻时,则会被固定为高电平或者低电平。具体的电平状态取决于硬件设置。
- SS0和SS1均处于高电平(未选中状态)
如下图:
2.通信状态
以mosi和miso信号线被下拉,即空闲时为低电平为例,流程为:
1. SS信号被拉低。
2. SCLK在SS信号被拉低后产生方波信号(在ss信号被拉低后立刻产生,并非在下个完整周期产生,图中只是为了便于讲解)。
3. MOSI和MISO信号线上产生高低电平以传输数据。
4. 数据传输完成后,SS信号被拉高,SCLK信号为高电平,MOSI和MISO为低电平。
图解如下:
讲解:
-
对于spi通来说,没有对一次传输的数据长度做规定。
即在开始信号和结束信号之间,可以为8位,16位甚至更长,需要根据具体的硬件手册和设计来进行具体分析。 -
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。
要理解这句话,需要从spi硬件入手,在 SPI 硬件设计中,主机和从机通常都有至少一个移位寄存器来处理数据的发送和接收。但是,具体到硬件实现,不同的 SPI 控制器可能有不同的架构和设计,所以移位寄存器的数量可能会有所不同。
以最简单的spi控制器,即主从设备都只有一个8位移位寄存器为例(如stm32f4xx的片内spi设备),通信过程是这样的:
从图中可以看出,两个移位寄存器通过MISO和MOSI两条线构成了一个环形。其具体流程如下:
(1)主设备将移位寄存器的最高位放置MOSI上,同时从设备将移位寄存器的最高位放在MISO上。
(2)主设备移位寄存器向左移动一位,从设备移位寄存器向左移动一位。
(3)主设备从MISO读取一个位,并将数据放在移位寄存器最右侧的位置。从设备从MOSI上读取一个位,并将设局放在移位寄存器最右侧俄位置上。
举个例子:
主设备移位寄存器中数据为0b01101101,从设备移位寄存器中的数据为0b01001001,现要将数据 0b10011100 从主设备发送至从设备。且CPHA = 1 ,CPOL = 1,大端在前。
整体时序图如下:
- 初始状态:
- 第一步:
对应时序图中的1,SS信号拉低,SCLK产生时钟信号,主设备将内存中需要发送的数据写入到移位寄存器中,。
- 第二步:
对应时序图的2,主设备将移位寄存器的最高位1放在MOSI上,从设备将最高位0放在MISO上,同时主从两个设备的移位寄存器都向左移动一位。
- 第三步:
对应时序图的3,主设备从MISO上采样数据,并将得到的数据放在移位寄存器的最右侧,同时从设备从MOSI上采样数据,并将得到的数据放在移位寄存器的最右侧。
之后重复第二第三步,直到数据传输完成。
五 总结和补充
1.优缺点:
优点:
- 高速 (最高50MHz,具体取决于硬件)
- 全双工 (接收和发送同时进行)
- 同步 (有单独的时钟信号来确保同步)
缺点:
- 布线复杂性:
对于每个从设备,都需要一条独立的 SS 线,这可能导致在连接多个从设备时引脚数量增加,从而增加了布线的复杂性。 - 有限的通信距离:
由于 SPI 是一种高速通信协议,信号衰减和反射等问题可能会限制通信的有效距离。SPI 通常用于短距离通信,不适合远距离数据传输。 - 没有内置的错误检测机制:
SPI 协议本身没有内置的错误检测机制,如 CRC 校验码,这可能需要在软件层面上添加额外的错误检测功能。 - 主控性:
SPI 通信完全由主设备控制,这意味着从设备不能主动发起通信,所有的数据交换都必须由主设备发起。
2.一些补充
- 从上面讲解可知,spi的主从设备必须选择同样的模式才可正常工作。
- 在硬件连接上,连接多从机还有一种菊花链的方式,该方式在多从机的情况下仅使用一个SS信号,节约引脚,但是较为复杂,不常见,故只做简述,有兴趣的可以自行搜索学习。
如果帮助到你,麻烦点个赞给个关注,你的支持和关注是我持续更新的动力!谢谢~