第 20 章 串行外设接口 (SPITM)
目录
本章包括下列主题:
20.1 简介 ............................................................................................................................. 20-2
20.2 状态和控制寄存器 ....................................................................................................... 20-4
20.3 工作模式 ...................................................................................................................... 20-7
20.4 SPI 主控模式时钟频率 .............................................................................................. 20-19
20.5 低功耗模式下的工作 .................................................................................................. 20-20
20.6 与 SPI 模块相关的特殊功能寄存器 ............................................................................ 20-22
20.7 相关应用笔记 ............................................................................................................ 20-23
20.8 版本历史 .................................................................................................................... 20-24
20
接
口
(
S
P
)
I
串
行
外
设
© 2005 Microchip Technology Inc.
DS70067C_CN 第 20-1 页
dsPIC30F 系列参考手册
20.1
简介
串行外设接口(Serial Peripheral Interface,SPI)模块是一个同步串行接口,可用于与其他外设
或者单片机进行通信。这些外设可以是串行 EEPROM、移位寄存器、显示驱动器和 A/D 转换器
等。 SPI 模块与 Motorola 的 SPI 和 SIOP 接口兼容。
dsPIC30F 系列器件在单个器件上提供一个或两个 SPI 模块,具体取决于具体不同的器件。SPI1
和 SPI2 功能相同。很多高引脚数 (64 引脚或更多)封装的器件具有 SPI2 模块,而 SPI1 模块
则是所有的器件都具有的。
注:
在本章中, SPI 模块统称为 SPIx,或分别称为 SPI1 和 SPI2。特殊功能寄存器也使
用类似的符号表示上述类似的意思。例如,SPIxCON 指 SPI1 或 SPI2 模块的控制寄
存器。
SPI 串口包含下列特殊功能寄存器 (SFR):
• SPIxBUF:地址位于 SFR 空间,用于缓冲待发送数据和已接收数据。此地址由 SPIxTXB
和 SPIxRXB 寄存器共享。
• SPIxCON:配置模块各种操作模式的控制寄存器。
• SPIxSTAT:显示各种状态条件的状态寄存器。
此外,还有一个 16 位移位寄存器 SPIxSR,此寄存器不映射到存储器空间。该寄存器可用于将数
据移入和移出 SPI 端口。
存储器映射的 SFR (SPIxBUF)是 SPI 数据接收 / 发送寄存器。在内部, SPIxBUF 寄存器实际
上由两个独立的寄存器 (SPIxTXB 和 SPIxRXB)组成。接收缓冲寄存器 SPIxRXB 和发送缓冲
寄存器 SPIxTXB 是两个单向 16 位寄存器。这两个寄存器共享名为 SPIxBUF 的 SFR 地址单元。
如果用户将需要发送的数据写入了 SPIxBUF 地址单元,该数据会在内部写入 SPIxTXB 寄存器。
与此类似,当用户从 SPIxBUF 读取已接收到的数据时,该数据在内部是从 SPIxRXB 寄存器读取
的。这种接收和发送操作的双缓冲可以使数据在后台连续传输。发送和接收可同时进行。
注:
用户无法直接写入 SPIxTXB 寄存器或读取 SPIxRXB 寄存器。所有的读写操作都是
在 SPIxBUF 寄存器中进行的。
SPI 串行接口由以下四个引脚组成:
• SDIx:串行数据输入
• SDOx:串行数据输出
• SCKx:移位时钟输入或输出
• SSx:低电平有效从动选择或者帧同步 I/O 脉冲
注:
SPI 模块可以配置为使用 3 个或 4 个引脚工作。在 3 引脚模式下,不使用 SSx 引脚。
DS70067C_CN 第 20-2 页
© 2005 Microchip Technology Inc.
第 20 章 串行外设接口 (SPI)
图 20-1:
SPI 模块框图
内部
数据总线
寄存器共享地址单元 SPIxBUF
SPIxBUF
SPIxRXB
SPIxTXB
发送
接收
SPIxSR
bit 0
从动模式选择
和帧
同步控制
fff 移位
控制
时钟
控制
边沿
选择
辅助
预分频器
1:1 → 1:8
主
预分频器
1, 4, 16, 64
FCY
使能主控时钟
SDIx
SDOx
SSx
SCKx
注:SPIxTXB 和 SPIxRXB 寄存器通过存储器映射到 SPIxBUF 寄存器。
20
接
口
(
S
P
)
I
串
行
外
设
© 2005 Microchip Technology Inc.
DS70067C_CN 第 20-3 页
dsPIC30F 系列参考手册
20.2
状态和控制寄存器
寄存器 20-2: SPIxSTAT:SPI 状态和控制寄存器
高字节:
R/W-0
SPIEN
bit 15
bit 15
bit 14
bit 13
U-0
-
R/W-0
SPISIDL
U-0
-
U-0
-
U-0
-
U-0
-
U-0
-
bit 8
低字节:
U-0
-
bit 7
R/W-0
HS
SPIROV
U-0
-
U-0
-
U-0
-
U-0
-
R-0
R-0
SPITBF
SPIRBF
bit 0
SPIEN:SPI 使能位
1 = 使能模块并将 SCKx、 SDOx、 SDIx 和 SSx 配置为串口引脚
0 = 禁止模块
未用:读作 0
SPISIDL:在空闲模式停止位
1 = 当器件进入空闲模式时模块不继续工作
0 = 在空闲模式下模块继续工作
bit 12-7 未用:读作 0
bit 6
bit 5-2 未用:读作 0
bit 1
SPIROV:接收溢出标志位
1= 一个新字节 / 字已完全接收并丢弃。用户软件未读取 SPIxBUF 寄存器中原先的数据。
0 = 没有发生溢出
bit 0
SPITBF:SPI 发送缓冲器满状态位
1 = 未开始发送, SPIxTXB 满
0 = 发送开始, SPIxTXB 空
当 CPU 写 SPIxBUF 地址单元并装载 SPIxTXB 时,该位由硬件自动置位。
当 SPIx 模块将数据从 SPIxTXB 传输到 SPIxSR 时,该位由硬件自动清零。
SPIRBF:SPI 接收缓冲器满状态位
1 = 接收完成, SPIxRXB 满
0 = 接收未完成, SPIxRXB 空
当 SPIx 将数据从 SPIxSR 传输到 SPIxRXB 时,该位由硬件自动置位。
当内核通过读 SPIxBUF 地址单元读 SPIxRXB 时,该位由硬件自动清零。
图注:
R = 可读位
HC = 由硬件清零
-n = 复位时的值
W = 可写位
HS = 由硬件置位
1 = 置位
U = 未用位,读作 0
0 = 清零
x = 未知
DS70067C_CN 第 20-4 页
© 2005 Microchip Technology Inc.
第 20 章 串行外设接口 (SPI)
寄存器 20-2: SPIXCON:SPIx 控制寄存器
高字节:
U-0
-
bit 15
R/W-0
FRMEN
R/W-0
SPIFSD
U-0
-
R/W-0
R/W-0
DISSDO MODE16
R/W-0
SMP
R/W-0
CKE
bit 8
低字节:
R/W-0
SSEN
bit 7
R/W-0
CKP
R/W-0
MSTEN
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
SPRE<2:0>
PPRE<1:0>
bit 0
bit 15
bit 14
bit 13
bit 12
bit 11
bit 10
bit 9
bit 8
bit 7
bit 6
bit 5
未用:读作 0
FRMEN: 帧 SPI 支持位
1 = 使能帧 SPI 支持
0 = 禁止帧 SPI 支持
SPIFSD:SSx 引脚上的帧同步脉冲方向控制位
1 = 帧同步脉冲输入 (从动模式)
0 = 帧同步脉冲输出 (主控模式)
未用:读作 0
DISSDO:SDOx 引脚禁止位
1 = 模块不使用 SDOx 引脚。该引脚由相关端口寄存器控制。
0 = SDOx 引脚由模块控制
MODE16:字 / 字节通信选择位
1 = 通信为字宽 (16 位)
0 = 通信为字节宽 (8 位)
SMP:SPI 数据输入采样相位位
主控模式:
1 = 输入数据在数据输出时间末尾采样
0 = 输入数据在数据输出时间中间采样
从动模式:
当 SPI 在从动模式下使用时,必须将 SMP 清零。
CKE:SPI 时钟沿选择位
1 = 串行输出数据在有效时钟状态转变为空闲时钟状态时变化 (参见 bit 6)
0 = 串行输出数据在空闲时钟状态转变为有效时钟状态时变化 (参见 bit 6)
注:
在帧 SPI 模式下未使用 CKE 位。在帧 SPI 模式下 (FRMEN = 1),用户应将该位编程为 0。
SSEN:从动选择使能 (从动模式)位
1 = SS 引脚用于从动模式
0 = 模块不使用 SS 引脚。引脚由端口功能控制。
CKP:时钟极性选择位
1 = 空闲状态时钟信号为高电平;有效状态为低电平
0 = 空闲状态时钟信号为低电平;有效状态为高电平
MSTEN:主控模式使能位
1 = 主控模式
0 = 从动模式
20
接
口
(
S
P
)
I
串
行
外
设
© 2005 Microchip Technology Inc.
DS70067C_CN 第 20-5 页
dsPIC30F 系列参考手册
寄存器 20-2: SPIXCON:SPIx 控制寄存器 (续)
bit 4-2
bit 1-0
SPRE<2:0>:辅预分频比 (主控模式)位
(支持设置:1:1、 2:1 到 8:1 全部支持)
111 = 辅预分频比 1:1
110 = 辅预分频比 2:1
……
000 = 辅预分频比 8:1
PPRE<1:0>:主预分频比 (主控模式)位
11 = 主预分频比 1:1
10 = 主预分频比 4:1
01 = 主预分频比 16:1
00 = 主预分频比 64:1
图注:
R = 可读位
-n = POR 值
W = 可写位
1 = 置位
U = 未用位,读作 0
0 = 清零
x = 未知
DS70067C_CN 第 20-6 页
© 2005 Microchip Technology Inc.
第 20 章 串行外设接口 (SPI)
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 主控模式和从动模式
图 20-2:
SPI 主 / 从连接
处理器 1 [SPI 主机 ]
处理器 2 [SPI 从机 ]
SDOx
SDIx
SDIx
SDOx
串行接收缓冲器
(SPIxRXB)
移位寄存器
(SPIxSR)
串行接收缓冲器
(SPIxRXB)
移位寄存器
(SPIxSR)
最高位
最低位
最高位
最低位
串行发送缓冲器
(SPIxTXB)
SPI 缓冲器
(SPIxBUF)
串行发送缓冲器
(SPIxTXB)
SPI 缓冲器
(SPIxBUF)
串行时钟
SCKx
SSx
.
SCKx
SSx
(MSTEN(SPIxCON<5> = 1))
(SSEN(SPIxCON<7>)= 1 且
MSTEN(SPIxCON<5> = 0))
20
注 1: 在从动模式使用 SSx 引脚是可选的。
2: 用户写发送数据和读接收数据都必须通过 SPIxBUF。 SPIxTXB 和 SPIxRXB 寄存器是通过存储器映射到
SPIxBUF 的。
接
口
(
S
P
)
I
串
行
外
设
© 2005 Microchip Technology Inc.
DS70067C_CN 第 20-7 页
dsPIC30F 系列参考手册
20.3.2.1 主控模式
遵循以下步骤将 SPI 模块设置为工作在主控模式:
1. 如果使用中断:
• 清零相应 IFSn 寄存器中的 SPIxIF 位。
• 置位相应 IECn 寄存器中的 SPIxIE 位。
• 向相应的 IPCn 寄存器设置 SPIxIP 位。
2. 将所需设置写入 SPIxCON 寄存器,同时 MSTEN (SPIxCON<5>) = 1。
3. 将 SPIROV 位 (SPIxSTAT<6>)清零。
4. 通过将 SPIEN 位 (SPIxSTAT<15>)置位使能 SPI 工作。
5. 将待发送数据写入 SPIxBUF 寄存器。数据一写入 SPIxBUF 寄存器,发送(以及接收)就
会立即开始。
PPRE<1:0>
在主控模式下,系统 时钟 被预分 频,然后作 为串 行时钟 使用。预 分频基于
(SPIxCON<1:0>)和 SPRE<1:0> (SPIxCON<4:2>)位的设置。串行时钟通过 SCKx 引脚输出
到从动器件。仅当有待发送数据时才会产生时钟脉冲。如需了解更多信息,请参阅第 20.4 节“SPI
主控模式时钟频率”。
CKP 和 CKE 位确定在哪个时钟沿发送数据。
待发送数据和已接收数据都分别向 SPIxBUF 寄存器写入和从该寄存器读取。
以下内容描述了主控模式下 SPI 模块的工作原理。
1. 一旦模块被设置为主控工作模式并使能,待发送数据就会写入 SPIxBUF 寄存器。SPITBF
(SPIxSTAT<1>)位置位。
2. SPIxTXB 的内容移到移位寄存器 SPIxSR,并且模块将 SPITBF 位清零。
3. 一组 8/16 个时钟脉冲将 8/16 位发送数据从 SPIxSR 移出到 SDOx 引脚,同时将 SDIx 引
脚的数据移入 SPIxSR。
4. 当传输结束后,会发生以下事件:
• 中断标志位 SPIxIF 置位。通过将中断使能位 SPIxIE 置位可以允许 SPI 中断。 SPIxIF
标志不会被硬件自动清零。
• 另外,当正在进行的发送和接收操作结束后, SPIxSR 的内容会移到 SPIxRXB 寄存
器。
• SPIRBF (SPIxSTAT<0>)位由模块置位,表明接收缓冲器满。一旦用户代码读
SPIxBUF 寄存器,硬件就会将 SPIRBF 位清零。
5. 当 SPI 模块需要从 SPIxSR 传输数据到 SPIxRXB 时,如果 SPIRBF 位置位 (接收缓冲器
满),模块会将 SPIROV (SPIxSTAT<6>)位置位,表明产生了溢出条件。
6. 只要 SPITBF (SPIxSTAT<1>)清零,用户软件就可以在任何时候将待发送数据写入
SPIxBUF。写入可以与 SPIxSR 移出前面写入的数据同时发生,因此可以允许连续发送。
注:
用户不能直接写 SPIxSR 寄存器。对 SPIxSR 寄存器的所有写入都是通过 SPIxBUF
寄存器进行的。
DS70067C_CN 第 20-8 页
© 2005 Microchip Technology Inc.