跳过正文

ch32v00x_i2c.h

目录
Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 10: 本文

描述
#

该文件定义了 CH32V00x 系列微控制器 I2C 外设的固件库函数原型、常量、枚举和结构体,用于实现 I2C 主从模式通信。支持标准模式(100kHz)和快速模式(最高 400kHz),提供完整的事件状态监控机制,适用于与传感器、EEPROM、RTC 等 I2C 设备的可靠通信。所有寄存器操作均通过位掩码和预定义常量封装,提升代码可读性与移植性。事件定义遵循 I2C 协议状态机,便于开发者按通信流程进行状态轮询或中断处理。

常量
#

I2C_mode
#

I2C 工作模式选择
仅支持标准 I2C 模式,无 SMBus 或其他扩展模式。该常量用于初始化结构体,启用 I2C 功能。

名称 简述
I2C_Mode_I2C 0x0000 启用标准 I2C 模式

以上所有值都强制转换为 uint16_t

I2C_duty_cycle_in_fast_mode
#

快速模式下 Tlow/Thigh 占空比配置
用于在 400kHz 快速模式下调整 SCL 时钟的高低电平比例,影响总线时序和稳定性。

名称 简述
I2C_DutyCycle_16_9 0x4000 Tlow/Thigh = 16/9,适用于高负载总线
I2C_DutyCycle_2 0xBFFF Tlow/Thigh = 2,适用于低延迟场景

以上所有值都强制转换为 uint16_t

I2C_acknowledgement
#

应答使能控制
用于配置主设备在接收数据时是否发送 ACK(应答)信号,影响通信可靠性。

名称 简述
I2C_Ack_Enable 0x0400 启用应答机制,接收方发送 ACK
I2C_Ack_Disable 0x0000 禁用应答机制,接收方发送 NACK

以上所有值都强制转换为 uint16_t

I2C_transfer_direction
#

主设备传输方向
在发送从机地址时指定后续数据传输方向,决定从机是作为接收端还是发送端。

名称 简述
I2C_Direction_Transmitter 0x00 主设备将向从机发送数据(写操作)
I2C_Direction_Receiver 0x01 主设备将从从机读取数据(读操作)

以上所有值均为 uint8_t 类型。

I2C_acknowledged_address
#

从机地址长度配置
指定从机地址是 7 位还是 10 位格式,影响地址寄存器的解析方式。

名称 简述
I2C_AcknowledgedAddress_7bit 0x4000 启用 7 位地址模式(默认)
I2C_AcknowledgedAddress_10bit 0xC000 启用 10 位地址模式(需额外地址字节)

以上所有值都强制转换为 uint16_t

I2C_registers
#

I2C 寄存器偏移地址
用于 I2C_ReadRegister() 函数读取特定寄存器内容,提供寄存器级调试能力。

名称 简述
I2C_Register_CTLR1 0x00 控制寄存器 1(主控模式、ACK、START/STOP)
I2C_Register_CTLR2 0x04 控制寄存器 2(中断、DMA、时钟频率)
I2C_Register_OADDR1 0x08 从机地址寄存器 1(主/从地址)
I2C_Register_OADDR2 0x0C 从机地址寄存器 2(双地址模式)
I2C_Register_DATAR 0x10 数据寄存器(发送/接收数据)
I2C_Register_STAR1 0x14 状态寄存器 1(事件标志)
I2C_Register_STAR2 0x18 状态寄存器 2(状态扩展标志)
I2C_Register_CKCFGR 0x1C 时钟配置寄存器(SCL 频率、占空比)

以上所有值均为 uint8_t 类型。

I2C_PEC_position
#

PEC(分组校验)位置配置
用于 SMBus 协议中指定 PEC 字节在数据流中的位置,增强数据完整性校验。

名称 简述
I2C_PECPosition_Next 0x0800 下一个字节为 PEC 校验值
I2C_PECPosition_Current 0xF7FF 当前字节为 PEC 校验值(清除位)

以上所有值都强制转换为 uint16_t

I2C_NACK_position
#

