IIC
简介
I2C(内部集成电路总线)模块提供了符合工业标准的两线串行制接口,可用于MCU 和外部I2C 设备的通讯。I2C 总线使用两条串行线:串行数据线SDA 和串行时钟线SCL。
I2C 接口模块实现了I2C 协议的标速模式和快速模式,具备CRC 计算和校验功能、支持SMBus(系统管理总线)、PMBus(电源管理总线)和SAM_V(验证安全控制模块)模式,此外还支持多主机I2C 总线架构。I2C 接口模块也支持DMA 模式,可有效减轻CPU 的负担。
由数据手册可知,GD32F470支持如下特性

具体IIC通信流程可详见用户手册524页,这里不再展开
软件控制流程
I2C具有4种运行状态——主机发送方、主机接收方、从机发送方、从机接收方。
从机发送模式下的软件流程
- 首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待I2C总线上的START信号和地址。
- 当接收到一个START信号及随后的地址后,地址可以是7位格式也可以是10位格式,I2C硬件将I2C_STAT0寄存器的ADDSEND位置1,此位应该被软件查询或者中断监视,发现置位后,软件应该读I2C_STAT0寄存器然后读I2C_STAT1寄存器来清除ADDSEND位。如果地址是10位格式,I2C主机应该接着再产生一个START并发送一个地址头到I2C总线。从机在检测到START和紧接着的地址头之后会继续将ADDSEND位置1。软件可以通过读I2C_STAT0寄存器和接着读I2C_STAT1寄存器来第二次清除ADDSEND位。
- 现在I2C进入数据发送状态,由于移位寄存器和数据寄存器I2C_DATA都是空的,硬件将TBE位置1。软件此时可以写入第一个字节数据到I2C_DATA寄存器,但是TBE位并没有被清0,因为写入I2C_DATA寄存器的字节被立即移入内部移位寄存器。当移位寄存器非空的时候,I2C开始发送数据到I2C总线。
- 第一个字节的发送期间,软件可以写第二个字节到I2C_DATA,此时TBE位被清0,因为I2C_DATA寄存器和移位寄存器都不是空。
- 第一个字节的发送完成之后,TBE被再次置起,软件可以写第三个字节到I2C_DATA,同时TBE位被清0。在此之后,任何时候TBE被置1,只要依然有数据待被发送,软件都可以写入一个字节到I2C_DATA寄存器。
- 倒数第二个字节发送期间,软件写最后一个数据到I2C_DATA寄存器来清除TBE标志位,之后就再不用关心TBE的状态。TBE位会在倒数第二个字节发送完成后置起,直到检测到STOP信号时被清0。
- 根据I2C协议,I2C主机将不会对接收到的最后一个字节发送应答,所以在最后一个字节发送结束后,I2C从机的AERR(应答错误)会置起以通知软件发送结束。软件写0到AERR位可以清除此位。

从机接收模式下的软件流程
- 首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号以及地址。
- 在接收到START起始信号和匹配的7位或10地址之后,I2C硬件将I2C状态寄存器0的ADDSEND位置1,此位应该通过软件轮询或者中断来检测,发现置起后,软件通过先读I2C_STAT0寄存器然后读I2C_STAT1寄存器来清除ADDSEND位。当ADDSEND位被清0时,I2C就开始接收来自I2C总线的数据。
- 当接收到第一个字节时,RBNE位被硬件置1,软件可以读取I2C_DATA寄存器的第一个字节,此时RBNE位也被清0。
- 任何时候RBNE被置1,软件可以从I2C_DATA寄存器读取一个字节。
- 接收到最后一个字节后,RBNE被置1,软件可以读取最后的字节。
- 当I2C检测到I2C总线上一个STOP信号,STPDET位被置1,软件通过先读I2C_STAT0寄存器再写I2C_CTL0寄存器来清除STPDET位。

