CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
SPI基础知识
一.SPI简介
二.SPI通信工作原理
-2.1.SPI的信号
-2.2.SPI通信数据传输步骤
三.SPI编程要点
-3.1.SPI初始化函数
-3.2.SPI数据传输函数
四.SPI的优缺点
-4.1.SPI的优点
-4.2.SPI的缺点
五.SPI的典型应用
回到顶部
SPI基础知识
一.SPI简介
二.SPI通信工作原理
-2.1.SPI的信号
-2.2.SPI通信数据传输步骤
三.SPI编程要点
-3.1.SPI初始化函数
-3.2.SPI数据传输函数
四.SPI的优缺点
-4.1.SPI的优点
-4.2.SPI的缺点
五.SPI的典型应用
回到顶部
# SPI基础知识 ## 一.SPI简介
SPI:Serial Peripheral Interface,串行外设接口,是一种常见的通用通信协议,SPI是单片机(或者SOC)与外设芯片通信的常用通信手段。 在SPI通信中,设备分为主机与从机。主机是控制设备(通常是单片机或者SOC),从机从主机获取指令。SPI协议有三线SPI与四线SPI,其中四线SPI最为常见,四线SPI包含四根信号线: - SCLK:或者SCK,时钟信号,由主机产生。 - CS:或者SS,片选信号,由主机产生。 - MOSI:Master Output Slave Input,数据线,主机输出,从机输入。 - MISO:Master Input Slave Output,数据线,主机输入,从机输出。 ![](images/2023-08-27-19-31-53-image.png) ## 二.SPI通信工作原理
### 2.1.SPI的信号
四线SPI包含四个信号: **1.时钟信号** SPI每个时钟周期传输一位数据,因此SPI数据传输的速率取决于时钟信号的频率。时钟信号是由主机配置生成的,因此SPI通信始终由主机启动。 设备共享时钟信号的通信协议称为同步通信。SPI是一种同步通信协议,SPI的主机与从机共享时钟信号。 **2.片选信号** 大部分SPI从设备的片选信号是低有效的。主机通过拉低从机的片选信号来使能通信。在空闲/非传输状态下,片选信号保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通信,如下图所示。 ![](images/2023-08-27-19-51-27-image.png) **3.MOSI和MISO信号** 主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据返回给主机,两者可以同时进行。所以SPI是一种全双工的通信协议。 ### 2.2.SPI通信数据传输步骤
SPI通信数据传输步骤如下: 1.主机拉低CS/SS引脚激活从机,紧接着主机开始输出时钟信号。 ![](images/2023-08-27-20-00-00-image.png) 2.主机通过MOSI将数据发送给从机。 ![](images/2023-08-27-20-01-33-image.png) 3.如果主机需要从机的数据,则从机通过MISO将数据返回给主机。 ![](images/2023-08-27-20-02-48-image.png) 4.完成一次通信之后,主机拉高CS/SS引脚,SPI进入空闲/非传输状态。 ## 三.SPI编程要点
对主机的SPI进行编程,即开发SPI驱动。SPI驱动通常需要至少两个函数:SPI初始化函数与SPI数据传输函数。 ### 3.1.SPI初始化函数
SPI初始化函数用来初始化主机的SPI,通常在主机初始化任务中调用,SPI初始化函数的编程要点: 1.SPI时钟周期或者频率,下图中tSCKL与tSCKH之和即为SPI时钟周期,例如对于1MHz的SPI时钟信号,时钟周期为1us。 2.SPI时钟极性CPOL: - CPOL=0时,时钟空闲时候的电平是低电平,当SCLK有效的时候是高电平 - CPOL=1时,时钟空闲时候的电平是高电平,当SCLK有效的时候是低电平 下图中SCK信号空闲时候的电平是高电平,因此CPOL=1。 3.SPI时钟相位CPHA: - CPHA=0时,数据移位发生在时钟下降沿 - CPHA=1时,数据移位发生在时钟上升沿 下图中数据移位(SDI信号)发生在时钟上升沿,因此CPHA=1。 4.片选信号与时钟信号时序关系参数,如下图中的tCSB_setup与tCSB_hold,通常SPI从设备数据手册中会标注这两个参数的最小值,通常要求主机中设置的参数比最小值稍大一些。 5.SPI数据位宽,几乎所有的单片机(或者SOC)都支持8位数据位宽,其它一些单片机(或者SOC)还支持4位、16位、32位等数据位宽。 ![](images/2023-08-27-20-18-49-image.png) ### 3.2.SPI数据传输函数
SPI数据传输函数用来给主从机之间传输数据,通常在主机周期性任务中调用,SPI数据传输函数的编程要点: 1. 因为一个SPI主机可以驱动多个从机,因此片选信号通常需要作为SPI数据传输函数的一个参数。 2. 因为SPI主机与从机之间通信的数据长度是不确定的,因此数据长度通常需要作为SPI数据传输函数的一个参数。 3. 因为SPI主机与从机之间的通信是双向的,因此需要一个参数存放主机发往从机的数据,需要另一个参数存放从机返回主机的数据,存放数据的参数可以使用指针或者数组。 ## 四.SPI的优缺点
任何一种通信方式都有优缺点,SPI通信也不例外。 ### 4.1.SPI的优点
- SPI通信不需要起始位与停止位,因此数据可以连续传输而不会中断,使用非常灵活,一次通信可以收发8个位,16个位,32个位甚至上千个位。 - SPI通信速率较高,低速SPI设备时钟频率在1MHz左右,高速SPI设备时钟频率在10MHz以上。 - SPI有独立的MOSI与MISO信号,可以同时发送和接收数据,效率较高。 ### 4.2.SPI的缺点
- SPI通信占用的引脚较多,四线SPI需要占用4个引脚。 - SPI没有任何形式的错误检查,用户如果需要错误检查的话,只能在应用层通过软件编码的方式进行。 ## 五.SPI的典型应用
SPI的典型应用有: - IO扩展,比如一些SPI接口的ADC芯片与DAC芯片可以扩展单片机的AD输入与DA输出。 - 传感器,比如一些SPI接口的压力传感器、温度传感器、加速度传感器等。 - 功率驱动,比如一些SPI接口的低端功率驱动芯片,高端功率驱动芯片等。 - 电源管理,比如一些SPI接口的电源管理芯片。 - 存储器,比如一些SPI接口的EEPROM芯片,FRAM芯片、FLASH芯片等。 - 处理器之间通信,单片机与单片机之间或者单片机与SOC之间可以通过SPI通信。