16 基本同步串行口 BSSP

第 16章 基本同步串行口 (BSSP)

目录

本章包括下面一些主要内容:

16.1 简介.............................................................................................................................. 16-2

16.2 控制寄存器................................................................................................................... 16-3

16.3 SPITM模式.................................................................................................................. 16-6

16.4 SSP模块的 I

2CTM 操作............................................................................................ 16-15

16.5 初始化........................................................................................................................ 16-23

16.6 设计技巧..................................................................................................................... 16-24

16.7 相关应用笔记............................................................................................................. 16-25

16.8 版本历史16-26

注: 关于哪些型号的器件包含此模块,请参照附录 C.2 或器件数据手册。

16.1 简介

基本同步串行口模块 (BSSP) 是用于同其它外设模块或单片机进行通信的串行接口。这些外设模

块可以是串行 EEPROM、移位寄存器、显示驱动器或 A/D 转换器等。 BSSP 模块有以下两种工

作模式:

? 串行外设接口(SPI?)

? 内部互联(I

2C?)

- 从动模式

-I/O口输出斜率控制,启动位和停止位,便于用软件实现主控和多主机模式。

16.2 控制寄存器

寄存器 16-1: SSPSTAT: 同步串行口状态寄存器

U-0 U-0 R-0 R-0 R-0 R-0 R-0 R-0

— —D/A PSR/W UA BF

bit 7 bit 0

bit 7:6 未用:读为 0

bit 5 D/A:数据 /地址位 ( 仅用于I

2C模式)

1 = 最后接收或发送的字节是数据

0 = 最后接收或发送的字节是地址

bit 4 P:停止位

( 仅用于I

2C 模式。当 SSP 模块被禁止时该位被清零)

1 = 检测到停止位 (复位时该位为 0)

0 = 未检测到停止位

bit 3 S:启动位

( 仅用于I

2C 模式。当 SSP 模块被禁止时该位被清零)

1 = 检测到启动位 (复位时该位为 0)

0 = 未检测到启动位

bit 2 R/W:读 /写位信息 (仅用于 I

2C 模式)

该位用来记录在最后一次地址匹配后接收到的读/写信息。 从本机地址与接收地址匹配开始, 到

下一个启动位、停止位或无应答位 (ACK)时,该位有效。

1 = 读

0 = 写

bit 1 UA:地址更新 ( 仅用于10 位 I

2C 模式)

1 =需要更新SSPADD寄存器中的地址

0 = 地址不需要更新

bit 0 BF:缓冲区满状态位

接收时 (SPI 和 I

2C模式 )

1 = 接收完成, SSPBUF 满

0 = 接收未完成, SSPBUF空

发送时 (I

2C 模式时)

1 = 发送正在进行, SSPBUF 满

0 = 发送已经完成, SSPBUF 空

图注:

R = 可读位 W =

可写位

U = 未用位,读为0- n = 上电复位时的值

寄存器 16-2: SSPCON: 同步串行口控制寄存器

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 7 bit 0

bit 7 WCOL:写冲突检测位

1 = 正在发送前一个数据时,又有数据写入 SSPB寄存器

(该位必须用软件清零 )

0 = 表示未发生冲突

bit 6 SSPOV: 接收溢出标志位

在 SPI 模式下:

1 = SSPBUF 寄存器中仍保持前一个数据时又收到新的数据。 在溢出时,SSPSR 中的数据会丢

失。溢出只会发生在从动模式下。即使只是发送数据,用户也必须读 SSPBUF,以避免产

生溢出。 在主控模式下,溢出位不会被置“1”,因为每次接收或发送新数据,都要通过写

SSPBUF来启动。

0 = 没有溢出

在 I

2C 模式下:

1 = 表示 SSPBUF中仍保持前一个数据时又收到新的数据。

在发送方式下SSPOV位无效,在 SPI、 I

2C模式下,该位都必须用软件清零。

0 = 没有溢出

bit 5 SSPEN: 同步串行口的使能位

在 SPI 和I

2C 两种模式下,当该位为 1而使能时,应正确配置相应引脚的输入输出方向。

在 SPI 模式下:

1 = 使能串行口,并定义 SCK、SDO、SDI 和 SS 引脚为串行口引脚

0 = 禁止串行口,并定义 SCK、SDO、SDI 和 SS 引脚为一般 I/O 端口引脚

在 I

2C 模式下:

1 = 使能串行口,并定义 SDA 和 SCL引脚为串行口引脚

0 = 禁止串行口,并定义 SDA 和 SCL引脚为一般 I/O 端口引脚

bit 4 CKP: 时钟极性选择:

在 SPI模式下:

1 = 空闲状态时,时钟为高电平

0 = 空闲状态时,时钟为低电平

在 I

2C 模式下:

SCK 释放控制

1 = 使能时钟

0 = 保持时钟线为低电平 (用于保证数据的建立时间 )

bit 3:0 SSPM3:SSPM0: 同步串行口的工作模式选择位

0000 = SPI 主控模式,时钟= FOSC/4

0001 = SPI 主控模式,时钟= FOSC/16

0010 = SPI 主控模式 ,时钟= FOSC/64

0011 = SPI 主控模式 , 时钟 = TMR2 输出/2

0100 = SPI 从动模式 , 时钟 = SCK 引脚。使能 SS 引脚控制。

0101 = SPI 从动模式 , 时钟 = SCK 引脚。禁止 SS 引脚控制。 SS 可用作I/O引脚。

0110 = I

2C 7 位地址的从动模式

0111 = I

2C 10 位地址的从动模式

1000 =保留

1001 = 保留

1010 = 保留

1011 = I

2C 固件控制的主控模式 (从动模式空闲)

1100 = 保留

1101 = 保留

1110 = I

2C 固件控制的多主机模式

7位地址,允许启动位和停止位中断功能

1111 = I

2C 固件控制的主控模式

10位地址,允许启动位和停止位中断功能

寄存器 16-2: SSPCON: 同步串行口控制寄存器 (续)

图注:

R = 可读位 W = 可写位

U = 未用位 , 读为 0- n = 上电复位时的值

16.3 SPI

TM 模式

SPI模式允许同步发送或接收 8位数据,一般用以下三个

引脚来完成通信:

? 串行数据输出 (SDO)

? 串行数据输入 (SDI)

? 串行时钟 (SCK)

当在从动模式下工作时,可能还需要第 4个引脚:

? 从动选择 (SS)

16.3.1 操作

初始化SPI时,必须通过设置SSPCON寄存器中的相应控制位 (SSPCON)来指定以下各项:

? 主控模式 (SCK 作为时钟输出 )

? 从动模式 (SCK 作为时钟输入 )

? 时钟极性 (选择在SCK 的上升沿还是下降沿输出/ 输入数据)

? 时钟速率( 仅用于主控模式)

? 从动选择 (仅用于从动模式)

图 16-1 给出了工作在 SPI模式下SSP模块的方框

SSP 模块由一个发送 / 接收移位寄存器 (SSPSR) 和一个缓冲寄存器 (SSPBUF)组成。 SSPSR

用于器件输入和输出数据的移位,最高有效位在前。 在新的数据接收完毕前,SSPBUF保存写入

SSPSR的数据。一旦8 位新数据接收完毕,该数据被送入 SSPBUF寄存器。同时缓冲区满标志

位 BF (SSPSTAT ) 和中断标志位 SSPIF 置 1。这种双重缓冲接收方式,允许接收的数据被

CPU读取之前,开始接收下一个数据。 在数据发送/接收期间, 任何试图写SSPBUF 寄存器的操

作都无效,会将冲突检测位WCOL (SSPCON) 置 1。此时用户必须用软件将 WCOL位清零,

否则无法判别下一次对SSPBUF的写操作是否成功。当应用软件要接收一个有效数据时,应该在

下一个要传送的数据写入SSPBUF之前,将 SSPBUF中的前一个数据读出。 缓冲器满标志位 BF

(SSPSTAT) 用于表示何时把接收到的数据送入 SSPBUF 寄存器 (传输完成) 。当 SSPBUF

中的数据被读出后,BF 位即被清零。如果 SPI 仅仅作为一个发送器,则不必理会接收的数据。

