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.

am377uart dma收包配置问题

Other Parts Discussed in Thread: AM4377

配置uart5使用dma收包,速率921600使用轮询和中断收包时是ok的。
且dma驱动功能正常,can和spi的dma收发可以使用正常


关闭uart5中断后,根据手册21.4.1.1.2 FIFOs and DMA Settings 配置为FIFO使能,
SCR[7]TRIG_GRANU1=0使用FCR[7:6]RX_FIFO_TRIG的触发lev,lev值设置为56B;
设置为mode1模式:SCR[0]MODE_CTL=1,SCR[2:1]MODE_2=1;


dma配置:uart5使用交叉映射的chl12(mux event 0x44e10f9c=0x1),rxFifo从RHR寄存器读取。
Acnt与lev值相同使用56B,为持续收包设置link跳转到相同配置的param32(原始rsv的)
paramSet:chl=12,opt=0x10c000,src=0x481aa000,dst=0x82f01000,Acnt=56,Bcnt=10,Ccnt1;
srcBid=0,dstBid=56,srcCid=0,dstCid=56,link=0x4400,BcntRld=0;
即dma rx ParamSet:8010c000,481aa000,a0038,82f01000,380000,4400,380000,1;


手册看dmaReq应该是达到阈值自动触发:
a DMA request is generated when the RX FIFO reaches its threshold level defined in the
trigger level register (UARTi.UART_TLR)
当前测试来包期间dma的param所有参数没有变化,bcnt没有递减,收不到包
麻烦帮看一下是uart配置问题导致没产生request还是dma param不对导致没响应?

多谢!

  • 目前进展:确实是到达阈值自动触发dma request,之前event mux配置方式不对,应该参考For example, when the TINT0 (Timer Interrupt 0) event这一段。
    出现新问题:其他配置没变,即使用rxFifo使能时,阈值56B,Acnt56B,当来56B包时,从dma目的地址看是增加了Acnt=56个没问题,bcnt也递减了。但目的地址上只有第一个字节读的值正确,后面都是读出了随机值。##【注】此问题目前仍未解决
    RParam:chl=5,opt=0x8010c000,src=0x481aa000,dst=0x82f01000,Acnt=56,Bcnt=10,Ccnt1;
    srcBid=0,dstBid=56,srcCid=0,dstCid=56,link=0x4400,BcntRld=0;
    (int0)
    RParam:chl=5,opt=0x8010c000,src=0x481aa000,dst=0x82f01038,Acnt=56,Bcnt=9,Ccnt1; ##地址和bcnt变化正常
    srcBid=0,dstBid=56,srcCid=0,dstCid=56,link=0x4400,BcntRld=0;
    (int0)
    sio dma rdbuf new(obs=0x0,int=0x0,doneCnt0):
    new frame cnt=1
    aa 00 00 00 00 00 00 00 c1... (内存清零过)

    后来此基础上仅修改为RX FIFO disable,即不使用fifo模式,且acnt设置=1;就可以正常读出所有数了(fifo dis时是默认每收到一个字节就触发一次DMA)。现在就用在非fifo模式了,因为fifo模式对小字节的包会不容易达到阈值,dma收包会不及时。
    RParam:chl=5,opt=0x8010c000,src=0x481aa000,dst=0x82f01000,Acnt=1,Bcnt=50,Ccnt1;
    srcBid=0,dstBid=1,srcCid=0,dstCid=1,link=0x4400,BcntRld=0;
    (int0)
    RParam:chl=5,opt=0x8010c000,src=0x481aa000,dst=0x82f01008,Acnt=1,Bcnt=42,Ccnt1;
    srcBid=0,dstBid=1,srcCid=0,dstCid=1,link=0x4400,BcntRld=0;
    (int0)
    sio dma rdbuf new(obs=0x0,int=0x0,doneCnt0):
    new frame cnt=8
    aa;
    bb;
    cc;
    dd;
    11;
    22;
    33;
    44;
  • 再问一下AM4377 uart tx的,用dma时现在现象是第一次N字节能发成功,发完后查询dma的bcnt等参数都为0了,但下次发送一个字节也发不出去,查看dma各参数没变化例如bcnt=n没有递减
    TParam2:chl=5,opt=0x0,src=0x0,dst=0x0,Acnt=0,Bcnt=0,Ccnt0;
    srcBid=0,dstBid=0,srcCid=0,dstCid=0,link=0xffff,BcntRld=0; --正常结束后
    TParam2:chl=5,opt=0x8010b000,src=0x82f04000,dst=0x481aa000,Acnt=1,Bcnt=48,Ccnt1;
    srcBid=1,dstBid=0,srcCid=1,dstCid=0,link=0xffff,BcntRld=0;--异常结束后
    但是如果在第一次发送后,手工写寄存器THR直接发送1字节后,再用dma发第二次N字节就都可以发成功,然后需要再手工发1B,再用dma这样循环操作

    增加打印看第一次dma发完后,tx level (TXFIFO_LVL0x68)已经=0了,应该会自动触发dma request吧。在这里参考ti例程加上SCR配置dma mode enable(SCR[0][2:1])或配置wakeup(SCR[3]),也都没有作用