网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 操作系统 > 嵌入式 >

痞子衡嵌入式:在i.MXRTxxx下使能DMA动态链式传输

时间:2025-11-13 17:02

人气:

作者:admin

标签:

导读:大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRTxxx下各通信外设驱动对DMA链式传输支持情况。 文接上篇《在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速...

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRTxxx下各通信外设驱动对DMA链式传输支持情况

  文接上篇《在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps》,当我们实现了 DMA 链式传输后:这里又分为两种情况,一种是静态 DMA 链式传输,另一种是动态 DMA 链式传输。

  所谓静态 DMA 链式,就是在启动 DMA 传输前把所有链表一次性全配置好,传输过程中不再修改链表。而动态 DMA 链式,则是在传输过程中动态地配置链表,比如在一个链表传输完成后,再添加下一个链表。

  静态 DMA 链式适用于需要预先知道全部传输数据的场景,如固定大小的数据块传输,或者先缓存后处理的场景(比如 ping-pong buffer 方式收数据,再将数据从 buffer 搬移到目的地址);动态 DMA 链式则更适合处理长度可变或实时生成的数据流,或者目标地址可变且无需 buffer 缓存的场景(比如直接让 DMA 将数据存到变化的目标地址),提供更灵活的数据传输方式。

  今天痞子衡就和大家聊一聊动态 DMA 链式传输使能过程中的一个小误区,以及当前版本 SDK 下各通信外设 DMA 版本驱动对于链式传输的支持情况:

一、由使能SPI动态DMA链式传输发现的问题

  回到痞子衡支持 RT600 AR 眼镜客户的应用场景,RT600 作为 SPI 从设备接收数据,为了实现最高 50MHz SPI 传输,我们必须使能 DMA 链式传输,保证在一包数据传输过程中不能出现间隔(比如一包数据是 4KB,而一次 DMA 传输 1KB,那么就需要 4 次 DMA 传输)。

  为了实现连续无间隔的 4 次 DMA 传输,既可以用静态 DMA 链式,也可以用动态 DMA 链式,为了便于描述两者差别,这里痞子衡用了 4 个 DMA 描述符示例(实际 2 个 DMA 描述符头尾相连组成 ping-pong 传输就可以了)。

  静态 DMA 链式传输情况下,我们先要将 DMA 描述符 0,1,2,3串起来,然后再启动 DMA 传输。而动态 DMA 链式传输情况时,我们是先串了 DMA 描述符 0,1,然后就直接启动了 DMA 传输,在每次 DMA 传输结束时,再将下一个未链接的 DMA 描述符按序串上去。

  在这个 AR 眼镜客户应用场景里,RT600 从 SPI 接收的数据是在 SRAM 执行的程序固件,其有指定内部 SRAM 存放地址,而且在每包数据传输过程中还涉及 CRC 校验,如果校验出错需要重新传输这一包数据。综合考虑,痞子衡选择了 DMA 动态链式传输方案,直接用 DMA 将数据放到目的 SRAM 地址,所以必须动态配置 DMA 描述符,因为每个描述符里目标地址需要更新。

  在改造 SDK 里的 fsl_spi_dma 驱动(v2.2.2)时,痞子衡发现了一个隐藏的误区,该驱动基于公共 DMA 函数 DMA_SubmitTransfer() 来创建一个 DMA 描述符,这个函数设计上完全是为了非链式传输,其仅能在 DMA 处于空闲状态才能被调用(根据 DMAx->COMMON[0].ACTIVE 寄存器),这么做的主要原因是函数最后会设置 DMAx->CHANNEL[n].XFERCFG 寄存器,而这个决定 DMA 传输配置的最重要寄存器 XFERCFG 在 DMA 传输期间不能够重新设置,哪怕相同的值再次写入也不行,一旦发生写入行为,DMA 会发生异常从而立即停止工作

二、各通信外设对DMA链式传输支持情况

  在 RT600 上支持 DMA 传输的通信类外设有很多,这些外设在 SDK 里大多数既有普通驱动,也有 DMA 版本驱动。痞子衡将全部驱动和例程均看了一遍,做了一个总结。原则上每个外设 DMA 版本驱动均可以做到支持链式传输,但目前 SDK 里的各外设 DMA 驱动实现并不一致,原因可能跟该外设自身应用特点有关。比如音频类外设 I2S 和 DMIC 就很适合做链式传输,因为它们数据流必须是连续的,否则 record_playback 场景下音频会出现杂音。

  由于这些外设驱动并不是同一个人写成的,因此代码风格各不相同,其中关于 DMA 链式传输实现,痞子衡最喜欢 fsl_i2s_dma 这个驱动,想要为 USART/SPI/I2C 添加 DMA 链式传输支持的朋友不妨参考这个驱动。

  • Note:下表是以 SDK_25_09 版本代码为准
外设类型 有无DMA版本驱动 DMA版本驱动是否支持链式传输 基于DMA的例程
FC USART dma_low_power
dma_transfer 单次传输
dma_double_buffer_transfer 链式传输
FC SPI dma_b2b_transfer 单次传输
FC I2C dma_b2b_transfer 单次传输
FC I2S dma_transfer 链式传输
dma_transfer_tfa9xxx 链式传输
dma_record_playback 链式传输
I3C
DMIC dmic_dma 单次传输
dmic_i2s_dma 链式传输
dmic_multi_channel 链式传输
FLEXSPI dma_transfer 链式传输
eSPI N/A N/A

  至此,i.MXRTxxx下各通信外设驱动对DMA链式传输支持情况痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

  最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

  衡杰(痞子衡),目前就职于恩智浦(NXP)半导体MCU系统应用部门,担任高级嵌入式系统应用工程师。

  专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

  与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

  可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

  关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

  痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信