第18章串行外设接口(SPI)
目录
本章包括下列主题:
18.1简介 .............................................................................................................................18-2
18.2SPI寄存器 ..................................................................................................................18-3
18.3工作模式 ......................................................................................................................18-9
18.4主模式时钟频率 .........................................................................................................18-24
18.5使用DMA的SPI操作 ...............................................................................................18-25
18.6节能模式下的操作 .....................................................................................................18-28
18.7与SPI模块相关的特殊功能寄存器 ............................................................................18-29
18.8相关应用笔记 ............................................................................................................18-30
18.9版本历史 ....................................................................................................................18-31
18
串行外设接口(SPI)? 2009 Microchip Technology Inc.DS70206B_CN 第18-1页
dsPIC33F 系列参考手册
DS70206B_CN 第18-2页? 2009 Microchip Technology Inc.
18.1
简介
串行外设接口(Serial Peripheral Interface ,SPI )模块是用于同其他外设或单片机器件进行通信的同步串行接口。这些外设可以是串行EEPROM 、移位寄存器、显示驱动器和A/D 转换器等。SPI 模块与Motorola 的SPI 和SIOP 接口兼容。
根据器件型号不同,dsPIC33F 系列在单个器件上提供一个或两个SPI 模块。两个模块(指定为SPI1和SPI2)具有相同的功能。SPI1模块在所有器件上都提供,而SPI2模块在许多高引脚数封装器件中提供。SPIx 串行接口由4个引脚组成:
? SDIx :串行数据输入? SDOx :串行数据输出
? SCKx :移位时钟输入或输出
? SSx/FSYNCx :低电平有效从选择或帧同步I/O 脉冲
可将SPIx 模块配置为使用2、3或4个引脚进行工作。在3引脚模式下,不使用SSx 。在2引脚模式下,不使用SDOx 和SSx 。 图18-1给出了该模块的框图。
图18-1:
SPI 模块框图
注:
在本章中,SPI 模块统称为SPIx ,或分别称为SPI1和SPI2。特殊功能寄存器也使用类似的符号表示。例如,SPIxCON 指SPI1或SPI2模块的控制寄存器。
内部数据总线
SDIx
SDOx SSx
SCKx
SPIxSR
bit 0
移位控制
边沿
选择F CY
主预分频器
1:1/4/16/64使能主时钟
同步SPIxBUF
控制
传输
传输写SPIxBUF
读SPIxBUF 16
SPIxCON1<1:0>SPIxCON1<4:2>时钟
控制辅助预分频器
1:1 至1:8
SPIxRXB SPIxTXB
? 2009 Microchip Technology Inc.DS70206B_CN 第18-3页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
18.2
SPI 寄存器
SPIxSTAT :SPIx 状态和控制寄存器
SPIx 状态和控制(SPIxSTAT )寄存器用于指示各种状态条件,如接收溢出、发送缓冲区满以及接收缓冲区满。该寄存器还可用于指定空闲模式下模块的工作。该寄存器还包含一个可使能和禁止模块的位。
SPIxCON1:SPIx 控制寄存器1
SPIx 控制寄存器1(SPIxCON1)用于指定时钟预分频比、主/从模式、字/字节通信、时钟极性和时钟/数字引脚操作。SPIxCON2:SPIx 控制寄存器2
SPIx 控制寄存器2(SPIxCON2)用于使能/禁止帧SPI 操作。该寄存器还可用于指定帧同步脉冲的方向、极性和边沿选择。
SPIxBUF :SPIx 数据接收/发送缓冲寄存器
SPIx 数据接收/发送缓冲(SPIxBUF )寄存器实际上是两个独立的内部寄存器:发送缓冲区(SPIxTXB )和接收缓冲区(SPIxRXB )。这两个单向的16位寄存器共用SPIxBUF 的SFR 地址。如果用户应用程序将待发送数据写入SPIxBUF 地址,在内部该数据会被写入SPIxTXB 寄存器。 与此类似,当用户应用程序从SPIxBUF 读取已接收数据时,在内部会从SPIxRXB 寄存器读取该数据。
这种技术对发送/接收操作进行了双重缓冲,允许在后台连续地传输数据。发送和接收可同时进行。此外,还有一个16位移位寄存器(SPIxSR ),该寄存器未被映射到存储空间。它用于将数据移入和移出SPI 端口。
dsPIC33F 系列参考手册
DS70206B_CN 第18-4页? 2009 Microchip Technology Inc.
寄存器18-1:
SPIxSTAT :SPIx 状态和控制寄存器R/W-0U-0R/W-0U-0U-0U-0U-0U-0SPIEN —
SPISIDL
—
—
—
—
—bit 15
bit 8
U-0R/C-0U-0U-0U-0U-0R-0R-0—SPIROV
—
—
—
—
SPITBF
SPIRBF
bit 7bit 0
图注: C = 可清零位R = 可读位W = 可写位U = 未实现位,读为0-n = POR 时的值 1 = 置1
0 = 清零
x = 未知
bit 15
SPIEN :SPIx 使能位
1 = 使能模块并将SCKx 、SDOx 、SDIx 和SSx 配置为串口引脚0 = 禁止模块bit 14未实现:读为0
bit 13
SPISIDL :空闲模式停止位
1 = 当器件进入空闲模式时,模块停止工作0 = 在空闲模式下模块继续工作bit 12-7未实现:读为0
bit 6
SPIROV :接收溢出标志位
1 = 一个新字节/字已完全接收并丢弃。用户软件没有读先前保存在SPIxBUF 寄存器中的数据
0 = 未发生溢出bit 5-2未实现:读为0
bit 1
SPITBF :SPIx 发送缓冲区满状态位1 = 发送尚未开始,SPIxTXB 为满0 = 发送已开始,SPIxTXB 为空
当CPU 通过写SPIxBUF 存储单元装入SPIxTXB 时,该位由硬件自动置1。当SPIx 模块将数据从SPIxTXB 传输到SPIxSR 时,该位由硬件自动清零。bit 0
SPIRBF :SPIx 接收缓冲区满状态位1 = 接收完成,SPIxRXB 为满0 = 接收未完成,SPIxRXB 为空
当SPIx 将数据从SPIxSR 传输到SPIxRXB 时,该位由硬件自动置1。当内核通过读SPIxBUF 存储单元读SPIxRXB 时,该位由硬件自动清零。
? 2009 Microchip Technology Inc.DS70206B_CN 第18-5页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
寄存器18-2:
SPI X CON1:SPIx 控制寄存器1U-0U-0U-0R/W-0R/W-0R/W-0R/W-0R/W-0——
—
DISSCK
DISSDO
MODE16
SMP (1)
CKE (2)
bit 15
bit 8R/W-0R/W-0R/W-0R/W-0
R/W-0R/W-0
R/W-0
R/W-0
SSEN CKP
MSTEN
SPRE<2:0>
PPRE<1:0>
bit 7bit 0
图注:R = 可读位W = 可写位U = 未实现位,读为0-n = POR 时的值 1 = 置1
0 = 清零
x = 未知
bit 15-13未实现:读为0
bit 12
DISSCK :禁止SCKx 引脚位(仅限SPI 主模式)
1 = 禁止内部SPI 时钟,引脚用作I/O 0 = 使能内部SPI 时钟
bit 11
DISSDO :禁止SDOx 引脚位
1 = 模块不使用SDOx 引脚;引脚用作I/O 0 = SDOx 引脚由模块控制bit 10
MODE16:字/字节通信选择位1 = 采用字宽(16位)通信0 = 采用字节宽(8位)通信
bit 9
SMP :SPIx 数据输入采样阶段位
(1)主模式:
1 = 在数据输出时间的末端采样输入数据0 = 在数据输出时间的中间采样输入数据从模式:
当在从模式下使用SPIx 时,必须将SMP 清零
bit 8
CKE :SPIx 时钟边沿选择位(2)
1 = 串行输出数据在时钟从工作状态转变为空闲状态时变化(见bit 6)0 = 串行输出数据在时钟从空闲状态转变为工作状态时变化(见bit 6)bit 7
SSEN :从选择使能位(从模式)1 = SSx 引脚用于从模式
0 = 模块不使用SSx 引脚。引脚由端口功能控制bit 6
CKP :时钟极性选择位
1 = 空闲状态时时钟信号为高电平;工作状态时为低电平0 = 空闲状态时时钟信号为低电平;工作状态时为高电平bit 5
MSTEN : 主模式使能位1 = 主模式0 = 从模式
bit 4-2
SPRE<2:0>:辅助预分频比位(主模式)111 = 辅助预分频比1:1110 = 辅助预分频比2:1...
000 = 辅助预分频比8:1
注
1:SMP 位只能在MSTEN 位置1后置1。如果MSTEN = 0,SMP 位将保持清零。
2:在帧SPI 模式下不使用CKE 位。在帧SPI 模式(FRMEN = 1)下,将该位编程为0。
dsPIC33F系列参考手册
寄存器18-2:SPI X CON1:SPIx控制寄存器1(续)
bit 1-0PPRE<1:0>:主预分频比位(主模式)
11 = 主预分频比1:1
10 = 主预分频比4:1
01 = 主预分频比16:1
00 = 主预分频比64:1
注1:SMP位只能在MSTEN位置1后置1。如果MSTEN = 0,SMP位将保持清零。
2:在帧SPI模式下不使用CKE位。在帧SPI模式(FRMEN = 1)下,将该位编程为0。
DS70206B_CN 第18-6页? 2009 Microchip Technology Inc.
? 2009 Microchip Technology Inc.DS70206B_CN 第18-7页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
寄存器18-3:
SPIxCON2:SPIx 控制寄存器2R/W-0R/W-0R/W-0U-0U-0U-0U-0U-0FRMEN SPIFSD
FRMPOL
—
—
—
—
—bit 15
bit 8
U-0U-0U-0U-0U-0U-0R/W-0U-0——
—
—
—
—
FRMDLY
—bit 7bit 0
图注:R = 可读位W = 可写位U = 未实现位,读为0-n = POR 时的值 1 = 置1
0 = 清零
x = 未知
bit 15
FRMEN :帧SPIx 支持位
1 = 使能帧SPIx 支持(SSx 引脚用作帧同步脉冲输入/输出)0 = 禁止帧SPIx 支持
bit 14
SPIFSD :帧同步脉冲方向控制位1 = 帧同步脉冲输入(从器件)0 = 帧同步脉冲输出(主器件)
bit 13
FRMPOL :帧同步脉冲极性位1 = 帧同步脉冲为高电平有效0 = 帧同步脉冲为低电平有效
bit 12-2未实现:读为0
bit 1
FRMDLY :帧同步脉冲边沿选择位
1 = 帧同步脉冲与第一个位时钟一致0 = 帧同步脉冲比第一个位时钟提前bit 0
未实现:禁止用户应用程序将该位设为1。
dsPIC33F 系列参考手册
DS70206B_CN 第18-8页? 2009 Microchip Technology Inc.
寄存器18-4:
SPIxBUF :SPIx 数据接收/发送缓冲寄存器R/W-0R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
SPIx 发送和接收缓冲寄存器
bit 15
bit 8
R/W-0R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
R/W-0
SPIx 发送和接收缓冲寄存器
bit 7bit 0
图注:R = 可读位W = 可写位U = 未实现位,读为0-n = POR 时的值 1 = 置1
0 =
清零
x = 未知
bit 15-0
发送/接收缓冲区位
? 2009 Microchip Technology Inc.DS70206B_CN 第18-9页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
18.3
工作模式
SPI 模块使用以下灵活的工作模式:? 8位和16位数据发送/接收? 主/从模式? 帧SPI 模式
? SPIx 只接收操作? SPIx 错误处理
18.3.18位与16位操作
SPIx 控制寄存器1中的字/字节通信选择控制位MODE16(SPIxCON1<10>)允许模块在8位或16位模式下进行通信。除了接收和发送的位数外,两种模式的功能相同。在本文中:? 当MODE16位的值改变时,模块会被复位。因此,在正常工作期间不应更改该位的值。? 在8位工作模式下,数据是从SPIx 移位寄存器(SPIxSR )的bit 7发送出去的;而在16位工作模式下,则是从bit 15(SPIxSR<15>)发送出去的。在两种模式下,数据都会移入bit 0(SPIxSR<0>)。
? 在8位模式下发送或接收数据时,需要在SCKx 引脚上出现8个时钟脉冲以移入/移出数据。在16位模式下,需要在SCKx 引脚上出现16个时钟脉冲。
18.3.2主/从模式
数据的收发可看作在一个模块的移位寄存器的最高位(MSb )和另一个模块的移位寄存器的最低位(LSb )之间采取了一个直接通路,然后将数据移到相应的发送或接收缓冲区。配置为主模块的模块根据需要为从器件提供串行时钟和同步信号。图18-2给出了主从模块的连接。
图18-2:
SPI 主/从器件连接
串行接收缓冲区(SPIxRXB )
移位寄存器(SPIxSR )
LSb
MSb
SDIx
SDOx
处理器2(SPIx 从器件)
SCKx
SSx (1)
串行发送缓冲区(SPIxTXB )
串行接收缓冲区
(SPIxRXB )移位寄存器(SPIxSR )
MSb
LSb
SDOx
SDIx 处理器1(SPIx 主器件)
串行时钟
SSEN (SPIxCON1<7>)= 1且MSTEN (SPIxCON1<5>)= 0
SSx
SCKx
串行发送缓冲区(SPIxTXB )MSTEN (SPIxCON1<5>)= 1
SPIx 缓冲区
(SPIxBUF )
(2)
SPIx 缓冲区
(SPIxBUF )
(2)注
1:可选择在从模式下使用SSx 引脚。
2:用户应用程序必须向SPIxBUF 写入发送数据,并从SPIxBUF 读取已接收数据。SPIxTXB 和SPIxRXB 寄存器被存储器映射到
SPIxBUF 。
dsPIC33F系列参考手册
18.3.2.1主模式
在主模式下,系统时钟被预分频,然后被用作串行时钟。预分频基于SPIx控制寄存器1中主预
分频比位PPRE<1:0>(SPIxCON1<1:0>)和辅助预分频比位SPRE<2:0>(SPIxCON1<4:2>)
的设置。串行时钟通过SCKx引脚输出到从器件。仅当有待发送数据时才会产生时钟脉冲。更多
信息,请参见第18.4节“主模式时钟频率”。CKP和CKE位决定数据传输发生在时钟脉冲的哪
个边沿。
将待发送数据写入SPIxBUF寄存器,或从SPIxBUF寄存器读取已接收数据。
主模式下SPIx模块的工作原理如下所述:
1.一旦模块被设置为主工作模式并使能,待发送数据就会被写入SPIxBUF寄存器。SPIx状
态和控制寄存器中的SPIx发送缓冲区满状态位SPITBF(SPIxSTAT<1>)被置1。
2.SPIx发送缓冲区(SPIxTXB)的内容被移到SPIx移位寄存器(SPIxSR),且模块将
SPITBF位(SPIxSTAT<1>)清零。
3.一组8/16个时钟脉冲将8/16位发送数据从移位寄存器SPIxSR移出到SDOx引脚,同时
将SDIx引脚的数据移入SPIxSR。
4.当传输结束时,中断控制器中会发生以下事件:
a)中断控制器中的相应中断标志位置1:
? 中断标志状态寄存器0中的SPI1IF(IFS0<10>)置1
? 中断标志状态寄存器2(IFS2)中的SPI2IF置1
通过将相应的中断允许位置1来允许以下中断:
? 将中断允许控制寄存器0中的SPI1IE(IEC0<10>)置1来允许中断
? 将中断允许控制寄存器2中的SPI2IE(IEC2<1>)置1来允许中断
SPIxIF标志不会被硬件自动清零。
b)当正在进行的发送和接收操作结束时,SPIx移位寄存器(SPIxSR)的内容被移到
SPIx接收缓冲区(SPIxRXB)。
c)SPIx状态和控制寄存器中的SPIx接收缓冲区满状态位SPIRBF(SPIxSTAT<0>)被
模块置1,指示接收缓冲区已满。一旦用户代码读取了SPIxBUF寄存器,硬件就会将
SPIRBF位清零。
5.当SPIx模块需要从SPIxSR传输数据到SPIxRXB时,如果SPIRBF位置1(接收缓冲区
满),模块会将接收溢出标志位SPIROV(SPIxSTAT<6>)位置1,指示产生了溢出条件。
6.只要SPITBF位(SPIxSTAT<1>)清零,用户软件就可以在任何时候将待发送数据写入
SPIxBUF。写操作可以与SPIxSR移出先前写入的数据同时发生,因此可以允许连续发送。
注:用户应用程序不能直接写入SPIxSR寄存器。对SPIxSR寄存器的所有写操作均通
过SPIxBUF寄存器执行。
DS70206B_CN 第18-10页? 2009 Microchip Technology Inc.
? 2009 Microchip Technology Inc.DS70206B_CN 第18-11页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
18.3.2.1.1主模式设置步骤
要将SPIx 模块设置为主工作模式,请执行以下步骤:1.
如果使用中断,需配置中断控制器:
a)将中断控制器中相应中断标志状态寄存器的SPIx 中断标志状态位SPIxIF (IFS0<10>
或IFS2<1>)清零。
b)将中断控制器中相应中断事件控制寄存器的SPIx 事件中断允许位SPIxIE (IEC0<10>
或IEC2<1>)置1。
c)通过写中断控制器中相应中断优先级控制寄存器的SPIx 事件中断优先级位SPIxIP
(IPC2<10-8>或IPC8<6-4>)来设置中断优先级。
2.将SPIxCON1寄存器中的主模式使能(MSTEN )位置1(SPIxCON1<5> = 1)。
3.将SPIxSTAT 寄存器中的接收溢出标志(SPIROV )位清零(SPIxSTAT<6> = 0)。
4.通过将SPIxSTAT 寄存器中的SPIx 使能(SPIEN )位置1(SPIxSTAT<15> = 1)使能SPIx 工作。
5.
将待发送数据写入SPIxBUF 寄存器。发送(和接收)在数据写入SPIxBUF 寄存器时立即开始。
例18-1给出了为主模式配置SPI 寄存器的代码片段。
例18-1:
SPI 配置——主模式
/* Following code snippet shows SPI register configuration for MASTER mode*/IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag IEC0bits.SPI1IE = 0;//disable the Interrupt
// SPI1CON1 Register Settings
SPI1CON1bits.DISSCK = 0;//Internal Serial Clock is Enabled.
SPI1CON1bits.DISSDO = 0;//SDOx pin is controlled by the module.SPI1CON1bits.MODE16 = 1;//Communication is word-wide (16 bits).
SPI1CON1bits.SMP = 0;//Input Data is sampled at the middle of data output time.SPI1CON1bits.CKE = 0;//Serial output data changes on transition from //Idle clock state to active clock state SPI1CON1bits.CKP = 0;//Idle state for clock is a low level; //active state is a high level SPI1CON1bits.MSTEN = 1;//Master Mode Enabled SPI1STATbits.SPIEN = 1;//Enable SPI Module
SPI1BUF = 0x0000;//Write data to be transmitted //Interrupt Controller Settings IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag IEC0bits.SPI1IE = 1;
//Enable the Interrupt
dsPIC33F 系列参考手册
DS70206B_CN 第18-12页? 2009 Microchip Technology Inc.
图18-3:
SPIx 主模式时序
SCKx
(CKP = 0
SCKx (CKP = 1
SCKx (CKP = 0
SCKx (CKP = 1
4种时钟模式(主模式下SCKx 输入采样
输入采样
SDIx
bit 7bit 0
SDOx
bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
bit 7
SDIx
SPIxIF
(SMP = 1)
(2)(SMP = 0)(2)
(SMP = 1)
(2)CKE = 1)(1)
CKE = 0)(1)
CKE = 0)(1)
CKE = 0)(1)(SMP = 0)(2)用户写入SPIxBUF
SDOx
bit 7bit 6bit 5bit 4bit 3bit 2bit 1bit 0
(CKE = 0)(CKE = 1)
将SPIxIF 标志位置1
有1个指令周期的延时
注
1:图中所示4种SPIx 时钟模式仅用于说明CKP (SPIxCON1<6>)和CKE (SPIxCON1<8>)位的功能。只能选择4种
工作模式之一。2:图中所示SMP 位(SPIxCON1<9>)取两个不同值时的SDIx 和输入采样,仅用于说明目的。在工作期间只能选择SMP
位的两种配置之一。
3:如果没有待发送的数据,一旦用户应用程序写入SPIxBUF ,SPIxTXB 中的数据就会传输到SPIxSR 。4:图中所示为8位模式下的操作。除时钟脉冲数外,16位模式下的操作与此类似。
从SPIxSR 移到SPIxRXB
用户读SPIxBUF
引脚上的时钟(SPIxSTAT<0>)
SPITBF 从SPIxTXB 传输到SPIxSR (3)
用户在传输过程中写入新数据
SPIRBF
SMP 控制位
有两种模式(4)
bit 0
输出)
? 2009 Microchip Technology Inc.DS70206B_CN 第18-13页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
18.3.2.2
从模式
在从模式下,当SCKx 引脚上出现外部时钟脉冲时发送和接收数据。SPIx 时钟极性选择位CKP (SPIxCON<6>)和SPIx 时钟边沿选择位CKE (SPIxCON<8>)决定数据传输发生在时钟脉冲的哪个边沿。将待发送数据写入SPIxBUF 寄存器,或从SPIxBUF 寄存器读取已接收数据。从模式下模块的其余操作与上述主模式下的操作相同。18.3.2.2.1从模式设置步骤
要将SPIx 模块设置为从工作模式:1.将SPIxBUF 寄存器清零。
2.
如果使用中断,需配置中断控制器:
a)将相应中断标志状态寄存器中的SPIx 中断标志状态位SPIxIF (中断控制器中的
IFS0<10>或IFS2<1>)清零。
b)将相应IECn 寄存器中的SPIx 事件中断允许(SPIxIE )位置1。
c)通过写相应IPCn 寄存器中的SPIx 事件中断优先级(SPIxIP )位来设置中断优先级。3.
配置SPIxCON1寄存器:
a)将主模式使能(MSTEN )位清零(SPIxCON1<5> = 0)。 b)将数据输入采样阶段(SMP )位清零(SPIxCON1<9> = 0)。
c)如果时钟边沿选择(CKE )位置1,则将从选择使能(SSEN )位置1(SPIxCON1<7> = 1)
来使能SSx 引脚。4.
配置SPIxSTAT 寄存器:
a)将接收溢出标志(SPIROV )位清零(SPIxSTAT<6> = 0)。
b)通过将SPIx 使能(SPIEN )位置1(SPIxSTAT<15> = 1)使能SPIx 工作。
例18-2给出了为从模式配置SPI 寄存器的代码片段。例18-2:
SPI 配置——从模式
注:
在从模式下,如果没有数据写入SPIxBUF 寄存器,SPI 模式将在SPI 主器件开始读操作时发送已写入SPIxBUF 寄存器的上个数据。
/* Following code snippet shows SPI register configuration for SLAVE Mode*/SPI1BUF = 0;
IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag IEC0bits.SPI1IE = 0;
//Disable The Interrupt
// SPI1CON1 Register Settings
SPI1CON1bits.DISSCK = 0;//Internal Serial Clock is Enabled
SPI1CON1bits.DISSDO = 0;//SDOx pin is controlled by the module SPI1CON1bits.MODE16 = 1;//Communication is word-wide (16 bits)
SPI1CON1bits.SMP = 0;//Input Data is sampled at the middle of data //output time.
SPI1CON1bits.CKE = 0;//Serial output data changes on transition //from Idle clock state to active clock state SPI1CON1bits.CKP = 0;//Idle state for clock is a low level; active //state is a high level SPI1CON1bits.MSTEN = 0;//Master Mode disabled
SPI1STATbits.SPIROV=0;//No Receive Overflow Has Occurred SPI1STATbits.SPIEN = 1;
//En able SPI Module
//Interrupt Controller Settings IFS0bits.SPI1IF = 0; //Clear the Interrupt Flag IEC0bits.SPI1IE = 1;
//Enable The Interrupt
dsPIC33F系列参考手册
18.3.2.2.2从选择同步
SSx引脚允许同步从模式。如果从选择使能(SSEN)位置1(SPIxCON1<7> = 1),则仅当SSx
引脚被驱动为低电平状态时才能使能从模式下的发送和接收(见图18-5)。不能驱动端口输出或
其他外设输出,以允许SSx引脚用作输入。如果SSEN位置1且SSx引脚被驱动为高电平,
SDOx引脚将不再被驱动并且将变为三态,即使模块在发送过程中也是如此。
下次SSx引脚被驱动为低电平时,将使用SPIxTXB寄存器中保存的数据重新尝试被中止的发送。
如果SSEN位未置1,则SSx引脚不影响从模式下模块的工作。
注:为满足模块的时序要求,当CKE = 1时,在从模式下必须使能SSx引脚(详细信
息,请参见图18-6)。
18.3.2.2.3SPITBF状态标志的操作
发送缓冲区满状态位SPITBF(SPIxSTAT<1>)的功能在从模式下与主模式下有所不同。
如果SSEN清零(SPIxCON1<7> = 0),当用户应用程序将数据装入SPIxBUF时,SPITBF位
将置1。它在模块将SPIxTXB中的数据传输到SPIxSR时清零。这与主模式下SPITBF位的功能
类似。
如果SSEN置1(SPIxCON1<7> = 1),当用户应用程序将数据装入SPIxBUF时,SPITBF将
置1。但是,它只有在SPIx模块完成数据发送时才被清零。当SSx引脚变为高电平时,发送将
被中止,但是可能在稍后重新尝试发送。每个数据字都保存在SPIxTXB中,直到所有位都被发
送到接收器中。
DS70206B_CN 第18-14页? 2009 Microchip Technology Inc.
? 2009 Microchip Technology Inc.DS70206B_CN 第18-15页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
(3)
dsPIC33F系列参考手册
(3)
DS70206B_CN 第18-16页? 2009 Microchip Technology Inc.
? 2009 Microchip Technology Inc.DS70206B_CN 第18-17页
第18章 串行外设接口(SPI )
串行外设接口(SPI )
18
(4)
dsPIC33F系列参考手册
18.3.3帧SPIx模式
当SPI模块工作在主模式或从模式时,模块支持一个基本的帧SPIx协议。模块使用4个控制位
来配置帧SPIx操作:
? 帧SPIx支持(FRMEN)位
FRMEN位(SPIxCON2<15>)用于使能帧SPIx模式并使SSx引脚用作帧同步脉冲输入
或输出引脚。SSEN(SPIxCON1<7>)的状态被忽略。
? 帧同步脉冲方向控制(SPIFSD)位
SPIFSD位(SPIxCON2<14>)决定SSx引脚是输入还是输出(即,模块是接收还是产生
帧同步脉冲)
? 帧同步脉冲极性(FRMPOL)位
FRMPOL(SPIxCON2<13>)用于选择单个SPIx数据帧的帧同步脉冲的极性(高电平有
效或低电平有效)
? 帧同步脉冲边沿选择(FRMDLY)位
FRMDLY(SPIxCON2<1>)用于选择同步脉冲是与第一个串行时钟脉冲一致还是在其之前
出现
在帧主模式下,SPIx模块产生帧同步脉冲并在SSx引脚上为其他器件提供此脉冲。
在帧从模式下,SPIx模块使用SSx引脚上接收到的帧同步脉冲。
注:在所有帧SPIx模式下必须使用SSx和SCKx引脚。
可同时支持帧SPIx模式和非帧主/从模式。这使用户可以使用以下4种帧SPIx配置:
? SPIx主模式和帧主模式
? SPIx主模式和帧从模式
? SPIx从模式和帧主模式
? SPIx从模式和帧从模式
这些模式决定SPIx模块是否产生串行时钟和帧同步脉冲。
当FRMEN(SPIxCON<14>)= 1且MSTEN(SPIxCON<5>)= 1时,SCKx引脚变为输出引
脚,且SCKx上的SPI时钟变为自由运行的时钟。
当FRMEN = 1且MSTEN = 0时,SCKx引脚变为输入引脚。假设提供给SCKx引脚的时钟源是
自由运行的时钟。
时钟的极性由CKP(SPIxCON<6>)位选择。CKE(SPIxCON<8>)位在帧SPI模式下不使用,
应该由用户软件编程为0。
当CKP = 0时,帧同步脉冲输出和SDOx数据输出在SCKx引脚上时钟脉冲的上升沿改变。在
串行时钟的下降沿,在SDIx输入引脚上采样输入数据。
当CKP = 1时,帧同步脉冲输出和SDOx数据输出在SCKx引脚上时钟脉冲的下降沿改变。在
串行时钟的上升沿,在SDIx输入引脚上采样输入数据。
DS70206B_CN 第18-18页? 2009 Microchip Technology Inc.
第18章串行外设接口(SPI)
18.3.3.1帧主模式和帧从模式
当SPIFSD(SPIxCON2<14>)= 0时,SPIx模块处于帧主工作模式。在该模式下,当用户软件
将发送数据写入SPIxBUF单元(从而将发送数据写入SPIxTXB寄存器)时,模块发出帧同步脉
冲。在帧同步脉冲的末尾,SPIxTXB中的数据被传输到SPIxSR,同时开始发送/接收数据。
当SPIFSD = 1时,模块处于帧从模式。在该模式下,帧同步脉冲由外部时钟源产生。当模块采
样到帧同步脉冲时,它会将SPIxTXB寄存器的内容传输到SPIxSR,同时开始发送/接收数据。
在接收到帧同步脉冲前,用户应用程序必须确保SPIxBUF中装入了正确的发送数据。
注:无论数据是否写入SPIxBUF,接收到帧同步脉冲时都将启动发送。如果没有执行任
何写操作,将发送SPIxTXB的当前内容。
18
串行外设接口(SPI)? 2009 Microchip Technology Inc.DS70206B_CN 第18-19页
dsPIC33F 系列参考手册
DS70206B_CN 第18-20页? 2009 Microchip Technology Inc.
18.3.3.2
SPIx 主/帧主模式
在SPI 主/帧主模式下,SPIx 模块同时产生时钟信号和帧同步信号,如图18-7所示。通过将MSTEN 和FRMEN 位设为1并将SPIFSD 设为0来使能这种配置。
在该模式下,无论模块是否正在进行发送,都将在SCKx 引脚连续输出串行时钟。当写入SPIxBUF
时,SSx 引脚将在适当的SCKx 时钟发送边沿被驱动为有效状态(由FRMPOL 位确定)
,并在一个数据帧期间保持有效。如果FRMDLY 控制位(SPIxCON2<1>)清零,将在发送数据前产生帧同步脉冲,如图18-8所示。如果FRMDLY 置1,帧同步脉冲将与数据发送的开始一致,如图18-9所示。模块在SCKx 的下一个发送边沿开始发送数据。
图18-7:
SPIx 主/帧主模式连接图
图18-8:SPIx 主/帧主模式时序(SPIFE =0)
图18-9:SPIx 主/帧主模式时序(SPIFE =1)
SDOx
SDIx dsPIC33F 串行时钟
SSx
SCKx 帧同步脉冲
SDIx
SDOx 处理器2
SSx
SCKx (SPIx 主/帧主)
SCKx
SSx
SDOx (CKP = 0)bit 14bit 13bit 12SDIx
bit 14
bit 13
bit 12
写入SPIxBUF
SDIx 上接收采样
SSx 上产生的脉冲
SCKx
(CKP = 1)(FRMPOL = 1)SSx
(FRMPOL = 0)
bit 15bit 15
SCKx
SDOx (CKP = 0)bit 14bit 13bit 12SDIx
bit 14
bit 13
bit 12
写入SPIxBUF
SSx 上产生的脉冲,SCKx
(CKP = 1)SSx
(FRMPOL = 1)SSx
(FRMPOL = 0)
SDIx 上接收采样
bit 15bit 15