Other Parts Discussed in Thread: HALCOGEN
器件型号: TMS570LC4357
主题中讨论的其他器件: HALCOGEN、
目标:
使用 DMA 在半‑双工模式下通过 SPI2(兼容模式)发送 8 个半‑字、且无中断。 DMA 由软件‑触发。
我使用的 DMA 控制数据包 (Tx 到 SPI2/DAT1)
G_dmaCTRL s_dmaCTRLPKTSPITx ={0};
/*-配置 DMA 控制数据包*/
S_dmaCTRLPKTSPITx.Sadd =(Uint32) au16_txData2; /*源地址 */
S_dmaCTRLPKTSPITX.DADD =((uint32_t)(&spiREG2->DAT1))+ 2); /*目标地址 (SPI2)*/
S_dmaCTRLPKTSPITX.CHCTRL = 0; /*通道控制 */
S_dmaCTRLPKTSPITX.FRCNT = 1; /*帧计数 */
S_dmaCTRLPKTSPITX.ELCNT = 8; /*元素计数 */
S_dmaCTRLPKTSPITX.ELDOFFSET = 0; /*元素目标偏移*/
S_dmaCTRLPKTSPITX.ELSOFFSET = 0; /*元素源偏移 */
S_dmaCTRLPKTSPITX.FRDOFFSET = 0; /*帧目标偏移 */
S_dmaCTRLPKTSPITX.FRSOFFSET = 0; /*帧源偏移 */
S_dmaCTRLPKTSPITx.PORTASGN = PORTA_READ_PORTB_WRITE;
S_dmaCTRLPKTSPITX.RDSIZE = ACCESS_16_BIT; /*读取大小 */
S_dmaCTRLPKTSPITx.WRSIZE = ACCESS_16_BIT; /*写入大小 */
S_dmaCTRLPKTSPITx.tType = FRAME_TRANSFER; /*传输类型 */
S_dmaCTRLPKTSPITX.ADDMODRED = ADDR_INC1; /*地址模式读取 */
S_dmaCTRLPKTSPITx.ADMODEWR = ADDR_FIXED; /*地址模式写入 */
S_dmaCTRLPKTSPITx.AUTOINIT = AUTOINIT_OFF; /* autoinit * /
/*设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、s_dmaCTRLPKTSPITx);
/*-通过软件触发*/
dmaSetChEnable (DMA_CH0、DMA_SW);
目的地为 spiREG2->DAT1 。 对 DAT1 的寻址基于 hl_reg_spi.h 中显示的 SPI 寄存器映射 周期性 TX DMA 软件触发使用 HALCoGen DMA API (dmaSetCtrlPacket、dmaSetChEnable)。
一些行为
‑我不使用 DMA 并且在没有内部等待的情况下调用 HALCoGen spiTransmitData ()(我在 SPIFLG.RXINTFLG/TXINTFLG 上注释掉了 while ),我只在总线上观察到两个半 μ s 的字;其余的从不出去。
如果我恢复原始 spiTransmitData (),使它等待每个字的 RXINTFLG(或 TXINTFLG ),那么所有 8 个半‑字都正确传输。
‑DMA、我看到了同样的模式:如果让 DMA 在没有起搏的情况下将多个元素推送到 DAT1、则只会显示几个半‑字而不是 8 个半字、而当我软件 起搏一次一个元素(在 RXINTFLG 之后触发)时、所有字都能正确传输。 (我‑的是,Hercules DMA 没有“每个 μ s 元件延迟“寄存器、可以像外设/总线接受它们的速度一样快地流式传输元素。 请确认。)
问题:
‑、在 兼容模式下写入 SPIDAT1 时、LC4357 DMA 中是否有任何寄存器‑级机制来强制执行每 μ s 元素等待?
‑我在 g_dmaCTRL(ELCNT/FRCNT/tType/ADDRMODE*/WRSIZE 等)中所看到的、没有“‑μ s 之间的元素延迟“、因此块/弹性流将输出 μ s 来运行 SPI 移位器、除非我从外部调整移位器的速度(SPIFLG 的软件轮询或慢速周期性触发器)。 这种理解是正确的吗?
2.观察到的“不等待时、只有两个半‑字传输“是否正常?
‑HALCoGen 的传输例程特意等待 RXINTFLG 以确保前一个字完全完成、我假设两个 字的症状是“过早“写入 DAT1 的预期结果。 TI 能否确认这是兼容模式下的已知/预期行为?
提前感谢!
Tushar