Post Go back to editing

LTC6804-1配合LTC1380扩展多路模拟复用器中I2C问题

Category: Hardware
Product Number: LTC1380

在研究LTC6804和LTC1380共同使用以扩展ADC通道的电路中,焊接1380和不焊接1380的发送的I2C命令不一致,具体疑问及细节如下:

我按照LTC6804的数据手册中LTC1380和LTC6804的电路连接后,在没有焊接LTC1380的情况下,我的软件成功发送了SPI命令并且让I2C发送了命令,如下图一所示

I2C发送的命令为1001 0000      0000 1000,符合LTC1380中数据手册采集S0通道的数据,如下图二所示

但是我在焊接LTC1380后遇到了问题,焊接后的I2C的SDA并没有发送成功,使用的是同样的代码和同一块PCB,如下图三所示

下图是原理图电路连接

以及PCB(U1为LTC1380)

Parents
  • 我不太能直观的判断出这种问题所在,仅仅是因为芯片焊接上了bms就出不了iic波形了?注意一下执行指令前确保是否已经用wakeupidle将芯片唤醒。

  • 感谢您的回复,以上问题已解决。

    但是我又遇到了新的问题求解答:

    如图所示,I2C的命令成功轮询S0-S7的8通道模拟量采集,事实上我的GPIO1口确实能读到实时更新的电压值。

    但是问题在于,他会出现一个通道的电压值串口打印多次的情况。

    并且根据我目前代码的调试情况,在分别单独触摸单个NTC时,会有其他通道的电压值受影响。例如我只焊接了两个NTC通道(S0和S1),但我在单独触摸S0或S1时,采集的两个电压都会变化,并显示的是一样的数值,如下图串口所示(VT4及VT5)。

    以及通道和串口轮循输出的顺序不一致,例如图中,S0未能对应VT0。

    下图是我编写的轮循代码,希望得到您的建议和看法

  • 我觉得你传指针过去,如果是二维数组最好是传comm_configp[0]吧,然后printf不建议放到for循环里面,建议放到for循环外面,ltc1380的传输应该只要用到两个byte吧,地址和数据,建议数组组成是0x69 0x08 0x00 0x89 0x7f 0xf9.第三个byte不用。还有就是您的6894 gpio当iic用时,上拉电阻是多大,不建议超过4.7k。还有您有个注释72Mhz是什么意思,6804的spi通信应该是1M的spi时钟吧。如果spi通信速率太快建议调低。

    最后是您如果以循环方式的调试出问题了,我建议是您先调试单独一个指定通道的通信程序,单独通道调试没问题了,到时候for循环跑起来出问题概率也小。主要还是需要您多调试调试。

  • 非常感谢您的建议,上拉电阻是按照数据手册选用的4.7k,听取您的建议将发送的数组改成两个byte,然后这个72MHz实际上是stcomm函数发送72个时钟电平,这里是我注释时的错误,抱歉带来了误解。

    在单独调试每个通道时GPIO1口采集的电压都没有问题,但是在我启用两个及以上的模拟通道时却出现了问题。

    下图为开启S0和S1的函数,这里的r_comm_config用于存储开启通道后读到的GPIO1口模拟量的值

    按理来说r_comm_config[0][0]和r_comm_config[0][1]应该分别显示S0和S1通道显示的温度值。但实际上的效果却如视频所示(变量值在视频右侧),显然这两个值相等。经过调试过后发现单独触摸S0通道或S1通道的NTC都会导致两个值同时变化显示一个通道测试的值。

    后来通过Debug一步一步走程序,单手触摸S1通道的NTC,去观察开启S0通道后(即走完上图中01部分代码),采集函数获得的GPIO1的值,r_comm_config[0][0]的值却显示了S1通道采集的电压值。经过检查逻辑分析仪发送波形通讯都是没问题的,但逻辑分析仪上显示rdaux回读的数据仍是相同的,我因此困惑了很久。

  • 您adax指令一发送就读rdax,按理是会有问题的,采样结束到新的数据更新需要时间,读取时间过快其实就是没更新的值,这可能就是您之前感觉数据错位的原因,以及多个通道同时更新的原因,都很有可能是通道还没采样完就被切,因为您缺少采样时间的等待。从采样指令发送出去到回读,按理是需要延时的,要么就是给一个较长的延时干等,要么是用PLADC指令来精确定位ADC的采样结束时间,待ADC确定采样结束了再去读值就不会错。PLADC函数应该是有代码参考的,您要快速调试的话也可以直接干等一个较长的延时确保采样结束,等问题确定是因为这个引起了再加PLADC指令。同时二维数据建议传的格式我建议改成加个[0]。

Reply
  • 您adax指令一发送就读rdax,按理是会有问题的,采样结束到新的数据更新需要时间,读取时间过快其实就是没更新的值,这可能就是您之前感觉数据错位的原因,以及多个通道同时更新的原因,都很有可能是通道还没采样完就被切,因为您缺少采样时间的等待。从采样指令发送出去到回读,按理是需要延时的,要么就是给一个较长的延时干等,要么是用PLADC指令来精确定位ADC的采样结束时间,待ADC确定采样结束了再去读值就不会错。PLADC函数应该是有代码参考的,您要快速调试的话也可以直接干等一个较长的延时确保采样结束,等问题确定是因为这个引起了再加PLADC指令。同时二维数据建议传的格式我建议改成加个[0]。

Children
No Data