在使用GD32L233KBT6通过sensirion官方驱动调试SCD4X二氧化碳传感器时,遇到软件模拟IIC通信正常,硬件IIC无法读写的问题,折腾了好久终于调试通过!记录如下:
1.遇到的问题
基于上一篇《GD32L233通过I2C总线驱动AHT20温湿度传感器》的硬件I2C代码,无法正常驱动SCD4X,现象是地址发完后就触发了STOP信号,导致无法正常读写。
2.原因
先看原来的iic_write代码:
uint8_t aht20_interface_iic_write_cmd(uint8_t addr, uint8_t *buf, uint16_t len)
{
uint16_t count=len;
// 配置为发送模式
i2c_master_addressing(I2C1, addr, I2C_MASTER_TRANSMIT);
/* wait until I2C bus is idle */
while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
// 配置要发送的字节数
i2c_transfer_byte_number_config(I2C1, count);
// 生成开始条件
i2c_start_on_bus(I2C1);
/* wait until the transmit data buffer is empty */
I2C_STAT(I2C1) |= I2C_STAT_TBE;
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
// 发送数据
while(count--) {
i2c_data_transmit(I2C1, *buf++);
// 等待可以发送数据
while(i2c_flag_get(I2C1, I2C_FLAG_TBE) == RESET) {
}
}
// 等待传输完成
while(i2c_flag_get(I2C1, I2C_FLAG_TC) == RESET) {
}
// 生成停止条件
i2c_stop_on_bus(I2C1);
/* wait until stop condition generate */
while(!i2c_flag_get(I2C1, I2C_FLAG_STPDET));