灵动MMCU的DMA传输过程
SPI可以利用DMA来搬运数据,包含读取接收数据和写入发送数据。DMA请求及应答机制,能监控收发缓冲的空满状态,并提高对SPI收发数据寄存器RXREG、TXREG的读写速率,从而加快SPI通信速
度。
配置SPI_I2S_GCTL.DMAMODE位为‘1’,来实现SPI模块与DMA之间的信号交互。当发送缓冲有
空闲空间,即请求DMA写入TXREG;当接收缓冲有可读的有效数据,即请求DMA读取RXREG。
发送时:当配置DW8_32位为‘0’,发送缓冲有大于等于1个空闲数据(1字节)的空间,即发送
缓冲未满时就发起DMA请求;当配置DW8_32位为‘1’,发送缓冲有1个有效数据的空闲空间时
会发起DMA请求。每次请求只进行一次DMA传输,且传输数据字节数由DW8_32位决定。
接收时:当配置DW8_32位为‘0’,接收缓冲有大于等于1个有效数据(1字节)时就发起DMA
请求;当配置DW8_32位为‘1’,接收缓冲有1个有效数据后才发起DMA请求。每次请求只进行
一次DMA传输。且传输数据字节数由DW8_32位决定。
注意:DW8_32=1时,1个有效数据的字节数由帧长位数决定。
楼主做过I2C硬件的DMA功能吗? SPI可以利用DMA来搬运数据,其实还是自身硬件DMA支持吧 初始化完成后,可以通过软件触发或者外设触发的方式启动DMA传输。在传输过程中,DMA控制器会自动从源地址读取数据,并将其写入目的地址,而CPU则可以在此期间执行其他任务 当不需要继续使用DMA功能时,应当通过软件将DMA通道关闭,并释放相关的系统资源。 当传输的数据量达到预设值时,DMA传输会自动停止。同时,DMA控制器会发送一个完成信号给CPU,通知传输已经完成。 灵动MMCU的DMA传输过程包括初始化DMA、启动DMA传输、DMA硬件电路控制数据传输、传输完成中断和关闭DMA等步骤。 通过使用DMA,可以降低CPU的工作负载,提高系统的运行效率。 为DMA传输任务配置相应的参数,例如传输数据的源地址、目标地址、传输数量等。这可以通过编程MMCU的寄存器或者使用相应的库函数来实现。 DMA控制器会在后台进行数据搬移,同时可以监控传输状态,如有错误则可能产生中断通知CPU。
在增量模式下,DMA控制器会自动更新源地址和/或目标地址以实现连续的数据块传输。 当DMA传输完成后,DMA控制器会向CPU发送一个中断信号,通知CPU传输任务已经完成。CPU可以在中断服务程序中处理传输完成后的相关事宜,例如更新数据源、释放内存等。 首先,需要在软件中启用并配置DMA控制器。这包括选择DMA通道、设置源地址和目标地址、指定传输的数据量以及数据传输方向(从设备到内存、从内存到设备或内存到内存)。
配置DMA请求源,例如定时器触发的输入捕获事件、SPI/I²C/UART等外设的传输完成中断等。
设置DMA的工作模式(单次传输、循环传输等)以及优先级。 当DMA传输完成后,MM32 MCU会触发一个传输完成中断。在中断服务程序中,可以执行一些后续处理,如数据处理、存储器释放等。 DMA传输过程中,CPU并不直接参与数据的传输,而是由DMA控制器自动完成。这样可以大大提高数据传输的效率,减轻CPU的负担。 在数据传输完成后,需要关闭DMA以节省资源。关闭DMA后,DMA硬件电路将不再工作。 首先,CPU对DMA控制器进行初始化,设置传输的相关参数,如数据缓冲区的首地址、设备地址、传输的数据长度等。
然后,CPU向I/O接口发出操作命令,I/O接口根据命令向DMA控制器提出传输请求。 CPU初始化DMA控制器,外设发出DMA请求。
DMA控制器判断DMA请求的优先级及屏蔽,向总线仲裁器提出总线请求。
当CPU执行完当前总线周期时,释放总线控制权。
DMA控制器获得总线控制权后,开始进行数据传输。
数据传输完成后,DMA控制器释放总线控制权,并产生一个DMA传输结束中断信号。 一旦DMA控制器获得总线控制权,CPU将挂起或仅执行内部操作,让出总线使用权。
DMA控制器输出读写命令,直接控制内存与I/O接口进行数据传输。
在传输过程中,DMA控制器会处理字节到字的装配和字到字节的拆卸,确保数据格式的一致性。 在DMA传输过程中,如果发生错误,例如传输数据错误、传输方向错误等,DMA控制器会向CPU发送一个错误中断信号。CPU可以在中断服务程序中处理错误情况,例如停止传输、记录错误信息等。 一旦完成DMA控制器的配置,可以启动DMA传输。这通常是通过向DMA控制器发送一个启动信号来完成的。