使用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);