工具与软件:
可以有人帮我吗?我正在尝试编写 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 已完成
}
}