1.前言
1.1 SPI简介
SPI全称Serial Peripheral Interface,串行外设接口,是一种用于连接外设的全双工通信总线。主机和从机支持一对一或一对多通讯连接。
图1 SPI物理层通讯连接
表1 Signal description
1.2 SPI特征
串行,每个时钟周期只传输1bit数据;
同步,同步时钟由主机提供,SPI总线上的数据读写使用该时钟同步;
全双工,主机和从机之间数据通信使用两根独立的数据线。
2. SPI的用途
主要用于ADC、 LCD 等设备与 MCU 间的通讯,常用来传递MCU的控制信息。
3. SPI原理
从起始信号/停止信号和数据有效性(采样点,读数据时机)的角度出发,可以将SPI通讯分为4种通讯模式,即其区别在于总线空闲时的时钟状态或数据采样时机。由此,衍生出以下定义:
(1)时钟极性(CPOL):空闲状态时,SCK (Serial Clock)的电平状态;
(2)时钟相位(CPHA):定义可以在时钟边沿进行采样,并区分奇数边沿采样和偶数边沿采样两种情况。
表2 SPI通讯模式
模式 | CPOL | CPHA | SCK空闲状态 | (触发)写数据时机 | 采样(读)时机 |
0 | 0 | 0 | 低电平 | 下降沿 | 奇数边沿,上升沿 |
1 | 0 | 1 | 低电平 | 上升沿 | 偶数边沿,下降沿 |
2 | 1 | 0 | 高电平 | 上升沿 | 奇数边沿,下降沿 |
3 | 1 | 1 | 高电平 | 下降沿 | 偶数边沿,上升沿 |
(1)Mode 0 (CPOL=0, CPHA=0):在SCLK的上升沿采样数据,数据在SCLK的下降沿改变;
(2)Mode 1 (CPOL=0, CPHA=1):在SCLK的下降沿采样数据,数据在SCLK的上升沿改变;
(3)Mode 2 (CPOL=1, CPHA=0):在SCLK的下降沿采样数据,数据在SCLK的上升沿改变;
(4)Mode 3 (CPOL=1, CPHA=1):在SCLK的上升沿采样数据,数据在SCLK的下降沿改变;
(a)
(b)
图3 CPOL/CPHA示例
从图3(a)可以看出,CPHA = 0的模式,主要用于开始信号发出后,数据线上的数据已准备好,从机必须立即(第一个时钟边沿)读取的情况。也就是说,片选信号拉低后,总线上的数据是有效的,即作为发送出去的第一个bit数据。而且,最后一次时钟边沿(编号16),其数据并没有被采样,即是一个无效值。
反过来,(b)中为CPHA = 1的情形,片选信号拉低后,总线上的数据是无效数据,需要在第一个时钟边沿先写入数据后,并在下一个时钟边沿进行采样。
在实际应用中,主设备和从设备必须配置为相同的模式才能正确通信。例如,如果主设备配置为Mode 0,那么从设备也必须配置为Mode 0,以确保数据在正确的时钟边沿被采样。
4. SPI规格
图4 tircore queued SPI概览
(1)可配置的时钟频率范围(时钟分频);
(2)主从设备通讯时,通讯速率受限于低速率设备,即CLK = min(clk_master,clk_slave);
(3)CS引脚数量,限制了作为主机时最大可连接的从机数量;
(4)可配置的数据宽度,通常支持8bit,16bit,32bit,tricore甚至支持2~32bit全范围;
(5)收发缓冲区深度,大于1时通常为队列模式(queue,fifo);
(6)中断配置;
① 接收缓冲区有新数据,可配触发中断;
② 发送缓冲区不满,即有可用空间,可写入新数据时,可触发中断;
③ 错误上报中断:
- 接收缓冲区上溢出中断(错误处理,数据overflow);
- 接收缓冲区下溢出中断(错误处理,读空);
- 数据校验错误(ecc,奇偶校验等);
- 波特率错误,传输错误等;
(7)可配置数据收发方式
① 轮询模式;
② 中断模式;
③ DMA模式;
(8)回环模式(loop back);
(9)复位模式
(1)复位SPI状态机;
(2)复位整个SPI模块(both FIFOs, all registers and the state machine);
(10)调试支持(主从分开讨论)
① 调试模式模块挂起位,即调试暂停程序运行时(例如断点命中),应可配置SPI是否停止运行;
② 调试模式下的读操作,应保证不影响任何状态位(包括正常工作模式下的读清零标志位,FIFO的内容及读写指针等),即不给程序正常执行带来副作用;
③ 调试期间的写操作;
5. SPI部分主要时序参数
表3 SPI时序参数描述
参数 | 描述 |
SckHighPulseDuration | SCK高电平脉冲时长; |
SckLowPulseDuration | SCK低电平脉冲时长 |
SckPeriod | SckHighPulseDuration + SckLowPulseDuration; |
DinSetupTime | 接收数据采样时刻前数据已有效(stable)时长; |
DinHoldTime | 接收数据采用时刻后数据保持有效的时长; |
DoutHoldTime | 发送数据写数据时刻后数据保持有效的时长; |
6. SPI错误处理
(1)overflow
① 写满
接收缓冲区发生数据覆写,即旧数据尚未读出(软件读取完成标志位未清零),新数据已到达,则新数据不应写入接受缓冲区,并触发接收缓冲区溢出中断。
② 总线阻塞或频率太低(用于与CPU通信)
SPI波特率很高,总线速度较慢或者阻塞,导致数据丢失;
(2)读空(underflow)
数据缓冲区中无有效数据,而发生了读取操作。
(3) 检测到波特率不匹配时,自动停止数据收发;
(4)移位寄存器溢出或收发缓冲区溢出时,自动停止通讯;