CH32V203 串口发送DMA异常

我发现在串口发送一个数据后,立即启动发送的DMA就会导致之前发送的数据发不出来

    uint8 sendHeadAndDatas(const byte* pkg, uint8 len) {
        goSend();
        txDmaInterruptOn();//现在是9Byte模式,第一个字节是地址,后面8个字节是数据。
        USART2->DATAR = 0x100 | pkg[0];//发送地址
        delayMs(0.1);//必须等待地址发送一段时间,才能发送数据,否则地址发送不出来
        aClr(DMA1C[TX_DMA_CH]->CFGR, bit(EN));
        DMA1C[TX_DMA_CH]->CNTR = len-1;
        DMA1C[TX_DMA_CH]->MADDR = (uint32)(pkg+1);
        aSet(DMA1C[TX_DMA_CH]->CFGR, bit(EN));//启动DMA
        return 0;
    }

这样发送才行

image.png

如果不等待一小段时间,直接发送:地址就丢了

image.png

您好,可在发送地址结束后加下列语句试一下呢。若不行可将工程发我邮箱(lzs@wch.cn)具体看一下。

while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);



程序逻辑上有问题吧,为啥不把地址也直接丢到DMA数组的第一个存储单元里面直接操作DMA发送?非得单独发送?要知道DMA有优先接管权的。


谢谢@TECH62,已经解决了。就是等待这个TXE为1。


逻辑上是没有问题的。

这个是9bit通信,第一个数据是地址,第九位=1;后面是数据,第九位=0。


发送的数据是存在byte数组里的,第一个数据要特殊处理:

        USART2->DATAR = 0x100 | pkg[0];//发送地址

后面的数据则是直接发送。




只有登录才能回复,可以选择微信账号登录