搜档网
当前位置:搜档网 › 第18 章 串行外设接口 (SPI)

第18 章 串行外设接口 (SPI)

第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

相关主题