查看: 2635|回复: 3

[求助] 关于K64的DMA模块中断源问题

[复制链接]

该用户从未签到

2

主题

5

帖子

0

注册会员

Rank: 2

积分
68
最后登录
2017-5-19
发表于 2017-4-7 14:19:38 | 显示全部楼层 |阅读模式
    想通过DMA的方式做SPI接收和发送的实验,用的是K64的SPI2模块,对应同一个DMA请求源。仅使能DMA发送请求是OK的,但是同时使能DMA发送和接收就碰到一点问题,发送方未能将数据全部打出,是否是因为同一个DMA请求员造成请求混乱,就是说只能使用接收或者发送,不能同时使用。

我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

注册会员

Rank: 2

积分
68
最后登录
2017-5-19
 楼主| 发表于 2017-4-7 17:05:26 | 显示全部楼层
经过测试,单独通过DMA进行SPI接收和发送都是可以的。同时就优点问题?
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24871
最后登录
2025-7-18
发表于 2017-5-3 11:24:10 | 显示全部楼层
楼主你好!
应该是两个有点冲突了,不知道你那边是怎么配置的,可以贴写代码出来看看。
另外,通道优先级寄存器有没有配置?可以配置下优先级。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

5

帖子

0

注册会员

Rank: 2

积分
68
最后登录
2017-5-19
 楼主| 发表于 2017-5-3 17:17:03 | 显示全部楼层
小恩GG 发表于 2017-5-3 11:24
楼主你好!
应该是两个有点冲突了,不知道你那边是怎么配置的,可以贴写代码出来看看。
另外,通道优先级寄 ...
  1. void spi_dma()
  2. {
  3.         SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
  4.         SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;  //打开DMA模块时钟
  5.         DMA_CR  = 0;  //控制寄存器清零

  6.         //发送DMA通道
  7.         DMAMUX_CHCFG_REG(DMAMUX, 6) = DMAMUX_CHCFG_ENBL_MASK|DMAMUX_CHCFG_SOURCE(17);
  8.         DMA_DADDR_REG(DMA0,6) = (unsigned long)&(SPI2->PUSHR);  //DMA发送目的地址
  9.         DMA_NBYTES_MLNO_REG(DMA0,6) = 4;  //每次读取4字节
  10.         DMA_ATTR_REG(DMA0,6) = DMA_ATTR_DSIZE(2) | DMA_ATTR_SSIZE(2);  //32位传送,关闭模特性
  11.         DMA_SOFF_REG(DMA0,6) = 4;  //每次操作完源地址,源地址增加4
  12.         DMA_DOFF_REG(DMA0,6) = 0;  //每次操作完目标地址,目标地址不增加
  13.         DMA_SLAST_REG(DMA0,6) = 0;  //DMA完成一次输出之后即major_loop衰减完之后不更改源地址
  14.         DMA_DLAST_SGA_REG(DMA0,6) = 0;  //DMA完成一次输出之后即major_loop衰减完之后不更改目标地址
  15.         DMA_CSR_REG(DMA0,6) = 0;  //TCD控制状态寄存器清零

  16.         //接收DMA通道
  17.         DMAMUX_CHCFG_REG(DMAMUX, 7) = DMAMUX_CHCFG_ENBL_MASK|DMAMUX_CHCFG_SOURCE(17);
  18.         DMA_SADDR_REG(DMA0,7) = (unsigned long)&(SPI2->POPR);  //DMA发送目的地址
  19.         DMA_NBYTES_MLNO_REG(DMA0,7) = 4;  //每次读取4字节
  20.         DMA_ATTR_REG(DMA0,7) = DMA_ATTR_DSIZE(2) | DMA_ATTR_SSIZE(2);  //32位传送,关闭模特性
  21.         DMA_SOFF_REG(DMA0,7) = 0;  //每次操作完源地址,源地址不增加
  22.         DMA_DOFF_REG(DMA0,7) = 4;  //每次操作完目标地址,目标地址加1
  23.         DMA_SLAST_REG(DMA0,7) = 0;  //DMA完成一次输出之后即major_loop衰减完之后不更改源地址
  24.         DMA_DLAST_SGA_REG(DMA0,7) = 0;  //DMA完成一次输出之后即major_loop衰减完之后不更改目标地址
  25.         DMA_CSR_REG(DMA0,7) = 0;  //TCD控制状态寄存器清零

  26. //        data[0] = DMA_DCHPRI7_REG(DMA0);
  27. //        data[1] = DMA_DCHPRI6_REG(DMA0);
  28. }
复制代码


从示波器上看到DMA应当是能正常收发的,但是通过DMA接收的数据会重复,比如应当收1,2,3,4,那结果就只会收到1,1,2,2.
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 15:42 , Processed in 0.092657 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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