主机发送模式下的软件流程
首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号,随后等待I2C总线寻址。
软件将START位置1,在I2C总线上产生一个START信号。
发送一个START信号后,I2C硬件将I2C_STAT0的SBSEND位置1然后进入主机模式。现在软件应该读I2C_STAT0寄存器然后写一个7位地址位或10位地址的地址头到I2C_DATA寄存器来清除SBSEND位。当SBSEND位被清0时,I2C就开始发送地址或者地址头到I2C总线。如果发送的地址是10位地址的地址头,硬件在发送地址头的时候会将ADD10SEND位置1 ,软件应该通过读I2C_STAT0寄存器然后写10位低地址到I2C_DATA来清除ADD10SEND位。
7位或10位的地址位发送出去之后,I2C硬件将ADDSEND位置1,软件通过读I2C_STAT0寄存器然后读I2C_STAT1寄存器清除ADDSEND位。
I2C进入数据发送状态,因为移位寄存器和数据寄存器I2C_DATA都是空的,所以硬件将TBE位置1。此时软件可以写第一个字节数据到I2C_DATA寄存器,但是TBE位此时不会被清零,因为写入I2C_DATA寄存器的字节会被立即移入内部移位寄存器。当移位寄存器非空时,I2C就开始发送数据到总线。
在第一个字节的发送过程中,软件可以写第二个字节到I2C_DATA,此时TBE会被清零,因为I2C_DATA寄存器和移位寄存器都不为空。
任意时刻TBE被置1,软件都可以向I2C_DATA寄存器写入一个字节,只要还有数据待发送。
在倒数第二个字节发送过程中,软件写入最后一个字节数据到I2C_DATA来清除TBE标志位,此后就不用关心TBE位的状态。TBE位会在倒数第二个字节发送完成后被置起,直到发送STOP信号时被清零。
最后一个字节发送结束后,I2C主机将BTC位置起,因为移位寄存器和I2C_DATA寄存器此时都为空。软件此时应该配置STOP来发送一个STOP信号,此后TBE和BTC状态位都将被清0。

主机接收模式下的软件流程
在主机接收模式下,主机需要为最后一个字节接收产生NACK,然后发送STOP信号。因此,需要特别注意以确保最后接收到数据的正确性。下面提供了两种针对主机接收模式的软件编程方案:方案A和B。方案A需要保证软件能对I2C事件进行快速响应,方案B则不需要。
方案 A
首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号,随后等待I2C总线寻址。
软件将START位置1,从而在I2C总线上产生一个START信号。
发送一个START信号后,I2C硬件将I2C_STAT0寄存器的SBSEND位置1然后进入主机模式。现在软件应该读I2C_STAT0寄存器然后写一个7位地址位或10位地址的地址头到I2C_DATA寄存器来清除SBSEND位。当SBSEND位被清0时,I2C就开始发送地址或者地址头到I2C总线。如果发送的地址是10位地址的地址头,硬件在发送地址头的时候会先将ADD10SEND位置1,软件应该通过读I2C_STAT0寄存器然后写10位低地址到I2C_DATA来清除ADD10SEND位。
7位或10位的地址位发送出去之后,I2C硬件将ADDSEND位置1,软件应该通过读I2C_STAT0寄存器然后读I2C_STAT1寄存器清除ADDSEND位。如果地址是10位格式,软件应该再次将START位置1来重新产生一个START。在START产生后,SBSEND位会被置1。软件应该通过先读I2C_STAT0然后写地址头到I2C_DATA来清除SBSEND位,然后地址头被发到I2C总线,ADDSEND再次被置1。软件应该再次通过先读I2C_STAT0然后读I2C_STAT1来清除ADDSEND位。
当接收到第一个字节时,硬件会将RBNE位置1。此时软件可以从I2C_DATA寄存器读取第一个字节,之后RBNE位被清0。
此后任何时候RBNE被置1,软件就可以从I2C_DATA寄存器读取一个字节。
接收完倒数第二个字节(N-1)数据之后,软件应该立即将ACKEN位清0,并将STOP位置1,这一过程需要在最后一个字节接收完毕之前完成,以确保NACK发送给最后一个字节。
最后一个字节接收完毕后,RBNE位被置1,软件可以读取最后一个字节。由于ACKEN已经在前一步骤中被清0,I2C不再为最后一个字节发送ACK,并在最后一个字节发送完毕后产生一个STOP信号。以上步骤要求字节数目N>1,如果N=1,步骤7应该在步骤4之后就执行,且需要在字节接收完成之前完成。

