嵌入式技术论坛
直播中

李莉

7年用户 1420经验值
私信 关注
[问答]

长期经过验证的程序在两块AD7616配置上出现错误求助

硬件描述
CPU使用STM32F429,分别通过SPI2和SPI3挂载了两片AD7616,记为MAIN_ADC和BKUP_ADC,采集32路模拟信号。

电路板经过了一年左右的内外部测试,MAIN_ADC一直使用正常,但近期两批电路板上,MAIN_ADC工作不正常。

问题描述
近期开了两批电路板,嘉立创焊好了芯片。

MAIN_ADC时而正常、时而不正常;不正常的情况占99%,具体表现为16个通道信号只有两路能正常采集和输出。

BKUP_ADC一切正常。

程序中,使用RT-Thread的SPI接口,做了自定义修改,支持DMA,通过程序向AD7616写0x20~0x3F寄存器、0x02寄存器,控制工作模式和序列堆栈寄存器。

MAIN_ADC输出log日志
[5909] D/ad7616_device: Read: AD7616 register (0x20) = 0x0008
[5909] D/ad7616_device: Read: AD7616 register (0x21) = 0x0008
[5909] D/ad7616_device: Read: AD7616 register (0x22) = 0x0008
[5909] D/ad7616_device: Read: AD7616 register (0x23) = 0x0008
[5909] D/ad7616_device: Read: AD7616 register (0x24) = 0x0008
[5910] D/ad7616_device: Read: AD7616 register (0x25) = 0x0008
[5910] D/ad7616_device: Read: AD7616 register (0x26) = 0x0008
[5910] D/ad7616_device: Read: AD7616 register (0x27) = 0x0008
[5912] D/ad7616_device: ADC7616 Enable Sequence stack and burst mode.
[5912] D/ad7616_device: Read: AD7616 register (0x02) = 0x0008
[5912] D/ad7616_device: Read: AD7616 register (0x03) = 0x0008
[5912] D/ad7616_device: Read: AD7616 register (0x04) = 0x0008
[5912] D/ad7616_device: Read: AD7616 register (0x05) = 0x0008
[5912] D/ad7616_device: Read: AD7616 register (0x06) = 0x0008
[5912] D/ad7616_device: Read: AD7616 register (0x07) = 0x0008
AD7616的[0x02]寄存器被配置成了0x0008,表示没有启用Sequence模式、没有启用Burst模式。因此,MAIN_ADC只采集了默认的A0和B0通道,能解释硬件上只有两路信号输出。

BKUP_ADC输出log日志:
[5909] D/ad7616_device: Read: AD7616 register (0x20) = 0x0000
[5909] D/ad7616_device: Read: AD7616 register (0x21) = 0x0011
[5909] D/ad7616_device: Read: AD7616 register (0x22) = 0x0022
[5909] D/ad7616_device: Read: AD7616 register (0x23) = 0x0033
[5909] D/ad7616_device: Read: AD7616 register (0x24) = 0x0044
[5910] D/ad7616_device: Read: AD7616 register (0x25) = 0x0055
[5910] D/ad7616_device: Read: AD7616 register (0x26) = 0x0066
[5910] D/ad7616_device: Read: AD7616 register (0x27) = 0x0177
[5912] D/ad7616_device: ADC7616 Enable Sequence stack and burst mode.
[5912] D/ad7616_device: Read: AD7616 register (0x02) = 0x0078
[5912] D/ad7616_device: Read: AD7616 register (0x03) = 0x0000
[5913] D/ad7616_device: Read: AD7616 register (0x04) = 0x00aa
[5913] D/ad7616_device: Read: AD7616 register (0x05) = 0x00aa
[5913] D/ad7616_device: Read: AD7616 register (0x06) = 0x00aa
[5913] D/ad7616_device: Read: AD7616 register (0x07) = 0x00aa
AD7616的[0x02]寄存器被配置成0x0078,表示启用Seqeunce模式,启用Burst模式,且按照[0x20]~[0x27]寄存器的配置,使用一个Convst信号,就可以完成A0/B0 ~ A7/B7合计16个通道的数据。

