16.3 STM32内部IIC协议相关寄存器
16.3.1 控制寄存器1:I2Cx_CR1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SWRST | - | ALERT | PEC | POS | ACK | STOP | START | NOSTRETCH | ENGC | ENPEC | ENAPR | SMBTYPE | - | SMBUS | PE |
Bit 15:软件复位
0:I2C模块不处于复位
1:I2C模块处于复位
Bit 13:SMBus提醒:软件可以设置或清除该位,当PE=0时,由硬件清除
0:释放SMBAlert引脚使其变高,提醒响应地址头紧跟在NACK信号后面
1:驱动SMBAlert引脚使其变低,提醒响应地址头紧跟在ACK信号后面
Bit 12:数据包出错检测
0:无PEC传输
1:PEC传输
Bit 11:应答/PEC位置
0:ACK位控制当前移位寄存器内正在接收的字节的ACK。PEC位表明当前移位寄存器内的字节是PEC
1:ACK位控制在移位寄存器里接收的下一个字节的ACK。PEC位表明在移位寄存器里接收的下一个字节是PEC
注1:POS位只能用在2字节的接收配置中,必须在接收数据之前配置
注2:为了NACK第2个字节,必须在清除ADDR为之后清除ACK位
注3:为了检测第2个字节的PEC,必须在配置了POS位之后,拉伸ADDR事件时设置PEC位
Bit 10:应答使能
0:无应答返回
1:在接收到一个字节后返回一个应答
Bit 9:停止条件产生
在主模式下:
0:无停止条件产生
1:在当前字节传输或在当前起始条件发出后产生停止条件
在从模式下:
0:无停止条件产生
1:在当前字节传输或释放SCL和SDA线
Bit 8:起始条件产生
在主模式下:
0:无起始条件产生
1:重复产生起始条件
在从模式下:
0:无起始条件产生
1:当总线空闲时,产生起始条件
Bit 7:禁止时钟延长
0:允许时钟延长
1:禁止时钟延长
Bit 6:广播呼叫使能
0:禁止广播呼叫,以非应答响应地址00h
1:允许广播呼叫,以应答响应地址00h
Bit 5:PEC使能
0:禁止PEC计算
1:开启PEC计算
Bit 4:ARP使能
0:禁止ARP
1:使能ARP
注1:如果SMBTYPE=0,使用SMBus设备的默认地址
注2:如果SMBTYPE=1,使用SMBus的主地址
Bit 3:SMBus类型
0:SMBus设备
1:SMBus主机
Bit 1:SMBus模式
0:I2C模式
1:SMBus模式
Bit 0:I2C模块使能
0:禁用I2C模块
1:启用I2C模块,根据SMBus位的设置,相应的I/O口需配置为复用功能
注:在主模式下,通讯结束之前,绝不能清除该位
16.3.2 控制寄存器2:I2Cx_CR2
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | LAST | DMAEN | ITBUFEN | ITEVTEN | ITERREN | - | FREQ[5:0] |
Bit 12:DMA最后一次传输
0:下一次DMA的EOT不是最后的传输
1:下一次DMA的EOT是最后的传输
Bit 11:DMA请求使能
0:禁止DMA请求
1:当TxE=1或RxNE=1时,允许DMA请求
Bit 10:缓冲器中断使能
0:当TxE=1或RxNE=1时,不产生任何中断
1:当TxE=1或RxNE=1时,产生事件中断
Bit 9:事件中断使能
0:禁止事件中断
1:允许事件中断
在下列条件下,将产生该中断:
SB=1(主模式)
ADDR=1(主/从模式)
ADD10=1(主模式)
STOPF=1(从模式)
BTF=1,但是没有TxE或RxNE事件
如果ITBUFEN=1,TxE事件为1
如果ITBUFEN=1,RxNE事件为1
Bit 8:出错中断使能
0:禁止出错中断
1:允许出错中断
在下列条件下,将产生该中断:
BERR=1
ARLO=1
AF=1
OVR=1
PECERR=1
TIMEOUT=1
SMBAlert=1
Bit 5~Bit 0:I2C模块时钟频率,允许的范围在2~36MHz之间
000000:禁用
000001:禁用
000010:2MHz
...
100100:36MHz
大于100100:禁用
16.3.3 上升时间寄存器:I2Cx_TRISE
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | TRISE[5:0] |
Bit 5~Bit 0:在快速/标准模式下的SCL最大上升时间(主模式)
例如:标准模式中最大允许SCL上升时间为1000ns。如果在I2C_CR2寄存器中FREQ中的值等于0x08且TPCLK1=125ns,故TRISE中必须写入09h(1000ns/125ns=8+1)
注:只有当PE=0时,才能设置TRISE
16.3.4 时钟控制寄存器:I2Cx_CCR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F/S | DUTY | - | CCR[11:0] |
Bit 15:I2C主模式选项
0:标准模式的I2C
1:快速模式的I2C
Bit 14:快速模式时的占空比
0:快速模式下T low /T high =2
1:快速模式下T low /T high =16/9
Bit 11~Bit 0:快速/标准模式下的时钟控制分频系数(主模式)
在I2C标准模式或SMBus模式下:
T high =CCR×TPCLK1
T low =CCR×TPCLK1
在I2C快速模式下:
如果DUTY=0:
T high =CCR×TPCLK1
T low =2×CCR×TPCLK1
如果DUTY=1:
T high =9×CCR×TPCLK1
T low =16×CCR×TPCLK1
例如:在标准模式下,产生100kHz的SCL的频率,如果FREQR=08,TPCLK1=125ns,则CCR必须写入0x28(40×125ns=5000ns)
注1:允许设定的最小值为0x04,在快速DUTY模式下允许的最小值为0x01
注2:fCK应当是10MHz的整数倍,这样可以正确产生400kHz的快速时钟