打印

求助,GD32 I2C遇到点问题

[复制链接]
5309|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年的帖子呢

使用特权

评论回复
5
airwill| | 2014-3-23 14:00 | 只看该作者
发完EEROM地址后,时钟线SCL变为低电平,通信锁死。

这样的问题, 需要验证时序来分析

使用特权

评论回复
6
biechedan| | 2014-3-31 22:49 | 只看该作者
需要你把代码贴上来的

使用特权

评论回复
7
biechedan| | 2014-3-31 22:49 | 只看该作者
使用软件调试功能的

使用特权

评论回复
8
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);

使用特权

评论回复
9
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;   
    }

}

使用特权

评论回复
10
锐鑫同创| | 2014-8-7 14:04 | 只看该作者
gotronPan 发表于 2014-7-15 16:45
我也遇到过,在STM32一直都可以的,在GD32就是不稳定。调试了半天,可能是GD32太快了吧,向I2C启动 ...

你说的对,在I2C主机发送命令给各个从机的时候,从机还没来的完全相应,主机就再次发另外一个命令了,你么可以在主机发完命令后,做个小延时

使用特权

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

本版积分规则

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

56

主题

462

帖子

1

粉丝