求助,GD32 I2C遇到点问题

[复制链接]
6315|9
 楼主| julien 发表于 2013-12-31 16:46 | 显示全部楼层 |阅读模式
GD32F103C8芯片,通过I2C1连接24LC32 EEROM。读写时发现单片机发完EEROM地址后,时钟线SCL变为低电平,通信锁死。
denvice 发表于 2013-12-31 19:33 | 显示全部楼层
上代码让大伙围观一下看看能不能解决问题
caijie187 发表于 2014-2-23 18:12 | 显示全部楼层
解决了吗?没有的话上传一下代码?
chenzhenzhen 发表于 2014-2-23 18:16 | 显示全部楼层
还是13年的帖子呢
airwill 发表于 2014-3-23 14:00 | 显示全部楼层
发完EEROM地址后,时钟线SCL变为低电平,通信锁死。

这样的问题, 需要验证时序来分析
biechedan 发表于 2014-3-31 22:49 | 显示全部楼层
需要你把代码贴上来的
biechedan 发表于 2014-3-31 22:49 | 显示全部楼层
使用软件调试功能的
gotronPan 发表于 2014-7-15 16:45 | 显示全部楼层
我也遇到过,在STM32一直都可以的,在GD32就是不稳定。调试了半天,可能是GD32太快了吧,向I2C启动停止后,总线还未到空闲,又进入新一轮的I2C操作,导致I2C设备的 ARLO 被置位。
解决办法是:启动停止后,等待 BUSY 位为 0
    I2C_GenerateSTOP(I2C1, ENABLE);
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)==SET);
gotronPan 发表于 2014-8-4 16:58 | 显示全部楼层
发送地址后,

很多时候返回的是 I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084),

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));<--导致死在这里了

做一寄存 I2C Event 的方法,sr2_1 = I2C_GetLastEvent(I2C1);有时会录得 0x00070086,

分析:

当地址写入地址寄存器后发送开始,

地址发送完,SR1的ADDR位先于TxE被置位,此时刚好调用了I2C_CheckEvent,读取SR1=0x0002,后SR1=0x0000;

地址寄存器被清空,TxE和或BTF被置位,但SR1=0x0084,从而使while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));不通过

I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED        ((uint32_t)0x00070082)  /* BUSY, MSL, ADDR, TXE and TRA flags

现改变如下

while(1)

{

    sr2_1 |= I2C_GetLastEvent(I2C1);<--保存所有位
    if( (sr2_1 & I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED )
    {
        break;   
    }

}

锐鑫同创 发表于 2014-8-7 14:04 | 显示全部楼层
gotronPan 发表于 2014-7-15 16:45
我也遇到过,在STM32一直都可以的,在GD32就是不稳定。调试了半天,可能是GD32太快了吧,向I2C启动 ...

你说的对,在I2C主机发送命令给各个从机的时候,从机还没来的完全相应,主机就再次发另外一个命令了,你么可以在主机发完命令后,做个小延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:群号:328835706  欢迎各位网友加入交流学习。||

56

主题

462

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部