[Kinetis] k60 16个通道的dma可以同时使用吗(已解决)

[复制链接]
4665|19
 楼主| huangxz 发表于 2014-11-26 11:46 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-12-1 10:54 编辑

我看dmamux可以从63个源连接到16个通道的, 那这16个通道的dma可以同时使用吗


有没有中文的dmamux和edma那部分的文档,网上找不到啊.

FSL_TICS_Jeremy 发表于 2014-11-26 14:00 | 显示全部楼层
你好,楼主!
可以使能16个通道工作的。
攻城狮 发表于 2014-11-26 14:02 | 显示全部楼层
我手上刚好有个DMA的介绍文档,希望有帮助。
DMA模块详解.pdf (762.58 KB, 下载次数: 305)
 楼主| huangxz 发表于 2014-11-26 16:19 | 显示全部楼层
攻城狮 发表于 2014-11-26 14:02
我手上刚好有个DMA的介绍文档,希望有帮助。

好的,非常谢谢.
 楼主| huangxz 发表于 2014-11-26 16:49 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2014-11-26 14:00
你好,楼主!
可以使能16个通道工作的。

您好,这样子dma能工作吗? 我想实现内存之间的拷贝.

  1. uint8_t dt_buff0[16];
  2. uint8_t dt_buff1[16];

  3. void dma_clk_init(void)
  4. {
  5.     /* the corresponding SIM clock gate to be enabled befor the DMAMUX module
  6.     register being initialized */
  7.     SIM->SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;
  8.     /* enable the DMA clock gate in SIM */
  9.     SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;                  /* DMA时钟门控上电默认是打开的,所以这步可加可不加 */
  10.     DMA0->CR = 0;                                      /* 默认配置,需要在DMA被激活之前配置此寄存器 */
  11.        
  12. }

  13. void dma1_init(void)
  14. {
  15.     DMAMUX0->CHCFG[1] =
  16. //  DMAMUX_CHCFG_REG(DMAMUX0, 1) =
  17.         (0
  18.          | DMAMUX_CHCFG_ENBL_MASK              /* 使能DMA通道 */
  19.          //| DMAMUX_CHCFG_TRIG_MASK              /* 打开周期性触发模式,注意只有0~3通道支持 */
  20.          | DMAMUX_CHCFG_SOURCE(63)  /* 指定DMA触发源 */
  21.         );

  22.     DMA0->ERQ &= ~(1 << 1);                                 /* 关闭相应通道的DMA请求,在配置阶段先关闭,再调用myDMA_Start函数开启DMA */

  23.     DMA0->TCD[1].SADDR = (uint32_t)(&dt_buff0[0]);                 /* 分配DMA源地址 */
  24.     DMA0->TCD[1].DADDR = (uint32_t)(&dt_buff1[0]);                 /* 分配DMA目标地址 */
  25.     DMA0->TCD[1].NBYTES_MLNO = 1;                /* 每次minor loop传送1个字节 */
  26.     DMA0->TCD[1].ATTR  =(0
  27.                          |DMA_ATTR_SMOD(0)        /* Source modulo feature disabled */
  28.                          | DMA_ATTR_SSIZE(0)      /* Source size, 8位传送 */
  29.                          | DMA_ATTR_DMOD(0)       /* Destination modulo feature disabled */
  30.                          | DMA_ATTR_DSIZE(0)      /* Destination size, 8位传送 */
  31.                         );
  32.     DMA0->TCD[1].SOFF  = 0x0001;                  /* 每次操作完源地址,源地址增加1 */
  33.     DMA0->TCD[1].DOFF  = 0x0001;                  /* 每次操作完目标地址,目标地址不增加  */
  34.     DMA0->TCD[1].SLAST = 0x00;                    /* DMA完成一次输出之后即major_loop衰减完之后不更改源地址 */
  35.     DMA0->TCD[1].DLAST_SGA = 0x00;                /* DMA完成一次输出之后即major_loop衰减完之后不更改目标地址 */
  36.     //22.3.27 TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled)
  37.     DMA0->TCD[1].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(16); /* 1个major loop, 即一次传输量=major_loop*minor_loop,最大为2^15=32767 */
  38.     //22.3.31 TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Disabled)
  39.     DMA0->TCD[1].BITER_ELINKNO = DMA_CITER_ELINKNO_CITER(16); /* BITER应该等于CITER */

  40.     DMA0->TCD[1].CSR = 0;                         /* 先清零CSR,之后再设置 */
  41.     DMA0->INT &=~(1<<1);                          /* 关闭DMA相应通道的传输完成中断,与TCD_CSR_INTMAJOR或者TCD_CSR_INTHALF搭配 */
  42.     DMA0->TCD[1].CSR &= ~DMA_CSR_INTMAJOR_MASK;   /* 关闭DMA major_loop完成中断 */
  43.     DMA0->TCD[1].CSR |= DMA_CSR_DREQ_MASK;        /* major_loop递减为0时自动关闭DMA,即只进行一次DMA传输 */
  44. }

  45. void dma1_start(void)
  46. {
  47.         int i;
  48.         for(i=0; i<16; i++)
  49.         {
  50.                 dt_buff0[i] = i;
  51.         }
  52.         DMA0->SERQ = (1 << 1);
  53. }
