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主控模式。