1. GD32F407VET6的I2C外设特性解析
GD32F407VET6作为兆易创新推出的Cortex-M4内核MCU,其I2C外设兼容标准I2C总线规范,支持多主机模式操作。实际使用中发现,与STM32的I2C外设相比,GD32的I2C在时钟配置和中断处理上有明显差异。硬件上提供两个独立的I2C控制器(I2C0和I2C1),最高支持1MHz的快速模式Plus。
时钟树配置时需要特别注意:
- PCLK1时钟必须至少是I2C时钟频率的4倍
- 标准模式(100kHz)下CCR寄存器值计算公式:
code复制CCR = PCLK1 / (2 * I2C_CLK) - 快速模式(400kHz)需设置I2C_CTL1寄存器中的FMP位
关键提示:GD32的I2C外设在检测到总线忙时会自动进入超时等待,这个特性在官方手册中没有明确说明,实测等待时间约300ms。
2. I2C例程代码的常见缺失功能
2.1 多字节读写实现
标准例程通常只提供单字节读写示例,实际项目中经常需要连续读写多个字节。以下是改进后的多字节读取函数:
c复制uint8_t I2C_ReadMultiBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *pData, uint16_t len)
{
/* 发送设备地址+写标志 */
while(i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == RESET);
i2c_data_transmit(I2C0, devAddr << 1);
/* 发送寄存器地址 */
while(i2c_flag_get(I2C0, I2C_FLAG_TBE) == RESET);
i2c_data_transmit(I2C0, regAddr);
/* 重新启动并发送设备地址+读标志 */
while(i2c_flag_get(I2C0, I2C_FLAG_BTC) == RESET);
i2c_start_on_bus(I2C0);
while(i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == RESET)
