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.

[参考译文] TMS570LC4357:DMA 在传输期间忽略 EIOFF 和 FIOFF

Guru**** 2482105 points
Other Parts Discussed in Thread: TMS570LC4357

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/900077/tms570lc4357-dma-ignores-eioff-and-fioff-during-transfers

器件型号:TMS570LC4357

我们已将 TMS570LC4357连接到具有传入等时串行通道的 FPGA。

当数据包到达时、FPGA 将激活连接到 CPU 中 GIO 的 DMAREQ 信号。
DMA 控制器将数据包读入内部 SRAM。

数据包大小在操作期间是固定的、但我们希望能够轻松地向数据包中添加字段。

现在、我们有一个128字节的数据包、但正在考虑使用一个144字节的数据包。
现在、只有前48个字节包含非零值

为了简化设计、我们决定在之后将 DMA 源地址与256字节边界对齐
接收每个帧。

FPGA 将具有256字节的数据包存储器、但会在128KB 地址范围内进行影子化。
因此、在128KB 地址范围内、数据包存储器有128KB/256 = 512个别名。

我们初始化 DMA 通道源地址、以指向 FPGA 中128KB 范围的开头。
我们初始化 DMA 通道目标地址以指向已使用0xDEADBEF 初始化的存储器。

帧大小设置为128、块大小设置为3。

   dma_dscr.ELDOFFSET = 0;
   dma_dscr.ELSOFFSET = 0;
   dma_dscr.FRDOFFSET = 0;
   dma_dscr.FRSOFFSET = 128;

我们可以看到、第1和第3帧包含数据包数据。 第2个帧全部清除。

我们对 g_dmaCTRL dma_dscr 进行正确设置;
然后、我们被偏移误了。

   dma_dscr.ELDOFFSET = 8;
   dma_dscr.ELSOFFSET = 8;
   dma_dscr.FRDOFFSET = 16;
   dma_dscr.FRSOFFSET = 32;

结果与之前的设置相同。

然后、我将 FRAME_SIZE 更改为256+16 = 272 = 0x110。

我运行该程序、直到在三帧后获得块传输完成中断。
结果是我读取0x330字节并将它们存储在内部 RAM 中的0x330字节中。

元素边界上的 DMA 源地址和目标地址没有变化
帧边界处没有变化。

看起来 DMA 地址仅由实际的 DMA 和地址更新
不会使用偏移寄存器进行后处理。

void setup_frame_dma_descriptor (g_dmaCTRL * dma_dscr、frame_t * dst、hw_frame_t * src、uint16_t frame_count、uint16_t frame_size)

   memset (dma_dscr、0、sizeof (g_dmaCTRL));
   dma_dscr->Sadd      =(uint32) src;            //初始源地址          */
   dma_dscr->dADD      =(uint32) dst;            //初始目标地址     */
   dma_dscr->CHCTRL    = 0;                       //要触发的下一个通道+ 1 */
   dma_dscr->FRCNT     = frame_count;             //帧  计数                   *
   dma_dscr->ELCNT     = frame_size >> 3;         /* 8字节元素的元素计数*/
   dma_dscr->ELDOFFSET = 0;                       /*元素目标偏移      量*/
   dma_dscr->ELSOFFSET = 0;                       //元素源偏移           */
   dma_dscr->FRDOFFSET = 0;                       /*帧目标偏移        */
   dma_dscr->FRSOFFSET = 256-frame_size;        /*帧源偏移             */
   dma_dscr->PORTASGN  = Porta_Read_Porta_write;  // DMA 端口 A = EMIF 和 SRAM      */
   dma_dscr->RDSIZE    = ACCESS_64_BIT;           /*读取元素大小               */
   dma_dscr->WRSIZE    = ACCESS_64_BIT;           /*写入元素大小              */
   dma_dscr->tType     = frame_transfer;          //触发类型-帧/块      */
   dma_dscr->ADDMODERD = ADDR_INC1;               //源的寻址模式      */
   dma_dscr->ADDMODEWR = ADDR_INC1;               //目标地址寻址模式 */
   dma_dscr->AUTOINIT  = AUTOINIT_OFF;            //自动初始化模式                  */

这是我的最新设置
FRAME_SIZE = 128

   setup_frame_dma_descriptor (&dma_dscr、&__frame_RX1[1]、  __FPGA_DMA_RX1[0]、3、frame_size*2);
   dma_dscr.ELCNT     = 68;  //读取256+ 16 = 272
   dma_dscr.ELDOFFSET = 8;                       /*元素目标偏移      量*
   dma_dscr.ELSOFFSET = 8;
   dma_dscr.RDSIZE    = ACCESS_32_BIT;
   dma_dscr.WRSIZE    = ACCESS_32_BIT;
   dma_dscr.FRDOFFSET = 16;
   dma_dscr.FRSOFFSET = 32;
   dmaSetCtrlPacket (frame_RX1_channel、dma_dscr);

偏移寄存器 EIOFF 和 FIOFF 是否被完全忽略、或者是否有办法使它们正常工作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ulf、

    DMA 控制器支持三种寻址模式、可独立于源地址和目标地址进行设置。 请使用索引模式(下面的#3):

    常量----源地址和/或目的地址不变

     dma_dscr->ADDMODERD = ADDR_FIXED;    //源的寻址模式      */
     dma_dscr->ADDMODEWR = ADDR_FIXED;    //目标的寻址模式 */

    2. POST 递增--源地址和/或目的地址被元素大小后递增。

      dma_dscr->ADDMODERD = ADDR_INC1;    //源的寻址模式      */
     dma_dscr->ADDMODEWR = ADDR_INC1;    //目标地址寻址模式 */

    3.已索引的--源和/或目的地址按照元件索引 偏移寄存器和帧索引偏移寄存器中的定义后递增。

       dma_dscr->ADDMODERD = ADDR_OFFSET;               //源的寻址模式      */
       dma_dscr->ADDMODEWR = ADDR_OFFSET;               //目标的寻址模式 */