GD32F470入门教程(七)IIC

13k 词

IIC

简介

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

由数据手册可知,GD32F470支持如下特性

image-20260226224917754

具体IIC通信流程可详见用户手册524页,这里不再展开

软件控制流程

I2C具有4种运行状态——主机发送方、主机接收方、从机发送方、从机接收方。

从机发送模式下的软件流程

  1. 首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待I2C总线上的START信号和地址。
  2. 当接收到一个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位。
  3. 现在I2C进入数据发送状态,由于移位寄存器和数据寄存器I2C_DATA都是空的,硬件将TBE位置1。软件此时可以写入第一个字节数据到I2C_DATA寄存器,但是TBE位并没有被清0,因为写入I2C_DATA寄存器的字节被立即移入内部移位寄存器。当移位寄存器非空的时候,I2C开始发送数据到I2C总线。
  4. 第一个字节的发送期间,软件可以写第二个字节到I2C_DATA,此时TBE位被清0,因为I2C_DATA寄存器和移位寄存器都不是空。
  5. 第一个字节的发送完成之后,TBE被再次置起,软件可以写第三个字节到I2C_DATA,同时TBE位被清0。在此之后,任何时候TBE被置1,只要依然有数据待被发送,软件都可以写入一个字节到I2C_DATA寄存器。
  6. 倒数第二个字节发送期间,软件写最后一个数据到I2C_DATA寄存器来清除TBE标志位,之后就再不用关心TBE的状态。TBE位会在倒数第二个字节发送完成后置起,直到检测到STOP信号时被清0。
  7. 根据I2C协议,I2C主机将不会对接收到的最后一个字节发送应答,所以在最后一个字节发送结束后,I2C从机的AERR(应答错误)会置起以通知软件发送结束。软件写0到AERR位可以清除此位。

image-20260226225604969

从机接收模式下的软件流程

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

image-20260226225651385

主机发送模式下的软件流程

  1. 首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号,随后等待I2C总线寻址。

  2. 软件将START位置1,在I2C总线上产生一个START信号。

  3. 发送一个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位。

  4. 7位或10位的地址位发送出去之后,I2C硬件将ADDSEND位置1,软件通过读I2C_STAT0寄存器然后读I2C_STAT1寄存器清除ADDSEND位。

  5. I2C进入数据发送状态,因为移位寄存器和数据寄存器I2C_DATA都是空的,所以硬件将TBE位置1。此时软件可以写第一个字节数据到I2C_DATA寄存器,但是TBE位此时不会被清零,因为写入I2C_DATA寄存器的字节会被立即移入内部移位寄存器。当移位寄存器非空时,I2C就开始发送数据到总线。

  6. 在第一个字节的发送过程中,软件可以写第二个字节到I2C_DATA,此时TBE会被清零,因为I2C_DATA寄存器和移位寄存器都不为空。

  7. 任意时刻TBE被置1,软件都可以向I2C_DATA寄存器写入一个字节,只要还有数据待发送。

  8. 在倒数第二个字节发送过程中,软件写入最后一个字节数据到I2C_DATA来清除TBE标志位,此后就不用关心TBE位的状态。TBE位会在倒数第二个字节发送完成后被置起,直到发送STOP信号时被清零。

  9. 最后一个字节发送结束后,I2C主机将BTC位置起,因为移位寄存器和I2C_DATA寄存器此时都为空。软件此时应该配置STOP来发送一个STOP信号,此后TBE和BTC状态位都将被清0。

image-20260226225800549

主机接收模式下的软件流程

在主机接收模式下,主机需要为最后一个字节接收产生NACK,然后发送STOP信号。因此,需要特别注意以确保最后接收到数据的正确性。下面提供了两种针对主机接收模式的软件编程方案:方案A和B。方案A需要保证软件能对I2C事件进行快速响应,方案B则不需要。
方案 A

  1. 首先,软件应该使能I2C外设时钟,以及配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。使能和配置以后,I2C运行在默认的从机模式状态,等待START信号,随后等待I2C总线寻址。

  2. 软件将START位置1,从而在I2C总线上产生一个START信号。

  3. 发送一个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位。

  4. 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位。

  5. 当接收到第一个字节时,硬件会将RBNE位置1。此时软件可以从I2C_DATA寄存器读取第一个字节,之后RBNE位被清0。

  6. 此后任何时候RBNE被置1,软件就可以从I2C_DATA寄存器读取一个字节。

  7. 接收完倒数第二个字节(N-1)数据之后,软件应该立即将ACKEN位清0,并将STOP位置1,这一过程需要在最后一个字节接收完毕之前完成,以确保NACK发送给最后一个字节。

  8. 最后一个字节接收完毕后,RBNE位被置1,软件可以读取最后一个字节。由于ACKEN已经在前一步骤中被清0,I2C不再为最后一个字节发送ACK,并在最后一个字节发送完毕后产生一个STOP信号。以上步骤要求字节数目N>1,如果N=1,步骤7应该在步骤4之后就执行,且需要在字节接收完成之前完成。

