背景
主机(NXPxxx)与从机(RH850)通过SPI进行大量的数据交互,为降低CPU开销采用DMA功能。
软/硬件开发环境
- CS+,SmartConfig.
- Renesas RH850
- 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,否则过快可能导致数据发不出来。