访问 DCP 寄存器导致 i.MX6 处理器崩溃,怀疑存在硬件设计缺陷?寻求帮助 我在使用 i.MX6 处理器时遇到了一个关键问题,希望得到社区的帮助。在我们生产的一批电路板中,大约20%的样本在访问DCP寄存器后导致处理器崩溃。以下是详细的背景和信息: # 问题描述 生产了一批电路板,发现20%的样品表现出相同的缺陷。 当代码尝试访问 DCP 寄存器(地址 0x02284000)时,处理器完全崩溃,甚至 JTAG 调试器也无法再访问内核。JTAG 报告错误: "错误:数据在 0x02284000 终止,dfsr = 0x00000008"。 一旦发生此错误,处理器将无法继续执行(即使输入"c" 继续执行)。 3 号和 6 号板有缺陷。暂时观察到,与其他板相比,这些板上的 VDD_SNVS_IN 电压略高。 Error data abort错误数据中止 can access可以访问 # 硬件环境 我不确定电路电压点设计是否存在差异,所以我测量了故障电路板与其他板之间的电压差。 -处理器:i.MX6ULL (MCIMX6Y2) - 故障板编号:3 号和 5 号(故障率约 20%) - 普通板数量:剩余的 80% 的板 # 代码复制 以下代码用于重现该问题。如果未注释 DCP 访问部分,则 LED 停止闪烁(处理器崩溃): 通过 JTAG 手动访问 DCP 也会触发信号错误: >>> set $R = 0x2284000
>>> p/x *$R #include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "pad_config.h"
#define LED_PAD_CONFIG_DATA 0x13008
int main()
{
CCM_CCGR1_CG13(0x3);
CCM_CCGR3_CG6(0x3);
IOMUXC_SetPinMux(RGB_RED_LED_IOMUXC,0);
IOMUXC_SetPinConfig(RGB_RED_LED_IOMUXC, LED_PAD_CONFIG_DATA);
GPIO1->GDIR |= (1<<4);
GPIO1->DR |= (1<<4);
while(1)
{
GPIO1->DR &= ~(1<<4); // led on
delay(0xFFFFF);
GPIO1->DR |= (1<<4); // led off
delay(0xFFFFF);
#if 0 // Turn on the code, MCU will be crash
int *ptr = 0x2284000; // This is DCP address
UART1_PrintHex32(*(ptr));
#endif
}
return 0;
} # 其他调查结果 - 访问 0x2284000 时,普通板返回 0x10000281(如预期)。 -根据手册 IMX6ULLRM.pdf,我们测试了所有其他外设寄存器,没有一个触发信号数据中止。该问题仅限于 DCP 区域。 well (ADC1_HC0)
set $R = 0x2198000
p/x *$R
well (AIPSTZ1_MPR)
set $R = 0x207C000
p/x *$R
......
well (TEMPMON_TEMPSENSE0)
set $R = 0x20C8180
p/x *$R
well (TSC_BASIC_SETTING)
set $R = 0x2040000
p/x *$R 请求帮助 -DCP 与时钟树之间的关系:DCP 模块依赖哪些时钟?是否需要任何特殊的时钟配置? -硬件设计缺陷:VDD_SNVS_IN 电压稍高可能是原因吗?是否还有其他电压或信号需要检查? -软件配置:是否有任何特殊的 DCP 初始化步骤或保护机制? -JTAG 调试:是否有办法在 DCP 访问失败后恢复 JTAG 连接? Re: Accessing DCP Register Causes i.MX6 Processor Crash, Suspected Hardware Design Defect? Seeking H 您是否遵循了我们指南中的需求:
Re: Accessing DCP Register Causes i.MX6 Processor Crash, Suspected Hardware Design Defect? Seeking H 1. 时序上满足的,2MS。 2. 采用纽扣电池供电,依旧在访问DCP寄存器后Crash Re: Accessing DCP Register Causes i.MX6 Processor Crash, Suspected Hardware Design Defect? Seeking H 1.IMX6ULLIEC.pdf 表 10 工作范围描述 VDD_SNVS_IN,工作范围在 2.8~3.6V。 典型 3.0V。 2.但是手册并未说明,提前多长时间? 原理图设计上,vdd_snvs_in 的确比vdd_high_in 和vdd_soc_in 先上电。 示波器观察的确如此,大约提前 1ms,是否足够? 是否因上电时序引起状态不一致,下面的实验很好验证。 电源树 3.的确总共做了 10 套板子,2 块存在相同故障。 4.板子跑uboot+linux卡死。 uboot/arch/arm/mach-imx/mx6/soc.c 试图从 DCP 模块获取随机数作为序列号时,SOC Crash。 于是尝试编写裸机LED程序,在代码里读写DCP寄存器,同样崩溃 int arch_misc_init(void)
{
if (IS_ENABLED(CONFIG_FSL_DCP_RNG)) {
struct udevice *dev;
int ret;
ret = uclass_get_device_by_driver(UCLASS_RNG, DM_DRIVER_GET(dcp_rng), &dev);
if (ret)
printf("Failed to initialize dcp rng: %d\n", ret);
}
setup_serial_number();
return 0;
} 接下来的尝试: 1.将所有板子时序一同测试时序是否一致,测试vdd_snvs_in 究竟有多少抖动。 2.板子接入纽扣电池 3.0v,保证 vdd_snvs_in一定处于最先上电,避免时序影响。 完成上述之后再回帖 Re: Accessing DCP Register Causes i.MX6 Processor Crash, Suspected Hardware Design Defect? Seeking H VDD_SNVS_IN这个电源一般要求为3.0V,设计电路板时,这个电源需要第一个输出出来,给到CPU 的 P12 引脚(VDD_SNVS_IN 脚)。你这里也是符合要求的这里。
还有在手册里你也可以看到
If VDD_SNVS_IN is directly supplied by a
coin cell, a schottky diode is required between VDD_HIGH_IN and VDD_SNVS_IN
你这里的设计都符合要求吗?还有,你这里总共做了10块板子, 有两块是不好使的?
你板子上跑的是什么软件?
記事全体を表示