查看: 4276|回复: 6

[求助] DMA 链接通道传输ADC数据问题

[复制链接]
  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
    发表于 2019-7-28 14:20:57 | 显示全部楼层 |阅读模式
    我是一个K60新手,最近在弄DMA实现多通道ADC数据采集,参考了AN4590(Using DMA to Emulate ADC Flexible Scan Mode on Kinetis KSeries)这个文档。
    它的方法思想是,用优先级高的DMA CH1链接DMA CH0,CH1用来把ADC结果寄存器的值传到指定内存区域,CH0用来把 放在内存的ADC 通道配置数据 传到 ADC配置寄存器,从而改变ADC数据采集通道。详细看我贴的文档。
    文档.png AN4590-Using DMA to Emulate ADC Flexible Scan Mode on Kinetis K Series_3.pdf (201.08 KB, 下载次数: 8)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25452
    最后登录
    2025-9-4
    发表于 2019-7-29 08:57:00 | 显示全部楼层
    应用手册AN4590中Link的过程应该是Channel1次循环完成会‘链接’Channel0的次循环发生,具体工作机制请参考手册,单单看代码会比较抽象
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
     楼主| 发表于 2019-7-29 18:44:37 | 显示全部楼层
    小恩GG 发表于 2019-7-29 08:57
    应用手册AN4590中Link的过程应该是Channel1次循环完成会‘链接’Channel0的次循环发生,具体工作机制请参考 ...

    是的,我分析之后发现,顺序错乱很可能是DMA的主次循环执行还有DMA通道链接没设置好才会出现这种情况。因为有两个通道,每个通道的一个次循环执行完之后是否执行下一次次循环,直到完成主循环?这里有两个通道就有四种情况。
    然后通道1(高优先级的)是执行完主通道发生链接还是执行完次循环发生链接,这里又有两种情况。
    所以一共有2*2*2可能,但是只有一种是对的。
    现在的问题是,我感觉看不太懂参考手册,我要配置哪些寄存器呢,怎么配置这些寄存器呢?
    谢谢!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
     楼主| 发表于 2019-7-29 22:39:40 | 显示全部楼层
    小恩GG 发表于 2019-7-29 08:57
    应用手册AN4590中Link的过程应该是Channel1次循环完成会‘链接’Channel0的次循环发生,具体工作机制请参考 ...

    今天晚上对着用户手册把该写的寄存器都配置了一遍,还是老样子,不知道为什么。
    刚才发现了问题,原来文档里的例程的MASK名字和我的.h文件MK60DZ10.h对不上,然后之前我也不懂这些MASK是什么意思,就在.h文件里找名字近似的替换。结果这就是罪魁祸首!
    我把DMA_CSR_MAJORELINK_MASK 与 DMA_CSR_MAJORLINKCH_MASK 弄混了!这是我在一个个对照寄存器的时候,发现与用户手册对不上才发现的。

    不过我还有个问题,下面这两个寄存器是不是一个地址呢?
    __IO uint16_t CITER_ELINKNO;                     /**< TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled), array offset: 0x1016, array step: 0x20 */
          __IO uint16_t CITER_ELINKYES;                    /**< TCD Current Minor Loop Link, Major Loop Count (Channel Linking Enabled), array offset: 0x1016, array step: 0x20 */
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25452
    最后登录
    2025-9-4
    发表于 2019-7-30 08:22:33 | 显示全部楼层
    redboy2018 发表于 2019-7-29 22:39
    今天晚上对着用户手册把该写的寄存器都配置了一遍,还是老样子,不知道为什么。
    刚才发现了问题,原来文 ...

    是的,你很仔细
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
     楼主| 发表于 2019-7-31 22:25:39 | 显示全部楼层
    结帖啦!
    程序除了改上面的MASK之外,还需要加上这一条语句
    DMA0->TCD[DMA_CH0].CSR = 0x01;
    不然会出现通道和结果寄存器的顺序有一位错位,暂时我也不知道为什么会这样。
    我猜想是通道1还没有开始主循环,通道二就开始启动传输。这样通道一采集的ADC结果数据就是ADC通道配置数组里的第二个ADC通道的值了。但是,这个CSR第0位在数据手册上并没有提到和我猜想有关的功能.
    还有就是,温度传感通道的通过手册的公式计算出来的温度很有问题,数据还受其他通道数据的影响,但是我试过了其他通道之间的数据并不受影响。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-8-2 21:20
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2020-12-8
     楼主| 发表于 2019-8-1 22:43:05 | 显示全部楼层
    本帖最后由 redboy2018 于 2019-8-2 10:50 编辑

    现在又发现了问题,ADC采集一次数据居然要700个US,而且无论我怎么改硬件平均数,都是保持每次采样时间是700us左右,这是为什么呀。然后发现是拉普兰德PDB的中断速度上不去。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-7 03:21 , Processed in 0.108081 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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