Part Number:DRA821U
问题 1:
尊敬的支持部门:
预加载 DDR ECC 时,我们使用 BIST 引擎进行 SDRAM 初始化,但会失败,以下是配置的寄存器。
可以帮助我检查配置是否正确吗?
我想初始化 0x9000 0000 ~ 0x9000 03FF(1KB)
/* BIST start address 0.*/
Tst_DDR_CTL->DENALI_CTL_196 = 0x90000000;
/* BIST start address 1.*/
Tst_DDR_CTL->DENALI_CTL_197 = 0x00000000;
/* BIST test mode.*/
/*4 – memory initialization.*/
Tst_DDR_CTL->DENALI_CTL_200 = 0x4;
/* BIST data pattern 0.*/
Tst_DDR_CTL->DENALI_CTL_201 = 0x55AA55AA;
/* BIST data pattern 1.*/
Tst_DDR_CTL->DENALI_CTL_202 = 0x55AA55AA;
/* BIST data pattern 2.*/
Tst_DDR_CTL->DENALI_CTL_203 = 0x55AA55AA;
/* BIST data pattern 3.*/
Tst_DDR_CTL->DENALI_CTL_204 = 0x55AA55AA;
/* bit0 -BIST GO */
/* bit18 -21, the number of address bits during BIST operation.*/
/* 9 – represent 1KB .*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x90001;
答 1:
很抱歉这么晚才回复。这段代码看起来没有问题。它是否能正常运行?使用 BIST 模块来初始化 DDR 是否有任何具体原因?您还可以使用 DMA 来初始化 DDR。
我们使用过 DMA 来初始化/填充 DDR。您可以在 ti-processor-sdk-rtos-j721e-evm-08_01_00_11/pdk_jacinto_08_01_00_33/packages/ti/board/src/j721e_evm/board_ddr_prime_dma.c 文件中找到此代码。
问题 2:
不能正常运行,地址 0x9000 0000 ~ 0x9000 03FF 没有填充预期值 (0x55AA55AA)。
BIST 引擎有相应的演示代码吗?
使用 DMA 初始化 DDR 比 BIST 引擎更快吗?
答 2:
您能说明一下只填充 1024 字节的原因吗?
很遗憾,SDK 中没有关于使用 BIST 来填充存储器的演示代码。我之前使用 gel 文件进行过这方面的尝试,是没有问题的。
根据用例来看,使用 DMA 引擎可能会更好。
问题 3:
我想使用 BIST 引擎在启用内联 ECC 的情况下进行 DDR 预加载。至于 1024 字节,只是一个为了验证 BIST 引擎是否正常工作的演示而已。
答 3:
是的,我们可以使用 BIST 引擎,但模式必须为 0x0。我们不能写入任何其他模式。此外,速度将与 DMA 可以写入的速度类似。这就是我建议使用 DMA 的原因。我不知道为什么没有使用 DMA 来填充模式。您能说明一下原因吗?
问题 4:
中国的 TI 支持部门建议我们可以使用 BIST 引擎进行 DDR 预加载。
我将尝试使用零模式,然后我再回复是否可行。
还有一个关于 BIST 引擎的问题:
如何知道 BIST 引擎是否成功完成 DDR 预加载?通过 DDRSS_CTL_194 位 8(数据检查状态)?我是否需要将位 8 作为 1 进行轮询?
在填充模式为 0x55AA55AA 的演示配置中,DDRSS_CTL_194 位 8 为 1。
答 4:
您可以使用 DDRSS_CTL_293 寄存器中的位 11 来等待完成。
答 5:
请使用以下代码通过 BIST 函数在 DDR 中填充模式。请使用 0x0 填充模式使 ECC 正常工作。
/***********************macro define************************/
#define DDR_START_ADDR 0x80000000
#define DDR_SIZE 32
#define DDR_DATA 0x11111111
#define DDR_DATA1 0xAAAAAAAA
#define DDR_DATA2 0x55555555
#define DDR_DATA3 0xFFFFFFFF
#define J7ES_DDR_SS_BASE_MCUStart 0x02990000U
#define DDRSS_CTL_194__SFR_OFFS 0x308
#define DDRSS_CTL_195__SFR_OFFS 0x30c
#define DDRSS_CTL_196__SFR_OFFS 0x310
#define DDRSS_CTL_200__SFR_OFFS 0x320
#define DDRSS_CTL_201__SFR_OFFS 0x324
#define DDRSS_CTL_202__SFR_OFFS 0x328
#define DDRSS_CTL_203__SFR_OFFS 0x32c
#define DDRSS_CTL_204__SFR_OFFS 0x330
#define DDRSS_CTL_293__SFR_OFFS 0x494
#define DDRSS_CTL_295__SFR_OFFS 0x49c
Board_STATUS fillTestPattern()
{
Board_STATUS status = BOARD_SOK;
BOARD_DEBUG_LOG("Start DDR pattern test!\r\n");
// Define start address
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_196__SFR_OFFS, (DDR_START_ADDR – 0x80000000));
// Define memory size
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 63 << 16, 16, DDR_SIZE);
// Enable data check
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 1 << 24, 24, 1);
// Disable addr check
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_195__SFR_OFFS, 1, 0, 0);
// Set BIST Mode to Mem Init
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_200__SFR_OFFS, 7, 0, 4);
// Set Data Patterns
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_201__SFR_OFFS, DDR_DATA);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_202__SFR_OFFS, DDR_DATA1);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_203__SFR_OFFS, DDR_DATA2);
HW_WR_REG32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_204__SFR_OFFS, DDR_DATA3);
// Clear Interrupt
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_295__SFR_OFFS, 1 << 11, 11, 1);
// Trigger Write
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_194__SFR_OFFS, 1, 0, 1);
// Wait for Finish
while(HW_RD_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_293__SFR_OFFS, 1 << 11, 11) !=1) BOARD_DEBUG_LOG("keep waiting finish!\r\n");
// Clear Interrupt
HW_WR_FIELD32_RAW(J7ES_DDR_SS_BASE_MCUStart + DDRSS_CTL_295__SFR_OFFS, 1 << 11, 11, 1);
}
问题 6:
我尝试了上面的代码,好像可以成功将指定的存储器空间初始化为 0。但是,DDRSS_CTL_293 中的位 11 未设置,然后程序将卡在 while 循环中。
Memlay_MemSet64((uint64*)0x90000000, 0x01uLL, 0x400uLL);
/* BIST start address 0.*/
Tst_DDR_CTL->DENALI_CTL_196 = 0x90000000 – 0x80000000;
/* BIST initialization size, 1K.*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0xA0000;
/* BIST enable data check.*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x1000000;
/* BIST disable address check.*/
Tst_DDR_CTL->DENALI_CTL_195 |= 0x1;
/* BIST start address 1.*/
Tst_DDR_CTL->DENALI_CTL_197 = 0x00000000;
/* BIST test mode.*/
/*4 – memory initialization.*/
Tst_DDR_CTL->DENALI_CTL_200 = 0x4;
/* BIST data pattern 0.*/
Tst_DDR_CTL->DENALI_CTL_201 = 0x00;
/* BIST data pattern 1.*/
Tst_DDR_CTL->DENALI_CTL_202 = 0x00;
/* BIST data pattern 2.*/
Tst_DDR_CTL->DENALI_CTL_203 = 0x00;
/* BIST data pattern 3.*/
Tst_DDR_CTL->DENALI_CTL_204 = 0x00;
/* BIST clear interrupt.*/
Tst_DDR_CTL->DENALI_CTL_295 = 0x800;
/* bit0 -BIST GO */
/* bit18 -21, the number of address bits during BIST operation.*/
/* 9 – represent 1KB .*/
Tst_DDR_CTL->DENALI_CTL_194 |= 0x1;
while(((Tst_DDR_CTL->DENALI_CTL_293) & 0x800) != 0x800)
/* BIST clear interrupt.*/
Tst_DDR_CTL->DENALI_CTL_295 = 0x800;
答 6:
我是在 TDA4xVM 上使用的这段代码,对于 DRA821 可能需要进行一些更改。您看是否可以轮询控制器中的任何其他位来完成 BIST?
问题 7:
我比较了 DRA821 和 TDA4XVM 之间的 DDRSS_CTL_293 寄存器,它们的描述是相同的。
我阅读了 DRA821 TRM,发现不能轮询任何位来完成 BIST。
TDA4:
DRA821:
Cherry Zhou:
我们建议您在发布新问题之前先搜索 E2E支持论坛,E2E支持论坛已经拥有数十万个已得到解答的话题。 这通常是解决问题的最快方法。