模拟IIc通讯失败解决办法&&通讯线长度问题

本文讲述了在调试SQ52205模块的模拟IIC通信过程中遇到的问题,发现IIC通讯失败,从机未回应ACK。通过排查确定问题在于IIC通讯线过长,解决办法是缩短线缆。文章详细介绍了如何使用GPIO进行模拟调试和KEIL代码分析,以及使用示波器进行波形分析的过程。

调试SQ52205的模拟IIC通信记录

——————————————————————————————————————————

先说结论:

问题:IIC通讯失败,IIC从机未有ACK回应

问题点:IIC通讯线过长

解决办法:剪短IIC从通讯线

——————————————————————————————————————————

1.可以直接调试:将口拉高拉低

如果可以正常拉高拉低,说明硬件上IIC需要的上拉电阻没有问题+配置的引脚没有问题

如果不正常:

(1)检查模拟IIC引脚是否配置有问题
(2)检查模拟IIC是否正常初始化

可以调用一下函数直接操作GPIO观察示波器SDA和SCL的波形

 gpio_bit_set(GPIO_I2C3_SCL_GPIO_PORT, GPIO_I2C3_SCL_PIN);
 gpio_bit_set(GPIO_I2C3_SDA_GPIO_PORT, GPIO_I2C3_SDA_PIN);
 gpio_bit_reset(GPIO_I2C3_SCL_GPIO_PORT, GPIO_I2C3_SCL_PIN);
 gpio_bit_reset(GPIO_I2C3_SDA_GPIO_PORT, GPIO_I2C3_SDA_PIN);

在经过模拟IIC读取芯片的数据过程后,blRet的返回值时FALSE,直接进入程序的return FALSE步骤

BOOL SQ52205_GetCurrent(P_U16 pu16ReadData)
{
    U8 u8ReadBuf[2] = {0};
    U16 u16ReadData = 0 ;
    BOOL blRet = FALSE;

    blRet = HAL_SQ52205_READ_ARRAY(SQ52205_CURRENT, u8ReadBuf, 2);

    if(blRet == FALSE)
    {
        return FALSE;
    }
    
    //电流计算方法   (04h寄存器的十进制)* LSB (mA) = A      LSB = 0.00512/(05h的十进制)/分流器阻值(Ω)

    u16ReadData = u8ReadBuf[0]<<8 | u8ReadBuf[1];

    *pu16ReadData = u16ReadData  * SQ52205_LSB;      //单位0.1A

    return TRUE;
}
2.KEIL代码调试分析
(1)进入失败的语句:HAL_SQ52205_READ_ARRAY

blRe

IIC(Inter-Integrated Circuit)通讯线长度为50cm是否合理,需要综合多方面因素判断。 IIC是一种串行通信协议,其通信速度与线路长度存在一定关联。一般来说,IIC标准模式下速率为100kbps,快速模式下可达400kbps,高速模式能到3.4Mbps。在低速率情况下,线路长度对通信的影响相对较小;而在高速率时,线路长度过长会带来信号衰减、反射等问题,影响通信的稳定性和可靠性。 当IIC通讯线长度达到50cm时,如果通信速率较低,例如处于标准模式100kbps,50cm的线路长度可能是合理的,因为在这种低速率下,信号的传播特性受线路长度的影响相对有限,只要线路的阻抗匹配合理、周围电磁环境干扰较小,就能够保证通信的正常进行。 然而,如果是在快速模式400kbps甚至高速模式3.4Mbps下,50cm的线路长度就可能过长。长线路会导致信号在传输过程中出现衰减,使得接收端接收到的信号幅度变小,可能无法被正确识别;同时,长线路还容易产生反射现象,反射波与原信号叠加,会造成信号失真,进而引发通信错误。 此外,线路周围的电磁环境也会对50cm长的IIC通讯线产生影响。如果周围存在强电磁干扰源,如大功率电机、开关电源等,长线路更容易耦合到干扰信号,影响IIC通信的稳定性。 综上所述,IIC通讯线长度为50cm是否合理不能一概而论,需要结合具体的通信速率、线路的阻抗匹配情况以及周围的电磁环境等因素来综合判断。 ```python # 简单示例代码,模拟IIC通信速率与线路长度关系的判断 def is_length_reasonable(speed, length): if speed == 100000: # 标准模式100kbps if length <= 100: # 假设100cm内都合理 return True else: return False elif speed == 400000: # 快速模式400kbps if length <= 20: # 假设20cm内合理 return True else: return False elif speed == 3400000: # 高速模式3.4Mbps if length <= 5: # 假设5cm内合理 return True else: return False else: return False # 测试示例 speed = 100000 length = 50 print(is_length_reasonable(speed, length)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值