查看: 2989|回复: 5

[其他] DMA中的TCD.CSR疑惑

[复制链接]

该用户从未签到

6

主题

10

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2019-12-13
发表于 2018-1-25 15:46:12 | 显示全部楼层 |阅读模式
各位大神,串口接收,我想配置循环DMA接收,并产生全中断,现在TCD配置如下:
  tcdRegs->SADDR = (uint32_t)SADDR;
  tcdRegs->DADDR = (uint32_t)DADDR;
  tcdRegs->SOFF = 0;
  tcdRegs->DOFF = byten;
  tcdRegs->ATTR = (DMA_ATTR_SMOD(0)|DMA_ATTR_SSIZE(BYTE)|DMA_ATTR_DMOD(0)|DMA_ATTR_DSIZE(BYTE));
  tcdRegs->NBYTES  = byten;
  tcdRegs->CITER  = DMA_CITER_ELINKNO_CITER(count);
  tcdRegs->BITER  = DMA_BITER_ELINKNO_BITER(count);

  tcdRegs->SLAST = 0;
  tcdRegs->DLAST_SGA = (uint32_t)(-count);

  tcdRegs->CSR &= ~DMA_CSR_DREQ_MASK; // The channel's ERQ bit is not affected.会继续产生DMA请求
  tcdRegs->CSR |= DMA_CSR_INTMAJOR_MASK;//开启完成中断

如果注释掉  tcdRegs->CSR |= DMA_CSR_INTMAJOR_MASK;这一句,是可以正常循环接收工作的
但是现在想开启全中断,在主Major完成后产生中断,将这一句添加tcdRegs->CSR |= DMA_CSR_INTMAJOR_MASK;
发现主Major完成后产生一次中断后,串口再下发数据也不会产生DMA请求了,即DMA不工作了,这是为什么,求解?

最佳答案

你可以参考此贴,实现你的功能 https://www.nxpic.org.cn/module/forum/thread-603299-1-1.html
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24891
最后登录
2025-7-21
发表于 2018-1-26 09:53:15 | 显示全部楼层
中断触发代表DMA工作完成了,都完成了,当然DMA不会继续工作了
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

10

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2019-12-13
 楼主| 发表于 2018-1-26 13:58:30 | 显示全部楼层
小恩GG 发表于 2018-1-26 09:53
中断触发代表DMA工作完成了,都完成了,当然DMA不会继续工作了

可是我有设定:
tcdRegs->CSR &= ~DMA_CSR_DREQ_MASK; // The channel's ERQ bit is not affected.会继续产生DMA请求
也就是一个主Major完成后会继续产生DMA请求的
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24891
最后登录
2025-7-21
发表于 2018-1-26 16:29:48 | 显示全部楼层
xiang90721 发表于 2018-1-26 13:58
可是我有设定:
tcdRegs->CSR &= ~DMA_CSR_DREQ_MASK; // The channel's ERQ bit is not affected.会继续 ...

但是DMA 功能完成了,即使DMA request过来,也不会有数据传输哦,按照你的逻辑,DMA就是无限的哦,只要有DMA request
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

10

帖子

0

注册会员

Rank: 2

积分
67
最后登录
2019-12-13
 楼主| 发表于 2018-1-27 12:07:03 | 显示全部楼层
小恩GG 发表于 2018-1-26 16:29
但是DMA 功能完成了,即使DMA request过来,也不会有数据传输哦,按照你的逻辑,DMA就是无限的哦,只要有 ...

按照我这样设置,在一个Major完成后,确实有DMA request的,且会进行数据传输啊,因为我设定传输完成后目的地址恢复到原来的,并且再次收到的数据会更新目标地址中的数据的,测试是这样的
tcdRegs->SLAST = 0;
tcdRegs->DLAST_SGA = (uint32_t)(-count);
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24891
最后登录
2025-7-21
发表于 2018-1-29 09:40:51 | 显示全部楼层
你可以参考此贴,实现你的功能
https://www.nxpic.org.cn/module/forum/thread-603299-1-1.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 01:05 , Processed in 0.097933 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表