目录
一、初识SPI
1. 介绍
2. 特性
补:
二、物理层
1. SS (Slave Select)
2. SCK (Serial Clock)
3. MOSI (Master Output, Slave Input)
4. MISO (Master Input, Slave Output)
三、协议层
1. 基本通讯过程
2. 通信的起始和停止信号
3. 数据有效性
4. CPOL/CPHA及通信模式
四、SPI架构
1. 通信引脚
2. 时钟控制逻辑
3. 数据控制
4. 整体控制逻辑
五、通信过程
一、初识SPI
1. 介绍
SPI (Serial Peripheral Interface,串行外围设备接口) 协议是由摩托罗拉公司提出的通信协议。它被广泛地使用在ADC、LCD等设备与MCU间,适用于对通信速率要求较高的场合。
2. 特性
补:
(1)主或从 操作。
(2)支持 多主模式。
(3)8 个 主模式 波特率 预分频 系数(最大为 fpclk / 2)。
(4)从 模式频率(最大为 fpclk / 2)。
(5)主模式 和 从模式的 快速通信。
(6)主模式 和 从模式 下均可以 由软件或硬件 进行 NSS管理:主 / 从操作模式的 动态改变。
(7)可编程的 时钟极性 和 相位。
(8)可编程的 数据顺序,MSB 在前或 LSB 在前。
(9)可 触发中断 的专用发送 和 接收标志。
(10)SPI 总线 忙状态 标志。
(11)支持 DMA功能 的 1 字节 发送和接收 缓冲器:产生发送 和 接受请求。
二、物理层
SPI通信使用 3 条总线及片选线,3条总线分别为SCK、MOSI、 MISO,片选线为SS。
1. SS (Slave Select)
从设备选择信号线,常称为片选信号线,也称为NSS、CS。
当有多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这 3条总线;而每个从设备都有独立的一条NSS信号线,本信号线独占主机的一个引脚,即有多少个 从设备,就有多少条片选信号线。
IIC协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通信;而SPl协议中没有设备地址,它使用 NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中(片选有效),主机便可开始与被选中的从设备进行SPI通信。所以SPI通信以NSS线置低电平为开始信号,以 NSS线 被拉高作为结束信号。
2. SCK (Serial Clock)
时钟信号线,用于通信数据同步。由通信主机产生,决定了通信的速率。不同的设备支持的最高时钟频率不一样。两个设备之间通信时,通信速率受限于低速设备。
3. MOSI (Master Output, Slave Input)
主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即该线上数据的方向为主机到从机。
4. MISO (Master Input, Slave Output)
主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即该线上数据的方向为从机到主机。
三、协议层
1. 基本通讯过程
NSS、SCK、MOSI信号都由主机控制产生,而 MISO的信号由 从机产生,主机通过该 信号线读取 从机的数据。MOSI 与 MISO的信号 只在 NSS为低电平 的时候才有效,在 SCK的 每个时钟周期,MOSI 和 MISO 传输一位数据。
2. 通信的起始和停止信号
① 处 NSS信号 由高变低,是SPI通信的 起始信号。NSS是 每个从机各自 独占的 信号线,当从机在自己的 NSS线检 测到起始信号后,就知道自己被 主机选中,开始准备与主机通信。
⑥ 处 NSS信号 由低变高,是SPI通信的 停止信号,表示本次通信结束,从机的选中状态 被取消。
3. 数据有效性
SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。
MOSI 及 MISO 数据线 在SCK 的每个时钟周期 传输 一位数据,且 数据输入输出是同时进行的。数据传输时,MSB先行或LSB先行并没有作硬性规定( 一般都会采用MSB先行模式 )。
MOSI 及 MISO 的数据在 SCK的 上升沿 期间 变化输出,在 SCK的 下降沿时被采样( MOSI 及MISO 的数据有效 )。高电平时 表示数据 1,为低电平时 表示数据 0。其他时刻数据无效,MOSI 及 MISO 为下一次表示数据做准备。
SPI 每次数据传输可以 8位 或 16位 为单位,每次传输的单位 数 不受限制。
4. CPOL/CPHA及通信模式
为方便说明 SPI 的 4种通信模式,引入了“ 时钟极性CPOL ” 和 “ 时钟相位CPHA ” 的概念,用于区别 总线空闲时SCK的时钟状态以及数据采样时刻。
时钟极性CPOL是指 SPI通信设备 处于空闲状态 时,SCK信号线 的电平信号(即 SPl 通信开始前、NSS线为 高电平时 SC K的状态)。CPOL= 0 时,SCK 在空闲状态时 为低电平,CPOL= 1时,则相反。
时钟相位CPHA是指 数据的采样时刻。当 CPHA = 0时,MOSI 或 MISO 数据线 上的信号将会在 SCK时钟线 的 “ 奇数边沿 ” 被采样;当 CPHA = 1时,数据线在 SCK的 “ 偶数边沿 ” 被采样。
无论 CPOL 是 0 还是 1 ,因为配置的 时钟相位 CPHA=0,采样时刻 都是在 SCK 的奇数边沿( 注意当 CPOL=0 的时候,时钟的奇数边沿 是 上升沿,而 CPOL=1 的时候,时钟的 奇数边沿是下降沿 )。所以 SPI 的采样时刻 不是由 上升 / 下降沿 决定的。
MOSI 和 MISO 数据线 的有效信号 在 SCK的奇数边沿 保持不变,数据信号 将在 SCK奇数边沿时被采样,在非采样时刻,MOSI 和 MISO 的有效信号 才发生切换。
CPHA =1 时,不受CPOL的影响,数据信号在 SCK的 偶数边沿 被采样。
由 CPOL 及 CPHA 的 不同状态,SPl 分成了 4种模式。主机与从机 需要工作 在相同的模式下才可以 正常通信( 实际中采用较多的是 “ 模式0 ” 与 “ 模式3 ” )。
四、SPI架构
1. 通信引脚
SPI的所有硬件架构 都是从左侧的 MOSI、 MISO、SCK及NSS线 展开的。
SPI1 是APB2上的设备,最高通信速率达36Mbps,SPI2、SPI3 是APB1上的设备,最高通信速率为18Mbps。除了通信速率,在其他功能上没有差异。SPI3 用到了下载接口的引脚,这几个引脚 默认功能 是下载,第二功能 才是 lO口。如果 想使用SPI3接口,则在程序上必须 先禁用这几个 lO口 的下载功能。
2. 时钟控制逻辑
SCK线的时钟信号 由波特率发生器 根据 控制寄存器CR1中的BR[0:2]位控制,该位是对 fpclk时钟的 分频因子,对 fpclk 的分频结果就是 SCK引脚的 输出时钟频率。
fpclk频率 是指SPl所在的 APB总线频率,APB1为 fpclk1,APB2为 fpclk2。
通过 配置 控制寄存器CR 的CPOL位 及 CPHA位,可以把 SPI设置成 前面分析的 4种SPI 模式。
3. 数据控制
SPI 的 MOSI 及 MISO 都连接到 数据移位寄存器上,数据移位寄存器的数据来源于 目标接收、发送缓冲区以及MISO、MOSI线。
当向外发送数据的时候,数据移位寄存器以 “ 发送缓冲区 ” 为数据源,通过写 SPI的 数据寄存器 DR 把数据填充到 发送缓冲区 中,并把数据一位位地通过数据线 发送出去。当 从外部接收数据的时候,数据移位寄存器 把数据线采样到的数据一位位地存储到 “ 接收缓冲区 〞中,通过读 数据寄存器 DR,可以 获取接收缓冲区 中的内容。
其中 数据帧长度 可以通过 控制寄存器 CR1 的 DFF位 配置成 8位 及16位 模式;配置LSBFIRST位 可选择 MSB先行 还是 LSB先行。
4. 整体控制逻辑
负责 协调整个SPI外设,其工作模式根据 配置的控制寄存器 (CR1/CR2) 的参数而改变。
在外设工作时,控制逻辑会根据外设的工作状态修改状态寄存器SR,只要读取状态寄存器相关的寄存器位,就可以了解 SPI的工作状态。
控制逻辑还根据要求,负责控制产生 SPI中断信号、DMA请求 及 控制 NSS信号线。
实际应用中,一般不使用 STM32 SPl 外设 的 标准 NSS信号线,而是更简单地 使用普通的 GPIO,软件控制 它的电平输出,从而 产生通信起始 和 停止信号。
五、通信过程
1. 控制NSS信号线,产生起始信号。
2. 把 要发送的数据写入 数据寄存器DR中,该数据会被存储到 发送缓冲区。
3. 通信开始,SCK时钟开始运行。MOSI 把发送缓冲区 中的数据一位位 地传输出去;MISO 则把数据一位位地 存储进 接收缓冲区中。
4. 当发送完一帧数据 的时候,状态寄存器SR中的TXE标志位会被置1,表示传输完一帧,发送缓冲区已空;同样,当接收完一帧数据的时候,RXNE标志位会被置1,表示传 输完一帧,接收缓冲区非空。
5. 等到TXE标志位为1时,若还要继续发送数据,则再次往 数据寄存器DR写入数据即可;等到RXNE标志位为 1 时,通过读取数据寄存器DR可以 获取接收缓冲区中的内容。
假如 使能了 TXE 或 RXNE中断,TXE 或 RXNE置1时会产生 SPI中断信号,进入同一个中断服务函数。到SPI中断服务程序后,可通过 检查寄存器位 来了解是 哪一个事件,再分别进行处理。也可以使用 DMA方式 来收发 数据寄存器 DR 中的数据。
后面再进行补充。