通常可用SSP 中断来判断发送或接收是否完成。 如果数据有效,可读出 SSPBUF 中的数据并/

或对 SSPBUF (SSPSR) 进行写操作。如果不使用中断来处理数据的收发,用软件查询方法同样

可确保不会发生写冲突。 例 16-1举例说明了在数据发送时如何写SPBUF, 阴影部分的指令仅在

需要接收数据时才使用 (而某些 SPI应用只发送数据)。

例 16-1:对SSPBUF (SSPSR) 寄存器的写操作

SSPSR 寄存器不能直接读写, 只能通过对SSPBUF寄存器寻址来访问。 SSP模块的状态寄存器

SSPSTAT可用来指示各种状态条件。

BCF STATUS, RP1 ;Specify Bank1

BSF STATUS, RP0 ;

LOOP BTFSS SSPSTAT, BF ;Has data been received (transmit complete)?

GOTO LOOP ;No

BCF STATUS, RP0 ;Specify Bank0

MOVF SSPBUF, W ;W reg = contents of SSPBUF

MOVWF RXDATA ;Save in user RAM, if data is meaningful

MOVF TXDATA, W ;W reg = contents of TXDATA

MOVWF SSPBUF ;New data to xmit

16.3.2 使能 SPI

TM 的 I/O 口

要使能SSP 串行口, SSP使能位 SSPEN (SSPCON) 必须被置1。 要复位

或重新配置 SPI模

式,先将 SSPEN 位清零,对 SSPCON 重新初始化,然后把 SSPEN 位置 1。这将设定 SDI、

SDO、SCK 和 SS 引脚为SSP串行口引脚。要使这些引脚用作串行口功能,还必须通过TRIS 寄

存器正确设置这些引脚的方向,即:

?SDI定义成输入

?SDO定义成输出

? 主控模式时,SCK 定义成输出

? 从动模式时,SCK 定义成输入

?SS定义成输入

对于不需要的串行口引脚,可以通过把相应的数据方向寄存器(TRIS)设置为上述的相反值而

另作它用。例如在主控模式下,如果只发送数据(如发送到显示驱动器) ,那么通过将SDI 和 SS

引脚的TRIS方向位清零,就可以把这两个引脚作为通用的输出口使用。

16.3.3 典型连接

图 16-2给出两个单片机之间的典型连接。主控制器 (处理器1)通过发送SCK信号来启动数据传

输。根据程序设定的时钟边沿,分别位于两个处理器里的移位寄存器中的数据同时被移出,并在

相反的时钟边沿被锁存。两个处理器的时钟极性(CKP) 必须编程设定为相同,这样两个处理器

就可以同时收发数据。至于数据是否有意义(或是无效“哑”数据)则取决于应用软件,这就导

致以下三种数据发送方式:

? 主控制器发送数据 — 从控制器发送无效数据(“哑”数据) 。

? 主控制器发送数据 — 从控制器发送数据

? 主控制器发送无效数据— 从控制器发送数据

16.3.4 主控模式的操作

因为主控制器控制着 SCK 信号,所以它可以在任何时候启动数据传输,同时主控制器通过软件

协议来决定从控制器 (处理器 2)何时要传送数据。

在主控模式下,数据一旦写入 SSPBUF 就开始发送或接收。如果 SPI 仅作为接收器,则可以禁

止SDO 输出 ( 将其设置为输入端口)。SSPSR 寄存器按设置的时钟速率,对 SDI引脚上的信号

进行连续地移位输入。每接收完一个字节,都把其送入 SSPBUF 寄存器,就象普通的接收字节

一样(相应的中断和状态位置 1) 。这在“线路主动监控”方式的接收器应用中可能是很有用的。

时钟极性可通过对SSPCON寄存器的CKP 位(SSPCON)编程来设定。图 16-3 是主控模式

下 SPI 通信的时序图,最高位首先发送。在主控模式下, SPI 时钟速率(位速率)可由用户编

程设定为下面几种方式之一:

?FOSC/4 (或 TCY)

?FOSC/16 (或 4 ? TCY)

?FOSC/64 (或 16 ? TCY)

? 定时器2 输出速率 /2

最大数据通信速率是5 Mbps(当晶振为 20 MHz时)。

16.3.5 从动模式的操作

在从动模式下,当SCK 引脚上出现外部时钟脉冲时,发送/ 接收数据。当最后一位数据锁存后,

中断标志位SSPIF置“1”。

时钟极性通过对SSPCON寄存器的CKP 位 (SSPCON)编程来设定。图 16-4 是SPI通信的

时序图,最高

位先被发送。 在从动模式下,外部时钟必须满足最短高电平和低电平的脉宽要求。

在休眠状态下,从控制器仍可发送和接收数据,如果允许中断,还可唤醒单片机。

16.3.6 从动选择模式

SS 引脚还可用于同步从动模式。 要将 SPI 设置成同步从动模式,SPI 必须工作在从动模式

(SSPCON = 04h) ,并将 SS 引脚的 TRIS 位置位。当 SS 引脚为低电平时,允许数据的

发送和接收, 同时SDO 引脚被驱动为高电平或低电平。 当 SS 引脚变为高电平时, 即使是在数

据的发送过程中, SDO引脚也不再被驱动,而是变成高阻悬浮状态。当 SS 引脚再次变成低电平

时,如果此前没有重新设置 SPI 的工作模式,则数据将接着上次变为高电平时的中断点继续发

送。为清零位计数器,必须先禁止然后再重新使能基本 SSP 模块。根据应用的需要,可在 SDO

引脚上外接上拉或下拉电阻。

将 SDO 引脚和 SDI 引脚相连,可以仿真二线制通信。 当 SPI 作为接收器时,可将 SDO 引脚定

义为输入, 这样就禁止SDO引脚发送数据。而SDI总是定义为输入, 因为它不会引起总线冲突。

16.3.7 休眠状态下的操作

在主控模式下,此时所有模块的时钟都停止了,在器件被唤醒前,发送 / 接收也处于停滞状态。

在器件恢复正常工作状态后,模块将继续数据的发送/ 接收。

在从动模式下, SPI 发送 / 接收移位寄存器与器件异步工作,所以在休眠状态时,数据仍可被移

入 SPI 发送 /接收移位寄存器。当接收完8 位数据后,SSP 中断标志位将置1,如果此时该中断

是使能的,将唤醒器件。

16.3.8 复位的影响

复位会禁止SSP 模块并停止当前的数据传输。

表 16-1:和SPI

TM 操作有关的寄存器

寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

上电复位、

欠压复位时

的值

其它复位时

的值

INTCON GIE PEIE T0IE INTE RBIE(2)

T0IF INTF RBIF(2)

0000 000x 0000 000u

PIR SSPIF

(1)

00

PIE SSPIE

(1)

00

SSPBUF 同步串行口的接收缓冲器 /发送寄存器 xxxx xxxx uuuu uuuu

SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

SSPSTAT — — D/A P S R/W UA BF --00 0000 --00 0000

其中: x = 未知,u =不变, - =未用,读为 0。

阴影部分在SPI模式下的 SSP中未用。

注 1:该位的位置和器件的具体型号有关。

2:这些位也可称为GPIE 和 GPIF。

16.4 SSP 模块的 I

2CTM 操作

SSP 模块工作在 I

2C 模式时,除了不支持全局呼叫外,可以完成所有的从动模式功能,并且硬件

上提供启动位和停止位中断,以便软件实现主控功能。 SSP 模块实现了标准模式规范,并支持对

7 位和 10位地址的寻址。附录 A 给出了 I

2C总线规范的概述。

数据传输使用两个

引脚:一个是作为时钟线的 SCL 引脚,另一个是作为数据线的SDA引脚。用

户应通过 TRIC 寄存器把这些引脚设置成输入。将 SSP 使能位 SSPEN (SSPCON)置位,

可使能SSP 模块功能。

当SCL 和 SDA 引脚为输入时,引脚上有窄脉冲(毛刺)滤波器,该滤波器可以工作在 100 KHz

和 400 KHz 两种模式下。在 100 KHz 模式下, 当这些引脚作为输出时,可对引脚进行压摆率控

制,此控制和器件频率无关。

SSP 模块有 5 个寄存器用于 I

2C 操作,它们是:

? SSP 控制寄存器 (SSPCON)

? SSP 状态寄存器 (SSPSTAT)

? 串行接收/ 发送缓冲器 (SSPBUF)

? SSP 移位寄存器 (SSPSR) - 不可直接访问

? SSP 地址寄存器 (SSPADD)

SSPCON 寄存器用于控制 I

2C的工作模式。可通过设置四个模式选择位 (SSPCON)来选

择以下几种 I

2C 模式:

?I

2C 从动模式(7 位地址 )

?I

2C 从动模式 (10 位地址)

?I

2C 固件控制的多主机模式, 7位地址 (允许启动位和停止位中断)

?I

2C 固件控制的多主机模式, 10位地址 (允许启动位和停止位中断 )

?I

2C 固件控制的主控模式,从动模式空闲

在选择 I

2C工作模式前,通过置位相应的 TRIS 位,将 SCL 和SDA 引脚定义为输入。然后选择

I

2C工作模式,通过将SSPEN 位置1,使能SCL和 SDA引脚分别作为 I

2C模式的时钟线和数据线。

SSPSTAT 寄存器提供数据传输的状态,其中包括启动位和停止位的检测、确定接收的字节是数

据还是地址、下一个字节是否已完成 10 位地址的传送,以及是数据传输是读操作还是写操作。

SSPSTAT 是一个只读寄存器。

SSPBUF 寄存器存放要读 / 写的传输数据, SSPSR 寄存器将数据移入或移出器件。接收时,

SSPBUF 和 SSPSR 构成了一个双重缓冲接收器,允许在前一个数据读出前即可接收下一个数

据。 当接收完字节后,将其送入 SSPBUF 寄存器,同时置位中断请求标志位 SSPIF。如果在

SSPBUF 寄存器中的前一个数据被读走前,又接收到一个新数据, 就会发生接收器溢出,

SSPOV 位 (SSPCON)将置 1。

SSPADD寄存器用于保存从机地址。 在 10 位地址模式时,用户需要写入地址的高字节 (1111 0

A9 A8 0)。 在高字节地址匹配后,再写入地址的低字节 (A7:A0)。

16.4.1 从动模式

在从动模式下,SCL 和 SDA 引脚必须设置为输入 ( 相应的TRIS 位置 1)。在需要时(如在从动

发送器情况下) , SSP模块会将输入状态改变为输出状态输出数据。

当地址匹配时或在地址匹配后传送的数据被接收时,硬件会自动产生一个应答 (ACK) 脉冲,并把

在SSPSR 中接收到的数据装入SSPBUF 缓冲区。

满足下列条件之一,SSP 模块不会产生应答脉冲 ACK:

a) 在传送的数据被接收之前,缓冲区满标志位 BF (SS

PSTAT) 已被置为1。

b) 在传送的数据被接收之前,溢出标志位 SSPOV (SSPCON)已被置为 1

此时, 移位寄存器 SSPSR 的值不会装入缓冲区SSPBUF中, 但是中断标志位 SSPIF和 SSPOV

位仍会置1。 表 16-2 列出了在给定 BF 和 SSPOV 位状态时,数据的接收情况。阴影部分表示用

户软件没有对溢出状态进行适当清零的情况。标志位 BF 是通过读取 SSPBUF 进行清零的,而

SSPOV 位必须通过软件来清零。

SCL 时钟输入的高电平和低电平必须满足最小脉宽的要求才能正常工作。关于I

2C 规范所规定的

高低电平脉宽以及对SSP 模块的具体要求,请参见“电气规范”一章参数 100 和 101。

16.4.1.1 寻址

一旦 SSP 模块被使能,它就等待 START(启动)信号出现。在启动信号出现后,8 位数据被移

入 SSPSR 寄存器。所有移入的位都在时钟线 SCL 的上升沿采样。在 SCL 时钟的第 8 个脉冲下

降沿,SSPSR 的值与地址寄存器 SSPADD 的值作比较,如果地址匹配, BF 和SSPOV 位

就被清零,并完成下列操作:

a) 在第8 个 SCL 脉冲的下降沿把 SSPSR寄存器的值装入 SSPBUF寄存器。

b) 缓冲器满标志位 BF 在第8 个SCL 脉冲的下降沿被置 1。

c) 产生ACK 脉冲。

d) 在第9个SCL脉冲的下降沿,SSP中断标志位SSPIF置1 (如果允许中断, 则产生中断)。

在 10 位地址模式时,从动器件需要接收两个地址字节。第一个地址字节的高 5 位指定这是否是

一个10位地址。 R/W 位 (SSPSTAT)必须指定为写操作,这样从动器件就会接收第二个地址

字节。对于10 位地址,高字节应该是 ‘1111 0 A9 A8 0’,其中 A9 和 A8 是10 位地址的两个

最高位。 10位地址的工作步骤如下,其中 7- 9 步是针对从动发送器而言的:

1. 接收地址的第一个 (高) 字节 (SSPIF、 BF和 UA (SSPSTAT)位被置 1)。

2. 用地址的第二个字节 (10位地址的低8位)更新SSPADD寄存器 (对 UA 位清零同时释放

SCL 时钟线)。

3. 读SSPBUF寄存器 ( BF位被清零 )并清零中断标志位 SSPIF。

4. 接收地址第二个字节 (SSPIF、 BF和 UA被置 1)。

5. 用地址的高字节更新 SSPADD 寄存器,这将使 UA位清零并释放 SCL 时钟线。

6. 读 SSPBUF寄存器 (BF位清零) 并清零中断标志位SSPIF。

7. 接收再次出现的启动(START)信号。

8. 接收地址的第一 个(高 ) 字节 (SSPIF和 BF位被置1)。

9. 读SSPBUF寄存器 (BF位清零) 并清零中断标志位SSPIF。

注: 10 位地址模式下,在重复启动(RESTART)条件(第 7 步)出现后,用户只需要

匹配开始的7 位地址,不需要更新 SSPADD 寄存器以匹配另一半地址。

表 16-2: 传输接收数据字节的情况

数据接收时的状态位

SSPSR → SSPBUF

产生 ACK

脉冲

置位 SSPIF位

(如允许中断,则产生

SSP

中断) BF SSPOV

00 是是是

10 否否是

11 否否是

0 1 是 否 是

注:阴影部分表示用户软件没有正确清除溢出条件时的情况。

16.4.1.2 接收

当地址字节的 R/W 位是零且地址匹配时, SSPSTAT 寄存器中的 R/W 位被清零,同时把接收的

地址装入缓冲器 SSPBUF。

当发生地址字节接收溢出时,则不会产生应答信号 (ACK)。溢出条件是指 BF 位 (SSPSTAT)

置1 或 SSPOV 位(SSPCON)置 1。

每个数据传输字节都会产生一个SSP 中断。SSPIF标志位必须用软件清零, 状态寄存器SSPSTAT

用于确定字节的状态。

16.4.1.3 发送

当输入地址字节的 R/W 位置 1 且地址匹配时,状态寄存器 SSPSTAT 的 R/W 位被置 1。 接收到

的地址被装入缓冲器 SSPBUF。应答信号 ACK 在 SCL 的第 9 个脉冲时发送,同时 SCL 引脚保

持低电平。发送的数据必须送入 SSPBUF缓冲器,同时也送入 SSPSR寄存器。然后通过把CKP

位(SSPCON)置 1,使能 SCL引脚。主控器件必须监视 SCL 引脚脉冲信号。 从动器件可

以通过延长 SCL 时钟的低电平,而使主控器件处于数据等待状态。 8 位数据在 SCL 时钟的下降

沿被移位输出。这可确保在SCL 为高电平期间 SDA信号是有效的 (如图 16-9)。

每个数据发送字节都会产生一个 SSP 中断, SSPIF 标志位必须通过软件清零,状态寄存器

SSPSTAT用于确定字节传输的状态。 SSPIF标志位是在第 9 个脉冲下降沿被置1。

作为从动发送器,在第 9个 SCL 时钟脉冲的上升沿锁存从主控接收器发出的 ACK 信号。若SDA

线为高电平(无 ACK 应答信号),那么表示数据传输已完成。当无ACK 应答被从动器件锁存时,