FSL_TICS_Jeremy 发表于 2014-11-26 16:54 | 显示全部楼层
你好,楼主!
至少从你给出的代码里,没看到有什么比较明显的错误!
 楼主| huangxz 发表于 2014-11-26 16:58 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2014-11-26 16:54
你好,楼主!
至少从你给出的代码里,没看到有什么比较明显的错误!

您好,确实,我也没看 出什么问题,就是不工作, 执行了dma1_start()以后,dt_buff[1]的全是0,没有拷贝成功

我还是不明白,内存之间的拷贝,数据源怎么选择,我是选DMA MUX吗,比如我在上面的代码里面用的是63
11.png

FSL_TICS_Jeremy 发表于 2014-11-26 17:27 | 显示全部楼层
huangxz 发表于 2014-11-26 16:58
您好,确实,我也没看 出什么问题,就是不工作, 执行了dma1_start()以后,dt_buff[1]的全是0,没有拷贝成功

  ...

你好,
我知道,选择63,表示Always enabled,没有什么问题啊。
 楼主| huangxz 发表于 2014-11-27 17:33 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2014-11-26 17:27
你好,
我知道,选择63,表示Always enabled,没有什么问题啊。

您好,哪种源叫dma mux源?
FSL_TICS_Jeremy 发表于 2014-11-28 09:37 | 显示全部楼层
huangxz 发表于 2014-11-27 17:33
您好,哪种源叫dma mux源?

你好,
翻译成中文的话,就不太好让你理解,我截取了文中的一段对此的说明,可以帮助你理解。
1a.jpg
 楼主| huangxz 发表于 2014-11-28 10:23 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2014-11-28 09:37
你好,
翻译成中文的话,就不太好让你理解,我截取了文中的一段对此的说明,可以帮助你理解。

就是这16个"总是打开的槽"指的是哪些源,感觉指的就是memory地址空间.
但是没有看到哪里明确说明.
FSL_TICS_Jeremy 发表于 2014-11-28 11:51 | 显示全部楼层
huangxz 发表于 2014-11-28 10:23
就是这16个"总是打开的槽"指的是哪些源,感觉指的就是memory地址空间.
但是没有看到哪里明确说明. ...

你好,
我的理解就是不需要硬件触发源,相当于软件触发源,完全有使用者控制啊。
硬件触发的通道也是可以做memory地址间的数据传送的。
FSL_TICS_A 发表于 2014-12-1 10:38 | 显示全部楼层
你好,楼主!
如果没有问题,请结贴。
谢谢理解。
 楼主| huangxz 发表于 2014-12-1 11:28 | 显示全部楼层
FSL_TICS_A 发表于 2014-12-1 10:38
你好,楼主!
如果没有问题,请结贴。
谢谢理解。

ok,呵呵,还没没有理解这个,希望能够有更加明确的说明.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:醒来才发现,一切都是一场梦

177

主题

4938

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部