主题中讨论的其他器件:HALCOGEN
工具/软件:
您好:
校验正在使用的 DMA 和 DMA 奇偶校验。
我执行 MINITGCR = 0xA 以启用存储器硬件初始化、并 设置 MSINENA = 1 以初始化 DMA RAM。
当我通过设置 DMAPCR 和 DMA 接收数据在启用 DMA 奇偶校验的情况下启动代码时、会出现连续 ESM 组 1 通道 3 DMA 奇偶校验错误。
您能帮我解决这个问题吗?
谢谢你。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好:
校验正在使用的 DMA 和 DMA 奇偶校验。
我执行 MINITGCR = 0xA 以启用存储器硬件初始化、并 设置 MSINENA = 1 以初始化 DMA RAM。
当我通过设置 DMAPCR 和 DMA 接收数据在启用 DMA 奇偶校验的情况下启动代码时、会出现连续 ESM 组 1 通道 3 DMA 奇偶校验错误。
您能帮我解决这个问题吗?
谢谢你。
尊敬的 Jagadish:
感谢您的答复。 我分享了下面的代码片段
void _c_int00 (void)
{
_coreInitRegisters“_();
_coreInitStackPointer_();
。
。
。
/*
*在 systemInit 函数内有
* setupPLL、periphInit、setupFlash 函数等
*/
systemInit();
memoryInit (0x1U);//在 systemInit 和 memoryInit 函数之间、没有任何其他函数
。
。
。
}
void memoryInit (Uint32 ram)
{
systemREG1->MINITGCR = 0xAU;
systemREG1->MSINENA = ram;
while ((systemREG1->MSTCGSTAT & 0x00000100U)!= 0x00000100U)
{
}/*等待*/
systemREG1->MINITGCR = 0x5U;
}
void main (void)
{
muxInit();
hetInit();
sciInit();
rtiInit();
gioInit();
spiInit();
dmaInit();
dmaREG->DMAPCR = 0x0000000A;//启用 DMA 奇偶校验 — 此处添加了该奇偶校验以进行测试
while (1)
{
。
。
。
}
}
void DmaInit()
{
SCI->SETINT |= SCI_SET_RX_DMA |SCI_SET_RX_DMA_ALL;
g_dmaCTRL g_dmaCTRLPKT1;
DmaReqAssign (DMA_CH0、DMA_SCI1_RX);
/*为通道 0*/配置控制包
G_dmaCTRLPKT1.Sadd =(UINT32)((u8*)&(SCI->RD)+3);/*源地址*/
G_dmaCTRLPKT1.DADD =(Uint32)&DMA_rx_Buffer[4];/*目标地址*/
G_dmaCTRLPKT1.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT1.FRCNT = DMA_BUFFER_SIZE;/*帧计数*/
G_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.PORTASGn = 4;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT1.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON;/* autoinit */
DmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
DmaSetChEnable (DMA_CH0、DMA_HW);
dmaEnable();
}
尊敬的 Samet varan:
您无需进行硬件存储器初始化即可启用 DMA 奇偶校验、
实际上、内存硬件初始化将在复位后立即发生、如上图所示。 实际上、我们不应该在运行时进行此内存硬件初始化、因为这是一种破坏性的操作、它将擦除内核的整个上下文。
因此、我的建议是您可以直接启用 DMA 奇偶校验、而无需在运行时进行任何硬件内存初始化。
--
此致、
Jagadish。
尊敬的 Jagadish:
我不会在运行时初始化 RAM。 初始化序列位于“void _c_int00 (void)“函数中、该函数处于“startup"(“(启动(启动)状态、因此在运行时不会调用该序列。
对于存储器初始化、是的 、它在复位后立即发生、但我们应在初始化之前启用 DMA 奇偶校验。
在详细图中、显示了在初始化之前应启用奇偶校验、并且 Halcogen 生成与参考手册兼容的代码。
尊敬的 Samet:
您是否可以尝试下面主题中提到的方法:
(+) RM44L920:DMA-Controlpacket 初始化后的 DMA-Parity 错误 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛
在启动期间对 DMA RAM 使用自动初始化方法之前启用 DMA 奇偶校验寄存器可以解决该问题。 ESM 停止报告奇偶校验错误、除非我应用相应的测试来测试诊断
--
此致、
Jagadish。