描述 #
该文件定义了 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 |
ENABLE 或 DISABLE |
返回值:
无
启用时设置
CTLR1的 PE 位,禁用时清除该位。禁用后总线释放,可安全断开设备。
I2C_DMACmd
#
void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 I2C 的 DMA 请求功能,用于高速连续数据传输。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
启用后,
TXE和RXNE事件可触发 DMA 传输,减少 CPU 负载。
I2C_DMALastTransferCmd
#
void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
标记下一次 DMA 传输为最后一次,自动在传输完成后生成 STOP 条件。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
仅在主模式下有效。启用后,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 |
ENABLE 或 DISABLE |
返回值:
无
启用后,从机可响应
OADDR1和OADDR2两个地址,适用于多角色设备。
I2C_GeneralCallCmd
#
void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用通用呼叫(General Call,地址 0x00)响应功能。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
启用后,从机可响应广播地址 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_BUF、I2C_IT_EVT、I2C_IT_ERR |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
仅控制三个主中断使能位,具体事件仍需通过
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_TXE或I2C_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_Transmitter 或 I2C_Direction_Receiver |
返回值:
无
自动将方向位(0=写,1=读)附加到地址 LSB。发送后需等待
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED或I2C_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 |
ENABLE 或 DISABLE |
返回值:
无
启用后,所有寄存器被复位,总线被释放。需在复位后重新初始化。
I2C_NACKPositionConfig
#
void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition)
配置主接收模式下 NACK 的发送时机(当前字节或下一字节)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
I2C_NACKPosition |
uint16_t |
I2C_NACKPosition_Next 或 I2C_NACKPosition_Current |
返回值:
无
用于精确控制最后字节的接收,避免从机发送多余数据。
I2C_TransmitPEC
#
void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用 PEC(分组校验)字节的发送。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
仅在 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_Next 或 I2C_PECPosition_Current |
返回值:
无
与
I2C_NACKPositionConfig共用同一寄存器位(POS),但语义不同,用于 SMBus。
I2C_CalculatePEC
#
void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用硬件自动计算 PEC 校验值。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
启用后,硬件自动对发送/接收的数据流计算 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 |
ENABLE 或 DISABLE |
返回值:
无
仅在支持 SMBus ARP 的系统中使用,CH32V00x 通常不启用。
I2C_StretchClockCmd
#
void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState)
启用或禁用时钟拉伸(Clock Stretching)功能。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
禁用时,从机无法拉低 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_2 或 I2C_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_RXNE、I2C_FLAG_SB |
返回值:
SET 或 RESET
该函数会读取寄存器,某些标志(如 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_STOPF、I2C_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_RXNE、I2C_IT_BERR |
返回值:
SET 或 RESET
检查中断标志位与中断使能位是否同时为 1,是中断服务函数中的标准判断方式。
I2C_ClearITPendingBit
#
void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT)
清除指定的中断挂起位。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
I2Cx |
I2C_TypeDef * |
选择 I2C 外设(仅 I2C1) |
I2C_IT |
uint32_t |
中断源,如 I2C_IT_STOPF、I2C_IT_ADDR |
返回值:
无
与
I2C_ClearFlag()相同,通过写 1 到 STAR1 清除。必须在中断服务函数末尾调用,否则中断会持续触发。