从动逻辑被复位,并再监测下一个 START信号的发生。如果 SDA 线是低电平(有ACK应答信

号) ,发送数据应装入 SSPBUF 缓冲器,并装入 SSPSR 寄存器,然后将 CKP 置 1,使能 SCL

(即释放 SCL)。

16.4.1.4 时钟仲裁

时钟仲裁是指在 SCL 引脚上抑制主控器件发送下一个时钟脉冲。当 CPU 需要响应 SSP 中断时

(SSPIF 位置 1, CKP 位清零 ),处在 I

2C 从动模式的SSP 模块将保持SCL 引脚为低电平。 从动

器件需要将要发送的数据写入SSPBUF寄存器,然后将 CKP 位置 1,以允许主控器件发出所需

的时钟信号。

16.4.2 主控模式(固件)

主控模式是通过检测启动(START) 和停止( STOP)条件产生中断来工作的。 STOP (P) 和

START (S) 位在复位或禁止 SSP模块时被清零。当 P位被置 1, 或 P位和 S位都清零而总线是

空闲时,可以获得对 I

2C总线的控制权。

在主控模式下,SCL 和 SDA 线是通过改变相应的 TRIS方向控制位来控制的。 不管PORT寄存

器中的值是什么,其输出电平总是为低电平。所以在发送数据时, 发送1 时必须把 TRIS的相应

位置 1 ( 设为输入 ),发送 0 时把该位清零(设为输出)。对于 SCL 线,可采用同样的方法对相

应的TRIS位进行控制。

下列事件会引起中断标志位 SSPIF置 1 ( 如果允许中断,便产生中断):

? 启动条件(START)

? 停止条件(STOP)

? 数据字节的发送/ 接收

在从动模式空闲状态 (SSPM3:SSPM0 = 1011) 或从动模式有效状态 (SSPM3:SSP0 = 1110 或

1111),都可以运行主控模式。当从动模式有效时,需要用软件来判断中断源。

16.4.3 多主控模式(固件)

在多主机模式下,利用检测启动条件(START)和停止条件(STOP)产生中断的功能,可以判

断总线何时空闲。 在复位或禁止SSP模块时, 停止位 (P) 和启动位 (S) 位清零。 当停止位 P位置

1 或P 位和S 位都为零而总线是空闲时,可以对 I

2C 总线进行控制操作。当总线处于忙状态且允

许SSP 中断时,一旦检测到停止条件便产生中断。

在多主机模式中, SDA线必须一直被检测以判断信号电平是否是所期望的输出电平。 如果期望高

电平输出,但检测的是低电平,器件就需要释放 SDA 和 SCL线 (把TRIS的相应位置 1 )。有两

种情况可能会丢失对总线的控制:

? 地址传输

? 数据传输

当允许从动模式时,从动器件将连续接收。如果在地址传输阶段失去总线控制机会,器件仍可被

其它主机寻址,若被其它主机寻址,将产生应答信号 ACK 脉冲。如果在数据传输期间失去总线

控制机会,则器件需要在以后重新传输数据。

16.4.4 休眠操作

在休眠模式下, I

2C模块能够接收地址或数据。并且地址匹配或字节传输完成后,如果允许 SSP

中断,将唤醒处理器。

16.4.5 复位的影响

复位会禁止SSP 模块并停止当前的传输。

表 16-3:与I

2CTM 操作有关的寄存器

寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

上电复位和

欠压复位时

的值

所有其

它复位时

的值

INTCON GIE PEIE T0IE INTE RBIE(2)

T0IF INTF RBIF(2)

0000 000x 0000 000u

PIR SSPIF

(1)

00

PIE SSPIE

(1)

00

SSPBUF 同步串行口的接收缓冲器 /发送寄存器 xxxx xxxx uuuu uuuu

SSPADD 同步串行口 (I

2C 模式)的地址寄存器 0000 0000 0000 0000

SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

SSPSTAT — —D/A PSR/W UA BF --00 0000 --00 0000

其中: x = 未知, u = 不变, - =未用,读作 0。

阴影部分在 I

2C 模式下未用。

注 1:这些位的位置和器件的具体型号有关。

2:这些位也可称为 GPIE 和 GPIF。

16.5 初始化

例 16-2: SPI

TM 主控模式的初始化

16.5.1 SSP 模块 / 基本 SSP 模块的兼容性

与基本SSP 模块相比,SSP模块的 SSPSTAT寄存器还另外包含两个控制位,它们是:

?SMP,SPI输入数据的采样相位

?CKE,SPI 时

钟沿选择位

为了使SSP模块与基本 SSP模块的SPI通信模式相兼容,这些位必须合理设置。 如果不按表 16-4

进行设置,可能会发生 SPI通信错误。如果 SSP模块的配置与表 16-4 中所列不同,则基本 SSP

模块不能用于实现SPI模式。可以通过软件实现该模式。

表 16-4: 保持兼容的位状态设置

CLRF STATUS ; Bank 0

CLRF SSPSTAT ; Clear status bits

MOVLW 0x31 ; Set up SPI port, Master mode, CLK/16,

MOVWF SSPCON ; Data xmit on rising edge

; Data sampled in middle

BSF STATUS, RP0 ; Bank 1

BSF PIE1, SSPIE ; Enable SSP interrupt

BCF STATUS, RP0 ; Bank 0

BSF INTCON, GIE ; Enable, enabled interrupts

MOVLW DataByte ; Data to be Transmitted

; Could move data from RAM location

MOVWF SSPBUF ; Start Transmission

基本 SSP 模块 SSP 模块

CKP CKP CKE SMP

1 100

0 000

16.6 设计技巧

问1: 在SPI 模式下,为什么无法和 SPI

TM 器件通信?

答 1:

确保你使用了该器件的正确 SPI 模式。该SPI支持 4种 SPI 模式中的两种,所以要确保你使用的

SPI器件与这两种模式之一兼容。 检查时钟的极性和相位。

如果你所使用的器件与这两种模式都不兼容,请选择使用 Microchip 具有SSP 模块的器件。

问 2: 使用 I

2C 模式时 ,为什么主控模式无法工作?

答2:

SSP 模块不支持硬件完全自动实现的主控模式,请参看应用笔记 AN578 介绍的如何用软件实现

SSP 模块的主控模式。如果你需要硬件完全自动实现的I

2C主控模式,请通过 Microchip 产品目

录卡,查阅具有主控SSP 模块的器件。

问 3: 使用 I

2C模式时, 将数据写入 SSPBUF 寄存器, 但数据并未发送,为什么?

答3:

确保CKP 位置1,以释放 I

2C 时钟。

注: 在该手册印制时,只有某些高档器件(PIC17CXXX 和PIC18F/CXXX)具有完全实现

的I

2C主控模式。

第 16章 基本同步串行口 (BSSP)

目录

本章包括下面一些主要内容:

16.1 简介.............................................................................................................................. 16-2

16.2 控制寄存器................................................................................................................... 16-3

16.3 SPITM模式.................................................................................................................. 16-6

16.4 SSP模块的 I

2CTM 操作............................................................................................ 16-15

16.5 初始化........................................................................................................................ 16-23

16.6 设计技巧..................................................................................................................... 16-24

16.7 相关应用笔记............................................................................................................. 16-25

16.8 版本历史16-26

注: 关于哪些型号的器件包含此模块,请参照附录 C.2 或器件数据手册。

16.1 简介

基本同步串行口模块 (BSSP) 是用于同其它外设模块或单片机进行通信的串行接口。这些外设模

块可以是串行 EEPROM、移位寄存器、显示驱动器或 A/D 转换器等。 BSSP 模块有以下两种工

作模式:

? 串行外设接口(SPI?)

? 内部互联(I

2C?)

- 从动模式

-I/O口输出斜率控制,启动位和停止位,便于用软件实现主控和多主机模式。

16.2 控制寄存器

寄存器 16-1: SSPSTAT: 同步串行口状态寄存器

U-0 U-0 R-0 R-0 R-0 R-0 R-0 R-0

— —D/A PSR/W UA BF

bit 7 bit 0

bit 7:6 未用:读为 0

bit 5 D/A:数据 /地址位 ( 仅用于I

2C模式)

1 = 最后接收或发送的字节是数据