image-20260226225914700

方案 B

  1. 首先,软件应该使能I2C外设时钟,配置I2C_CTL1中时钟相关寄存器来确保正确的I2C时序。初始化完成之后,I2C运行在默认的从机模式状态,等待START信号和地址。

  2. 软件将START位置1,从而在I2C总线上产生一个START信号。

  3. 发送一个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位。

  4. 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位。

  5. 当第一个字节被接收时,RBNE位会被硬件置1。此时软件可从I2C_DATA寄存器读取出第一个字节,同时RBNE位被清0。

  6. 此后任何时刻,只要RBNE位被置1,软件就可以从I2C_DATA寄存器读取一个字节的数据,直到主机接收了N-3个字节。如图20-13. 主机接收使用方案B 模式(10 位地址模式)所示,第N-2 个字节还没被软件读出,之后第N-1 个字节被接收,此时BTC 和RBNE 都被置位,总线就会被主机锁死以阻止最后一个字节的接收。然后软件应该清除ACKEN 位。

  7. 软件从I2C_DATA读出倒数第三个(N-2)字节数据,同时也将BTC位清0。此后第N-1个字节从移位寄存器被移到I2C_DATA,总线得到释放然后开始接收最后一个字节,由于ACKEN已经被清除,因此主机不会给最后一个字节数据发送ACK响应。

  8. 最后一个字节接收完毕后,硬件再次把BTC位和RBNE置1,并拉低SCL,软件将STOP位置1,主机发出一个STOP信号。

  9. 软件读取第N-1个字节,清除BTC。此后最后一个字节从移位寄存器被移动到I2C_DATA。

  10. 软件读取最后一个字节,清除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两次。

image-20260226230042455

例程:使用库函数配置IIC

为了更好地理解IIC的使用,我们提供一个简单的例程,使用GD32F4xx标准外设库(SPL)来配置IIC0作为主机,向一个从机设备发送数据。假设从机地址为0x50,我们发送一个字节的数据0xAA。

步骤详解

  1. 包含头文件
    首先,在代码文件中包含必要的头文件,包括GD32F4xx的IIC和GPIO库。

    1
    2
    3
    4
    #include "gd32f4xx.h"
    #include "gd32f4xx_i2c.h"
    #include "gd32f4xx_gpio.h"
    #include "gd32f4xx_rcu.h"
  2. 定义常量和变量
    定义IIC外设、引脚和时钟。

    1
    2
    #define I2C0_SLAVE_ADDRESS7 0x50  // 从机地址
    #define I2C_DATA 0xAA // 要发送的数据
  3. 使能外设时钟
    使能IIC0和相关GPIO的时钟。

    1
    2
    rcu_periph_clock_enable(RCU_I2C0);      // 使能IIC0时钟
    rcu_periph_clock_enable(RCU_GPIOB); // 假设IIC0使用PB6(SCL)和PB7(SDA)
  4. 配置GPIO引脚
    将PB6和PB7配置为IIC模式,使用复用功能。

    1
    2
    3
    4
    5
    6
    7
    8
    gpio_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);
  5. 初始化IIC结构体
    配置IIC的参数,如时钟速度、地址模式等。

    1
    2
    3
    i2c_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:从机地址。
  6. 使能IIC
    使能IIC0外设。

    1
    i2c_enable(I2C0);
  7. 发送数据
    编写一个函数来发送数据。首先产生START信号,发送地址,然后发送数据,最后发送STOP。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void 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发送完成
    }
  8. 在主函数中调用
    在main函数中调用初始化和发送函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int 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 = 2
    • I2C_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发送中断标志
      返回值SETRESET

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(传输结束)时发送NACK
    • I2C_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: 使能PEC
    • I2C_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: 传输PEC
    • I2C_PECTRANS_DISABLE: 不传输PEC
      返回值:无
留言