NACK 位置配置
在主接收模式下,指定何时发送 NACK 以终止数据接收,影响最后字节的处理时机。

名称 简述
I2C_NACKPosition_Next 0x0800 下一个字节是最后一个,当前发送 ACK
I2C_NACKPosition_Current 0xF7FF 当前字节是最后一个,立即发送 NACK

以上所有值都强制转换为 uint16_t

I2C_interrupts_definition
#

中断使能位掩码
用于 I2C_ITConfig() 启用或禁用三种主要中断源:缓冲、事件、错误。

名称 简述
I2C_IT_BUF 0x0400 数据寄存器缓冲区中断(TXE/RXNE)
I2C_IT_EVT 0x0200 通信事件中断(SB、ADDR、STOPF 等)
I2C_IT_ERR 0x0100 错误中断(BERR、ARLO、AF、OVR、PECERR)

以上所有值都强制转换为 uint16_t

I2C_interrupts_definition(扩展)
#

细粒度中断标志(32 位)
用于 I2C_GetITStatus()I2C_ClearITPendingBit() 检测和清除具体中断源,覆盖所有硬件事件。

名称 简述
I2C_IT_PECERR 0x01001000 PEC 校验错误
I2C_IT_OVR 0x01000800 溢出/欠载(从机模式)
I2C_IT_AF 0x01000400 应答失败(NACK 收到)
I2C_IT_ARLO 0x01000200 仲裁丢失(主模式)
I2C_IT_BERR 0x01000100 总线错误(异常电平)
I2C_IT_TXE 0x06000080 发送数据寄存器空(可写)
I2C_IT_RXNE 0x06000040 接收数据寄存器非空(可读)
I2C_IT_STOPF 0x02000010 停止条件检测(从机模式)
I2C_IT_ADD10 0x02000008 10 位地址头发送完成
I2C_IT_BTF 0x02000004 字节传输完成(数据已移出)
I2C_IT_ADDR 0x02000002 地址匹配(主:已发送;从:已接收)
I2C_IT_SB 0x02000001 起始位生成(主模式)

以上所有值均为 uint32_t 类型。

SR2 register flags
#

状态寄存器 2(STAR2)标志位
反映从机模式、总线状态、通用呼叫等扩展状态。

名称 简述
I2C_FLAG_DUALF 0x00800000 双地址匹配标志(OADDR2 匹配)
I2C_FLAG_GENCALL 0x00100000 通用呼叫地址(0x00)匹配
I2C_FLAG_TRA 0x00040000 传输方向(1=发送,0=接收)
I2C_FLAG_BUSY 0x00020000 总线忙(有通信活动)
I2C_FLAG_MSL 0x00010000 主从模式(1=主,0=从)

以上所有值均为 uint32_t 类型。

SR1 register flags
#

状态寄存器 1(STAR1)标志位
反映通信过程中的核心事件和错误状态,是事件检测的主要依据。

名称 简述
I2C_FLAG_PECERR 0x10001000 PEC 校验错误
I2C_FLAG_OVR 0x10000800 溢出/欠载(从机模式)
I2C_FLAG_AF 0x10000400 应答失败(NACK 收到)
I2C_FLAG_ARLO 0x10000200 仲裁丢失(主模式)
I2C_FLAG_BERR 0x10000100 总线错误(异常电平)
I2C_FLAG_TXE 0x10000080 发送数据寄存器空(可写)
I2C_FLAG_RXNE 0x10000040 接收数据寄存器非空(可读)
I2C_FLAG_STOPF 0x10000010 停止条件检测(从机模式)
I2C_FLAG_ADD10 0x10000008 10 位地址头发送完成
I2C_FLAG_BTF 0x10000004 字节传输完成(数据已移出)
I2C_FLAG_ADDR 0x10000002 地址匹配(主:已发送;从:已接收)
I2C_FLAG_SB 0x10000001 起始位生成(主模式)

以上所有值均为 uint32_t 类型。

I2C Master Events
#

主设备通信事件(按通信流程排序)
用于 I2C_CheckEvent() 判断通信阶段,是主模式编程的核心依据。

