请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:DK-TM4C129X
此问题是为了记录 TM4C129X 散聚模式中出现的错误,以及该错误的解决方法。 无需帮助。
下面的 SG 代码循环两次传输、每次传输
1) 1)将 SSI 数据块从 FIFO 读取到存储器中、
2) 2)将 EMAC 时间戳寄存器读取到存储器中、和
3) 3)通过取消屏蔽 SSI EOT 中断来产生中断。
为了节省时间,这里没有人试图描述支持软件----希望代码是相当不言自明的。 有一个环状的
μ µDMA 任务、此处未显示、它执行四次14位 SSI 输出传输、以在外部 GPIO 管脚的上升沿触发 SSI 输入传输。
整个传输流程按设计工作、不同之处在于如果下面红色显示的"虚拟"任务未包括在内、则每个 SSI 输入任务的第6个16位传输
在时间戳复制和中断请求之前、会发生两次、在 SSI 输入流中插入错误的半字。 传输加倍
在启动时不会发生第一次传输。 不知道逻辑结构、我无法说明 MCU 内部发生的情况、但看起来是这样的
写入缓冲和随后的 SSI 输入传输之间存在时序冲突。
散聚机制是一个很好的主意、并且在所涉及的设计中节省了大量的硬件。 我们不胜感激。 虚拟任务
解决方法似乎可以完全解决问题、允许 MCU 在夜间运行而不会锁定或明显的数据损坏。 不要求 TI 采取任何行动
本期的内容。 但是、TI 可能会考虑一整套更完整的示例和文档、以允许普通用户访问 SG DMA 的全部功能。
数据结构:
静态常量 uint32_t packueQueueDepth = 2; struct{ uint32_t b[ni:ssiPackInLength / sizeof (uint32_t)]; //! ADC 数据 uint32_t emactimsec 的可打包块;//! EMAC 寄存器内容 uint32_t emactimnano;//! EMAC 寄存器内容 }adcBlockUnpacked[packQueueDepth]; //! 来自硬件 的 ADC 输入数据//! 输入 uDMA 任务列表 结构{ struct{ tDMAControlTable 虚拟; //! 在 intReq 之后、adcReceive 可能会遇到写入重复 //! 虚拟任务的情况下运行。 tDMAControlTable adcReceive; //! 将 ADC 数据输入到存储器。 tDMAControlTable timeStampCopy; //! 将时间戳复制到存储器。 tDMAControlTable intReq; //! 向处理器请求中断 。} packQueue[packQueueDepth]; tDMAControlTable 循环; //! 循环主条目以重复 。} CoilInUdmaTask; //! 线圈输入 |指向任务列表的主 UDMA 条目 const tDMAControlTable coilInputUdmaPrimary ={(char *)&(coilInUdmaTask)+ sizeof (coilInUdmaTask)-1、&(uDmaInputCccs[ni::adcRxUdmaTask)+ sizeof (coilInUdmaTdmaTask_32 )| t UdCC32_eDMA_udt_eUSTR_Udma32_eDMA_udt_eR32_eRdCC32_cn_cnt | t |<SRC4_UdCC32_UdmaTSER_UCC32_UCC32_UCC32_Udma_UCC32_UCC32_UCC32_UCC32_UCC32_UCC32_UCC32_Udma_UCC32_UCC32_UCC32_UCC32_UCC32_E_UCC32_E_UCC32_E_UCC32_UCC32_E_UCC32_E_U 线圈输入的 uDMA 源 uDMA 副本
初始化代码:
//将主 ADC 输入 uDMA 添加到任务列表。 uDmaCcs[ni:udmaPrimary][ni::adcRxUdmaChannel]= cilInputUdmaPrimary; //为循环保存重新初始化值。 coilInputUdmaPrimaryInit = coilInputUdmaPrimary.ui32Control; //对于( int b=0;<packQueueDepth; ++b) { )的包队列中的每个块 //虚拟任务在 adcReceive 时防止样本重复 //紧随 timeStampCopy 和 intReq。 uDMATaskAssign ( CoilInUdmaTask.packQueue[b].dummy、 8、UDMA_SIZE_32、 //使用 UDMA 控制结构的未使用部分进行读取/写入 UDMA_SRC_INC_NONE、(void *)&(coilInUdmaTask.packQueue[b].dummy.ui32Spare)、 UDMA_DST_INC_NONE、(void *)&(coilInUdmaTask.packQueue[b].dummy.ui32Spare)、 //读取/写入、不会接触 RAM 且不会影响寄存器 //uDMA_SRC_INC_NONE、(void *)(ni:adcSsi+SSI_O_RIS)、 //uDMA_dst_INC_none、(void *)(ni:adcSsi+SSI_O_RIS)、 UDMA_ARB_8、UDMA_MODE_PER_散 射_收集 ); // ADC 采样块 uDMATaskAssign ( CoilInUdmaTask.packQueue[b].adcReceive, NI:ssiPackInLength / sizeof (uint16_t)、 UDMA_SIZE_16、 UDMA_SRC_INC_NONE、(void *)(ni:adcSsi + SSI_O_DR)、 UDMA_dst_INC_16、adcBlockUnpacked[b].b、 UDMA_ARB_1、UDMA_MODE_PER_散 射_收集 ); //时间戳 uDMATaskAssign ( CoilInUdmaTask.packQueue[b].timeStampCopy、 2、UDMA_SIZE_32、 UDMA_SRC_INC_32、(void *)(EMAC0_BASE + EMAC_O_TIMSEC)、 UDMA_dst_INC_32、&(adcBlockUnpacked[b].emactimsec)、 UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集 ); //中断 uDMATaskAssign ( CoilInUdmaTask.packQueue[b].intReq、 1、UDMA_SIZE_32、 UDMA_SRC_INC_NONE、sisimEoim、 UDMA_DST_INC_NONE、(void *)(ni:adcSsi + SSI_O_IM)、 UDMA_ARB_1、UDMA_MODE_MEM_散 射_收集 ); } //循环返回到传输开始。 uDMATaskAssign ( coilInUdmaTask.loop、 1、UDMA_SIZE_32、 UDMA_SRC_INC_32、&coilInputUdmaPrimaryInit、 UDMA_DST_INC_32、 (void *)&(uDmaCcs[ni:udmaPrimary][ni:adcRxUdmaChannel].ui32Control)、 UDMA_ARB_4、UDMA_MODE_MEM_散 射收集 );