配置正常,数据采集正常。

疑惑
在程序中,将MAIN_ADC修改成BKUP_ADC,只需要改一个字符串即可,可以排除程序不同的原因。

虽然没有用逻辑分析仪,但是,可以确定A0/B0通道采集的数据波形正确,表明MAIN_ADC的SPI在传输采样结果时一切正常。

为什么MAIN_ADC配置过程数据错误,采集过程数据正确呢?
有什么好的排查手段吗?我计划让学生先把MAIN_ADC吹下来,再焊上测试。
虚心求教,希望能得到大家的帮助,谢谢!

回帖(6)

王波

2023-4-4 14:21:42
先大胆假设下:也许就是 刚好那边的 AD7616 都坏了。或工作在临界状态,比如SPI时钟过高了?或供电不稳甚至电压不对?甚至工作温度变了都有可能受影响。
不然就是替换法,逐个修改其中1个变量,进行列表对比。
举报

李莉

2023-4-4 14:21:54
谢谢回复。依次检查过硬件、供电、修改SPI时钟,均没发现问题。
温度或许有影响,因为测试在海南,工作在北方,之前在-20环境下也没有什么问题。主要是近期两批板子出错。
奇怪的点在于,坏也不是全部坏,只有配置工作模式时出错,读取采样数据却没有问题。正在买逻辑分析仪,到时候试试。
举报

王波

2023-4-4 14:22:04
不知道当前实际工作温度是多少?
相对恶劣的工作环境,除关注芯片本身素质外,还对电容电阻等被动元件有影响,甚至PCB和外壳的形变也有影响。
举报

李莉

2023-4-4 14:22:12
一般工作在-20-40度之间。我拿一根杜邦线划过7616得引脚,正常过一次。
回头再单独拆下这几块ad芯片,换新后测试。
举报

李莉

2023-4-4 14:22:24
我的AD7616的初始化过程:
GPIO操作,Reset AD7616
配置SPI接口
通过SPI写寄存器,设置AD7616的采样电压范围
通过SPI写寄存器,设置AD7616的OSR
通过SPI写寄存器,设置AD7616的序列堆栈、突发模式采样模式
配置PWM,Convst引脚上产生PWM波
调试了一天,逐步排查相关可能性,得到了如下结论:
在上述过程第2步配置SPI接口之前,若将Convst引脚的工作模式改为GPIO Output,拉高/拉低,可以正常配置所有寄存器。但是,奇怪的事情发生,Convst引脚在后续步骤中,配置成PWM的CH失败,没法转换。哪怕我在重新设置PWM之前,将Convst引脚Deinit也不行。
举报

李莉

2023-4-4 14:22:35
问题已经解决,是Convst引脚导致的。
实际的初始化过程是:
INIT Device, Convst引脚通过HAL_TIM_MspPostInit函数被配置成AF_PP模式、NO_PULL、AF_TIM功能。
Reset AD7616。
配置SPI。
可能MAIN_ADC这一块的电路,导致Convst引脚上的电平异常,而BKUP_ADC附近的电路却没有异常(这部分真实情况,要上示波器再仔细测测硬件)。因此,BKUP_ADC的寄存器配置成功。
程序经过修改,将NO_PULL改成PULLDOWN,内部下拉,解决了MAIN_ADC的寄存器配置错误问题,同时,BKUP_ADC也能工作良好。
至于Convst引脚在reset之后,配置成GPIO再下拉,AD7616配置成功,却没有波形的原因也找到了。PWM对应的GPIO引脚初始化是INIT_DEVICE,所以,这一步破坏了PWM的模式,没有转换脉冲。没想到在这里还踩了个坑。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分