0 = 最后接收或发送的字节是地址

bit 4 P:停止位

( 仅用于I

2C 模式。当 SSP 模块被禁止时该位被清零)

1 = 检测到停止位 (复位时该位为 0)

0 = 未检测到停止位

bit 3 S:启动位

( 仅用于I

2C 模式。当 SSP 模块被禁止时该位被清零)

1 = 检测到启动位 (复位时该位为 0)

0 = 未检测到启动位

bit 2 R/W:读 /写位信息 (仅用于 I

2C 模式)

该位用来记录在最后一次地址匹配后接收到的读/写信息。 从本机地址与接收地址匹配开始, 到

下一个启动位、停止位或无应答位 (ACK)时,该位有效。

1 = 读

0 = 写

bit 1 UA:地址更新 ( 仅用于10 位 I

2C 模式)

1 =需要更新SSPADD寄存器中的地址

0 = 地址不需要更新

bit 0 BF:缓冲区满状态位

接收时 (SPI 和 I

2C模式 )

1 = 接收完成, SSPBUF 满

0 = 接收未完成, SSPBUF空

发送时 (I

2C 模式时)

1 = 发送正在进行, SSPBUF 满

0 = 发送已经完成, SSPBUF 空

图注:

R = 可读位 W =

可写位

U = 未用位,读为0- n = 上电复位时的值

寄存器 16-2: SSPCON: 同步串行口控制寄存器

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 7 bit 0

bit 7 WCOL:写冲突检测位

1 = 正在发送前一个数据时,又有数据写入 SSPB寄存器

(该位必须用软件清零 )

0 = 表示未发生冲突

bit 6 SSPOV: 接收溢出标志位

在 SPI 模式下:

1 = SSPBUF 寄存器中仍保持前一个数据时又收到新的数据。 在溢出时,SSPSR 中的数据会丢

失。溢出只会发生在从动模式下。即使只是发送数据,用户也必须读 SSPBUF,以避免产

生溢出。 在主控模式下,溢出位不会被置“1”,因为每次接收或发送新数据,都要通过写

SSPBUF来启动。

0 = 没有溢出

在 I

2C 模式下:

1 = 表示 SSPBUF中仍保持前一个数据时又收到新的数据。

在发送方式下SSPOV位无效,在 SPI、 I

2C模式下,该位都必须用软件清零。

0 = 没有溢出

bit 5 SSPEN: 同步串行口的使能位

在 SPI 和I

2C 两种模式下,当该位为 1而使能时,应正确配置相应引脚的输入输出方向。

在 SPI 模式下:

1 = 使能串行口,并定义 SCK、SDO、SDI 和 SS 引脚为串行口引脚

0 = 禁止串行口,并定义 SCK、SDO、SDI 和 SS 引脚为一般 I/O 端口引脚

在 I

2C 模式下:

1 = 使能串行口,并定义 SDA 和 SCL引脚为串行口引脚

0 = 禁止串行口,并定义 SDA 和 SCL引脚为一般 I/O 端口引脚

bit 4 CKP: 时钟极性选择:

在 SPI模式下:

1 = 空闲状态时,时钟为高电平

0 = 空闲状态时,时钟为低电平

在 I

2C 模式下:

SCK 释放控制

1 = 使能时钟

0 = 保持时钟线为低电平 (用于保证数据的建立时间 )

bit 3:0 SSPM3:SSPM0: 同步串行口的工作模式选择位

0000 = SPI 主控模式,时钟= FOSC/4

0001 = SPI 主控模式,时钟= FOSC/16

0010 = SPI 主控模式 ,时钟= FOSC/64

0011 = SPI 主控模式 , 时钟 = TMR2 输出/2

0100 = SPI 从动模式 , 时钟 = SCK 引脚。使能 SS 引脚控制。

0101 = SPI 从动模式 , 时钟 = SCK 引脚。禁止 SS 引脚控制。 SS 可用作I/O引脚。

0110 = I

2C 7 位地址的从动模式

0111 = I

2C 10 位地址的从动模式

1000 =保留

1001 = 保留

1010 = 保留

1011 = I

2C 固件控制的主控模式 (从动模式空闲)

1100 = 保留

1101 = 保留

1110 = I

2C 固件控制的多主机模式

7位地址,允许启动位和停止位中断功能

1111 = I

2C 固件控制的主控模式

10位地址,允许启动位和停止位中断功能

寄存器 16-2: SSPCON: 同步串行口控制寄存器 (续)

图注:

R = 可读位 W = 可写位

U = 未用位 , 读为 0- n = 上电复位时的值

16.3 SPI

TM 模式

SPI模式允许同步发送或接收 8位数据,一般用以下三个

引脚来完成通信:

? 串行数据输出 (SDO)

? 串行数据输入 (SDI)

? 串行时钟 (SCK)

当在从动模式下工作时,可能还需要第 4个引脚:

? 从动选择 (SS)

16.3.1 操作

初始化SPI时,必须通过设置SSPCON寄存器中的相应控制位 (SSPCON)来指定以下各项:

? 主控模式 (SCK 作为时钟输出 )

? 从动模式 (SCK 作为时钟输入 )

? 时钟极性 (选择在SCK 的上升沿还是下降沿输出/ 输入数据)

? 时钟速率( 仅用于主控模式)

? 从动选择 (仅用于从动模式)

图 16-1 给出了工作在 SPI模式下SSP模块的方框

SSP 模块由一个发送 / 接收移位寄存器 (SSPSR) 和一个缓冲寄存器 (SSPBUF)组成。 SSPSR

用于器件输入和输出数据的移位,最高有效位在前。 在新的数据接收完毕前,SSPBUF保存写入

SSPSR的数据。一旦8 位新数据接收完毕,该数据被送入 SSPBUF寄存器。同时缓冲区满标志

位 BF (SSPSTAT ) 和中断标志位 SSPIF 置 1。这种双重缓冲接收方式,允许接收的数据被

CPU读取之前,开始接收下一个数据。 在数据发送/接收期间, 任何试图写SSPBUF 寄存器的操

作都无效,会将冲突检测位WCOL (SSPCON) 置 1。此时用户必须用软件将 WCOL位清零,

否则无法判别下一次对SSPBUF的写操作是否成功。当应用软件要接收一个有效数据时,应该在

下一个要传送的数据写入SSPBUF之前,将 SSPBUF中的前一个数据读出。 缓冲器满标志位 BF

(SSPSTAT) 用于表示何时把接收到的数据送入 SSPBUF 寄存器 (传输完成) 。当 SSPBUF

中的数据被读出后,BF 位即被清零。如果 SPI 仅仅作为一个发送器,则不必理会接收的数据。

通常可用SSP 中断来判断发送或接收是否完成。 如果数据有效,可读出 SSPBUF 中的数据并/

或对 SSPBUF (SSPSR) 进行写操作。如果不使用中断来处理数据的收发,用软件查询方法同样

可确保不会发生写冲突。 例 16-1举例说明了在数据发送时如何写SPBUF, 阴影部分的指令仅在

需要接收数据时才使用 (而某些 SPI应用只发送数据)。

例 16-1:对SSPBUF (SSPSR) 寄存器的写操作

SSPSR 寄存器不能直接读写, 只能通过对SSPBUF寄存器寻址来访问。 SSP模块的状态寄存器

SSPSTAT可用来指示各种状态条件。

BCF STATUS, RP1 ;Specify Bank1

BSF STATUS, RP0 ;

LOOP BTFSS SSPSTAT, BF ;Has data been received (transmit complete)?

GOTO LOOP ;No

BCF STATUS, RP0 ;Specify Bank0

MOVF SSPBUF, W ;W reg = contents of SSPBUF

MOVWF RXDATA ;Save in user RAM, if data is meaningful

MOVF TXDATA, W ;W reg = contents of TXDATA

MOVWF SSPBUF ;New data to xmit

16.3.2 使能 SPI

TM 的 I/O 口

要使能SSP 串行口, SSP使能位 SSPEN (SSPCON) 必须被置1。 要复位

或重新配置 SPI模

式,先将 SSPEN 位清零,对 SSPCON 重新初始化,然后把 SSPEN 位置 1。这将设定 SDI、