名称 简述
I2C_EVENT_MASTER_MODE_SELECT 0x00030001 起始条件已发送,总线已占用(SB=1, MSL=1, BUSY=1)
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED 0x00070082 从机地址已发送并收到 ACK,进入发送模式(ADDR=1, TXE=1, TRA=1)
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED 0x00030002 从机地址已发送并收到 ACK,进入接收模式(ADDR=1)
I2C_EVENT_MASTER_MODE_ADDRESS10 0x00030008 10 位地址头已发送,等待发送第二字节(ADD10=1)
I2C_EVENT_MASTER_BYTE_RECEIVED 0x00030040 接收到一个字节,数据寄存器非空(RXNE=1)
I2C_EVENT_MASTER_BYTE_TRANSMITTING 0x00070080 数据已写入寄存器,正在移出(TXE=1)
I2C_EVENT_MASTER_BYTE_TRANSMITTED 0x00070084 数据已完全移出总线,BTF=1(更可靠,但速度慢)

以上所有值均为 uint32_t 类型。

I2C Slave Events
#

从设备通信事件(按通信流程排序)
用于从模式下检测主设备的寻址与数据传输,支持双地址与通用呼叫。

名称 简述
I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED 0x00020002 地址匹配,进入接收模式(ADDR=1)
I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED 0x00060082 地址匹配,进入发送模式(ADDR=1, TXE=1, TRA=1)
I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED 0x00820000 双地址匹配,进入接收模式(DUALF=1, BUSY=1)
I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED 0x00860080 双地址匹配,进入发送模式(DUALF=1, TRA=1, BUSY=1, TXE=1)
I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED 0x00120000 通用呼叫地址(0x00)匹配(GENCALL=1, BUSY=1)
I2C_EVENT_SLAVE_BYTE_RECEIVED 0x00020040 接收到一个字节(RXNE=1)
I2C_EVENT_SLAVE_STOP_DETECTED 0x00000010 检测到停止条件(STOPF=1)
I2C_EVENT_SLAVE_BYTE_TRANSMITTED 0x00060084 一个字节已完全发送(BTF=1, TXE=1)
I2C_EVENT_SLAVE_BYTE_TRANSMITTING 0x00060080 字节正在发送中(TXE=1)
I2C_EVENT_SLAVE_ACK_FAILURE 0x00000400 主设备发送 NACK,要求停止传输(AF=1)

以上所有值均为 uint32_t 类型。

枚举
#

结构体
#

I2C_InitTypeDef
#

I2C 初始化参数结构体
用于配置 I2C 外设的通信参数,初始化后通过 I2C_Init() 应用到硬件寄存器。

名称 类型 简述
I2C_ClockSpeed uint32_t 设置 I2C 时钟频率,最大 400kHz(标准模式 100kHz)
I2C_Mode uint16_t 选择 I2C 工作模式,仅支持 I2C_Mode_I2C
I2C_DutyCycle uint16_t 快速模式下 SCL 占空比,可选 16:9 或 2:1
I2C_OwnAddress1 uint16_t 从机设备的 7 位或 10 位主地址(低 7 位有效)
I2C_Ack uint16_t 启用或禁用应答机制(ACK)
I2C_AcknowledgedAddress uint16_t 指定地址格式为 7 位或 10 位,影响地址寄存器解析

以上所有值均按位域或掩码方式写入寄存器,需配合常量使用。

函数
#

I2C_DeInit
#

void I2C_DeInit(I2C_TypeDef *I2Cx)
将指定 I2C 外设的所有寄存器恢复为复位默认值,通过复位 APB1 总线实现。适用于系统初始化或异常恢复。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设,仅支持 I2C1

返回值:

该函数通过 RCC 复位机制实现,比直接写寄存器更彻底,可清除所有异常状态。

I2C_Init
#

void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct)
根据初始化结构体配置 I2C 外设的时钟、地址、模式等参数。必须在 I2C_Cmd() 前调用。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_InitStruct I2C_InitTypeDef * 指向包含配置参数的结构体

返回值:

该函数自动计算 SCL 时钟分频值,支持标准模式和快速模式。地址配置会自动设置 OADDR1 的第 0 位(读/写位)。

I2C_StructInit
#

void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct)
将 I2C 初始化结构体的所有成员设置为默认值,便于快速初始化。

参数:

名称 类型 简述
I2C_InitStruct I2C_InitTypeDef * 待初始化的结构体指针

返回值:

默认值:时钟 5kHz(极低速)、7 位地址、禁用应答、占空比 2:1。适用于调试或最小配置。

I2C_Cmd
#

void I2C_Cmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 I2C 外设。必须在初始化后调用才能使能通信。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用时设置 CTLR1 的 PE 位,禁用时清除该位。禁用后总线释放,可安全断开设备。

I2C_DMACmd
#

void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 I2C 的 DMA 请求功能,用于高速连续数据传输。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用后,TXERXNE 事件可触发 DMA 传输,减少 CPU 负载。

I2C_DMALastTransferCmd
#

void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
标记下一次 DMA 传输为最后一次,自动在传输完成后生成 STOP 条件。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

仅在主模式下有效。启用后,DMA 传输结束时自动发送 STOP,无需软件干预。

I2C_GenerateSTART
#

void I2C_GenerateSTART(I2C_TypeDef *I2Cx, FunctionalState NewState)
生成或取消 I2C 起始条件(START)。主设备发起通信的第一步。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLE 生成 START,DISABLE 无操作

返回值:

仅在主模式下有效。调用后需等待 I2C_EVENT_MASTER_MODE_SELECT 事件确认总线已占用。

I2C_GenerateSTOP
#

void I2C_GenerateSTOP(I2C_TypeDef *I2Cx, FunctionalState NewState)
生成或取消 I2C 停止条件(STOP)。主设备结束通信的最后一步。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLE 生成 STOP,DISABLE 无操作

返回值:

仅在主模式下有效。生成 STOP 后总线释放,从机可被其他主设备访问。

I2C_AcknowledgeConfig
#

void I2C_AcknowledgeConfig(I2C_TypeDef *I2Cx, FunctionalState NewState)
配置是否在接收数据时发送 ACK/NACK。主接收时控制何时结束传输。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLE 发送 ACK,DISABLE 发送 NACK

返回值:

在主接收模式下,最后字节前发送 NACK 可通知从机停止传输,避免多余数据。

I2C_OwnAddress2Config
#

void I2C_OwnAddress2Config(I2C_TypeDef *I2Cx, uint8_t Address)
配置从机的第二个地址(双地址模式),用于响应两个不同地址的请求。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
Address uint8_t 7 位从机地址(仅低 7 位有效)

返回值:

需配合 I2C_DualAddressCmd() 启用。地址必须为 7 位,且不能与 OADDR1 冲突。

I2C_DualAddressCmd
#

void I2C_DualAddressCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用双地址模式,允许从机响应两个不同的 I2C 地址。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用后,从机可响应 OADDR1OADDR2 两个地址,适用于多角色设备。

I2C_GeneralCallCmd
#

void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用通用呼叫(General Call,地址 0x00)响应功能。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用后,从机可响应广播地址 0x00,常用于复位所有从机或配置全局参数。

I2C_ITConfig
#

void I2C_ITConfig(I2C_TypeDef *I2Cx, uint16_t I2C_IT, FunctionalState NewState)
启用或禁用 I2C 中断源(BUF、EVT、ERR)。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_IT uint16_t 中断源:I2C_IT_BUFI2C_IT_EVTI2C_IT_ERR
NewState FunctionalState ENABLEDISABLE

返回值:

仅控制三个主中断使能位,具体事件仍需通过 I2C_GetITStatus() 检查。

I2C_SendData
#

void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t Data)
向 I2C 数据寄存器写入一个字节,触发发送。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
Data uint8_t 要发送的 8 位数据

返回值:

写入后,硬件自动移出数据。需等待 I2C_FLAG_TXEI2C_IT_TXE 确认可写。

I2C_ReceiveData
#

uint8_t I2C_ReceiveData(I2C_TypeDef *I2Cx)
从 I2C 数据寄存器读取一个接收到的字节。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)