方案 B
首先,软件应该使能I2C外设时钟,配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。初始化完成之后,I2C运行在默认的从机模式状态,等待START信号和地址。
软件将START位置1,从而在I2C总线上产生一个START信号。
发送一个START信号后,I2C硬件将I2C_STAT0寄存器的SBSEND位置1然后进入主机模式。现在软件应该读I2C_STAT0寄存器然后写一个7位地址位或10位地址的地址头到I2C_DATA寄存器来清除SBSEND位。当SBSEND位被清0时,I2C就开始发送地址或者地址头到I2C总线。如果发送的地址是10位地址的地址头,硬件在发送地址头之后会将ADD10SEND位置1,软件应该通过读I2C_STAT0寄存器然后写10位低地址到I2C_DATA来清除ADD10SEND位。
7位或10位的地址位发送出去之后,I2C硬件将ADDSEND位置1,软件应该通过读I2C_STAT0寄存器然后读I2C_STAT1寄存器清除ADDSEND位。如果地址是10位格式,软件应该接着将START位再次置1来产生一个开始信号,START被发送出去以后SBSEND位被再次置1。软件应该通过先读I2C_STAT0然后写地址头到I2C_DATA来清除SBSEND位,然后地址头被发到I2C总线,ADDSEND再次被置1。软件应该再次通过先读I2C_STAT0然后读I2C_STAT1来清除ADDSEND位。
当第一个字节被接收时,RBNE位会被硬件置1。此时软件可从I2C_DATA寄存器读取出第一个字节,同时RBNE位被清0。
此后任何时刻,只要RBNE位被置1,软件就可以从I2C_DATA寄存器读取一个字节的数据,直到主机接收了N-3个字节。如图20-13. 主机接收使用方案B 模式(10 位地址模式)所示,第N-2 个字节还没被软件读出,之后第N-1 个字节被接收,此时BTC 和RBNE 都被置位,总线就会被主机锁死以阻止最后一个字节的接收。然后软件应该清除ACKEN 位。
软件从I2C_DATA读出倒数第三个(N-2)字节数据,同时也将BTC位清0。此后第N-1个字节从移位寄存器被移到I2C_DATA,总线得到释放然后开始接收最后一个字节,由于ACKEN已经被清除,因此主机不会给最后一个字节数据发送ACK响应。
最后一个字节接收完毕后,硬件再次把BTC位和RBNE置1,并拉低SCL,软件将STOP位置1,主机发出一个STOP信号。
软件读取第N-1个字节,清除BTC。此后最后一个字节从移位寄存器被移动到I2C_DATA。
软件读取最后一个字节,清除RBNE。
以上步骤需要字节数字N>2,N=1和N=2的情况近似:N=1在第4 步,软件应该在清除ADDSEND 位之前将ACKEN 位清0,在清除ADDSEND 位之后将STOP 位置1。当N=1 时步骤5 是最后一步。N=2在第2步,软件应该在START置1之前将POAP置1。在第4步,软件应该在清除ADDSEND位之前将ACKEN位清0。在第5步,软件应该一直等到BTC位被置1然后将STOP位置1且读取I2C_DATA两次。

