IIC问题记录

文章描述了一个使用ESP32C3微控制器通过IIC通信协议与活动部件耗材交互的问题。在模拟IIC模式下遇到半波和尖峰问题,通过修改SDA引脚配置为开漏输出和外部上拉仍无法完全解决。切换至硬件IIC模式后,虽然解决了波形问题,但在耗材热拔插时出现偶发死机。最终,通过调整SDA引脚配置为同时包含开漏、上拉、输入和输出属性,成功解决了所有问题。
摘要由CSDN通过智能技术生成

1、运行环境:ESP32C3

2、编译环境:VSCode+Platform IDE

3、程序框架:arduino

4、基本背景介绍:项目中有一个耗材需要记录数据,但此耗材是活动部件,可以更换并且需要支持热拔插,我们选用的就是一个IIC通信(题外话:IIC是不持支热拔插的)的芯片再此耗材上,大致如下图;主控ESP32C3需要通过IIC不断的(10ms读一次)读取耗材芯片的ID判断耗材是否在线

 问题一:

最初使用的模拟IIC读取耗材信息,出现了半波和尖峰问题,如下:

 

 这个问题在网上搜索“IIC 半波”就可以找到相关的文章分析,然后根据网上分析需要修改SDA的引脚的配置

原来程序SDA的配置定义:

#define I2C_SDA_OUT()   pinMode(SDA_PIN,OUTPUT)
#define I2C_SDA_IN()    pinMode(SDA_PIN,INPUT)

 修改后的代码:

#define I2C_SDA_OUT()   pinMode(SDA_PIN,OUTPUT_OPEN_DRAIN)
#define I2C_SDA_IN()    pinMode(SDA_PIN,INPUT_PULLUP)

以上这种把SDA的引脚配置成开漏输出+硬件外部上拉的方法在STM上确实能解决问题,但是在ESP32C3上面,发现有尖峰波形,如下:

 

 

对于这个点本人的分析是,在等待应答的函数内部SDA从开漏输出切换为上拉输入时,外加外部上拉,导致电位变高,但立马外部IIC设备响应,又给拉低了,就出现了尖峰(不对指出,还望指出),当时这点尝试了不同的输出输出模式,一直避不开上面这两个问题。既然避不开,那就不用模拟IIC,直接改用硬件IIC。

问题2:

使用硬件IIC后,确实解决上面的半波和尖峰问题,但后面发现偶发出现死机。主要出现在拔插耗材时,有一定的几率出现死机问题

在arduino框架下,

void loop()
{

}

内不允许有是循环,若出现死循环,就没法喂狗,导致死机。

通过加快读取IIC数据的速度(从上面的10ms读取一次变成3ms读取一次),拔插耗材,发现更容易出现死机,并且抓取到死机时IIC的通信波形如下:

 在等待应答信号时,SAD一直没有应答信号,导致硬件超时,然后应该就是我所使用的硬件IIC的驱动里面进入了死等,导致我的整个程序死机。

由于底层封装的太多,没法找到到底是哪里的原因,这个时候有切换回模拟IIC一样的进行3ms读取一次的压力测试发现没问题,不会死机。最后还是要解决模拟IIC的尖峰或半波问题。

通过查看硬件IIC驱动中的对SDA的引脚配置找到了最后的解决方案:

#define I2C_SDA_OUT()   pinMode(SDA_PIN,OUTPUT_OPEN_DRAIN)
#define I2C_SDA_IN()    pinMode(SDA_PIN,INPUT_PULLUP)

//上面的两句合并成一句,如下
#define I2C_SDA_OUT()   pinMode(SDA_PIN, OPEN_DRAIN | PULLUP | INPUT | OUTPUT) 

最后关于SDA和CLK的配置定义

#define SET_SCL_LEVEL(a)        digitalWrite(SCL_PIN, (a))
#define I2C_SCL_OUT()           pinMode(SCL_PIN, OUTPUT_OPEN_DRAIN)

