当前位置: 首页 > news >正文

痞子衡嵌入式:在i.MXRTxxx下使能DMA动态链式传输误区及各外设驱动对DMA链式支持情况


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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 USARTdma_low_power
dma_transfer 单次传输
dma_double_buffer_transfer 链式传输
FC SPIdma_b2b_transfer 单次传输
FC I2Cdma_b2b_transfer 单次传输
FC I2Sdma_transfer 链式传输
dma_transfer_tfa9xxx 链式传输
dma_record_playback 链式传输
I3C
DMICdmic_dma 单次传输
dmic_i2s_dma 链式传输
dmic_multi_channel 链式传输
FLEXSPIdma_transfer 链式传输
eSPIN/AN/A

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

欢迎订阅

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

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

http://www.zskr.cn/news/48605.html

相关文章:

  • 【Linux】Linux进程间通信:命名管道(FIFO)的模拟实现重要知识点梳理 - 实践
  • Akamai 简单 记录
  • Redis分布式锁:从“能用”到“好用”,中间差了多少细节?
  • Zabbix监控mysl数据库配置
  • 嵌入式学习笔记-Chapter4
  • Java 线程同步与线程间通信
  • HarmonyOS ArkTS卡片开发:多种方式实现卡片信息刷新
  • 可视化图解算法68:数组中出现次数超过一半的数字
  • 2025年国内自助入住系统公司TOP5权威推荐:智慧住宿新选择
  • 内蒙古太空菌酸奶厂家,厚乳老酸奶厂家排名,希腊酸奶公司排行榜,奶皮子糖葫芦生产厂家,干咽酸奶厂家,冷萃酸奶源头工厂,口碑推荐!
  • PG系列:并行创建索引
  • bluetooth matlab GFSK 调制解调,误码率统计
  • without updating the macOS to figure out the Markdown import to Mac Note app
  • 统计学第二章
  • MATLAB 对于小目标检测,绘制roc曲线
  • 构建数据安全体系,数据分类分级是核心
  • 破解传统数据安全监测瓶颈,数据安全平台是关键
  • go beego http
  • 新乡LCD拼接屏实用指南:聚焦跨平台能力与售后体系
  • 2025年安徽省窗帘电机公司专业推荐与实力对比排行
  • Unreal Python 菜单扩展
  • 深入解析:mysql_page pagesize 如何实现游标分页?
  • Continuous Trajectory: 从 Independent Set Process 到另类 Giant Component
  • c++初学者的随笔记录_1
  • 从0到1构建一个稳定redis架构
  • Codeforces 1120D Power Tree 题解 [ 蓝 ] [ 树形 DP ] [ 记忆化搜索 ] [ 图论建模 ] [ 最小生成树 ] [ 差分 ]
  • 软件开发公司的隐形资产:为什么设计思维比代码量更值钱?
  • 2025年平移门行业十大服务商权威推荐榜单:专业选择指南
  • 2025年不锈钢列管式冷凝器源头厂家权威推荐榜单:化工冷凝器/新型风冷冷凝器/不锈钢冷凝器源头厂家精选
  • 一阶矩估计