[STM8] STM8 硬件 i2c 问题

[复制链接]
4695|39
 楼主| f781831 发表于 2017-6-20 09:08 | 显示全部楼层 |阅读模式
用的STM8的 硬件I2C +官方slave的示例代码。接收完第一帧后,第二帧无法完成接收,逻辑分析仪上发现ACK的脉宽与之前相比,短了很多并且SCL线直接被拉低了。不知道是什么原因造成ACK脉宽变短以及SCL被拉低。知道的老铁们,告知下谢谢[img][/img]

SCL被拉低

SCL被拉低

ACK脉宽变短

ACK脉宽变短
feelhyq 发表于 2017-6-20 14:24 | 显示全部楼层
本帖最后由 feelhyq 于 2017-6-20 14:29 编辑

在I2C总线处于工作状态时,CLK在空闲的时候拉低(防止产生结束信号),SDA在空闲的时候释放总线(OD开漏被上拉电阻拉高,I2C属于线与逻辑)。从第二张图来看,发完0x0E后,也就是在第8个时钟完成后,SDA释放了(被上拉电阻拉高),等待应答信号,而主机应答ACK会将SDA拉低,可以看到第8个时钟下降沿后有个很窄的脉冲,也就是这么来的,SDA信号被主机拉低后,在第9个时钟(应答时钟)到来时,此时SDA维持低电平,说明主机确实应答了。主机应答完后会将SDA释放(被拉高),也就出现了第九个时钟后的另外一个高电平。但是从实际波形图上看,SDA表现出来的并不是一个高电平,而是SDA释放(被上拉电阻拉高)后,立刻被拉低了(通常如果主机也是硬件I2C控制的话不会出现这种情况)。
forum.png
feelhyq 发表于 2017-6-20 14:25 | 显示全部楼层
你的I2C主机是软件控制的吗?
feelhyq 发表于 2017-6-20 14:31 | 显示全部楼层
对于总线的问题,尽量用示波器去看,毕竟还跟信号的质量有关。
 楼主| f781831 发表于 2017-6-20 14:33 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:25
你的I2C主机是软件控制的吗?

我的主机是买的纬图的Ginkgo USB-I2C适配器 配置的是硬件模式

主机配置

主机配置
 楼主| f781831 发表于 2017-6-20 14:36 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:25
你的I2C主机是软件控制的吗?

我发现把主机的速度 调低至5Kbps  通讯过程就一直正常了 100Kbps 能收到一次 然后死机 100kbps以上 不能收到一帧完整的数据
feelhyq 发表于 2017-6-20 14:39 | 显示全部楼层
收完第一帧后,是从机收到 11 22 33 44 55 66 77 88后再无法接收到其他数据吗?
feelhyq 发表于 2017-6-20 14:42 | 显示全部楼层
f781831 发表于 2017-6-20 14:36
我发现把主机的速度 调低至5Kbps  通讯过程就一直正常了 100Kbps 能收到一次 然后死机 100kbps以上 不能 ...

可以让你们的硬件工程师将 I2C的上拉电阻改小一点
 楼主| f781831 发表于 2017-6-20 14:43 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:39
收完第一帧后,是从机收到 11 22 33 44 55 66 77 88后再无法接收到其他数据吗?

收完第一帧后 逻辑分析上看到的是 第二帧的数据 只收到了 地址位 和 第一个11的数据 然后SCL SDA 线都被拉低了 图示在一楼第二个图里
feelhyq 发表于 2017-6-20 14:44 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:42
可以让你们的硬件工程师将 I2C的上拉电阻改小一点

上拉电阻改小后可以提高I2C通信速度的质量,不过也会增加功耗
 楼主| f781831 发表于 2017-6-20 14:45 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:39
收完第一帧后,是从机收到 11 22 33 44 55 66 77 88后再无法接收到其他数据吗?

第一帧接收到的 是完整的

完整数据

完整数据
 楼主| f781831 发表于 2017-6-20 14:46 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:44
上拉电阻改小后可以提高I2C通信速度的质量,不过也会增加功耗

先试试调小吧,主站的工具上面推荐放的4.7k  我试试2.2k 吧
 楼主| f781831 发表于 2017-6-20 15:10 | 显示全部楼层
feelhyq 发表于 2017-6-20 14:44
上拉电阻改小后可以提高I2C通信速度的质量,不过也会增加功耗

调小了 没有改善  SCL好像 被拉低后 一直不会变高 这是为什么
feelhyq 发表于 2017-6-20 15:13 | 显示全部楼层
从波形图上面看,从机是给了主机应答(也许主机并没有收到该应答),如果主机正确接收到应答信号后会再次发送数据(数据会伴随着时钟产生),但是从波形图上看,主机是没有发送数据的(即便发送的数据全为0,CLK时钟线上应该有时终才对)。
feelhyq 发表于 2017-6-20 15:19 | 显示全部楼层
能不能把100Kb的速度稍微调小一点试试,比如说80kb,或者50kb
feelhyq 发表于 2017-6-20 15:22 | 显示全部楼层
还有一个现象,主机发完一帧数据后 直接把I2C通信给结束掉了,你可以尝试发送的一帧数据为多个字节,比如说20个或者30个,这些数据应该也能完整的收到
 楼主| f781831 发表于 2017-6-20 15:23 | 显示全部楼层
feelhyq 发表于 2017-6-20 15:19
能不能把100Kb的速度稍微调小一点试试,比如说80kb,或者50kb

速度调到 20kbps 没问题 能一直通讯上
 楼主| f781831 发表于 2017-6-20 15:25 | 显示全部楼层
feelhyq 发表于 2017-6-20 15:22
还有一个现象,主机发完一帧数据后 直接把I2C通信给结束掉了,你可以尝试发送的一帧数据为多个字节,比如说 ...

是啊 一帧 8个字节  速度100k的时候第一帧8字节都收到了 然后第二帧 只收到第一个字节 SDA 和SCL 线都被拉低了
 楼主| f781831 发表于 2017-6-20 15:27 | 显示全部楼层
feelhyq 发表于 2017-6-20 15:22
还有一个现象,主机发完一帧数据后 直接把I2C通信给结束掉了,你可以尝试发送的一帧数据为多个字节,比如说 ...

是啊 一帧 8个字节  速度100k  的时候第一帧8字节都收到了 然后第二帧 只收到第一个字节 SDA 和SCL 线都被拉低了
feelhyq 发表于 2017-6-20 15:29 | 显示全部楼层
自己写个弄个I2C主机 不用维图的,对比下就出来了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

20

帖子

0

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