主题中讨论的其他器件:MSPM0G3106、
工具与软件:
你(们)好
我将 MSPM0G3106/MSPM0G3507用于以以下配置运行的 UART DMA 通信。
波特率- 2mbps
CPU 时钟- 80MHz
MCLK - 80MHz
ULPCLK - 40MHz (根据 TRM 可能达到的最大值)
所使用的 UART0 (电源域0)、指40MHz (最大值) 的 ULPCLK 作为其运行的 BUSCLK。 DMA 用于 RX 和 TX 、触发条件设置为向/从 RX/TX FIFO 传输。 DMA (电源域1)。
问题说明:
我们是一个运行时间为1ms 的 TX 任务,它一次最多创建130字节的数据包,这将成为 DMA 推送到 UART TX FIFO 的源缓冲区。 在启用内部环回的情况下、我们观察到传输的数据包中缺少随机的1或2个字节。 我们已验证数据包结构、直到为 UART DMA 事务指定了缓冲区、因此问题必须由 UART/DMA 层本身引起。
观察结果:
1、相同的代码将 MCLK 和 CPU 时钟设置为40MHz ,同时 ULPCLK 也设置为40MHz ,似乎不会造成问题。
2.在 launchpad 上, 与使用 UART3 (PD1)代替 UART0(PD0)进行的测试相同,该测试使用 MCLK 80MHz 进行 UART3 (PD1)-此设置也会处理字节的缺失问题。
对于使用 UART0 DMA 与 ULPCLK -40MHz、MCLK -80MHz、CPU 时钟-80MHz 以获得稳定性、是否有任何建议?
请查找发现问题时使用的配置的代码片段 :
时钟配置(SYS PLL):
static const DL_SYSCTL_SYSPLLConfig gSYSPLLConfig = {
.inputFreq = DL_SYSCTL_SYSPLL_INPUT_FREQ_16_32_MHZ,
.rDivClk2x = 0,
.rDivClk1 = 0,
.rDivClk0 = 0,
.enableCLK2x = DL_SYSCTL_SYSPLL_CLK2X_DISABLE,
.enableCLK1 = DL_SYSCTL_SYSPLL_CLK1_ENABLE,
.enableCLK0 = DL_SYSCTL_SYSPLL_CLK0_ENABLE,
.sysPLLMCLK = DL_SYSCTL_SYSPLL_MCLK_CLK0,
.sysPLLRef = DL_SYSCTL_SYSPLL_REF_SYSOSC,
.qDiv = 9,
.pDiv = DL_SYSCTL_SYSPLL_PDIV_2
};
DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
DL_SYSCTL_configSYSPLL((DL_SYSCTL_SYSPLLConfig *) &gSYSPLLConfig);
DL_SYSCTL_setMCLKSource(SYSOSC, HSCLK, DL_SYSCTL_HSCLK_SOURCE_SYSPLL);
DL_SYSCTL_setULPCLKDivider(DL_SYSCTL_ULPCLK_DIV_2);
//Low Power Mode is configured to be SLEEP0
DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0);
DL_SYSCTL_setFlashWaitState(DL_SYSCTL_FLASH_WAIT_STATE_2);
UART0和 DMA 配置:
DL_UART_Main_setOversampling(UART_INST, DL_UART_OVERSAMPLING_RATE_16X);
DL_UART_Main_setBaudRateDivisor(UART_INST, UART_IBRD_40_MHZ_2000000_BAUD, UART_FBRD_40_MHZ_2000000_BAUD);
DL_UART_Main_enableDMAReceiveEvent(UART_INST, DL_UART_DMA_INTERRUPT_RX);
DL_UART_Main_enableDMATransmitEvent(UART_INST);
/* Configure FIFOs */
DL_UART_Main_enableFIFOs(UART_INST);
DL_UART_Main_setRXFIFOThreshold(UART_INST, DL_UART_RX_FIFO_LEVEL_ONE_ENTRY);
DL_UART_Main_setTXFIFOThreshold(UART_INST, DL_UART_TX_FIFO_LEVEL_ONE_ENTRY);
/* Configuration for UART 0 Peripheral */
static const DL_UART_Main_ClockConfig gUART_ClockConfig = {
.clockSel = DL_UART_MAIN_CLOCK_BUSCLK,
.divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};
static const DL_UART_Main_Config gUART_Config = {
.mode = DL_UART_MAIN_MODE_NORMAL,
.direction = DL_UART_MAIN_DIRECTION_TX_RX,
.flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
.parity = DL_UART_MAIN_PARITY_NONE,
.wordLength = DL_UART_MAIN_WORD_LENGTH_8_BITS,
.stopBits = DL_UART_MAIN_STOP_BITS_ONE
};
/*configuration for DMA TX channel - Channel 1*/
static const DL_DMA_Config gDMA_CH1Config = {
.transferMode = DL_DMA_SINGLE_TRANSFER_MODE,
.extendedMode = DL_DMA_NORMAL_MODE,
.destIncrement = DL_DMA_ADDR_UNCHANGED,
.srcIncrement = DL_DMA_ADDR_INCREMENT,
.destWidth = DL_DMA_WIDTH_BYTE,
.srcWidth = DL_DMA_WIDTH_BYTE,
.trigger = UART_INST_DMA_TRIGGER_1,
.triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL,
};
/*configuration for DMA RX channel - Channel 0*/
static const DL_DMA_Config gDMA_CH0Config = {
.transferMode = DL_DMA_FULL_CH_REPEAT_SINGLE_TRANSFER_MODE,
.extendedMode = DL_DMA_NORMAL_MODE,
.destIncrement = DL_DMA_ADDR_INCREMENT,
.srcIncrement = DL_DMA_ADDR_UNCHANGED,
.destWidth = DL_DMA_WIDTH_BYTE,
.srcWidth = DL_DMA_WIDTH_BYTE,
.trigger = UART_INST_DMA_TRIGGER_0,
.triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL,
};