简介
DMA 是 FT-M6678 的数据传输引擎之一,是 CrossNet 的主要主机。而CrossNet 是所有设备的数据交换中心, 可提供所有的外围设备、片内存储、 DSP 核之间进行无阻塞的高速数据交换。DMA 在 FT-M6678 中处于数据交换中枢的位置,通过 CrossNet 总线,对内连接 8 个 DSP 核的核内存储资源(L1D、 L1P 和 L2),对外连接 DDR3、 SRIO、EMIF32、 GPIO、 I2C、 SPI 等片上外设和 FFT 等加速器件。
DMA 控制器由以下几部分组成:
1. DMA 逻辑通道, 8 个 DSP 核共享 3 组逻辑通道, 分别为 DMA0、DMA1和 DMA2。其中DMA0包含 16 个 DMA 通道和 8 个 QDMA通道,DMA1包含 64 个 DMA 通道和 8 个 QDMA 通道,DMA2包含 64 个 DMA通道和 8 个 QDMA 通道。每个 DMA 通道都有一个事件与之关联,由这些事件触发启动相应通道。 每组逻辑通道都有一组寄存器进行配置。DMA 通道优先于 QDMA 通道,序号低的逻辑通道优先于序号高的逻辑通道。
2. DMA 传输控制器,主要由不同的传输控制逻辑组成, DMA 设置 10 个通用 DMA 传输控制器;10 个传输控制器分为 3 组,第 0 组包含 2 个传输控制器,第 1 组和第 2 组各包含 4 个传输控制器, 3 组传输控制器由 8 个 DSP 核共享。
3. CrossNet 总线接口,高速存储总线接口,数据总线位宽为 256 位,主要用于访问 MSMC和 DDR3;低速存储总线接口,数据总线位宽 128 位,主要用于访问除 MSMC和 DDR3 外的其他存储资源;配置总线接口,数据总线位宽 32 位,主要用于访问 FT-M6678 的配置寄存器空间。
开发接口
从工程师角度来说DMA就是将数据从一个地址空间,拷贝到另外一个地址空间,中间不需要CPU参与。官方提供的接口主要是三个:
1. DMA配置函数:DMA_ParaConfig
/*******************************************************************************
*函数名:DMA_ParaConfig(int DMA_Numb,int Numb ,int SourceAddr,int Acount,int Bcount,int DestinationAddr,int IntEnable)
*功 能: DMA配置函数
*参 数:DMA_Numb为DMA部件的选择,为DMA0,DMA1,DMA2其中的一个;Numb为通道号;
* SourceAddr为源地址;Acount为数据字节数;Bcount为数据帧数;
* DestinationAddr为目的地址;IntEnable为中断使能
*******************************************************************************/
void DMA_ParaConfig(int DMA_Numb,int Numb ,int SourceAddr,int Acount,int Bcount,int DestinationAddr,int IntEnable)
2. DMA启动传输函数:DMA_Start
/*******************************************************************************
*函数名:DMA_Start(int DMA_Numb , int Numb)
*功 能: DMA启动传输函数
*参 数:DMA_Numb为DMA部件的选择,为DMA0,DMA1,DMA2其中的一个;Numb为通道号。
*******************************************************************************/
void DMA_Start(int DMA_Numb , int Numb)
3. DMA传输状态查询函数:DMA_TransState
/*******************************************************************************
*函数名:DMA_TransState(int DMA_Numb , int Numb)
*功 能: DMA传输状态查询函数
*参 数:DMA_Numb为DMA部件的选择,为DMA0,DMA1,DMA2其中的一个;Numb为通道号。
*******************************************************************************/
int DMA_TransState(int DMA_Numb , int Numb)
注:传输状态查询可用于轮询方式进行DMA状态,而DMA传输时可使用中断方式,来完成,个人比较喜欢轮询方式。