SPI协议
SPI协议
目录
本章包括下列主题:
20
接口 (SPI)
串行外设
20.1 简介
串行外设接口(Serial Peripheral Interface,SPI)模块是一个同步串行接口,可用于与其他外设
或者单片机进行通信。这些外设可以是串行 EEPROM、移位寄存器、显示驱动器和 A/D 转换器
等。 SPI 模块与 Motorola 的 SPI 和 SIOP 接口兼容。
dsPIC30F 系列器件在单个器件上提供一个或两个 SPI 模块,具体取决于具体不同的器件。 SPI1
和 SPI2 功能相同。很多高引脚数 (64 引脚或更多)封装的器件具有 SPI2 模块,而 SPI1 模块
则是所有的器件都具有的。
SPI 串行接口由以下四个引脚组成:
• SDIx:串行数据输入
• SDOx:串行数据输出
• SCKx:移位时钟输入或输出
• SSx:低电平有效从动选择或者帧同步 I/O 脉冲
内部
数据总线
SPIxBUF
寄存器共享地址单元 SPIxBUF
SPIxRXB SPIxTXB
发送
接收
SPIxSR
SDIx bit 0
SDOx fff 移位
控制
从动模式选择 时钟 边沿
和帧 控制 选择
SSx 同步控制
辅助 主
预分频器 预分频器 FCY
1:1 → 1:8 1, 4, 16, 64
SCKx
使能主控时钟
20
接口 (SPI)
串行外设
20.2 状态和控制寄存器
高字节:
R/W-0 U-0 R/W-0 U-0 U-0 U-0 U-0 U-0
SPIEN - SPISIDL - - - - -
bit 15 bit 8
低字节:
U-0 R/W-0 U-0 U-0 U-0 U-0 R-0 R-0
HS
- SPIROV - - - - SPITBF SPIRBF
bit 7 bit 0
图注:
R = 可读位 W = 可写位 U = 未用位,读作 0
HC = 由硬件清零 HS = 由硬件置位
-n = 复位时的值 1 = 置位 0 = 清零 x = 未知
高字节:
U-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0
- FRMEN SPIFSD - DISSDO MODE16 SMP CKE
bit 15 bit 8
低字节:
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
SSEN CKP MSTEN SPRE<2:0> PPRE<1:0>
bit 7 bit 0
bit 15 未用:读作 0
bit 14 FRMEN: 帧 SPI 支持位
1 = 使能帧 SPI 支持
0 = 禁止帧 SPI 支持
bit 13 SPIFSD:SSx 引脚上的帧同步脉冲方向控制位
1 = 帧同步脉冲输入 (从动模式)
0 = 帧同步脉冲输出 (主控模式)
bit 12 未用:读作 0
bit 11 DISSDO:SDOx 引脚禁止位
1 = 模块不使用 SDOx 引脚。该引脚由相关端口寄存器控制。
0 = SDOx 引脚由模块控制
bit 10 MODE16:字 / 字节通信选择位
1 = 通信为字宽 (16 位)
0 = 通信为字节宽 (8 位)
bit 9 SMP:SPI 数据输入采样相位位
主控模式:
1 = 输入数据在数据输出时间末尾采样
0 = 输入数据在数据输出时间中间采样
从动模式:
当 SPI 在从动模式下使用时,必须将 SMP 清零。
bit 8 CKE:SPI 时钟沿选择位
1 = 串行输出数据在有效时钟状态转变为空闲时钟状态时变化 (参见 bit 6)
0 = 串行输出数据在空闲时钟状态转变为有效时钟状态时变化 (参见 bit 6)
注: 在帧 SPI 模式下未使用 CKE 位。在帧 SPI 模式下 (FRMEN = 1),用户应将该位编程为 0。
bit 7 SSEN:从动选择使能 (从动模式)位
1 = SS 引脚用于从动模式
0 = 模块不使用 SS 引脚。引脚由端口功能控制。
bit 6 CKP:时钟极性选择位
1 = 空闲状态时钟信号为高电平;有效状态为低电平
0 = 空闲状态时钟信号为低电平;有效状态为高电平
bit 5 MSTEN:主控模式使能位
1 = 主控模式
0 = 从动模式
20
接口 (SPI)
串行外设
图注:
R = 可读位 W = 可写位 U = 未用位,读作 0
-n = POR 值 1 = 置位 0 = 清零 x = 未知
20.3 工作模式
以下各节讨论了 SPI 模块灵活的工作模式:
• 8 位和 16 位数据发送 / 接收
• 主控模式和从动模式
• 帧 SPI 模式
20.3.1 8 位与 16 位工作模式
控制位 MODE16 (SPIxCON<10>)允许模块在 8 位或 16 位模式下通信。除了接收和发送的位
数外,两种模式的功能是相同的。此外,在阅读本文时还应注意以下各项:
• 当 MODE16 (SPIxCON<10>)位的值变化时,模块会复位。因此,在正常工作过程中不应
该改变该位。
• 8 位工作模式下数据是从 SPIxSR 的 bit 7 发送的,而在 16 位工作模式下,则是从 SPIxSR
的 bit 15 发送的。在两种模式下,数据都会移入 SPIxSR 的 bit 0。
• 在 8 位模式下移入 / 移出数据需要 SCKx 引脚上出现 8 个时钟脉冲,而在 16 位模式下则需
要 16 个时钟脉冲。
20.3.2 主控模式和从动模式
SDOx SDIx
串行接收缓冲器 串行接收缓冲器
(SPIxRXB) (SPIxRXB)
SDIx SDOx
移位寄存器 移位寄存器
(SPIxSR) (SPIxSR)
串行发送缓冲器 串行发送缓冲器
(SPIxTXB) (SPIxTXB)
串行时钟
SCKx SCKx SPI 缓冲器
SPI 缓冲器
(SPIxBUF) (SPIxBUF)
SSx SSx
.
SPIxBUF 的。
串行外设
20.3.2.1 主控模式
用户写入
用户在发送过程中
SPIxBUF
SPIxTXB 到 SPIxSR 写入新数据
SPITBF
SCKx
(CKP = 0
CKE = 0)
4 种时钟
SCKx 模式
(CKP = 1 (在主控
CKE = 0) 模式下
SCKx
SCKx 引脚上的
(CKP = 0
时钟输出)
CKE = 1)
SCKx
(CKP = 1
CKE = 0)
SDIx
(SMP = 0) bit0
bit7
输入
采样 SMP
(SMP =0) 控制位
有两种
SDIx 可用
(SMP = 1) 模式(参见
bit7 bit0
注 4)
输入
采样
(SMP = 1)
SPIxIF
SPIxSR 移入
SPIxRXB
SPIRBF
(SPIxSTAT<0>)
用户读取
SPIxBUF 20
注 1: 图中所示四种 SPI 时钟模式仅用于说明 CKP (SPIxCON<6>)和 CKE (SPIxCON<8>)位的功能。只可选择其中
接口 (SPI)
一种模式工作。
串行外设
20.3.2.2 从动模式
SCKx 输入
(CKP = 0
CKE = 0)
SCKx 输入
(CKP = 1
CKE = 0)
SDIx 输入
(SMP = 0) bit7 bit0
输入
采样
(SMP = 0)
用户写入
SPIxBUF
SPITBF
SPISR 到
SPIxRXB
SPIRBF
20
接口 (SPI)
串行外设
SSx
SCKx
(CKP = 0
CKE = 0)
SCKx
(CKP = 1
CKE = 0)
用户写入 SPIxBUF
到
SPIxBUF SPIxSR
SPITBF
SDIx
(SMP = 0) bit7 bit0
输入采样
(SMP = 0)
SPIxIF
1 个指令
周期的延时
SPIxSR 到
SPIxBUF
SPIRBF
用户读取
SPIxBUF
SSx
(参见注 1)
SCK 输入
(CKP = 0
CKE = 1)
SCK 输入
(CKP = 1
CKE = 1)
SDI 输入
(SMP = 0) bit7 bit0
输入采样
(SMP = 0)
SPIxIF
写入 SPISR 到
SPIxBUF SPIRXB
SPITBF
SPIxRBF
20
接口 (SPI)
串行外设
20.3.5 帧 SPI 模式
当工作在主控模式或从动模式时,模块支持一个非常基本的帧 SPI 协议。在 SPI 模块中提供了以
下功能来支持帧 SPI 模式:
• 控制位 FRMEN (SPIxCON<14>)可使能帧 SPI 模式并使 SSx 引脚作为帧同步脉冲输入
或输出引脚使用。 SSEN (SPIxCON<7>)的状态会被忽略。
• 控制位 SPIFSD (SPIxCON<13>)决定 SSx 引脚的输入 / 输出方向 (即模块是接收还是
产生帧同步脉冲)。
• 帧同步脉冲在一个 SPI 时钟周期内为高电平有效脉冲。
SPI 模块支持以下两种帧 SPI 模式:
• 帧主控模式:SPI 模块产生帧同步脉冲并在 SSx 引脚为其他器件提供此脉冲。
• 帧从动模式:SPI 模块使用在 SSx 引脚接收到的帧同步脉冲。
主控模式和从动模式都支持帧 SPI 模式。因此,用户可以使用以下四种帧 SPI 配置:
• SPI 主控模式和帧主控模式
• SPI 主控模式和帧从动模式
• SPI 从动模式和帧主控模式
• SPI 从动模式和帧从动模式
这四种模式决定 SPIx 模块是否产生串行时钟和帧同步脉冲。
SDOx SDIx
串行接收缓冲器 串行接收缓冲器
(SPIxRXB) (SPIxRXB)
串行发送缓冲器 串行发送缓冲器
(SPIxTXB) (SPIxTXB)
串行时钟
SPI 缓冲器 SCKx SCKx SPI 缓冲器
(SPIxBUF) (SPIxBUF)
SSx SSx
帧同步
脉冲
20
接口 (SPI)
串行外设
注: 无论数据是否写入 SPIxBUF,接收到帧同步脉冲的同时都将开始发送。如果新数据
尚未写入,将发送 SPIxTXB 的原有数据。
SCKx
(CKP = 1)
SCKx
(CKP = 0)
SSx
SCKx
(CKP = 1)
SCK
(CKP = 0)
FSYNC
dsPIC30F 处理器 2
[SPI 主控,帧从动 ]
SDOx SDIx
SDIx SDOx
串行时钟
SCKx SCKx
SSx SSx
帧同步
脉冲
20
接口 (SPI)
串行外设
dsPIC30F 处理器 2
[SPI 从动、帧主控 ]
SDOx SDIx
SDIx SDOx
串行时钟
SCKx SCKx
SSx SSx
帧同步
脉冲
dsPIC30F 处理器 2
[SPI 从动,帧从动 ]
SDOx SDIx
SDIx SDOx
串行时钟
SCKx SCKx
SSx SSx
帧同步
脉冲
FCY
FSCK =
主预分频比×辅助预分频比
表 20-1: 范例 SCKx 频率
辅助预分频比设置
FCY = 30 MHz
1:1 2:1 4:1 6:1 8:1
主预分频比设置 1:1 30000 15000 7500 5000 3750
4:1 7500 3750 1875 1250 938
16:1 1875 938 469 313 234
64:1 469 234 117 78 59
FCY = 5 MHz
主预分频比设置 1:1 5000 2500 1250 833 625
4:1 1250 625 313 208 156
16:1 313 156 78 52 39
64:1 78 39 20 13 10
注: 表中 SCKx 频率的单位为 kHz。
20
接口 (SPI)
串行外设
20.5 低功耗模式下的工作
dsPIC30FXXXX 系列器件具有三种能耗模式:
• 工作模式:内核与外设均处于运行状态。
• 低功耗模式:通过执行 PWRSAV 指令可进入该模式。 dsPIC30F 系列器件支持两种低功耗模
式。在 PWRSAV 指令中可以通过参数来指定具体的模式。这两种模式为:
- 休眠模式:器件时钟源和整个器件都关闭。可通过以下指令实现。
;include device p30fxxxx.inc file
PWRSAV #SLEEP_MODE
20.5.1 休眠模式
当器件进入休眠模式后,系统时钟会被禁止。
20.5.1.1 主控模式下的工作
20.5.1.2 从动模式下的工作
20.5.2 空闲模式
当器件进入空闲模式时,系统时钟源保持工作。 SPISIDL 位 (SPIxSTAT<13>)选择模块在空闲
模式下是停止工作还是继续工作。
• 如果 SPISIDL = 1, SPI 模块将在进入空闲模式时停止通信。其工作状况将和处于休眠模式
时相同。
• 如果 SPISIDL = 0 (默认选择),模块将在空闲模式下继续工作。
20
接口 (SPI)
串行外设
dsPIC30F 系列参考手册
20.6 与 SPI 模块相关的特殊功能寄存器
20.7 相关应用笔记
本节列出了与手册的本章内容相关的应用笔记。这些应用笔在记可能并不是专为 dsPIC30F 系列
产品编写的,但是概念是相关的,通过适当修改即可使用,但使用中可能会受到一定限制。当前
与串行外设接口 (SPI)模块相关的应用笔记有:
标题 应用笔记编号
Interfacing Microchip's MCP41XXX/MCP42XXX Digital Potentiometers
to a PICmicro® Microcontroller AN746
Interfacing Microchip’s MCP3201 Analog-to-Digital Converter to the
PICmicro® Microcontroller AN719
20
接口 (SPI)
串行外设
20.8 版本历史
版本 A
这是本文档的初始发行版。
版本 B
此版本反映了 dsPIC30F 串行外设接口 (SPI)模块的编辑修订及技术内容修改。
版本 C
本章未包含任何技术内容修订,然而我们谨更新此节以反映本手册已更新到版本 C。