返回值:
接收到的 8 位数据

读取前需确认 I2C_FLAG_RXNE 为 SET,否则读取值无效。

I2C_Send7bitAddress
#

void I2C_Send7bitAddress(I2C_TypeDef *I2Cx, uint8_t Address, uint8_t I2C_Direction)
发送 7 位从机地址 + 读/写位,启动与从机的通信。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
Address uint8_t 7 位从机地址(不包含 R/W 位)
I2C_Direction uint8_t I2C_Direction_TransmitterI2C_Direction_Receiver

返回值:

自动将方向位(0=写,1=读)附加到地址 LSB。发送后需等待 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTEDI2C_EVENT_MASTER_RECEIVER_MODE_SELECTED

I2C_ReadRegister
#

uint16_t I2C_ReadRegister(I2C_TypeDef *I2Cx, uint8_t I2C_Register)
直接读取 I2C 寄存器的值,用于调试或高级控制。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_Register uint8_t 寄存器偏移:I2C_Register_CTLR1

返回值:
寄存器的 16 位值

通过指针算术访问寄存器,不推荐常规使用,仅用于调试或特殊场景。

I2C_SoftwareResetCmd
#

void I2C_SoftwareResetCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 I2C 软件复位,强制清空内部状态机。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用后,所有寄存器被复位,总线被释放。需在复位后重新初始化。

I2C_NACKPositionConfig
#

void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition)
配置主接收模式下 NACK 的发送时机(当前字节或下一字节)。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_NACKPosition uint16_t I2C_NACKPosition_NextI2C_NACKPosition_Current

返回值:

用于精确控制最后字节的接收,避免从机发送多余数据。

I2C_TransmitPEC
#

void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 PEC(分组校验)字节的发送。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

仅在 SMBus 模式下有效,用于数据完整性校验。

I2C_PECPositionConfig
#

void I2C_PECPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_PECPosition)
配置 PEC 字节在数据流中的位置(当前或下一个字节)。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_PECPosition uint16_t I2C_PECPosition_NextI2C_PECPosition_Current

返回值:

I2C_NACKPositionConfig 共用同一寄存器位(POS),但语义不同,用于 SMBus。

I2C_CalculatePEC
#

void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用硬件自动计算 PEC 校验值。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

启用后,硬件自动对发送/接收的数据流计算 CRC-8 校验值。

I2C_GetPEC
#

uint8_t I2C_GetPEC(I2C_TypeDef *I2Cx)
读取硬件计算的 PEC 校验值。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)

返回值:
当前 PEC 校验值(8 位)

仅在 I2C_CalculatePEC() 启用后有效,用于校验接收数据完整性。

I2C_ARPCmd
#

void I2C_ARPCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 ARP(地址解析协议)功能,支持动态地址分配。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

仅在支持 SMBus ARP 的系统中使用,CH32V00x 通常不启用。

I2C_StretchClockCmd
#

void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用时钟拉伸(Clock Stretching)功能。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
NewState FunctionalState ENABLEDISABLE

返回值:

禁用时,从机无法拉低 SCL 延迟响应,可能导致数据丢失。建议保留启用。

I2C_FastModeDutyCycleConfig
#

void I2C_FastModeDutyCycleConfig(I2C_TypeDef *I2Cx, uint16_t I2C_DutyCycle)
动态修改快速模式下的 SCL 占空比。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_DutyCycle uint16_t I2C_DutyCycle_2I2C_DutyCycle_16_9

返回值:

可在运行时切换,适用于动态负载调整,但需确保总线时序仍满足规范。

I2C_CheckEvent
#

ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
检查当前 I2C 状态是否匹配指定事件,是主从通信流程控制的核心函数。

参数:

名称 类型 简述
I2Cx I2C_TypeDef* 选择 I2C 外设(仅 I2C1)
I2C_EVENT uint32_t 期望的事件掩码(如 I2C_EVENT_MASTER_MODE_SELECT

返回值:
READY(匹配)或 NoREADY(不匹配)

该函数将 STAR1 和 STAR2 合并为 32 位值,与事件掩码进行位与比较。适用于轮询模式,但不检测错误标志,需配合中断使用。

I2C_GetLastEvent
#

uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx)
返回当前 I2C 状态寄存器的完整 32 位组合值,用于高级事件判断。

