15. I2C 总线控制器 (I2C)
15.1. 概述
SWM221 系列所有型号 I2C 操作均相同,不同型号 I2C 模块数量可能不同。使用前需使能对应 I2C 模块时钟。
I2C 模块提供了 Master 模式及 Slave 模式,基本操作及配置详见功能描述章节。
15.2. 特性
支持通过 APB 总线进行配置
支持 Master, Slave 两种模式
支持 I2C 输入信号数字滤波
支持 Standard-mode(100kbps)、Fast-mode(400kbps)、Fast-mode Plus(1Mbps)、High-speed mode(3.4Mbps)
SCL/SDA 线上数据可读
Master 模式特性:
支持 Clock Synchronization
支持多 Master 总线仲裁
支持 Clock Stretching,Slave 器件可通过拉低 SCL 延长时钟来占据总线
支持 SCL LOW 超时报警
支持读、写操作
支持发出的SCL时钟周期最大为(217) x PCLK
SCL 时钟占空比可配置
Slave 模式特性:
支持多 Slave
支持7位、10位两种地址模式
支持地址 Mask,一个 Slave 器件可以占用多个地址
7位地址模式,一个 Slave 器件最多可占用128个地址
10位地址模式,一个 Slave 器件最多可占用256个地址
支持 Clock Stretching,通过拉低 SCL 延长时钟占据总线
支持读、写操作
15.3. 功能描述
15.3.1. 模块结构
I2C 模块结构如 图 71 所示。
图 71 I2C 模块结构宽图
15.3.2. 基本操作
总线设置
I2C总线采用串行数据线(SDA)和串行时钟线(SCL)传输数据。I2C 总线的设备端口为开漏输出,必须在接口外接上拉电阻。
数据在主从设备之间通过 SCL 时钟信号在 SDA 数据线上逐字节同步传输。每一个 SCL 时钟脉冲发送一位数据,高位在前。每发送一个字节的数据产生一个应答信号。在时钟线 SCL 高电平期间对数据的每一位进行采样。数据线 SDA 在时钟线 SCL 为低改变,在时钟线 SCL 为高电平时保持稳定。
协议介绍
通常情况下,一个标准的通信包含四个部分:开始信号、从机地址、数据传输、停止信号。如 图 72 所示:
图 72 I2C 通信示意图
起始位发送
当总线空闲时,表示没有主机设备占用总线(SCL 和 SDA 都保持高电平),主机可以通过发送一个起始信号启动传输。启动信号,通常被称为 S 位。SCL 为高电平时,SDA 由高电平向低电平跳变。启动信号表示开始新的数据传输。
重新启动是没有先产生一个停止信号的启动信号。主机使用此方法与另一个从机或者在不释放总线的情况下与相同的从机改变数据传输方向(例如从写入设备到写入设备的转换)。
当命令寄存器的 STA 位被置位,同时 RD 或者 WR 位被置位时,系统核心产生一个启动信号。根据 SCLK 的当前的不同状态,生成启动信号或重复启动信号。
地址发送
在开始信号后,由主机传输的第一个字节数据是从机地址。包含7位的从设备地址和1位的RW指示位。RW 指示位信号表示与从机的数据传输方向。在系统中的从机不可以具有相同的地址。只有从机地址和主机发送的地址匹配时才能产生一个应答位(在第九个时钟周期拉低SDA)进行响应。对于10位从机地址,模块通过产生两个从机地址支持。
发送从机地址为一次写操作,在传输寄存器中保存从机地址并对 WR 位置位,从机地址将被发送到总线上。
数据发送
一旦成功取得了从机地址,主机就可以通过 R/W 位控制逐字节的发送数据。每传输一个字节都需要在第九个时钟周期产生一个应答位。
如果从机信号无效,主机可以生成一个停止信号中止数据传输或生成重复启动的信号并开始一个新的传输周期。如果从机返回一个 NACK 信号,主机就会产生一个停止信号放弃数据传输,或者产生一个重新启动信号开始一个新的传输周期。
如果主机作为接收设备,没有应答从机,从机就会释放SDA,主机产生停止信号或者重新启动信号。
向从机写入数据,需把将要发送的数据存入传输寄存器中并设置 WR 位。从从机中读取数据,需设置 RD 位。在数据传输过程中系统核心设置 TIP 提示标志,指示传输正在进行。当传输完成后 TIP 提示标志会自动清除。当中断使能时,中断标志位 IF 被置位,并产生中断。当中断标志位 IF 被置位后,接收寄存器收到有效数据。当 TIP 提示标志复位后,用户可以发出新的写入或读取命令。
停止位发送
主机可以通过生成一个停止信号终止通信。停止信号通常被称为 P 位,被定义为 SCL 为高电平时,SDA 由低电平向高电平跳变。
15.3.3. Master SCL周期配置
图 73 Master SCL 周期配置示意图
15.3.4. 主机发送模式
I2C 模块作为主机,初始化配置操作如下:
配置 PORTCON 模块中端口对应 PORTx_FUNC 寄存器,将指定引脚切换为功能复用
配置 PORTCON 模块中端口对应 PULLU_x 上拉使能寄存器,使能端口内部上拉电阻(也可使用外部上拉电阻)
配置 PORTCON 模块中端口对应 INEN_x 输入使能寄存器,使能 I2C 数据线输入功能
配置 CR 寄存器的 EN 位,关闭 I2C 模块,确保配置寄存器过程中模块未工作
配置 CR 寄存器的 MASTER 位,将 I2C 模块设置为主机模式
配置 CR 寄存器的 EN 位,I2C 模块总线使能
设置时序配置寄存器 CLK,假设 PCLK = 48MHz,希望 I2C 工作在 Standard-mode(100kbps)速度下,则每个SCL = 480个PCLK,可以设置 SCLL = 0XA0,SCLH = 0x50,DIV = 0x01
查询 SR.BUSY,如果为1,则等待直至其变为0;如果为0,则进行下一步
发送Start。设置 MCR.STA=1,查询该位,直至其变为0
发 Slave 地址字节
设置 TXDATA 为【7位slave地址字节左移一位】
设置 MCR.WR = 1,查询该位,直至其变为0(或查询到 IF 的 TXDONE = 1(发送成功)或 AL = 1(仲裁丢失总线),并写1清除)
如果 TXDONE = 1,读 TR.RXACK,如果该位为0,表示 Slave 地址匹配成功
如果 AL = 1,表示本 Master 失去总线,不能再进行后续操作,需重新查询 SR.BUSY 位直至1,才可以重新发送 Start 位,重新申请总线操作
向 Slave 发送待写数据
设置 TXDATA,准备待写入 Slave 的数据
设置 MCR.WR = 1,查询该位,直至其变为0(或查询到 RIST 的 TXDONE = 1,并写1清除)
读 TR.RXACK,如果该位为0,表示写数据成功
发 Stop。设置MCR.STO=1,查询该位,直至其变为0
示意图如 图 74 所示:
图 74 Master 寄存器时序示意图
注意
图中红色部分表示软件操作
15.3.5. 主机接收模式
I2C 作为主机接收模式,需将 I2C 模块设置为 MASTER,初始化过程与主发送模式相同。
I2C 作为主机从从机接收数据操作流程如下:
配置 PORTCON 模块中端口对应 PORTx_FUNC 寄存器,将指定引脚切换为功能复用
配置 PORTCON 模块中端口对应 PULLU_x 上拉使能寄存器,使能端口内部上拉电阻(也可使用外部上拉电阻)
配置 PORTCON 模块中端口对应 INEN_x 输入使能寄存器,使能 I2C 数据线输入功能
配置 CR 寄存器的 EN 位,关闭 I2C 模块,确保配置寄存器过程中模块未工作
配置 CR 寄存器的 MASTER 位,将 I2C 模块设置为主机模式
配置 CR 寄存器的 EN 位,I2C 模块总线使能
设置时序配置寄存器 CLK,假设 PCLK = 48MHz,希望 I2C 工作在 Standard-mode(100kbps)速度下,则每个 SCL = 480个PCLK,可以设置 SCLL = 0XA0,SCLH = 0x50,DIV = 0x01
查询 SR.BUSY,如果为1,则等待直至其变为0;如果为0,则进行下一步
发送 Start。设置 MCR.STA = 1,查询该位,直至其变为0
发 Slave 地址字节
设置 TXDATA为 [ 7位 Slave 地址字节地址右移1位 ]
设置 MCR.WR = 1,查询该位,直至其变为0(或查询到 IF 的 TXDONE = 1(发送成功)或 AL = 1(仲裁丢失总线),并写1清除)
如果 TXDONE = 1,读 TR.RXACK,如果该位为0,表示 Slave 地址匹配成功
如果 AL = 1,表示本 Master 失去总线,不能再进行后续操作,需重新查询 SR.BUSY 位直至1,才可以重新发送 Start 位,重新申请总线操作
从 Slave 读数据
设置 TR.TXACK=0
设置 MCR.RD = 1,查询直到 IF.RXNE = 1
读取 RXDATA,得到 slave 数据
查询 MCR.RD,直至其变为0(或查询到 IF.RXDONE = 1,并写1清除)
发 Stop。设置 MCR.STO =1,查询该位,直至其变为0
15.3.6. 从发送模式
I2C 作为从发送模式,需将 I2C 模块设置为 SLAVE,具体软件配置操作如下:
配置 PORTCON 模块中端口对应 PORTx_FUNC 寄存器,将指定引脚切换为功能复用
配置 PORTCON 模块中端口对应 PULLU_x 上拉使能寄存器,使能端口内部上拉电阻(也可使用外部上拉电阻)
配置 PORTCON 模块中端口对应 INEN_x 输入使能寄存器,使能 I2C 数据线输入功能
配置 CR 寄存器的 EN 位,关闭 I2C 模块,确保配置寄存器过程中模块未工作
配置 CR 寄存器的 MASTER 位,将 I2C 模块设置为从机模式
配置 CR 寄存器的 EN 位,I2C 模块总线使能
设置 Slave 地址模式。SCR.SADDR10=0
设置 Slave 地址 SADDR
查询直至 IF.RXSTA,表示检测到 I2C 总线上有 Start 发出
查询直至 IF.RXNE=1。表示有 Master 选中本器件
如果 SADDR 中设置了地址 mask,则读取 RXDATA,判断 Master 发送的实际地址
如果判断到 TR.SLVRD = 1,表示 Master 希望从 Slave 读取数据
准备数据,写 TXDATA
查询直到 RXDONE = 1,表示之前地址匹配后,返回 ACK 结束
查询直到 IF.TXE = 1,就可以向 TXDATA 中写入新数据了
查询直到 IF.TXDONE = 1,表示数据发送完成。然后写1清除
查询 TR.RXACK,如果为0,表示 Master 希望继续接收数据,则可重新向 TXDATA 中写入数据;如果 RXACK = 1,表示 Master 希望结束读操作,则设置 TR.TXCLR,清除之前预准备到 TXDATA 中的最后一个数据。转入下一步
查询到 IF.RXSTO,表示检测到 I2C 总线上有 Stop 发出。本次会话结束
示意图如 图 75 所示:
图 75 Slave 寄存器时序示意图
注意
图中红色部分表示软件操作
注意
图中 t1 = tLOW,由CLK寄存器设置
15.3.7. 从接收模式
I2C 作为从接收模式,需将 I2C 模块设置为 SLAVE,操作流程如下:
配置 PORTCON 模块中端口对应 PORTx_FUNC 寄存器,将指定引脚切换为功能复用
配置 PORTCON 模块中端口对应 PULLU_x 上拉使能寄存器,使能端口内部上拉电阻(也可使用外部上拉电阻)
配置 PORTCON 模块中端口对应 INEN_x 输入使能寄存器,使能 I2C 数据线输入功能
配置 CR 寄存器的 EN 位,关闭 I2C 模块,确保配置寄存器过程中模块未工作
配置 CR 寄存器的 MASTER 位,将 I2C 模块设置为从机模式
配置 CR 寄存器的 EN 位,I2C 模块总线使能
设置 Slave 地址模式。SCR.SADDR10 = 0
设置 Slave 地址 SADDR
查询直至 IF.RXSTA,表示检测到 I2C 总线上有 Start 发出
查询直至 IF.RXNE=1。表示有 Master 选中本器件
如果 SADDR 中设置了地址 mask,则读取 RXDATA,判断 Master 发送的实际地址
如果判断到 TR.SLVWR = 1,表示 Master 希望向 Slave 写入数据
查询直到 RXDONE = 1,表示之前地址匹配后,返回 ACK 结束。然后写1清除
设置 TR.TXACK = 0
查询直到 IF.RXNE = 1,表示 Slave 接收到新数据,读取 RXDATA
查询直到 RXDONE = 1,表示之前接收数据后,返回 ACK 结束。然后写1清除
可重复查询 IF.RXNE 位,继续接收数据,直到查询到 IF.RXSTO,表示本次会话结束
15.3.8. 时钟延展 Clock Stretching
Clock Stretching通过将 SCL 线拉低来暂停一个传输,直到释放 SCL 线为高电平,传输才继续进行。
以 master-receiver,slave-transmitter 为例,具体软件配置操作如下:
配置 PORTCON 模块中端口对应 PORTx_FUNC 寄存器,将指定引脚切换为功能复用
配置 PORTCON 模块中端口对应 PULLU_x 上拉使能寄存器,使能端口内部上拉电阻(也可使用外部上拉电阻)
配置 PORTCON 模块中端口对应 INEN_x 输入使能寄存器,使能 I2C 数据线输入功能
配置 CR 寄存器的 EN 位,关闭 I2C 模块,确保配置寄存器过程中模块未工作
配置 CR 寄存器的 MASTER 位,将 I2C 模块设置为主机模式
配置 CR 寄存器的 EN 位,I2C 模块总线使能
设置时序配置寄存器 CLK,假设 PCLK = 48MHz,希望 I2C 工作在 Standard-mode(100kbps)速度下,则每个SCL = 480个 PCLK,可以设置 SCLL = 0XA0,SCLH = 0x50,DIV = 0x01
查询 SR.BUSY,如果为1,则等待直至其变为0;如果为0,则进行下一步
发送 Start。设置 MCR.STA=1,查询该位,直至其变为0
发 Slave 地址字节
设置 TXDATA 为 [7位slave地址字节左移一位]
设置 MCR.WR = 1,查询该位,直至其变为0(或查询到 IF 的 TXDONE = 1(发送成功)或 AL = 1(仲裁丢失总线),并写1清除)
如果 TXDONE = 1,读 TR.RXACK,如果该位为0,表示 Slave 地址匹配成功
如果 AL = 1,表示本 Master 失去总线,不能再进行后续的步骤11~12,需查询直至 SR.BUSY = 1,才可以回到步骤9,重新发送 Start 位,重新申请总线操作
向 Slave 发送待写数据
设置 TXDATA,准备待写入 Slave 的数据
设置 MCR.WR = 1,查询该位,直至其变为0(或查询到 RIST 的 TXDONE = 1,并写1清除)
读 TR.RXACK,如果该位为0,表示写数据成功
发 Stop。设置 MCR.STO = 1,查询该位,直至其变为0
15.3.9. HS-MODE
以 master-transmitter 为例,具体软件配置操作如下:
设置 CR.HS = 0,以普通模式发第一个字节
以主机发送模式的方式,先在 F/S-mode 下发送 Start 和 Master Code。在此过程中,可以进行 Multi-master 的总线仲裁
如果本 Master 获得了总线控制权。则进行如下步骤
设置 CR.HS = 1。才可以设置为高速模式
设置 CLK 寄存器。假设 PCLK = 60MHz,希望 I2C 工作在 HS-mode(3.4Mbps)速度下,则每个SCL = 14个PCLK,可以设置SCLL = 0x0A,SCLH = 0x05,DIV = 0x0
以主机发送模式的方式,以 High-speed 发送 Repeated Start (Sr) 和 Slave 地址(不需要再判断 IF.AL 位)、写数据等
以 slave-receiver 为例,具体软件配置操作如下:
根据 F/S-mode 速度设置 CLK 寄存器
设置 CR.MASTER = 0(slave),CR.EN = 1,CR.HS = 0
设置 Slave SCR.MCDE=1,等待master发送master code
查询直到 RXNE = 1,表示接收到 Master Code
读取 RXDATA 中的数据,判断是 Multi-master 中的哪一个 Master 获得了总线。(对于 Single-master 情况,可以省略此判断,但 RXDATA 中的数据需要读走,否则会影响后续地址和数据的接收)
设置 HS-mode,后续操作在 HS-mode 下进行。设置 CR.HS = 1;设置 SCR.MCDE = 0
根据 HS-mode 速度设置 CLK 寄存器
设置 Slave 地址模式及地址。设置 SCR.SADDR10,并相应设置 SADDR
查询直到 IF.RXSTA = 1,表示接收到 Repeated Start (Sr)
查询直到 RXNE = 1,表示接收到匹配的地址
根据从机接收模式的操作继续后续操作,直至结束本次会话
15.3.10. 中断清除
此模块中中断状态位详见寄存器中各个中断标志位属性,当其中断标志位属性为 R/W1C 时,如需清除此标志,需在对应标志位中写1清零(R/W1C),否则中断在开启状态下会一直进入;
当其中断标志位属性为 AC 时,表示此中断状态位会自动清零;当其中断标志位属性为 RO 时,表示此标志位会随着水位的变化而改变,标志位只与其当前状态有关,不需要清除。具体详见寄存器描述。
15.4. 寄存器映射
名称 |
偏移 |
复位值 |
---|---|---|
I2C0 BASE: 0x40042000 |
||
CR |
0x0 |
0x00000018 |
SR |
0x4 |
0x00000000 |
TR |
0x8 |
0x00000002 |
RXDATA |
0xC |
0x00000000 |
TXDATA |
0x10 |
0x00000000 |
IF |
0x14 |
0x00000001 |
IE |
0x18 |
0x00000000 |
MCR |
0x20 |
0x00000000 |
CLK |
0x24 |
0x00033f7f |
SCR |
0x30 |
0x00000008 |
SADDR |
0x34 |
0x00000000 |
15.5. 寄存器描述
15.5.1. 通用配置寄存器CR
偏移: 0x00 |
复位值: 0x00000018 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
DNF |
HS |
MASTER |
EN |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:7 |
RO |
||
6:3 |
DNF |
R/W |
Receive SDA、SCL数字噪声滤波(Digital Noise Filter)。 0000:滤波不使能。 0001:滤波使能,且滤波能力最大1个系统时钟。 …… 1111:滤波使能,且滤波能力最大15个系统时钟。 |
2 |
HS |
R/WAC |
High-Speed mode。仅在master模式下有效。 0:Standard-mode, Fast-mode, Fast-mode Plus。SCL为open-drain输出。 1:High-Speed mode。SCL为电流源上拉电路输出。Master发送STOP后,硬件自动清除本位。 |
1 |
MASTER |
R/W |
模式控制。 0:slave模式 1:master模式 |
0 |
EN |
R/W |
i2c总线使能。 0:不使能。 1:使能。 |
15.5.2. 通用状态寄存器SR
偏移: 0x04 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SDA |
SCL |
BUSY |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:3 |
RO |
||
2 |
SDA |
RO |
I2C SDA状态。不受I2C总线使能影响。 0:I2C SDA为低。 1:I2C SDA为高。 |
1 |
SCL |
RO |
I2C SCL状态。不受I2C总线使能影响。 0:I2C SCL为低。 1:I2C SCL为高。 |
0 |
BUSY |
RO |
总线忙状态。本位不受CR.EN位控制,当EN不使能时,仍然检测总线忙状态。 0:总线不忙。 1:总线忙,I2C总线START至STOP期间有效。 |
15.5.3. 通用传输寄存器TR
偏移: 0x08 |
复位值: 0x00000002 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
SLVRDS |
SLVSTR |
SLVWR |
SLVRD |
SLVACT |
|||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TXCLR |
RXACK |
TXACK |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:14 |
RO |
||
13:12 |
SLVRDS |
RO |
Slave接收到的数据类型。仅在Slave模式有效。 00:RXDATA为空。 01:接收到的是地址。 10:接收到的是数据。 11:接收到的是master code。仅当MCDE=1时有效。 |
11 |
SLVSTR |
RO |
Slave clock stretching忙状态。仅在slave模式有效。 0:无clock stretching。 1:有clock stretching。 |
10 |
SLVWR |
RO |
Slave写状态。仅在slave模式有效。 1:Slave接收到master的写请求后有效。 0:slave接收到master的读请求或STOP后,自动清除。 |
9 |
SLVRDD |
RO |
Slave读状态。仅在slave模式有效。 1:Slave接收到master的读请求后有效。 0:slave接收到master的写请求或STOP后,自动清除。 |
8 |
SLVACT |
RO |
Slave活跃状态。仅在slave模式有效。 0:slave器件处于非活跃状态 1:slave器件处于活跃状态。地址匹配成功后本位有效;接收到STOP,或Sr后的地址匹配不成功,自动清除。 |
7:3 |
RO |
||
2 |
TXCLR |
RO |
发送数据寄存器清空。硬件自动清除。 0:不清空。 1:清空TXDATA中的数据,并更新TXE位。 |
1 |
RXACK |
RO |
当作为transmitter时,接收到的ACK/NACK。硬件置位,TXDONE有效后即可查询此位;接收到Sr或STOP会将此位清零。 0:接收到ACK 1:接收到NACK |
0 |
TXACK |
RO |
当作为receiver时,反馈ACK/NACK。 0:反馈ACK。 1:反馈NACK。 以下情况,ACK/NACK不由本位决定: slave接收地址时,硬件自动反馈ACK/NACK。 slave MCDE有效,接收到master code时,硬件自动返回NACK。 slave接收溢出时,硬件自动反馈NACK。 |
15.5.4. 接收数据寄存器RXDATA
偏移: 0x0C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
RXDATA |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:8 |
|||
7:0 |
RXDATA |
接收数据寄存器 RXNE为1,表示本寄存器中存在有效数据 在完成数据接收(不包含ACK/NACK发送)的时刻,更新此寄存器 slave接收地址字节情况,参见RXDONE位说明 |
15.5.5. 发送数据寄存器TXDATA
偏移: 0x10 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TXDATA |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:8 |
RO |
||
7:0 |
TXDATA |
R/W |
发送数据寄存器 TXE为0,表示本寄存器中存在待发送数据 |
15.5.6. 中断标志寄存器IF
偏移: 0x14 |
复位值: 0x00000001 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
MLTO |
AL |
||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
RXSTO |
RXSTA |
||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
RXDONE |
TXDONE |
RXOV |
RXNE |
TXE |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:18 |
RO |
||
17 |
MLTO |
R/W1C |
Master SCL LOW超时。写1清除。仅在master模式有效。 0:未超时。 1:超时。SCL LOW时间超过1024个由CLK寄存器设置的SCL LOW时间。 【对于golden model,SCL LOW超时时间由MLTO_LIM设置】 |
16 |
AL |
R/W1C |
Master仲裁丢失总线。写1清除。仅在master模式有效。 0:无仲裁丢失总线控制权。 1:仲裁丢失总线控制权。 |
15:10 |
RO |
||
9 |
RXSTO |
R/W1C |
Slave检测到STOP。写1清除。仅在slave模式下有效。 0:slave未检测到STOP。 1:slave检测到STOP。 |
8 |
RXSTA |
R/W1C |
Slave检测到START。写1清除。仅在slave模式下有效。 0:slave未检测到START。 1:slave检测到START。 |
7:5 |
RO |
||
4 |
RXDONE |
R/W1C |
接收结束。写1清除,包含ACK/NACK时间。 0:接收未结束。 1:接收结束。 slave接收情况说明: Slave器件7位地址模式下,slave地址字节(含R/W位)接收完成,若地址匹配,则生成此中断。 Slave器件10位地址模式下,slave地址的第2字节(ADDR[7:0])接收完成,若10位地址匹配,则生成此中断;跟在repeat START之后的slave地址第1字节,若地址8、9位匹配,则生成此中断;跟在START之后的第1字节接收完成后,即使ADDR[9:8]匹配,也不会生成此中断。 Slave模式,MCDE=1,接收到master code时,会生成此中断。 |
3 |
TXDONE |
R/W1C |
发送结束。写1清除,包含ACK/NACK时间。 0:发送未结束,或没有发送。 1:发送结束。 说明:当master模式发送字节发生仲裁丢失总线时,不产生本中断。 |
2 |
RXOV |
R/W1C |
接收数据寄存器溢出。软件写1清除。(更新的时刻点,不包含ACK/NACK发送) 0:无溢出。 1:当RXDATA非空时,又接收到新的字节,会产生溢出。溢出发生时,新数据丢失。 说明:对于slave模式,如果STRE位有效,当接收数据寄存器非空,且又接收到新的字节,slave器件会拉低SCL信号,直到RXDATA中的旧数被读走,再把新数存到RXDATA中,此情况不会产生溢出。 |
1 |
RXNE |
R/W1C |
接收数据寄存器非空。 0:接收数据寄存器空,不存在未读取的接收数据。 1:接收数据寄存器非空,存在未读取的接收数据。 在接收完数据的时刻更新此位(不包含ACK/NACK发送时间)。 如果新数据接收完成时,旧数据未及时读取,分如下几种情况处理: Master模式: 新数据丢失。同时置位RXD_OV位。 Slave模式: A.STRE=0:新数据丢失。同时置位RXD_OV位,硬件自动反馈NACK。 B.STRE=1:正常返回ACK,然后在master发送下一个字节前,slave将SCL hold在低电平,直到旧数据被读走后,再将新数据更新到RXDATA寄存器中。最后释放SCL。 |
0 |
TXE |
R/W1C |
发送数据寄存器空。 0:发送数据寄存器非空,不允许写TXDATA寄存器。 1:发送数据寄存器空,允许写TXDATA寄存器。 在发送数据开始的时刻,发送数据被硬件读走后,此位被更新为1(此时TXDONE仍为0)。 向TXDATA寄存器写入新数据,可清除此位。 |
15.5.7. 中断使能寄存器IE
偏移: 0x18 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
MLTO |
AL |
||||||
12 |
11 |
10 |
9 |
8 |
10 |
9 |
8 |
RXSTO |
RXSTA |
||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
RXDONE |
TXDONE |
RXOV |
RXNE |
TXE |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:18 |
RO |
||
17 |
MLTO |
R/W |
Master SCL LOW超时中断使能。 0:不使能。 1:使能。 |
16 |
AL |
R/W |
Master仲裁丢失总线中断使能。 0:不使能。 1:使能。 |
15:10 |
RO |
||
9 |
RXSTO |
R/W |
Slave检测到STOP中断使能。 0:不使能。 1:使能。 |
8 |
RXSTA |
R/W |
Slave检测到START中断使能。 0:不使能。 1:使能。 |
7:5 |
RO |
||
4 |
RXDONE |
R/W |
接收数据结束中断使能。 0:不使能。 1:使能。 |
3 |
TXDONE |
R/W |
发送数据结束中断使能。 0:不使能。 1:使能。 |
2 |
RXOV |
R/W |
接收数据寄存器溢出中断使能。 0:不使能。 1:使能。 |
1 |
RXNE |
R/W |
接收数据寄存器非空中断使能。 0:不使能。 1:使能。 |
0 |
TXE |
R/W |
发送数据寄存器空中断使能。 0:不使能。 1:使能。 |
15.5.8. Master控制寄存器MCR
偏移: 0x20 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
STO |
WR |
RD |
STA |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:5 |
RO |
||
3 |
STO |
WAC |
写1,产生STOP,完成后自动清零。 |
2 |
WR |
WAC |
写1,发送TXDATA中数据,完成后(含ACK/NACK时间)自动清零。 向本位写1前,要求TXDATA不能为空。否则,本位无法设置。 注意:WR与RD位不能同时写1. |
1 |
RD |
WAC |
写1,接收数据到RXDATA中,完成后(含ACK/NACK时间)自动清零。 |
0 |
STA |
WAC |
写1,产生START,完成后自动清零。 注意:允许STA和WR同时置位,优先发送START。 |
15.5.9. 时序配置寄存器CLK
偏移: 0x24 |
复位值: 0x00033F7F |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
SDAH |
|||||||
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
DIV |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
SCLH |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SCLL |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:28 |
RO |
||
27:24 |
SDAH |
R/W |
SDA数据保持时间配置。(对Master和Slave有效) 对于master:tHD;DAT=(SDAH + 4) * Tpclk 对于slave:tHD;DAT=(SDAH + DNF + 6) * Tpclk 注意:如果应用环境比较恶劣,则应注意,出现在SDA数据保持期间的毛刺有可能导致SDA的变化沿提前毛刺宽度的时间(如果此时SCL上无毛刺,则总线上会出现非预期的STA、STOP)。在此情况下,应设置SDAH使得tHD;DAT大于最大的毛刺宽度。 |
23:16 |
DIV |
R/W |
时钟预分频,详见SCLH和SCLL描述。(仅对Master模式有效) 0:1分频 1:2分频 2:3分频 …… 255:256分频 |
15:8 |
SCLH |
R/W |
SCL时钟高电平时间配置。(仅对Master模式有效) tHIGH=( (SCLH+1) * (DIV+1) + DNF + 6) * Tpclk |
7:0 |
SCLL |
R/W |
SCL时钟低电平时间配置。(对Master模式有效;在slave模式下,如果使能了STRETCH功能,且ASDS配置为0,则需要配置本寄存器。在slave写TXDATA后,延迟本寄存器设置的时间,再释放SCL。) tLOW=( (SCLL+1) * (DIV+1) + SDAH + 5) * Tpclk SCL的周期为tHIGH+tLOW。 推荐SCLH与SCLL的比例为1:2。 |
备注
注:示意图如图 6-48所示
15.5.10. Slave控制寄存器SCR
偏移: 0x30 |
复位值: 0x00000008 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
ASDS |
STRE |
MCDE |
SADDR10 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
RO |
||
3 |
ASDS |
R/W |
Stretching后数据建立时间自适应使能。(Adaptive Stretching Data Setup) 0:自适应不使能。由CLK设置 1:自适应使能。在接收master地址时,自动检测SCL低电平时间,作为stretching后数据建立时间。 Slave-transmitter,当STRECH寄存器设置为有效,且发生stretching的情况,在新数据准备好后,salve会继续拉低SCL一段时间,以保证SDA线上满足数据建立时间的要求。 |
2 |
STRE |
R/W |
Clock stretching使能控制。 0:Clock stretching不使能。 1:Clock stretching使能。 (slave作为receiver时,当接收到新数据,但旧数据未被及时读取(RXNE=1):SLVSTR变有效,在返回ACK后,将SCL hold在低电平,直到旧数据被读取后,把新数据更新到RXDATA中,同时SLVSTR变无效,再释放SCL,开始下一个数据的接收。 slave作为transmitter时,当发送结束(TXDONE=1,含接收ACK/NACK时间),但新数据未准备好(TXE=1):SLVSTR变有效,将SCL hold在低电平,直到新数据准备好,延迟SCLL时间后,SLVSTR变无效,再释放SCL,开始新数据的发送。) |
1 |
MCDE |
R/W |
Master Code Detect Enable. 0:不检测master code。 1:检测master code。 本位有效时,slave在START之后检测到master code,会生成RXDONE中断,并硬件设置SLVRDS为11。软件应保证slave地址设置不与master code冲突。 |
0 |
SADDR10 |
R/W |
slave地址模式控制。 0:7位地址模式 1:10位地址模式 |
15.5.11. Slave地址寄存器SADDR
偏移: 0x34 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
MASK7 |
MASK10 |
||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
ADDR10 |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
ADDR7 |
ADDR0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:24 |
RO |
||
23:17 |
MASK7 |
R/W |
Slave对应地址位掩码。 0:不掩码。 1:掩码对应位地址。掩码后,硬件匹配slave地址时,忽略被掩码的地址位。 对于10位地址模式,RXDATA仅保存ADDR[7:0],所以不支持对ADDR[9:8]的mask。 |
16 |
MASK10 |
R/W |
Slave对应地址位掩码。 |
15:10 |
RO |
||
9:8 |
ADDR10 |
R/W |
10位地址模式:地址bit9~bit8 |
7:1 |
ADDR7 |
R/W |
地址bit7~bit1 |
0 |
ADDR0 |
R/W |
10位地址模式:地址bit0 |