主题中讨论的其他器件: HALCOGEN
我们正在使用 TMS570LC4357中的 DMA 控制器、从闪存到 EMIF 总线进行4MB DMA 的校准。
我们只需要执行 DMA 一次、只需让处理器旋转、直到 DMA 完成。 在我们之前的 TMS570处理器上、我们使用了 CTCOUNT、只是等待它倒数到零。
在 TMS570LC4357上、DMA 正常运行、但 CTCOUNT 的值为0xF8DAF7E6、从不改变或递减。
我已在 TMS570LC43x 参考手册中查看、根据表20-108、CTCOUNT 似乎仍应具有类似的功能。
您能不能帮助我弄清楚我是使用 CTCOUNT 错误、还是告诉我使用 DMA 控制器中的寄存器来知道 DMA 传输何时完成的替代方法? FWiw 我尝试使用 DMASTAT 而不是 CTCOUNT ,它似乎起作用。 我的担心是、根据轮询 DMASTAT、4MB DMA 花费了721毫秒、这可能对于我们的时间表来说是一个问题。
下面是一个代码片段、它显示了如何设置 DMA 通道和启动事务。 while 循环永远不会退出、因为 CTCOUNT 不会改变。
谢谢你。
g_dmaCTRL g_dmaCTRLPKT; /* DMA 控制数据包*/
/*设置 DMA 传输*/
G_dmaCTRLPKT。 SADD = Source_Adrs 闪存;/*源地址(闪存开头)*/
G_dmaCTRLPKT。 DADD = 缓冲器的 Base_Adrs; /*目标地址(FPGA 缓冲器)*/
G_dmaCTRLPKT。 CHCTRL = 0; /*待使用的 DMA 通道编号*/
/*传输大小为(帧计数*元素计数*字大小)*/
G_dmaCTRLPKT。 FRCNT = NumWords/0x1000; /*帧计数*/
G_dmaCTRLPKT。 ELCNT = 0x1000; /*元素数量*/
G_dmaCTRLPKT。 ELDOFFSET = 0; /*元素目标偏移量*/
G_dmaCTRLPKT。 ELSOFFSET = 0; /*元素源偏移量*/
G_dmaCTRLPKT。 FRDOFFSET = 0; /*帧目的偏移量*/
G_dmaCTRLPKT。 FRSOFFSET = 0; /*帧源偏移*/
G_dmaCTRLPKT。 PORTASGN = Porta_read_Porta_write; /*端口分配*/
G_dmaCTRLPKT。 RDSIZE = access_32_bit; /*读取大小*/
G_dmaCTRLPKT。 WRSIZE = access_32_bit; /*写大小*/
G_dmaCTRLPKT。 TTYPE = block_transfer; /*块传输*/
G_dmaCTRLPKT。 ADDMODERD = ADDR_INC1; /*使读取地址递增*/
G_dmaCTRLPKT。 ADDMODEWR = ADDR_INC1; /*写入地址递增*/
G_dmaCTRLPKT。 AUTOINIT = AUTOINIT_OFF; /*自动初始化关闭*/
/*让驱动程序在 DMA 控制存储器中初始化 DMA 结构*/
dmaSetCtrlPacket (dma_CH0、g_dmaCTRLPKT);
/*启用由软件触发的 DMA 通道*/
dmaSetChEnable (DMA_CH0、DMA_SW);
/*开始传输*/
dmaEnable();
/*等待传输完成*/
while (dmaRAMREG->WCP[DMA_CH0].CTCOUNT > 0)
{
}
dmaDisable();