参数:

名称 类型 简述
I2Cx I2C_TypeDef* 选择 I2C 外设(仅 I2C1)

返回值:
STAR2 « 16 | STAR1 的 32 位值(低 24 位有效)

可用于自定义事件判断,例如 if (I2C_GetLastEvent(I2C1) == (I2C_FLAG_ADDR | I2C_FLAG_RXNE)),灵活性高。

I2C_GetFlagStatus
#

FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG)
检查单个标志位的状态(SET/RESET),用于调试或简单判断。

参数:

名称 类型 简述
I2Cx I2C_TypeDef* 选择 I2C 外设(仅 I2C1)
I2C_FLAG uint32_t 标志位,如 I2C_FLAG_RXNEI2C_FLAG_SB

返回值:
SETRESET

该函数会读取寄存器,某些标志(如 SB、ADDR)在读取后自动清除,需谨慎使用。

I2C_ClearFlag
#

void I2C_ClearFlag(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG)
清除指定的状态标志位。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_FLAG uint32_t 要清除的标志,如 I2C_FLAG_STOPFI2C_FLAG_BERR

返回值:

清除方式为写 1 到 STAR1 对应位。某些标志(如 STOPF、ADDR)需配合读操作序列清除,详见注释。

I2C_GetITStatus
#

ITStatus I2C_GetITStatus(I2C_TypeDef *I2Cx, uint32_t I2C_IT)
检查指定中断是否发生(需先使能)。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_IT uint32_t 中断源,如 I2C_IT_RXNEI2C_IT_BERR

返回值:
SETRESET

检查中断标志位与中断使能位是否同时为 1,是中断服务函数中的标准判断方式。

I2C_ClearITPendingBit
#

void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT)
清除指定的中断挂起位。

参数:

名称 类型 简述
I2Cx I2C_TypeDef * 选择 I2C 外设(仅 I2C1)
I2C_IT uint32_t 中断源,如 I2C_IT_STOPFI2C_IT_ADDR

返回值:

I2C_ClearFlag() 相同,通过写 1 到 STAR1 清除。必须在中断服务函数末尾调用,否则中断会持续触发。

Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 10: 本文

相关文章

ch32v00x.h

该文件是 CH32V003 微控制器的外设访问层头文件,定义了所有外设寄存器的内存映射、位域常量、中断向量、时钟配置、GPIO 控制结构及系统级常量。它为标准外设库提供底层硬件抽象,使开发者可通过结构体指针直接访问寄存器,或通过位掩码配置外设功能。本文件不包含函数原型,仅提供寄存器定义与常量,是所有外设驱动开发的基础。

ch32v00x_adc.h

该文件定义了 CH32V00x 系列微控制器 ADC 外设的固件库所有函数原型、常量、枚举和结构体。ADC(模数转换器)支持单通道与多通道扫描转换、注入通道、模拟看门狗、DMA 请求、软件与外部触发等多种模式,适用于高精度模拟信号采集场景。本库通过寄存器掩码操作实现灵活配置,所有常量均以 uint32_t 或 uint8_t 类型定义,确保与硬件寄存器位域精确匹配。函数设计遵循标准外设库风格,支持初始化、启动、中断、校准、偏移设置等完整功能链,适用于工业控制、传感器接口、电源管理等嵌入式应用。

ch32v00x_dma.h

该文件定义了 CH32V00x 系列微控制器 DMA(直接存储器访问)外设的固件库函数原型、数据结构及常量宏。DMA 用于在不占用 CPU 资源的情况下实现外设与内存、内存与内存之间的高效数据传输,适用于高速数据采集、串口/ADC 缓冲、图像处理等场景。本库支持 7 个 DMA 通道,每个通道可独立配置传输方向、数据宽度、地址递增模式、优先级和循环模式,极大提升系统并发处理能力。