SDO、SCK 和 SS 引脚为SSP串行口引脚。要使这些引脚用作串行口功能,还必须通过TRIS 寄

存器正确设置这些引脚的方向,即:

?SDI定义成输入

?SDO定义成输出

? 主控模式时,SCK 定义成输出

? 从动模式时,SCK 定义成输入

?SS定义成输入

对于不需要的串行口引脚,可以通过把相应的数据方向寄存器(TRIS)设置为上述的相反值而

另作它用。例如在主控模式下,如果只发送数据(如发送到显示驱动器) ,那么通过将SDI 和 SS

引脚的TRIS方向位清零,就可以把这两个引脚作为通用的输出口使用。

16.3.3 典型连接

图 16-2给出两个单片机之间的典型连接。主控制器 (处理器1)通过发送SCK信号来启动数据传

输。根据程序设定的时钟边沿,分别位于两个处理器里的移位寄存器中的数据同时被移出,并在

相反的时钟边沿被锁存。两个处理器的时钟极性(CKP) 必须编程设定为相同,这样两个处理器

就可以同时收发数据。至于数据是否有意义(或是无效“哑”数据)则取决于应用软件,这就导

致以下三种数据发送方式:

? 主控制器发送数据 — 从控制器发送无效数据(“哑”数据) 。

? 主控制器发送数据 — 从控制器发送数据

? 主控制器发送无效数据— 从控制器发送数据

16.3.4 主控模式的操作

因为主控制器控制着 SCK 信号,所以它可以在任何时候启动数据传输,同时主控制器通过软件

协议来决定从控制器 (处理器 2)何时要传送数据。

在主控模式下,数据一旦写入 SSPBUF 就开始发送或接收。如果 SPI 仅作为接收器,则可以禁

止SDO 输出 ( 将其设置为输入端口)。SSPSR 寄存器按设置的时钟速率,对 SDI引脚上的信号

进行连续地移位输入。每接收完一个字节,都把其送入 SSPBUF 寄存器,就象普通的接收字节

一样(相应的中断和状态位置 1) 。这在“线路主动监控”方式的接收器应用中可能是很有用的。

时钟极性可通过对SSPCON寄存器的CKP 位(SSPCON)编程来设定。图 16-3 是主控模式

下 SPI 通信的时序图,最高位首先发送。在主控模式下, SPI 时钟速率(位速率)可由用户编

程设定为下面几种方式之一:

?FOSC/4 (或 TCY)

?FOSC/16 (或 4 ? TCY)

?FOSC/64 (或 16 ? TCY)

? 定时器2 输出速率 /2

最大数据通信速率是5 Mbps(当晶振为 20 MHz时)。

16.3.5 从动模式的操作

在从动模式下,当SCK 引脚上出现外部时钟脉冲时,发送/ 接收数据。当最后一位数据锁存后,

中断标志位SSPIF置“1”。

时钟极性通过对SSPCON寄存器的CKP 位 (SSPCON)编程来设定。图 16-4 是SPI通信的

时序图,最高

位先被发送。 在从动模式下,外部时钟必须满足最短高电平和低电平的脉宽要求。

在休眠状态下,从控制器仍可发送和接收数据,如果允许中断,还可唤醒单片机。

16.3.6 从动选择模式

SS 引脚还可用于同步从动模式。 要将 SPI 设置成同步从动模式,SPI 必须工作在从动模式

(SSPCON = 04h) ,并将 SS 引脚的 TRIS 位置位。当 SS 引脚为低电平时,允许数据的

发送和接收, 同时SDO 引脚被驱动为高电平或低电平。 当 SS 引脚变为高电平时, 即使是在数

据的发送过程中, SDO引脚也不再被驱动,而是变成高阻悬浮状态。当 SS 引脚再次变成低电平

时,如果此前没有重新设置 SPI 的工作模式,则数据将接着上次变为高电平时的中断点继续发

送。为清零位计数器,必须先禁止然后再重新使能基本 SSP 模块。根据应用的需要,可在 SDO

引脚上外接上拉或下拉电阻。

将 SDO 引脚和 SDI 引脚相连,可以仿真二线制通信。 当 SPI 作为接收器时,可将 SDO 引脚定

义为输入, 这样就禁止SDO引脚发送数据。而SDI总是定义为输入, 因为它不会引起总线冲突。

16.3.7 休眠状态下的操作

在主控模式下,此时所有模块的时钟都停止了,在器件被唤醒前,发送 / 接收也处于停滞状态。

在器件恢复正常工作状态后,模块将继续数据的发送/ 接收。

在从动模式下, SPI 发送 / 接收移位寄存器与器件异步工作,所以在休眠状态时,数据仍可被移

入 SPI 发送 /接收移位寄存器。当接收完8 位数据后,SSP 中断标志位将置1,如果此时该中断

是使能的,将唤醒器件。

16.3.8 复位的影响

复位会禁止SSP 模块并停止当前的数据传输。

表 16-1:和SPI

TM 操作有关的寄存器

寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

上电复位、

欠压复位时

的值

其它复位时

的值

INTCON GIE PEIE T0IE INTE RBIE(2)

T0IF INTF RBIF(2)

0000 000x 0000 000u

PIR SSPIF

(1)

00

PIE SSPIE

(1)

00

SSPBUF 同步串行口的接收缓冲器 /发送寄存器 xxxx xxxx uuuu uuuu

SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

SSPSTAT — — D/A P S R/W UA BF --00 0000 --00 0000

其中: x = 未知,u =不变, - =未用,读为 0。

阴影部分在SPI模式下的 SSP中未用。

注 1:该位的位置和器件的具体型号有关。

2:这些位也可称为GPIE 和 GPIF。

16.4 SSP 模块的 I

2CTM 操作

SSP 模块工作在 I

2C 模式时,除了不支持全局呼叫外,可以完成所有的从动模式功能,并且硬件

上提供启动位和停止位中断,以便软件实现主控功能。 SSP 模块实现了标准模式规范,并支持对

7 位和 10位地址的寻址。附录 A 给出了 I

2C总线规范的概述。

数据传输使用两个

引脚:一个是作为时钟线的 SCL 引脚,另一个是作为数据线的SDA引脚。用

户应通过 TRIC 寄存器把这些引脚设置成输入。将 SSP 使能位 SSPEN (SSPCON)置位,

可使能SSP 模块功能。

当SCL 和 SDA 引脚为输入时,引脚上有窄脉冲(毛刺)滤波器,该滤波器可以工作在 100 KHz

和 400 KHz 两种模式下。在 100 KHz 模式下, 当这些引脚作为输出时,可对引脚进行压摆率控

制,此控制和器件频率无关。

SSP 模块有 5 个寄存器用于 I

2C 操作,它们是:

? SSP 控制寄存器 (SSPCON)

? SSP 状态寄存器 (SSPSTAT)

? 串行接收/ 发送缓冲器 (SSPBUF)

? SSP 移位寄存器 (SSPSR) - 不可直接访问

? SSP 地址寄存器 (SSPADD)

SSPCON 寄存器用于控制 I

2C的工作模式。可通过设置四个模式选择位 (SSPCON)来选

择以下几种 I

2C 模式:

?I

2C 从动模式(7 位地址 )

?I

2C 从动模式 (10 位地址)

?I

2C 固件控制的多主机模式, 7位地址 (允许启动位和停止位中断)

?I

2C 固件控制的多主机模式, 10位地址 (允许启动位和停止位中断 )

?I

2C 固件控制的主控模式,从动模式空闲

在选择 I

2C工作模式前,通过置位相应的 TRIS 位,将 SCL 和SDA 引脚定义为输入。然后选择

I

2C工作模式,通过将SSPEN 位置1,使能SCL和 SDA引脚分别作为 I

2C模式的时钟线和数据线。

SSPSTAT 寄存器提供数据传输的状态,其中包括启动位和停止位的检测、确定接收的字节是数

据还是地址、下一个字节是否已完成 10 位地址的传送,以及是数据传输是读操作还是写操作。

SSPSTAT 是一个只读寄存器。

SSPBUF 寄存器存放要读 / 写的传输数据, SSPSR 寄存器将数据移入或移出器件。接收时,

