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.

[参考译文] MSP432P401R:UART DMA发送和DMA同时接收

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/657506/msp432p401r-uart-dma-send-and-dma-receive-at-same-time

部件号:MSP432P401R

使用DMA通道3在UART模式下为UCA1的接收端提供服务。 使用DMA通道2为UCA1的传输端提供服务。

7数据,1停止,无奇偶校验,46.08万 bps。

随机(比1 % 少得多)跳过DMA接收缓冲区中的字符。 测试数据包是ASCII 0,1,2,3,4,5,6,7,8,9,0,1,2,…9的重复模式(便于查找丢失的字符)。  数据包由CR LF终止。

串行总线是共享RS-485总线,我可以使用Windows PC上的串行端口对其进行监控。 PC上的串行记录器不会丢失任何字符。 因此,MSP432的接收出错。

在ping模式下不会出现缺少字符的错误。 在每个接收到的封装器后传输数据包。  执行异步传输/接收时出现错误。  在这种情况下,数据包的到达是相对于数据包传输的随机的,两个DMA通道可以同时处于活动状态。

我需要在不先清除UART TXIFG,然后将字符写入UART TXBUF的情况下启动传输DMA。 我禁用接收DMA通道,清除TXIFG,然后重新启用接收DMA通道。  我必须禁用/启用接收DMA通道,或者有时会收到一个额外的字符。 (我理解,在您读取IFG寄存器时,清除TXIFG位,然后将字节写回IFG寄存器,这有时会设置已读取但在将字节写回IFG寄存器之前由DMA控制器清除的RXIFG。

void StartDmaTx (byte* pSrc,字大小)
{
MAP_DMA_setChannelTransfer(DMA_CH2_EUSCIA1TX | UDMA_PRI_SELECT,UDMA_MODE_BASIC,
&pSrc[1],(void *) map_UART_getTransmitBufferAddressForDMA(EUSSCI_A1_base),size-1);

map_dma_disableChannel(DMA_channel_3);
UCA1IFG &=~UCTXIFG;//清除TX中断映射
map_dma_enableChannel(DMA)通道(dma_channel_3);




//start DMA
hmiTxState = HMITX_ST_WAIT_DMA_Done
;}

引导代码:
/*正在配置DMA模块*/
MAP_DMA_enableModule();
MAP_DMA_setControlBase (SZ_DMAControlTable);

//通道2 TX
MAP_DMA_赋 值通道(DMA_CH2_EUSCIA1TX);
DMA_disableChannelAttribute (DMA_CH2_EUSCIA1TX,UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH _priority | UDMA_ATTR_REQMAK);
MAP_DMA_setChannelControl (DMA_CH2_EUSCIA1TX | UDMA_PRI_SELECT,UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NON | UDMA_ARB_1);
MAP_DMA_赋 值中断(DMA_INT2,DMA_CHANGE_2);

//通道3 RX
MAP_DMA_赋 值通道(DMA_CH3_EUSCIA1RX);
DMA_disableChannelAttribute (DMA_CH3_EUSCIA1RX,UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_REQMAK);
MAP_DMA_setChannelControl (DMA_CH3_EUSCIA1RX | UDMA_PRI_SELECT,UDMA_SIZE_8 | UDMA_DST_INC_8 | UDMA_SRC_INC_NONE | UDMA_ARB_1);
MAP_DMA_赋 值中断(DMA_INT1,DMA_CHANGE_3);