历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2018年02月13日 | 基于散列DMA的高速串口驱动设计方案

2018-02-13 来源:eefocus

  1  前 言

  由于串口在电报通信、工控和数据采集等领域有着广泛的应用,绝大多数嵌入式处理器都内置了通用异步收发器(UART)。UART数据传输主要通过中断或DMA的方式实现。


  中断方式是在接收到数据或需要发送数据时产生中断,在中断服务程序中读写UART的缓冲区(FIFO)实现数据传输。由于串口通信速率一般比较低(典型值不超过115 200 bps),大多数嵌入式系统都采用中断方式来传输串口数据。然而,中断服务程序需要占用CPU的时间,而串口速度的提升也必将导致CPU更频繁地响应UART中断,这势必会造成嵌入式系统的性能下降。

  DMA数据传输无需CPU的参与,是一种更加高效的数据传输方式。现有的DMA数据传输方案都是基于DMA块传输方式(即BLOCk DMA)。这种方式下每次传输完一个数据块后产生一个DMA中断,在高速串口通信中,频繁的DMA中断仍然会影响系统的性能。本文基于散列DMA(seatter DMA)的传输方式提出了一套完整的工业级高速串口驱动设计方案,实现了波特率高达12 Mbps的UART数据传输。

  2  DMA数据传输的特点

  DMA(Direct Memory ACCess,直接存储器访问),是指数据在内存与I/O设备间的直接传输,数据操作由DMA控制器(DMAC)完成而不需要CPU的参与,大大提高了CPU的利用率。因此,DMA是高速数据传输的理想方式。利用DMA进行数据传输时应注意以下几点:

  ①DMA传输需要占用系统总线,在此期间CPU不能使用总线。如果外设在进行数据传输时不能有任何的间断,就必须保证传输期间DMAC对系统总线的独占,这可能会影响其他需要使用总线进行数据传输的设备。所以,系统总线在DMA传输期间是否可被抢占,要依据嵌入式系统的特定环境来决定。

  ②DMA传输存在缓存一致性(cache coherency)问题。如图1所示,DMAC和CPU是两个平行的单元,CPU总是通过数据缓存来访问内存中的数据,而DMAC则直接访问内存。如果内存中的数据被DMAC更新,而数据缓存中的数据尚未被更新,CPU获得的某些地址的值可能并不是内存中的真实值。为了避免这个问题,可在DMAC更新完内存数据后或CPU读取被更新过的数据前刷新数据缓存,或是使用不被数据缓存映射的非缓存(non-cacheable)内存区域。

9
DMA数据传输可分为块传输和散列传输两种方式。在DMA传输数据的过程中,要求源物理地址和目标物理地址必须是连续的。但是在某些计算机体系中(如IA架构),连续的存储器地址在物理上不一定是连续的,所以DMA传输要分成多次完成。传输完一块物理上连续的数据后引发一次中断,然后进行下一块物理上连续的数据传输,这就是DMA块传输方式(Block DMA)。散列传输是在块传输方式上发展起来的,它与一个传输链表相关,如图2所示。该链表可以是单向结构或环形结构。控制字中包含数据位宽、数据块大小、当前块传输结束是否引发中断等控制信息。DMA块传输可看作是只含有一个节点,且下一节点指针总是指向当前节点的散列传输。采用散列DMA方式能更灵活、高效地传输数据。