#define SET_SDA_LEVEL(a)        digitalWrite(SDA_PIN, (a)) 
#define GET_SDA_LEVEL           digitalRead(SDA_PIN)
#define I2C_SDA_OUT()           pinMode(SDA_PIN, OPEN_DRAIN | PULLUP | INPUT | OUTPUT) 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: IIC(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和外设。IIC Tool上位机是一种用于通过IIC协议与外设进行通信和控制的软件工具。 IIC Tool上位机可以轻松地与支持IIC通信的设备建立连接,并通过软件界面进行数据的发送和接收。它提供了多种功能和选项,可以方便地配置和监控外设的工作状态。 使用IIC Tool上位机,用户可以读取和写入外设的寄存器和寄存器组,以实现对外设的控制和配置。通过发送特定的IIC命令和数据,可以改变外设的工作模式、参数设置等。 此外,IIC Tool上位机还支持数据的实时监测和显示。通过设置相关的参数,用户可以实时地查看外设发送和接收的数据,从而更好地了解和分析外设的工作情况。 总之,IIC Tool上位机是一种方便实用的软件工具,可以通过IIC协议与外设进行通信和控制。它为用户提供了丰富的功能和选项,使得与支持IIC通信的设备的连接和控制变得更加简单和高效。 ### 回答2: IIC Tool上位机是一种用于与IIC(Inter-Integrated Circuit或I2C)总线通信的工具。它是通过计算机与IIC设备之间进行数据交互和控制的软件工具。 IIC是一种串行通信协议,通常用于在电子设备之间传输数据。IIC总线常常用于连接微控制器、传感器、存储器等外围设备,并通过IIC通信协议进行数据传输。然而,要完成IIC通信,需要一个可以与IIC设备进行交互的工具,这就是IIC Tool上位机的作用。 使用IIC Tool上位机,我们可以在计算机上通过串口或USB接口与IIC设备进行通信。通过IIC Tool上位机软件的图形用户界面,我们可以向IIC设备发送指令、读取或写入数据,以及监控设备的状态。 IIC Tool上位机的功能通常包括: 1. 设备搜索和识别:可以自动扫描IIC总线上的设备,并显示其地址和设备类型。 2. 数据读写:可以向IIC设备发送读写命令,读取或写入设备的寄存器、存储器等信息。 3. 数据显示与记录:可以实时显示IIC设备发送的数据,并将其记录保存到计算机中以便后续分析。 4. 设备调试和控制:可以向IIC设备发送控制命令,调整设备参数或执行特定操作。 5. 错误检测和故障排除:可以检测IIC通信中的错误,并提供故障排除功能。 总之,IIC Tool上位机是一种方便实用的工具,可以帮助我们与IIC设备进行数据交互和控制,提高了开发、调试和测试的效率。 ### 回答3: IIC通讯是一种用于连接多个集成电路(IC)的串行通信接口。IIC通信协议包括两根线——时钟线(SCL)和数据线(SDA)。上位机是指在IIC通讯中负责发送控制指令和接收数据的主设备。 IIC Tool是一种用于与IIC设备进行通信的软件工具。上位机软件通常提供用户友好的界面,使用户可以轻松地进行IIC通信操作。通过IIC Tool上位机,用户可以连接到目标IIC设备并与其进行数据交换。 IIC Tool上位机通常具备以下功能: 1. 设备识别:通过扫描IIC总线,上位机软件能够识别连接的IIC设备并显示其地址和相关信息。 2. 寄存器读写:用户可以对IIC设备的寄存器进行读写操作,以实现对设备内部状态的控制和监测。 3. 数据收发:用户可以发送自定义的数据包给IIC设备,并接收来自设备的数据回传。这使得上位机可以与目标设备之间进行双向数据通信。 4. 时序分析:通过监测和记录IIC通信的时序信息,上位机软件可以显示通信过程中的时钟信号和数据线信号的变化情况,有助于调试和验证IIC通信的正确性。 通过使用IIC Tool上位机,用户可以方便地控制和管理IIC设备,实现各种应用场景下的数据交互和协作。无论是开发者还是工程师,都可以利用IIC Tool上位机软件对IIC设备进行测试、调试和监控。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值