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.

[参考译文] TMS570LS1224:UART DMA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420766/tms570ls1224-uart-dma

器件型号:TMS570LS1224

工具与软件:

可以有人帮我吗?我正在尝试编写 TX 正常工作的 UART (sci) DMA 代码、但在 Rx 中没有任何信息可供参考。我发布的代码请查看并告诉我代码中有什么问题  

#include "sys_dma.h"
#include "sci.h"
#include "string.h"

// TX 和 RX 的 DMA 控制数据包结构
g_dmaCTRL g_dmaCTRLPKT_TX;
g_dmaCTRL g_dmaCTRLPKT_RX;
Volatile UINT32 DMA_TX_TX = 0xFFFFFFFF;//初始化 Comp_Flag 标志
Volatile UINT32 DMA_RX_RX = 0xFFFFFFFF;//初始化 Comp_Flag 标志

//函数原型
void scidmaInit (void);
void scidmaSend (char *source_address);
void scidmaReceive (char * dest_address、uint32 length);
void sciNotification (scibase_t * sci、uint32标志);

int main (void){
//初始化 SCI 和 DMA
scidmaInit ();

//缓存存储接收到的数据
char received_data[100]={0};

//使用 DMA 通过 UART 发送测试数据
char test_data[]="Hello DMA UART Transfer!";
scidmaSend (TEST_DATA);

//使用 DMA 通过 UART 接收数据
scidmaReceive (RECEIVED_DATA、strlen (TEST_DATA));

//主循环
while (1){

}
}

//用于初始化 DMA 和 SCI 的函数
void scidmaInit (void){
//初始化用于 UART 通信的 SCI
sciInit();//使用默认设置初始化 SCI 模块

//初始化 DMA
dmaEnable();//启用 DMA 控制器

//为 RX (接收)设置 DMA 控制包-**高优先级、通道0**
G_dmaCTRLPKT_RX。 SADD =(UINT32)(&(scilinREG->RD));// SCI 接收数据寄存器
G_dmaCTRLPKT_RX。 DADD = 0;//稍后将设置目标地址
G_dmaCTRLPKT_RX。 FRCNT = 1;//帧计数:1字节/帧
G_dmaCTRLPKT_RX。 ELCNT = 1;//元素数量:1个元素/帧
G_dmaCTRLPKT_RX。 RDSIZE = ACCESS_8_BIT;//读取大小:8位
G_dmaCTRLPKT_RX。 WRSIZE = ACCESS_8_BIT;//写入大小:8位
G_dmaCTRLPKT_RX。 TTYPE = FRAME_TRANSFER;//基于帧的传输
G_dmaCTRLPKT_RX。 ADDMODERD = ADDR_FIXED;//源地址是固定的(SCI RX 寄存器)
G_dmaCTRLPKT_RX。 ADDMODEWR = ADDR_INC1;//使目标地址递增

//设置 DMA 通道0 (RX)的控制数据包
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT_RX);

//为 TX (传输)设置 DMA 控制数据包-**Lower priority、Channel 1**
G_dmaCTRLPKT_TX。 SADD = 0;//稍后将设置源地址
G_dmaCTRLPKT_TX。 DADD =(UINT32)(&(scilinREG->TD);// SCI 发送数据寄存器
G_dmaCTRLPKT_TX。 FRCNT = 1;//帧计数:1字节/帧
G_dmaCTRLPKT_TX。 ELCNT = 1;//元素数量:1个元素/帧
G_dmaCTRLPKT_TX。 RDSIZE = ACCESS_8_BIT;//读取大小:8位
G_dmaCTRLPKT_TX。 WRSIZE = ACCESS_8_BIT;//写入大小:8位
G_dmaCTRLPKT_TX。 TTYPE = FRAME_TRANSFER;//基于帧的传输
G_dmaCTRLPKT_TX。 ADDMODERD = ADDR_INC1;//使源地址递增
G_dmaCTRLPKT_TX。 ADDMODEWR = ADDR_FIXED;//目标地址是固定的(SCI TX 寄存器)

//设置 DMA 通道1 (TX)的控制数据包
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT_TX);

//设置 DMA 通道0 (RX)以在硬件请求(SCI RX 请求)时触发
dmaReqAssign (30、30);// SCI RX 使用 DMAREQ[30](用于通道0)

//设置 DMA 通道1 (TX)以在硬件请求(SCI TX 请求)时触发
dmaReqAssign (31、31);// SCI TX 使用 DMAREQ[31](适用于通道1)

//为 TX 和 RX 完成启用 DMA 中断
dmaEnableInterrupt (30、BTC);// RX DMA 通道0 (较高优先级)
dmaEnableInterrupt (31、BTC);// TX DMA 通道1 (较低优先级)

//启用 SCI TX 和 RX DMA 请求(SCI 就绪时触发 DMA)
scilinREG->SETINT =(1 << 16)|(1 << 17);//为 DMA 启用 SCI TX 和 RX 中断
}

//使用 DMA 通过 SCI 发送数据的函数
void scidmaSend (char *source_address){
//等待之前的 DMA 传输完成
while (DMA_TX_FFFF Comp_Flag!= 0xFFFFFFFF);

//重置 DMA 完成标志
DMA_TX_FFFF Comp_Flag = 0xFFFFFFFF;

//设置 DMA 传输的源地址(要发送的数据)
G_dmaCTRLPKT_TX。 SADD =(UINT32) source_address;

//设置要传输的字节数
G_dmaCTRLPKT_TX。 FRCNT = strlen (source_address);

//使用更新的源地址和帧计数配置 DMA 通道
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT_TX);//通道1上的 TX

//启用 DMA 通道1以进行硬件触发传输
dmaSetChEnable (DMA_CH1、DMA_HW);
}

//使用 DMA 通过 SCI 接收数据的函数
void scidmaReceive (char * dest_address、uint32 length){
//等待之前的 DMA 传输完成
while (DMA_RX_FFFF Comp_Flag!= 0xFFFFFFFF);

//重置 DMA 完成标志
DMA_RX_FFFF Comp_Flag = 0xFFFFFFFF;

//设置 DMA 传输的目标地址(存储接收到的数据的缓冲区)
G_dmaCTRLPKT_RX。 DADD =(uint32) dest_address;

//设置要接收的字节数
G_dmaCTRLPKT_RX。 FRCNT =长度;

//使用更新的目标地址和帧计数配置 DMA 通道
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT_RX);//通道0上的 RX

//启用 DMA 通道0以执行硬件触发传输
dmaSetChEnable (DMA_CH0、DMA_HW);
}

//针对传输完成的 DMA 中断处理程序
void dmaGroupANotification (dmaInterrupt_t inttype、UINT32通道){
if (channel == DMA_CH0){
DMA_RX_DMA = 0x99BBCCDD;// RX Comp_Flag 完成
}否则、如果(通道=> DMA_CH1){
DMA_TX_DMA = 0x55AAD09E;// TX Comp_Flag 已完成
}
}