例程:使用库函数配置IIC
为了更好地理解IIC的使用,我们提供一个简单的例程,使用GD32F4xx标准外设库(SPL)来配置IIC0作为主机,向一个从机设备发送数据。假设从机地址为0x50,我们发送一个字节的数据0xAA。
步骤详解
包含头文件:
首先,在代码文件中包含必要的头文件,包括GD32F4xx的IIC和GPIO库。1
2
3
4#include "gd32f4xx.h"
#include "gd32f4xx_i2c.h"
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_rcu.h"定义常量和变量:
定义IIC外设、引脚和时钟。1
2#define I2C0_SLAVE_ADDRESS7 0x50 // 从机地址
#define I2C_DATA 0xAA // 要发送的数据使能外设时钟:
使能IIC0和相关GPIO的时钟。1
2rcu_periph_clock_enable(RCU_I2C0); // 使能IIC0时钟
rcu_periph_clock_enable(RCU_GPIOB); // 假设IIC0使用PB6(SCL)和PB7(SDA)配置GPIO引脚:
将PB6和PB7配置为IIC模式,使用复用功能。1
2
3
4
5
6
7
8gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_6); // PB6复用为I2C0_SCL
gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_7); // PB7复用为I2C0_SDA
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);初始化IIC结构体:
配置IIC的参数,如时钟速度、地址模式等。1
2
3i2c_deinit(I2C0); // 复位IIC0
i2c_init(I2C0, I2C_SPEED_100K, I2C_DUTY_2_1, I2C_ADDRESS_MODE_7BIT, I2C0_SLAVE_ADDRESS7);- I2C_SPEED_100K:100kHz标准模式。
- I2C_DUTY_2_1:时钟占空比。
- I2C_ADDRESS_MODE_7BIT:7位地址模式。
- I2C0_SLAVE_ADDRESS7:从机地址。
使能IIC:
使能IIC0外设。1
i2c_enable(I2C0);发送数据:
编写一个函数来发送数据。首先产生START信号,发送地址,然后发送数据,最后发送STOP。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19void i2c_send_data(uint8_t data) {
// 产生START信号
i2c_start_on_bus(I2C0);
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); // 等待START发送完成
// 发送从机地址(写操作)
i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); // 等待地址发送完成
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); // 清除地址发送标志
// 发送数据
i2c_data_transmit(I2C0, data);
while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); // 等待发送缓冲区空
while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)); // 等待字节传输完成
// 发送STOP信号
i2c_stop_on_bus(I2C0);
while(I2C_CTL0(I2C0) & I2C_CTL0_STOP); // 等待STOP发送完成
}在主函数中调用:
在main函数中调用初始化和发送函数。1
2
3
4
5
6
7
8
9
10
11
12
13int main(void) {
// 初始化系统时钟等(省略)
// 初始化IIC
// 步骤3-6的代码
// 发送数据
i2c_send_data(I2C_DATA);
while(1) {
// 主循环
}
}
你也可参考如下文章二十四、 IIC 实验 | 立创开发板技术文档中心
IIC库函数详解
1. IIC 初始化与配置
i2c_deinit
功能:复位I2C外设,将I2C寄存器重置为默认值。
原型:void i2c_deinit(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。I2C0: I2C0外设I2C1: I2C1外设I2C2: I2C2外设
返回值:无
i2c_clock_config
功能:配置I2C时钟速度和占空比。
原型:void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc)
参数:
i2c_periph: I2C外设 (I2C0, I2C1, I2C2)。clkspeed: I2C速度,单位为Hz。标准模式最高100000Hz (100kHz),快速模式最高400000Hz (400kHz)。dutycyc: 快速模式下的占空比。I2C_DTCY_2: T_low/T_high = 2I2C_DTCY_16_9: T_low/T_high = 16/9
返回值:无
i2c_mode_addr_config
功能:配置I2C模式、地址格式和从机地址。
原型:void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr)
参数:
i2c_periph: I2C外设。mode: I2C模式。I2C_I2CMODE_ENABLE: I2C模式I2C_SMBUSMODE_ENABLE: SMBus模式
addformat: 地址格式。I2C_ADDFORMAT_7BITS: 7位地址I2C_ADDFORMAT_10BITS: 10位地址
addr: I2C从机地址。
返回值:无
i2c_enable
功能:使能I2C外设。
原型:void i2c_enable(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:无
i2c_disable
功能:禁用I2C外设。
原型:void i2c_disable(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:无
i2c_ack_config
功能:使能或禁用ACK(应答)发送。
原型:void i2c_ack_config(uint32_t i2c_periph, uint32_t ack)
参数:
i2c_periph: I2C外设。ack: ACK状态。I2C_ACK_ENABLE: 使能ACK发送I2C_ACK_DISABLE: 禁用ACK发送
返回值:无
i2c_ackpos_config
功能:配置ACK位置(当前字节或下一个字节)。通常用于接收只剩两个字节时的特殊操作。
原型:void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos)
参数:
i2c_periph: I2C外设。pos: ACK位置。I2C_ACKPOS_CURRENT: ACK作用于当前正在接收的字节I2C_ACKPOS_NEXT: ACK作用于下一个字节
返回值:无
i2c_master_addressing
功能:在主机模式下配置从机地址和传输方向。
原型:void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection)
参数:
i2c_periph: I2C外设。addr: 从机地址。trandirection: 传输方向。I2C_TRANSMITTER: 发送方向I2C_RECEIVER: 接收方向
返回值:无
i2c_dualaddr_enable
功能:使能双地址模式并配置第二个从机地址。
原型:void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr)
参数:
i2c_periph: I2C外设。addr: 第二个从机地址。
返回值:无
i2c_software_reset_config
功能:使能或禁用I2C软件复位。
原型:void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset)
参数:
i2c_periph: I2C外设。sreset: 软件复位状态。I2C_SRESET_SET: I2C处于复位状态I2C_SRESET_RESET: I2C不处于复位状态
返回值:无
i2c_stretch_scl_low_config
功能:使能或禁用SCL时钟延展(Clock Stretching)。
原型:void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretch)
参数:
i2c_periph: I2C外设。stretch: 时钟延展状态。I2C_SCLSTRETCH_ENABLE: 使能时钟延展I2C_SCLSTRETCH_DISABLE: 禁用时钟延展
返回值:无
2. 数据传输
i2c_data_transmit
功能:通过I2C外设发送一个字节的数据。
原型:void i2c_data_transmit(uint32_t i2c_periph, uint8_t data)
参数:
i2c_periph: I2C外设。data: 要发送的数据字节。
返回值:无
i2c_data_receive
功能:通过I2C外设接收一个字节的数据。
原型:uint8_t i2c_data_receive(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:接收到的数据字节。
i2c_start_on_bus
功能:在I2C总线上产生START条件。
原型:void i2c_start_on_bus(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:无
i2c_stop_on_bus
功能:在I2C总线上产生STOP条件。
原型:void i2c_stop_on_bus(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:无
3. 状态标志管理
i2c_flag_get
功能:检查指定的I2C标志位状态。
原型:FlagStatus i2c_flag_get(uint32_t i2c_periph, uint32_t flag)
参数:
i2c_periph: I2C外设。flag: 待检查的标志位。常用标志包括:I2C_FLAG_SBSEND: START条件已发送 (Master)I2C_FLAG_ADDSEND: 地址已发送/匹配 (Master/Slave)I2C_FLAG_BTC: 字节传输完成 (Byte transfer finished)I2C_FLAG_ADD10SEND: 10位地址头部已发送 (Master)I2C_FLAG_STPDET: 检测到STOP条件 (Slave)I2C_FLAG_RBNE: 接收缓冲区非空 (Data register not empty)I2C_FLAG_TBE: 发送缓冲区空 (Data register empty)I2C_FLAG_BERR: 总线错误I2C_FLAG_LOSTARB: 仲裁丢失I2C_FLAG_AERR: 应答错误I2C_FLAG_OVR: 过载/溢出错误I2C_FLAG_PECERR: PEC错误I2C_FLAG_SMBTO: SMBus超时I2C_FLAG_SMBALT: SMBus告警I2C_FLAG_I2CBSY: I2C总线忙I2C_FLAG_DUMODF: 双地址模式匹配
返回值:SET(标志位置位) 或RESET(标志位未置位)。
i2c_flag_clear
功能:清除指定的I2C标志位。
原型:void i2c_flag_clear(uint32_t i2c_periph, uint32_t flag)
参数:
i2c_periph: I2C外设。flag: 待清除的标志位。I2C_FLAG_SMBTO: SMBus超时I2C_FLAG_SMBALT: SMBus告警I2C_FLAG_PECERR: PEC错误I2C_FLAG_OVR: 过载/溢出错误I2C_FLAG_AERR: 应答错误I2C_FLAG_LOSTARB: 仲裁丢失I2C_FLAG_BERR: 总线错误I2C_FLAG_ADDSEND: 地址已发送/匹配I2C_FLAG_STPDET: 检测到STOP条件 (Slave) (注意:有些标志位需要特定读写序列清除,不仅是调用此函数)
返回值:无
4. 中断配置
i2c_interrupt_enable
功能:使能指定的I2C中断。
原型:void i2c_interrupt_enable(uint32_t i2c_periph, uint32_t interrupt)
参数:
i2c_periph: I2C外设。interrupt: 待使能的中断源。I2C_INT_ERR: 错误中断使能I2C_INT_EV: 事件中断使能I2C_INT_BUF: 缓冲区中断使能
返回值:无
i2c_interrupt_disable
功能:禁用指定的I2C中断。
原型:void i2c_interrupt_disable(uint32_t i2c_periph, uint32_t interrupt)
参数:
i2c_periph: I2C外设。interrupt: 待禁用的中断源。
返回值:无
i2c_interrupt_flag_get
功能:检查指定的I2C中断标志位状态。
原型:FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, uint32_t interrupt)
参数:
i2c_periph: I2C外设。interrupt: 待检查的中断标志位。I2C_INT_FLAG_SMBTO: SMBus超时中断标志I2C_INT_FLAG_SMBALT: SMBus告警中断标志I2C_INT_FLAG_PECERR: PEC错误中断标志I2C_INT_FLAG_OVR: 过载错误中断标志I2C_INT_FLAG_AERR: 应答错误中断标志I2C_INT_FLAG_LOSTARB: 仲裁丢失中断标志I2C_INT_FLAG_BERR: 总线错误中断标志I2C_INT_FLAG_TBE: 发送缓冲区空中断标志I2C_INT_FLAG_RBNE: 接收缓冲区非空中断标志I2C_INT_FLAG_STPDET: 检测到STOP中断标志I2C_INT_FLAG_ADD10SEND: 10位头发送中断标志I2C_INT_FLAG_BTC: 字节传输完成中断标志I2C_INT_FLAG_ADDSEND: 地址发送中断标志I2C_INT_FLAG_SBSEND: START发送中断标志
返回值:SET或RESET。
i2c_interrupt_flag_clear
功能:清除指定的I2C中断标志位。
原型:void i2c_interrupt_flag_clear(uint32_t i2c_periph, uint32_t interrupt)
参数:
i2c_periph: I2C外设。interrupt: 待清除的中断标志位。
返回值:无
5. DMA 配置
i2c_dma_enable
功能:使能I2C DMA请求。
原型:void i2c_dma_enable(uint32_t i2c_periph, uint32_t dma)
参数:
i2c_periph: I2C外设。dma: DMA请求使能。I2C_DMA_ON: 使能DMA模式I2C_DMA_OFF: 禁用DMA模式
返回值:无
i2c_dma_last_transfer_config
功能:配置DMA最后一次传输(只在接收模式下使用)。
原型:void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dma_last)
参数:
i2c_periph: I2C外设。dma_last: DMA最后传输配置。I2C_DMALST_ON: 下一次DMA EOT(传输结束)时发送NACKI2C_DMALST_OFF: 下一次DMA EOT时不发送NACK
返回值:无
6. PEC (Packet Error Checking) 配置
i2c_pec_enable
功能:使能I2C PEC计算。
原型:void i2c_pec_enable(uint32_t i2c_periph, uint32_t pecstate)
参数:
i2c_periph: I2C外设。pecstate: PEC状态。I2C_PEC_ENABLE: 使能PECI2C_PEC_DISABLE: 禁用PEC
返回值:无
i2c_pec_value_get
功能:获取当前的PEC值。
原型:uint8_t i2c_pec_value_get(uint32_t i2c_periph)
参数:
i2c_periph: I2C外设。
返回值:当前的PEC计算值。
i2c_pec_transfer_enable
功能:请求传输PEC值(作为最后一个字节发送或接收)。
原型:void i2c_pec_transfer_enable(uint32_t i2c_periph, uint32_t pec_transfer)
参数:
i2c_periph: I2C外设。pec_transfer: PEC传输使能。I2C_PECTRANS_ENABLE: 传输PECI2C_PECTRANS_DISABLE: 不传输PEC
返回值:无