IIC数据读写取错误

IIC错误原因汇总

前言

最近手里有个项目,是由IIC总线作为通信协议的。IIC的教程和原理网上一大把,但是我在调试时遇到了一个很奇葩的BUG,整整花费了3天时间才得到解决。因此在这里把调试过程记录一下,给大家遇到相似的问题时以提供一个大致思路。

问题排除流程

1、检查硬件连接问题,注意总线是否连接上拉电阻。
2、检查电压,排除由于硬件设计导致读取失败,注意引脚电平一般为3.3V或1.5V。
3、检查IO口配置,在初始化配置IO时一定要注意IO的配置是否正确,是否有复用或重复定义,多检查几遍,尤其是和官方的Datasheet或者例子相对比一下。
4、检查从机设备地址,从机设备地址设置错误导致通信失败,一般读取到的数据为全1。注意函数需要设置的是7bit地址还是8bit地址。
5、频率问题,此类问题一般有2个

一是频率设置错误,可以通过示波器抓取SCL引脚波形判断;
二是2个设备之间的通信频率不匹配,此类问题一般比较难找(如果读取到数据,但是不对,且在连续变动大概率时频率问题),可以在排除以上原因的前提下多设置几次(一般设备都支持100k【标准】,400k【高速】)

6、未知的原因(一般是由于IIC使用了特殊的设置)可以先查看设备手册上是否使用了与标准协议不同的时序,如果没有就查找IIC官方手册是否有可能用到其中的一些特殊设置。实在不行只能联系厂家询问是否有技术支持。

总结

  • IIC中出现的错误大概率是时钟/频率之间的问题,可以灵活使用示波器进行检查。
  • 要对官方文档抱有怀疑态度,尤其是一些小公司生产的芯片一定要注意。

我出现的问题是IIC读取从机设备寄存器时得到的数据不对,在排除大量问题之后,才发现是频率出现的问题。两个设备都支持400K的通信速率,并且主机设备设置后通过示波器观察是可以到400k的(官方文档也这么写),从机设备官方的例子就是400k(最大1M)但是两个连接在一起就会出现问题。
现象: 通过示波器发现,写入数据正常,但是读取数据时钟波形缺失,数据也会经常变动。
最后将频率改为100k就可以了。

补充

上面的总结是错的,在使用以上的方法之后,发现在做连续多字节读写时还会出现数据错误。使用逻辑分析仪对数据进行抓取,发现从机在ACK之后会将SCL拉起,变为高电平。在查看IIC总线官方文档之后发现,这是使用了IIC的时钟拉伸,为了解决主从机由于速度不匹配造成的数据错误。

现在问题找到,将时钟拉伸相关操作写入代码。在一个ACK之后,如果检测到时钟信号为高电平,就继续等待,直到检测到低电平再开始下一轮数据操作。

在从机的官方手册中,我并没有找到需要进行时钟拉伸的相关提示。但是在开头就介绍了此模块支持最快高达1MHz的速率,而不是一写其他手册中写的固定400K或100K。在这里插入图片描述

IIC时钟拉伸(Clock Stretching)

时钟拉伸时标准的IIC总线协议,当注意到设备支持宽范围的速率时就应该注意到可能使用了时钟拉伸。一般的单片机硬件IIC也是支持此项功能的,可以在寄存器列表中查找关键词Clock Stretching。

仲裁

此现象发生于多主机连接同一总线的情况。原文如下:
在这里插入图片描述

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在FPGA上实现IIC总线驱动来读写EEPROM是一种常见的应用。通过引用和中的内容,我们可以了解到以下步骤和问题解决方案: 1. IIC协议简介:IIC协议是一种串行通信协议,它允许多个设备在同一总线上进行通信。IIC协议在硬件结构上包含了两根线路,即串行数据线(SDA)和串行时钟线(SCL)。 2. 设计思想:在FPGA上实现IIC读写EEPROM的设计思路是通过编写Verilog HDL代码来实现IIC总线的驱动功能,并通过IIC总线对EEPROM进行读写测试。 3. RTL代码重要部分:在RTL代码的实现中,需要考虑起始信号、应答信号以及数据读写时序。根据引用的内容,可能会遇到从机无应答、应答正常但数据不对以及时钟问题等问题。对于从机无应答的情况,可以通过添加状态机中的等待应答的机制来解决。对于应答正常但数据不对的情况,可能是EEPROM本身的问题,可以尝试重新上电来解决。而时钟问题可以通过添加边沿检测程序来解决。 4. 开发过程遇到的问题:在开发过程中可能会遇到一些问题,如从机无应答、数据错误等。通过使用SignalTap抓波形图可以帮助分析问题所在。 综上所述,实现IIC读写EEPROM的FPGA设计可以根据IIC协议的时序特点编写Verilog HDL代码,并解决可能出现的问题,如从机无应答、数据错误等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FPGA中 通过IIC读写EEPROM驱动代码示例](https://download.csdn.net/download/qq_20222919/12733052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [FPGA实现IIC通信(读写EEPROM)](https://blog.csdn.net/xs_sd/article/details/114534036)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值