SPI DMA 通信配置

1 篇文章 0 订阅

背景

主机(NXPxxx)与从机(RH850)通过SPI进行大量的数据交互,为降低CPU开销采用DMA功能。

软/硬件开发环境

  1. CS+,SmartConfig.
  2. Renesas RH850
  3. E1 emulator

DMA原理

DMA是一种减少CPU开销进行数据访问的内部外设。
DMA传输请求(transfer request)可由外设中断或软件触发。由传输请求执行若干个DMA周期读/写数据。
DMA周期:前半周期执行读源地址,后半周期执行写目标地址。
此处以DMA搬运SPI接收数据为例,

DMA0.DTCT0 = _DMA_SINGLE_TRANSFER | _DMA_SOURCE_FIXED | _DMA_DESTINATION_INCREMENT;		// 源地址固定,目标地址递增
DMA0.DSA0 = (uint32_t)(&RX0H);	// 先读源地址,设置为寄存器地址
DMA0.DDA0 = (uint32_t)DetAddr;	// 后写至目标地址(如数组首地址)
DMA0.DTC0 = Length;

DMA包含三种工作模式:
1)单周期模式
当有一个传输请求,则执行一个DMA周期。
2)块传输模式1
当有一个传输请求,则执行n个(传输计数)DMA周期。
3)块传输模式2
当有一个传输请求,则执行n个(地址重载计数)DMA周期。当地址重载计数大于传输计数,则执行n个(传输计数)DMA周期。

INFO:地址重载传输(address reload transfer)
在重载功能2下,当 地址重载计数为1 则执行DMA周期。

非重载模式下,完成一个DMA周期后,将源地址和目标地址向前移,传输计数递减。
在重载功能2或块传输模式2,完成一个DMA周期,地址重载计数递减。
重载功能1或2模式下,可配置当最后传输到来时,传输信息(源地址,目标地址,传输计数和地址重载计数)的更新机制

初始化 Spi_DMAInit(void)

1.关闭DMA(DCEN)
2.清除硬件传输请求(DTFRRQC)
3.清除传输错误、传输完成的标志位(DCSTC)
4.关联硬件传输源选择,使能硬件传输源(DTFR)
5.根据DMA配置类型,选择源地址(DSA)或目标地址(DDA)写入

启动 Spi_DMAStart(…)

1.根据DMA配置类型,选择源地址(DSA)或目标地址(DDA)写入
2.清除传输错误、*传输完成的标志位(DCSTC)
3.清除硬件传输请求(DTFRRQC)
*4.传输控制(DTCT)
5.写入传输计数值(DTC)
6.开启DMA(DCEN)

关闭 Spi_DMAStop(…)

1.关闭DMA(DCEN)
2.清除硬件传输请求(DTFRRQC)
3.清除传输错误、传输完成的标志位(DCSTC)
4.读传输状态(DCST)

调试问题点

(*1)DMA属于外设,访问全局变量需要开通RAM权限(PEG)
(2)数据发完最后一帧(计数=1)会产生完成中断
(2.1)可在完成中断中关闭DMA,以免再次触发传输请求;
(2.2)如果需要响应新请求,可配置重载地址和计数值,并清除传输完成的标志位。
(3)一个DMA周期多长?DMA传输请求有SPI接收中断触发,推荐选择单周期模式,否则DMA周期与接收中断周期不匹配。
(4)DMA机制通过关联SPI发送或接受中断,可屏蔽中断减小开销,DMA正常搬运数据。
(*5)DMA写入SPI寄存器TX0H的速度,要考虑寄存器的响应,加入InterDataTime,否则过快可能导致数据发不出来。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值