9
  3  在SPEAR300平台上实现高速串口

  3.1  硬件平台

  SPEAR300是ST公司在ARM926EJ-S核的基础上开发的高性能嵌入式处理器。其最高工作频率为333MHz,有8个独立的DMA通道,支持散列DMA;UART支持DMA传输,发送和接收FIFO大小均为16字节,在192 MHz的外设总线(APB)频率下支持的最高波特率为12 Mbps,如果提高APB的频率还可以获得更高的波特率。本文的硬件平台是以SPEAR300为核心的人机界面产品,主要外设包括触摸屏、液晶显示模组、网口和串口(串口要支持最高波特率为12 Mbps的西门子MPI通信协议)。


  3.2  驱动程序设计

  串口驱动程序的核心是实现数据高效稳定的收发。为了实现UART的高速数据传输,UART中断设置为最高优先级;同时在操作系统中允许中断嵌套,打开UART接收超时中断RTI并使能UART的DMA传输。这样,当UART的发送FIFO数据减少到设定的参考值(FIFOLevel)时,发送DMA传输就会被触发。同样,当接收FIFO的数据增长到设定值时,接收DMA传输就会被触发。为了减少DMA传输被触发的次数同时保证数据被及时传输,发送FIFO Level设定为2字节,而接收FIFOLevel设定为14字节,将发送和接收的FIFO Level分别设定为0和16字节是有很大风险的。MPI协议要求传输的一帧数据不能有间断,所以在使用DMA传输UART数据时DMAC必须独占系统总线。为了避免产生缓存一致性问题,使用2块非缓存内存区域存放待发送的数据和已接收到的数据。

  发送数据时,待发送的数据量总是已知的。先构造一个传输节点,数据源地址为数据包的首地址,目的地址为UART寄存器,数据位宽为8,下一节点指针(PTR_NEXT)为空。当前数据包发送结束前,如果PTR_NEXT被更新,则下一个数据包的传输自动开始。当前数据包是否发送完毕,可通过读取DMAC寄存器DMACCnControl的TransferSize字段得知。整个发送数据的过程无需触发任何中断,流程图如图3所示。如果采用DMA块传输方式,就需要在每次传输完毕后产生DMA中断,重新装载数据到内存中的发送数据区以发送下一个数据包。


8
接收数据时,对方发过来的数据量一般是未知的。构造含有100个节点的循环链表结构,每个节点对应的传输块大小为接收FIFO Level。数据源地址为UART数据寄存器的地址,首节点的目的地址为接收数据内存区域的首地址,此后节点的目的地址每次向后偏移(FIFO Level×2)个字节,数据位宽为16(8个数据位,4个状态位,4个保留位)。当接收到的数据达到接收内存区域的80%(RECV_TH)时,需要通知数据发送方停止数据传输,在第80个节点处设置DMA中断,该节点为阈值节点。采用本文的设计方案接收1帧不超过RECV_TH大小的数据,最多产生一次RTI中断。当接收到的数据量少于FIFOLevel时不会触发DMA接收,在RTI中断中把UART接收FIFO中的数据复制到内存中的数据接收区,同时使DMA接收节点的目的地址向后偏移相应的长度并更新阈值节点的位置。接收数据流程如图4所示。如果采用DMA块传输方式,就必须额外使用一个环形数据缓冲区(Ring Buffer),每次接收到指定大小的数据块后产生DMA中断,在中断服务程序中将接收到的数据复制到环形数据缓冲区中。7

  3.3 驱动测试

  本文的设计方案直接应用于工业级的HMI产品,必须经过严格的测试。利用3台西门子S7系列PLC和1台产品样机搭建令牌网,使用西门子MPI协议进行测试,并利用数据分析工具ProfiTrace监测通信过程。测试结果表明,2 400 bps~12 Mbps的各个波特率下都能进行稳定的数据通信。

  4  结  语

  本文详细介绍了DMA数据传输的特点和散列DMA的工作方式。在此基础上,提出了一套基于散列DMA的高速串口驱动设计方案,发送数据完全由DMAC完成,无需触发任何中断,接收1帧不超过接收区阈值的数据最多产生1次RTI中断。和现有的各种利用DMA块传输进行串口数据通信的方案相比,中断次数大幅减少,大大提高了数据传输的效率。在应用了本方案的人机界面产品上,实现了波特率高达12 Mbps的稳定数据传输。对于在其他平台上设计实现高速串口,本方案是一个很好的参考。


推荐阅读

史海拾趣

台湾君耀(Brightking)公司的发展小趣事

作为一家具有社会责任感的企业,君耀始终注重环保和可持续发展。公司在生产过程中采用环保材料和工艺,减少对环境的影响。同时,君耀还积极参与各种环保活动,推动行业的绿色发展。这种理念不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这些故事只是君耀公司发展历程中的一部分,每个阶段都充满了挑战和机遇。君耀凭借其坚韧不拔的精神、卓越的技术实力和市场洞察力,成功在电子行业中崛起并持续壮大。如需更多详细信息或具体故事,建议查阅君耀公司的官方资料、相关新闻报道或行业分析报告。

Everbuild公司的发展小趣事

随着公司的逐步发展,Everbuild开始注重技术研发和品牌建设。公司投入大量资金引进先进的生产设备和技术人才,不断推出具有创新性的电子产品。其中,一款高性能的智能手机处理器在市场上引起了热烈反响,成为公司的明星产品。同时,Everbuild还加强了品牌宣传和推广,提高了品牌的知名度和美誉度。