SSPBUF 和 SSPSR 构成了一个双重缓冲接收器,允许在前一个数据读出前即可接收下一个数

据。 当接收完字节后,将其送入 SSPBUF 寄存器,同时置位中断请求标志位 SSPIF。如果在

SSPBUF 寄存器中的前一个数据被读走前,又接收到一个新数据, 就会发生接收器溢出,

SSPOV 位 (SSPCON)将置 1。

SSPADD寄存器用于保存从机地址。 在 10 位地址模式时,用户需要写入地址的高字节 (1111 0

A9 A8 0)。 在高字节地址匹配后,再写入地址的低字节 (A7:A0)。

16.4.1 从动模式

在从动模式下,SCL 和 SDA 引脚必须设置为输入 ( 相应的TRIS 位置 1)。在需要时(如在从动

发送器情况下) , SSP模块会将输入状态改变为输出状态输出数据。

当地址匹配时或在地址匹配后传送的数据被接收时,硬件会自动产生一个应答 (ACK) 脉冲,并把

在SSPSR 中接收到的数据装入SSPBUF 缓冲区。

满足下列条件之一,SSP 模块不会产生应答脉冲 ACK:

a) 在传送的数据被接收之前,缓冲区满标志位 BF (SS

PSTAT) 已被置为1。

b) 在传送的数据被接收之前,溢出标志位 SSPOV (SSPCON)已被置为 1

此时, 移位寄存器 SSPSR 的值不会装入缓冲区SSPBUF中, 但是中断标志位 SSPIF和 SSPOV

位仍会置1。 表 16-2 列出了在给定 BF 和 SSPOV 位状态时,数据的接收情况。阴影部分表示用

户软件没有对溢出状态进行适当清零的情况。标志位 BF 是通过读取 SSPBUF 进行清零的,而

SSPOV 位必须通过软件来清零。

SCL 时钟输入的高电平和低电平必须满足最小脉宽的要求才能正常工作。关于I

2C 规范所规定的

高低电平脉宽以及对SSP 模块的具体要求,请参见“电气规范”一章参数 100 和 101。

16.4.1.1 寻址

一旦 SSP 模块被使能,它就等待 START(启动)信号出现。在启动信号出现后,8 位数据被移

入 SSPSR 寄存器。所有移入的位都在时钟线 SCL 的上升沿采样。在 SCL 时钟的第 8 个脉冲下

降沿,SSPSR 的值与地址寄存器 SSPADD 的值作比较,如果地址匹配, BF 和SSPOV 位

就被清零,并完成下列操作:

a) 在第8 个 SCL 脉冲的下降沿把 SSPSR寄存器的值装入 SSPBUF寄存器。

b) 缓冲器满标志位 BF 在第8 个SCL 脉冲的下降沿被置 1。

c) 产生ACK 脉冲。

d) 在第9个SCL脉冲的下降沿,SSP中断标志位SSPIF置1 (如果允许中断, 则产生中断)。

在 10 位地址模式时,从动器件需要接收两个地址字节。第一个地址字节的高 5 位指定这是否是

一个10位地址。 R/W 位 (SSPSTAT)必须指定为写操作,这样从动器件就会接收第二个地址

字节。对于10 位地址,高字节应该是 ‘1111 0 A9 A8 0’,其中 A9 和 A8 是10 位地址的两个

最高位。 10位地址的工作步骤如下,其中 7- 9 步是针对从动发送器而言的:

1. 接收地址的第一个 (高) 字节 (SSPIF、 BF和 UA (SSPSTAT)位被置 1)。

2. 用地址的第二个字节 (10位地址的低8位)更新SSPADD寄存器 (对 UA 位清零同时释放

SCL 时钟线)。

3. 读SSPBUF寄存器 ( BF位被清零 )并清零中断标志位 SSPIF。

4. 接收地址第二个字节 (SSPIF、 BF和 UA被置 1)。

5. 用地址的高字节更新 SSPADD 寄存器,这将使 UA位清零并释放 SCL 时钟线。

6. 读 SSPBUF寄存器 (BF位清零) 并清零中断标志位SSPIF。

7. 接收再次出现的启动(START)信号。

8. 接收地址的第一 个(高 ) 字节 (SSPIF和 BF位被置1)。

9. 读SSPBUF寄存器 (BF位清零) 并清零中断标志位SSPIF。

注: 10 位地址模式下,在重复启动(RESTART)条件(第 7 步)出现后,用户只需要

匹配开始的7 位地址,不需要更新 SSPADD 寄存器以匹配另一半地址。

表 16-2: 传输接收数据字节的情况

数据接收时的状态位

SSPSR → SSPBUF

产生 ACK

脉冲

置位 SSPIF位

(如允许中断,则产生

SSP

中断) BF SSPOV

00 是是是

10 否否是

11 否否是

0 1 是 否 是

注:阴影部分表示用户软件没有正确清除溢出条件时的情况。

16.4.1.2 接收

当地址字节的 R/W 位是零且地址匹配时, SSPSTAT 寄存器中的 R/W 位被清零,同时把接收的

地址装入缓冲器 SSPBUF。

当发生地址字节接收溢出时,则不会产生应答信号 (ACK)。溢出条件是指 BF 位 (SSPSTAT)

置1 或 SSPOV 位(SSPCON)置 1。

每个数据传输字节都会产生一个SSP 中断。SSPIF标志位必须用软件清零, 状态寄存器SSPSTAT

用于确定字节的状态。

16.4.1.3 发送

当输入地址字节的 R/W 位置 1 且地址匹配时,状态寄存器 SSPSTAT 的 R/W 位被置 1。 接收到

的地址被装入缓冲器 SSPBUF。应答信号 ACK 在 SCL 的第 9 个脉冲时发送,同时 SCL 引脚保

持低电平。发送的数据必须送入 SSPBUF缓冲器,同时也送入 SSPSR寄存器。然后通过把CKP

位(SSPCON)置 1,使能 SCL引脚。主控器件必须监视 SCL 引脚脉冲信号。 从动器件可

以通过延长 SCL 时钟的低电平,而使主控器件处于数据等待状态。 8 位数据在 SCL 时钟的下降

沿被移位输出。这可确保在SCL 为高电平期间 SDA信号是有效的 (如图 16-9)。

每个数据发送字节都会产生一个 SSP 中断, SSPIF 标志位必须通过软件清零,状态寄存器

SSPSTAT用于确定字节传输的状态。 SSPIF标志位是在第 9 个脉冲下降沿被置1。

作为从动发送器,在第 9个 SCL 时钟脉冲的上升沿锁存从主控接收器发出的 ACK 信号。若SDA

线为高电平(无 ACK 应答信号),那么表示数据传输已完成。当无ACK 应答被从动器件锁存时,

从动逻辑被复位,并再监测下一个 START信号的发生。如果 SDA 线是低电平(有ACK应答信

号) ,发送数据应装入 SSPBUF 缓冲器,并装入 SSPSR 寄存器,然后将 CKP 置 1,使能 SCL

(即释放 SCL)。

16.4.1.4 时钟仲裁

时钟仲裁是指在 SCL 引脚上抑制主控器件发送下一个时钟脉冲。当 CPU 需要响应 SSP 中断时

(SSPIF 位置 1, CKP 位清零 ),处在 I

2C 从动模式的SSP 模块将保持SCL 引脚为低电平。 从动

器件需要将要发送的数据写入SSPBUF寄存器,然后将 CKP 位置 1,以允许主控器件发出所需

的时钟信号。

16.4.2 主控模式(固件)

主控模式是通过检测启动(START) 和停止( STOP)条件产生中断来工作的。 STOP (P) 和

START (S) 位在复位或禁止 SSP模块时被清零。当 P位被置 1, 或 P位和 S位都清零而总线是

空闲时,可以获得对 I

2C总线的控制权。

在主控模式下,SCL 和 SDA 线是通过改变相应的 TRIS方向控制位来控制的。 不管PORT寄存

器中的值是什么,其输出电平总是为低电平。所以在发送数据时, 发送1 时必须把 TRIS的相应

位置 1 ( 设为输入 ),发送 0 时把该位清零(设为输出)。对于 SCL 线,可采用同样的方法对相

应的TRIS位进行控制。

