工具与软件:
您好!
我正在从事一个项目、我将使用 SCI 从另一个 MCU 接收不同的消息。 消息长度不同、我无法知道是否会提前发送消息。 我决定使用 DMA 来实现 SCI RX、我按如下方式配置了我的通道:
g_dmaCTRL g_dmaCTRLPKT1;
dmaReqAssign (DMA_CH0、DMA_SCI2_RX);
/*配置通道0的控制包*/
g_dmaCTRLPKT1.Sadd =(uint32_t)((uint8*)&(scilinREG->RD)+3);/*源地址*/
g_dmaCTRLPKT1.DADD =(uint32_t) dma_rx_buf;/*目标地址*/
G_dmaCTRLPKT1.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT1.FRCNT = buffer_size;/*帧计数*/
g_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.PORTAGN = 4;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT1.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON;/* autoinit */
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
dmaSetChEnable (DMA_CH0、DMA_HW);
dmaEnable();
通过这种配置、 dma_rx_buf 缓冲器填充 RX 数据、然后我使用主循环中的函数解析消息并进行处理。 我想在 DMA 中添加另一个通道、但有一个问题。 将优先级配置为在 Rotation 中工作、根据我配置 CHN0的方式、任务在收到1000字节后才会结束。 第二个通道应处理从缓冲区到 SCI TX 线路的数据传输。 如果我正确理解、我在数据表中看到 DMA 只有一个端口、那么如果我要使用 CHN1进行传输、就必须停止 CHN0、这两个通道无法同时传输数据?