打印

GD32H757VGT6的硬件I2C问题

[复制链接]
1828|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Formersnow|  楼主 | 2025-3-31 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32H757VGT6的硬件I2C读写都一直卡在while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)),地址确认没有问题,时序是跟着手册里的时序表配置的,有大佬知道是为什么吗
代码如下:
初始化
     /* 禁用I2C外设 */
    i2c_deinit(I2C0);
    // 禁用从机地址
    i2c_address_disable(I2C0);
    /* 配置时序(100kHz,满足t_VD;DAT≤3.45μs) */
    i2c_timing_config(I2C0, 14, 3, 0);      // PSC=14, SDADEL=3, SCLDEL=0
    i2c_master_clock_config(I2C0, 65, 34);  // SCLH=65, SCLL=34 → 周期≈10μs
       
    /* 禁用自动结束模式(手动控制STOP条件) */
    i2c_automatic_end_disable(I2C0);
    /* 使能I2C */
    i2c_enable(I2C0);
    i2c_nack_enable(I2C0);
    i2c_bus_timeout_a_config(I2C0, 0x96); // 超时阈值根据实际时钟调

/* 单字节写入 */
int byte_write(uint16_t addr, uint8_t data)
{
/*  等待总线空闲 */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
       
               
    /* 配置传输3字节:地址高、地址低、数据 */
    i2c_transfer_byte_number_config(I2C0, 3);
       
                /*  发送起始条件 */
    i2c_start_on_bus(I2C0);
       
                /* 3等待地址发送完成或检测错误 */
    i2c_master_addressing(I2C0, EEPROM_WRITE_ADDR, I2C_MASTER_TRANSMIT);
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)){
                   if (i2c_flag_get(I2C0, I2C_FLAG_NACK) ||
            i2c_flag_get(I2C0, I2C_FLAG_BERR) ||
            i2c_flag_get(I2C0, I2C_FLAG_LOSTARB)) {
            i2c_stop_on_bus(I2C0);
        i2c_flag_clear(I2C0, I2C_FLAG_NACK | I2C_FLAG_BERR |I2C_FLAG_LOSTARB);
            return -1; // 错误处理
        }
                }
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
                /*  发送地址高字节 */
    i2c_data_transmit(I2C0, (addr >> 8));
    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)) { // 等待发送缓冲区空
    }
    /*  发送地址低字节 */
    i2c_data_transmit(I2C0, (addr & 0xFF));
    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)) { // 等待发送缓冲区空
    }
    /* 发送数据字节 */
    i2c_data_transmit(I2C0, data);
    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE)) { // 等待发送缓冲区空
    }
    /*  等待传输完成(TC标志) */

    while (!i2c_flag_get(I2C0, I2C_FLAG_TC)) { // 等待发送缓冲区空
    }
                /*  发送停止条件 */
    i2c_stop_on_bus(I2C0);
    delay_1ms(10); // EEPROM写入延迟
                return 100;
}


使用特权

评论回复
沙发
Formersnow|  楼主 | 2025-4-2 14:01 | 只看该作者
解决了解决了,没有清寄存器以及少写了配置问题

使用特权

评论回复
板凳
chenjun89| | 2025-4-5 22:00 | 只看该作者
这是犯了低级错误啊。

使用特权

评论回复
地板
两只袜子| | 2025-4-17 11:22 | 只看该作者
解决了解决了,点赞点赞。

使用特权

评论回复
5
su1yirg| | 2025-5-7 14:40 | 只看该作者
在使用GD32H757VGT6的硬件I2C模块时,如果代码卡在 while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)),通常意味着I2C设备没有正确响应主机发送的起始条件或从机地址。

使用特权

评论回复
6
q1d0mnx| | 2025-5-7 15:55 | 只看该作者
确保I2C总线上的SDA和SCL引脚连接正确,没有松动或短路。

使用特权

评论回复
7
lix1yr| | 2025-5-7 17:01 | 只看该作者
检查上拉电阻,一般来说I2C总线需要上拉电阻,通常为4.7kΩ到10kΩ。确保上拉电阻已正确连接。

使用特权

评论回复
8
p0gon9y| | 2025-5-7 19:21 | 只看该作者
电源供应,确保I2C设备和GD32H757VGT6的电源供应正常。

使用特权

评论回复
9
kaif2n9j| | 2025-5-7 20:15 | 只看该作者
你提到地址确认没有问题,但请再次检查从机地址是否正确,包括读写位(通常写操作时最低位为0)。

使用特权

评论回复
10
cen9ce| | 2025-5-7 21:39 | 只看该作者
有些设备可能有多个地址选择引脚,确保这些引脚配置正确。

使用特权

评论回复
11
q1ngt12| | 2025-5-8 09:13 | 只看该作者
检查时序配置是否符合设备要求。你使用的 i2c_timing_config(I2C0, 14, 3, 0); 和 i2c_master_clock_config(I2C0, 65, 34); 需要确保与从机设备的时序要求兼容

使用特权

评论回复
12
suw12q| | 2025-5-8 10:25 | 只看该作者
频率匹配,确保I2C时钟频率设置正确,通常为100kHz或400kHz。

使用特权

评论回复
13
t1ngus4| | 2025-5-8 12:07 | 只看该作者
看看初始化顺序,确保I2C初始化顺序正确,包括禁用I2C、配置时序、使能I2C等步骤。

使用特权

评论回复
14
d1ng2x| | 2025-5-8 14:24 | 只看该作者
中断和错误标志,在 while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) 循环中,你已经检查了NACK、BERR和LOSTARB标志,但可以尝试在循环外部也检查这些标志,以捕获初始化阶段的错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