Hanghsing Enterprise Co Ltd公司的发展小趣事

随着全球对环保和可持续发展的重视,Everbuild也将绿色环保理念融入到产品设计和生产过程中。公司采用环保材料和节能技术,减少生产过程中的污染和能源消耗。同时,Everbuild还积极参与环保公益活动,倡导绿色生活方式。这些举措不仅提高了公司的社会责任感,也为公司的可持续发展奠定了基础。

Crydom公司的发展小趣事

随着全球对环保和可持续发展的重视,Everbuild也将绿色环保理念融入到产品设计和生产过程中。公司采用环保材料和节能技术,减少生产过程中的污染和能源消耗。同时,Everbuild还积极参与环保公益活动,倡导绿色生活方式。这些举措不仅提高了公司的社会责任感,也为公司的可持续发展奠定了基础。

Agilent Technologies公司的发展小趣事

随着公司的逐步发展,Everbuild开始注重技术研发和品牌建设。公司投入大量资金引进先进的生产设备和技术人才,不断推出具有创新性的电子产品。其中,一款高性能的智能手机处理器在市场上引起了热烈反响,成为公司的明星产品。同时,Everbuild还加强了品牌宣传和推广,提高了品牌的知名度和美誉度。

Big-Sun Electronics Co Ltd公司的发展小趣事

面对电子行业的快速变化和市场竞争的加剧,Big-Sun Electronics Co Ltd公司积极实施多元化战略。公司不仅继续深耕电子芯片领域,还逐步拓展至智能家居、物联网等新兴领域。通过产业转型和升级,Big-Sun成功实现了业务的多元化发展,为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

开关电源手册(第二版)_Keith Billings

书名:开关电源手册(第2版) 作者:Keith Billings(著),张占松、汪仁煌、谢丽萍(译) 出版社:人民邮电出版社 版次:2006年12月第一版 丛书名:图灵电子与电气工程丛书 文件格式:PDF 文件总大小:43.2M 压缩包个数:9 内容简介: &n ...…

查看全部问答>

常用元器件的识别

不想说了 有用留着…

查看全部问答>

pxa310的keypad

有哪位做过pxa310的keypad的?可以帮兄弟一把么? 问题是这样的,我想在blob里面非中断模式下扫描键盘,但是只能扫描到行的信息,print出来的是所有列都被按下....是KPC配置的不对么? 还是什么呢?从KPAS这个寄存器里面读出来的就是某行的所有键都被按 ...…

查看全部问答>

如何得到驱动内核中Modem设备的设备名?

在驱动中,Modem的设备的特性是AUTOGENETERATED_DEVICE_NAME, 好像是系统启动时随机分配的,怎样枚举所有Modem设备并获得设备名啊?…

查看全部问答>

CC2430+CC2591无线通讯模块出现的问题

我在焊接CC2430+CC2591这块无线模块的时候出现了一些问题,如下面列表。不知道那位大侠可以帮忙解决一下,在下十分感激。 问题一:焊接完成后仿真器能够识别,但是不能刷程序。 问题二:能识别能刷程序,但是不能通信。 问题三:能识别能刷程序 ...…

查看全部问答>

ARM7关于中断

问题很简单,编写了一个定时器0中断,但是中断进不去。网上也有说 修改STARTUP.S 清除 CPSR的位I   但是我修改了好几处 还是没改好,又不想完全使用周立功的那个STARTUP.S  求给位指点指点,感激不尽。  本人的代码如下: #i ...…

查看全部问答>

关于430FR57团购细节的疑问。

1.除了板上的资源,还有没有配套的模块?如果有,是包含在团购中的还是要自己单买的? 2.我的几个朋友也挺想买,有些没上过EE,而且大家都住在一起,账号和地址的限制怎么办呢? 3.呃。。。这算不算已经完成了step 1 呢 …

查看全部问答>

有学习430来参加北京市EDA比赛的吗?

今年的北京市EDA比赛采用430套件,请问大家有现在为这个比赛而学习430的吗?…

查看全部问答>

为什么PC13引脚电平影响RTC震荡

STM32F101CBT6,PC13定义为GPIO_Mode_Out_PP,外接一个PNP控制LED.当PC13输出低电平时,没有问题,输出高电平后,RTC晶振停止震荡.检查管脚间没有短路.两种产品都是一样的电路,一种产品没问题,新作的产品就有这个问题,CPU不是一个批次买的.都是用的12.5P ...…

查看全部问答>