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.

OMAP-L138上面EDMA3的ping-pong模型缓冲区的问题

Other Parts Discussed in Thread: OMAP-L138

最近在做的一个项目需要用到使用EDMA3的ping-pong模型实现串口数据的接收,相当于一个通道挂接两块接收缓存,这两块接收缓存使用PaRAM里面的Link进行链接起来,之前做其他公司的DMA的时候,在使用ping-pong模型的时候有一个标志位TC可以显示当前工作的是哪一块缓存,但是OMAP-L138上面在中断来来时只能知道是哪一个通道触发的完成中断,但是我想知道是哪一块缓存满的呢?我有想过读取PaRAM的参数进行判断,但是读取PaRAM的参数的函数的输入参数需要知道PaRAM的ID,但是没有办法获取当前接收完成中断的PaRAM,请TI的大神给予答复!

谢谢

  • 你既然使用的是ping-pong传输,假如第一次进中断是ping传输完成的话,下一次进中断就pong,然后再是ping,一直重复下去,这个节拍是不会乱的。所以,你在中断中可以设置两个全局变量来记录当前是哪个缓冲区已经存满。

  • 你好,谢谢你对我的帮助,现在正在用TI的开发板进行Pingpong的接收调试中,用的是串口1,现在出现两个问题,第一:Ping收到的串口数据第四个字节总是00,其他的字节数据都是对的;第二:只能进入一次接收中断,继续运行,第二次就进不去了,全速运行的时候也是这个问题,进入一次之后就不会进入第二次了,请问这可能是什么原因?

  • 能否贴出来一部分代码呢,可能这样更容易解决问题。

  • uart1_rx用ping pong接收数据的代码:

    EDMA3CCPaRAMEntry paramSet;

    paramSet.srcAddr = (uint32)SOC_UART_1_REG;

    paramSet.destAddr = (uint32)g_secret_addr_0;

    paramSet,aCnt = 1;

    paramSet,bCnt = 10;

    paramSet,cCnt = 1;

    paramSet,srcBIdx = 0;

    paramSet,destBIdx = 1;

    paramSet,srcCIdx = 0;

    paramSet,destCIdx = 0;

    paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);

    paramSet.bCntReload = 10;

    paramSet.opt = 0x0010c000;

    EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, EDMA3_CHA_UART1_RX, &paramSet);

    /* 配置PONG */

    paramSet.destAddr = (uint32)g_secret_addr_1;

    paramSet.linkAddr = (uint16)((RX_PAR_ID+1)*32);

    EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, RX_PAR_ID, &paramSet);

    /* 配置PING */

    paramSet.destAddr = (uint32)g_secret_addr_0;

    paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);

    EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, (RX_PAR_ID+1), &paramSet);

  •  如果EDMA3_CHA_UART1_RX的值为12,RX_PAR_ID的值大于等于64而且小于等于127,你这三组paRAM的配置应该是正确的。