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:MSP432 UART DMA 在基本和乒乓模式之间切换

Guru**** 2535600 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/914543/msp432p401r-msp432-uart-dma-switching-between-basic-and-ping-pong

器件型号:MSP432P401R

我有 UART TX 与 DMA 和基本传输类型一起工作。   有时、我必须执行大于1024个周期的 DMA 周期。  为了解决硬件限制问题、我在主源和备用源之间拆分数据并使用 PNGPPONG 模式。   DMA 传输第一次工作、发送全部1288字节。  我在 UART 上接收数据、但 DMA 在该数据之后不执行任何传输。  切换回基本模式也不再起作用。  在基本模式下、DMA 中断触发。  在 pingpong 期间、中断会触发两次、一次是主中断、一次是备用中断、然后再也不会触发。

//使用乒乓
void Telemetry_pop (void)发送数据{
//Half HRT to Primary Channel (//半 HRT 至主通道)
DICE_TX_BUSY=1;
MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、
TLM_BUF.buffer[TLM_BUF.tail].all_8、(void*) DICE_TX、HRT_MESSAGE/2);
MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、
&TLM_BUF.buffer[TLM_BUF.tail].all_8[HRT_MESSAGE_SIZE/2]、(void*) DICE_TX、HRT_MESSAGE/2);
TLM_BUF.tail=(TLM_BUF.tail+1)%TLM_BUF_SIZE;
TLM_BUF.packet_count--;
MAP_DMA_enableChannel (4);
MAP_DMA_enableInterrupt (DMA_INT1);
}

//发送基本
情况下的数据 HS_DATA:
MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、
priority_BUF.HS_DATA_BUF.buffer[priority_BUF.HS_DATA_BUF.tail].all_8、(void*) DICE_TX、HS_DATA_SIZE);
priority_BUF.HS_DATA_BUF.tail=(priority_BUF.HS_DATA_BUF.tail+1)%hsdata_buf_size;
priority_BUF.HS_DATA_BUF.packet_count--;
中断;
}
MAP_DMA_enableChannel (4);
MAP_DMA_enableInterrupt (DMA_INT1);

// DMA 配置
map_dma_enableModule();
MAP_DMA_setControlBase (MSP_EXP432P401RLP_DMAControlTable);
MAP_DMA_assignChannel (DMA_CH4_EUSCIA2TX);//将 DMA 通道4分配给 EUSCI_A2_TX
MAP_DMA_disableChannelAttribute (DMA_CH4_EUSCIA2TX、UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
MAP_DMA_setChannelControl (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
MAP_DMA_setChannelControl (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
MAP_DMA_赋 值中断(DMA_INT1、4);
MAP_DMA_clearInterruptFlag (4);
MAP_Interrupt_enableInterrupt (DMA_INT1);

//DMA_INT1处理程序
void DMA_INT1_IRQHandler (void){
uint32_t ui32modeA、ui32modeB;

ui32ModeA=MAP_DMA_getChannelMode (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT);
ui32ModeB=MAP_DMA_getChannelMode (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT);
if (ui32modeA=udma_mode_stop && ui32modeB=udma_mode_stop)
{
DICE_TX_BUSY=0;
MAP_DMA_disableInterrupt (DMA_INT1);
}
MAP_DMA_clearInterruptFlag (4);
} 

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

    每次传输后、DMA 都会将 Mode 字段更改为0 (Invalid = STOP)。 因此、在 Pong (备用)之后、当它返回到 Ping (主)时、它遇到 mode=0并停止。[参考 TRM (SLAU356I)第 11.2.3.4.1节]

    为了保持运行、您需要跟踪刚完成的项目、并将其模式字段设置回乒乓模式。

    我看不到 dma_setChannelMode(),因此我认为您必须使用 setChannelTransfer()并写入所有字段(包括 Mode)。

    [编辑:忘记 TRM 参考]

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

    我不希望 DMA 在另一组数据准备就绪前一直运行。  当另一个设置就绪时、将调用遥感遥测_POP 函数、该函数将主模式和备用模式字段设置回乒乓以进行另一个 UART 传输。  我可以在 pingpong 设置之间使用基本模式发送数据

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

    通过添加以下内容、我能够正确完成乒乓:

    > MAP_DMA_disableChannel (4);

    在 disableInterrupt()调用后发送给 ISR。  

    TRM 第11.2.3.4.4节末尾的注释表明、您应该以基本周期结束、但这对我来说没有什么明显的区别。