下列事件会引起中断标志位 SSPIF置 1 ( 如果允许中断,便产生中断):

? 启动条件(START)

? 停止条件(STOP)

? 数据字节的发送/ 接收

在从动模式空闲状态 (SSPM3:SSPM0 = 1011) 或从动模式有效状态 (SSPM3:SSP0 = 1110 或

1111),都可以运行主控模式。当从动模式有效时,需要用软件来判断中断源。

16.4.3 多主控模式(固件)

在多主机模式下,利用检测启动条件(START)和停止条件(STOP)产生中断的功能,可以判

断总线何时空闲。 在复位或禁止SSP模块时, 停止位 (P) 和启动位 (S) 位清零。 当停止位 P位置

1 或P 位和S 位都为零而总线是空闲时,可以对 I

2C 总线进行控制操作。当总线处于忙状态且允

许SSP 中断时,一旦检测到停止条件便产生中断。

在多主机模式中, SDA线必须一直被检测以判断信号电平是否是所期望的输出电平。 如果期望高

电平输出,但检测的是低电平,器件就需要释放 SDA 和 SCL线 (把TRIS的相应位置 1 )。有两

种情况可能会丢失对总线的控制:

? 地址传输

? 数据传输

当允许从动模式时,从动器件将连续接收。如果在地址传输阶段失去总线控制机会,器件仍可被

其它主机寻址,若被其它主机寻址,将产生应答信号 ACK 脉冲。如果在数据传输期间失去总线

控制机会,则器件需要在以后重新传输数据。

16.4.4 休眠操作

在休眠模式下, I

2C模块能够接收地址或数据。并且地址匹配或字节传输完成后,如果允许 SSP

中断,将唤醒处理器。

16.4.5 复位的影响

复位会禁止SSP 模块并停止当前的传输。

表 16-3:与I

2CTM 操作有关的寄存器

寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

上电复位和

欠压复位时

的值

所有其

它复位时

的值

INTCON GIE PEIE T0IE INTE RBIE(2)

T0IF INTF RBIF(2)

0000 000x 0000 000u

PIR SSPIF

(1)

00

PIE SSPIE

(1)

00

SSPBUF 同步串行口的接收缓冲器 /发送寄存器 xxxx xxxx uuuu uuuu

SSPADD 同步串行口 (I

2C 模式)的地址寄存器 0000 0000 0000 0000

SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

SSPSTAT — —D/A PSR/W UA BF --00 0000 --00 0000

其中: x = 未知, u = 不变, - =未用,读作 0。

阴影部分在 I

2C 模式下未用。

注 1:这些位的位置和器件的具体型号有关。

2:这些位也可称为 GPIE 和 GPIF。

16.5 初始化

例 16-2: SPI

TM 主控模式的初始化

16.5.1 SSP 模块 / 基本 SSP 模块的兼容性

与基本SSP 模块相比,SSP模块的 SSPSTAT寄存器还另外包含两个控制位,它们是:

?SMP,SPI输入数据的采样相位

?CKE,SPI 时

钟沿选择位

为了使SSP模块与基本 SSP模块的SPI通信模式相兼容,这些位必须合理设置。 如果不按表 16-4

进行设置,可能会发生 SPI通信错误。如果 SSP模块的配置与表 16-4 中所列不同,则基本 SSP

模块不能用于实现SPI模式。可以通过软件实现该模式。

表 16-4: 保持兼容的位状态设置

CLRF STATUS ; Bank 0

CLRF SSPSTAT ; Clear status bits

MOVLW 0x31 ; Set up SPI port, Master mode, CLK/16,

MOVWF SSPCON ; Data xmit on rising edge

; Data sampled in middle

BSF STATUS, RP0 ; Bank 1

BSF PIE1, SSPIE ; Enable SSP interrupt

BCF STATUS, RP0 ; Bank 0

BSF INTCON, GIE ; Enable, enabled interrupts

MOVLW DataByte ; Data to be Transmitted

; Could move data from RAM location

MOVWF SSPBUF ; Start Transmission

基本 SSP 模块 SSP 模块

CKP CKP CKE SMP

1 100

0 000

16.6 设计技巧

问1: 在SPI 模式下,为什么无法和 SPI

TM 器件通信?

答 1:

确保你使用了该器件的正确 SPI 模式。该SPI支持 4种 SPI 模式中的两种,所以要确保你使用的

SPI器件与这两种模式之一兼容。 检查时钟的极性和相位。

如果你所使用的器件与这两种模式都不兼容,请选择使用 Microchip 具有SSP 模块的器件。

问 2: 使用 I

2C 模式时 ,为什么主控模式无法工作?

答2:

SSP 模块不支持硬件完全自动实现的主控模式,请参看应用笔记 AN578 介绍的如何用软件实现

SSP 模块的主控模式。如果你需要硬件完全自动实现的I

2C主控模式,请通过 Microchip 产品目

录卡,查阅具有主控SSP 模块的器件。

问 3: 使用 I

2C模式时, 将数据写入 SSPBUF 寄存器, 但数据并未发送,为什么?

答3:

确保CKP 位置1,以释放 I

2C 时钟。

注: 在该手册印制时,只有某些高档器件(PIC17CXXX 和PIC18F/CXXX)具有完全实现

的I

2C主控模式。


相关内容

  • 并行串行接口定义
  • 1. 并行通信和串行通信 计算机与外设或计算机之间的通信通常有两种方式: (1) 并行通信 (2) 串行通信 并行通信指数据的各位同时传送.并行方式传输数据速度快,但占用的通信线多,传输数 据的可靠性随距离的增加而下降,只适用于近距离的数据传送. 串行通信是指在单根数据线上将数据一位一位地依次传送. ...

  • 串口通讯协议综述
  • 串口通讯协议综述 所谓通信协议是指通信双方的一种约定.约定包括对数据格式.同步方式.传送速度.传送步骤.检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守.因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层,其主要完成的作用如下: (1)实 ...

  • 所谓通信协议是指通信双方的一种约定
  • 所谓通信协议是指通信双方的一种约定.约定包括对数据格式.同步方式.传送速度.传送步骤.检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守.因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层,其主要完成的作用如下: (1)实现数据格式化:因为 ...

  • 毕业论文基于单片机红外遥控密码锁
  • 学科代码:080714 学 号:[1**********]1 贵 州 师 范 大 学(本 科) 毕 业 论 文 题 目:基于单片机红外遥控密码锁设计 学 院:物理与电子科学学院 专 业:电子信息科学与技术 年 级:2012级 姓 名:罗滨志 指导教师:曹晓龙 完成时间:2016年4月7日 贵州师范大 ...

  • 中规模集成电路
  • 中规模集成电路 4.5.1 集成编码器 编码器的逻辑功能是将加在电路若干个输入端中的某一个输入端的信号变换成相应的一组二进制代码输出.常用的编码器集成电路有8/3线优先编码器和10/4线优先编码器等器件. 图4.5.1(a)是8/3线优先编码器74LS148的管脚排列图.I0-I7是输入信号输入端, ...

  • 计算机总线技术基础知识
  • 任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU 直接连接,那么连线将会错综复杂,甚至难以实现.为了简化硬件电路设计.简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线.采用总线结构便于部件 ...

  • 单片机原理及应用课后习题答案
  • 第一章 单片机概述 1.2 除了单片机这一名称之外,单片机还可称为(微控制器)和(嵌入式控制器). 1.3 单片机与普通计算机的不同之处在于其将(微处理器).(存储器)和(各种输入输出接口)三部分集成于一块芯片上. 4.单片机的发展大致分为哪几个阶段? 答:单片机的发展历史可分为四个阶段: 第一阶段 ...

  • 大功率LED脉冲位置调制解调设计
  • 第9卷第5期 2011年lO月 光学与光电技术 0F7rICS8.()PT()ELECTRONICTECHNOI.OGY V01.9.No.5October.2011 文章编号:1672-3392(2011)05-0075-04 大功率LED脉冲位置调制解调设计 谭家杰1'2 杨克成1 夏珉1 (1 ...

  • 定时器与波特率
  • 在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS-51串行口编程可约定四种工作方式.其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定. 串行口的四种工作方式对应着三种波特率.由于输人的移位时钟的来源不同,所以,各种方式的 ...