0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于SPI配合DMA实现理论速度性能

331062281 来源:RCSN嵌入式 2023-07-21 10:17 次阅读

一、背景

在《先楫hpm6000的SPI外设使用四线模式操作读写华邦flash》一文中介绍了先楫SPI外设是为flash器件而生的控制器,但是楼主在该篇文章读写flash的页是用的poll轮询读写spi fifo的接口,并没用DMA来进行加速优化。本篇就是基于SPI配合DMA实现理论速度性能。

二、问题点

(一) SPI FIFO poll阻塞发送无法发挥SPI理论速度性能

使用spi poll阻塞的时候,虽然能实现数据的完整传输,但是传输的时间并不能达到理想传输速度,比如SPI四线模式下,30M的SPI SCLK时钟,理论可以达到15MB/S速度。但实际测量当中并未达到该性能。从逻辑分析仪看到,发送flas一页数据,也就是256字节,从开始传输到结束传输的时间需要37.034us,合计为6.91MB/S,与理论速度相差了2到3倍的距离。

ce1a537a-2769-11ee-962d-dac502259ad0.png

从波形上看,导致这个速度达不到原因就在于,每个字节之间存在了一定的间隔时间,这些间隔的累积导致传输时间变长,导致总的时间变长,进而速度远远跟不上。

ce63203c-2769-11ee-962d-dac502259ad0.png

(二)使用了DMA仍然有SPI SCLK时钟不连续问题

从(一)的问题可以看出,要想达到理论速度,必须消除每个字节的SCLK间隔,缩短传输时间。这时候需要DMA来加持速度性能,但实际上,在使用了相关配置之后,速度虽然有些提升,但还是存在些许间隔产生。

在这里的例子验证条件是:SPI SCLK时钟频率为50M,主机发送512字节。理论传输速度可以25MB/S.从逻辑分析仪可看到,间隔有所缩短,但依然存在字节间隔。512字节传输需要45.97us,合计为11.173MB/S。距离25MB/S也有两倍的差距。

ce98458c-2769-11ee-962d-dac502259ad0.png

三、解决问题

在二问题的所有描述当中,速度达不到理想性能,归根到底是字节之间产生间隔累积形成。

所以我们的问题解决点是:再配合DMA,进行其他优化。达到理想速度性能。

(一) 使用AHB SRAM(内存32KB空间)作为数据交互RAM。

在HPM6000系列中,AHB/APB外设总线连接了一个内存为32KB空间的AHB SRAM,与之同时连接的也有DMA控制器之一HDMA。

从官方文档可知,AHB SRAM和HDMA以及SPI外设同样位于AHB/APB外设总线中,AHB SRAM是专门给HDMA进行低延时访问的内存,也是SPI进行DMA低延时传输保证。

cec90532-2769-11ee-962d-dac502259ad0.png

在上面的DMA搬运中,待发送的数据放在AXI SRAM中。那么把这发送的数据放在AHB SRAM,看下会不会有所提升。

cf07639a-2769-11ee-962d-dac502259ad0.png

从以下逻辑分析仪结果看出,传输512字节,相比放在AXI_SRAM中,在AHB_SRAM只需要22.97us,缩短了23us, 合计22MB/S,提高了两倍速度性能。当仍与25MB/S理想速度有些许差距。

cf293ad8-2769-11ee-962d-dac502259ad0.png

通过放大波形查看,有些字节依然产生间隔,这也是导致速度没达到理想速度的原因。

cf619342-2769-11ee-962d-dac502259ad0.png

(二)使用DMA的burst突发传输

先楫的DMA,对于源地址数据来说,支持突发传输。例如传输位宽为8,设置burst数量为4,那么就是相当一次DMA请求设置了4个节拍,连续传输4个字节。是单次传输的4倍效率。在这里来说,待发送的数据就是源地址数据。

cf857b4a-2769-11ee-962d-dac502259ad0.png

先楫的SPI控制器有四个字的FIFO数据空间,每个FIFO是32位。SPI请求DMA搬运是通过发送FIFO阈值请求。从效率上来看,最好是一次请求中能把FIFO数据全部搬运。从上面的优化流程来看,都设置为了默认,TX FIFO阈值设置为了0,也就是只要TXFIFO有一个为空就请求一次,DMA的源数据burst数量为0,也就是相当设置了1个节拍的突发传输,传输宽度为8位,一次DMA请求就塞给一次FIFO,等待FIFO完全塞满后这时候没法请求,所以会导致一次周期的间隔,当DMA收到请求后连这样能解释上面为何每隔四个字节会产生间隔的原因。

cfbc3752-2769-11ee-962d-dac502259ad0.png

所以这里我们可以SPI的TXFIFO阈值为3,当出现一个空位的时候就请求一次,设置burst数量为2,也就是四个字节,一次请求搬运四个字节。通过逻辑分析仪可看到:

配合(一)的方案,传输512字节,只需要20.468us,合计为25MB/S左右,接近了理想速度性能了。

cff5f26c-2769-11ee-962d-dac502259ad0.png

放大波形查看,也能看到SCLK时钟连续了。

d01c8cc4-2769-11ee-962d-dac502259ad0.png

(三)压榨性能(使用SPI的字节合并merge功能)

先楫官方手册说明的是SPI时钟可以80M,保守是40M。在四线模式下,SPI时钟SCLK为80M,相比单线来说可以提高四倍性能传输,也就是可以达到40MB/S。

但是在实际操作的时候,分频SPI SCLK频率到66M,又出现了SCLK时钟不连续的情况,导致与理想速度不符合。

d04fc6fc-2769-11ee-962d-dac502259ad0.png

仔细翻下官方手册,可以知道SPI有个寄存器是TRANSFMT,有一个位是DATAMERGE,对于描述如下:

d07de9d8-2769-11ee-962d-dac502259ad0.png

特别说明的是,由于SPI的数据FIFO是32位,这个功能只在数据单位长度为8位的时候有效,而且合并的数据量需要以四的整数倍。如此来说,在配置DMA的时候,传输宽度可以从8位变到32位,传输的带宽也能提高了四倍。那么我们这样配置下,逻辑分析仪结果如下:

在66M的SPI SCLK时钟下,逻辑分析仪抓到的SCLK能保持连续,并且数据能对得上。512字节耗时15.352us,合计33MB/S左右,与理论速度33MB/S接近。

d0a7f750-2769-11ee-962d-dac502259ad0.png

80M的SPI SCLK频率,传输512字节,耗时12.794us,合计40MB/S左右,也能满足预期40MB/S速度。

d0cafe3a-2769-11ee-962d-dac502259ad0.png

SCLK波形也能保持连续。

d1021bae-2769-11ee-962d-dac502259ad0.png

四、号外(单线SPI总线可以达到120M)

四线模式既然能达到80M,那么楼主想试下80M的单线,也是没问题的,效果如下:

d131423a-2769-11ee-962d-dac502259ad0.png

再尝试一把,把SPI SCLK分频到120M,只是稍微有点间隔,但单线SPI也是没问题的。

d165ae6c-2769-11ee-962d-dac502259ad0.png

五、总结

对于先楫这个SPI外设来说,配合DMA,SPI的数据FIFO以及相关SPI配置,能达到手册描述的性能。无论是四线模式还是二线模式还是单线模式,都能到达80M的SPI时钟性能。

对于SCLK不连续的问题在于DMA搬运和SPI传输不同步造成,导致传输间隔中断,特别是SPI频率越来越高的情况下。解决同步问题就不会有SCLK不连续的问题存在。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16196

    浏览量

    177385
  • FlaSh
    +关注

    关注

    10

    文章

    1621

    浏览量

    147743
  • 主机
    +关注

    关注

    0

    文章

    985

    浏览量

    35058
  • 时钟
    +关注

    关注

    10

    文章

    1720

    浏览量

    131359
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1700

    浏览量

    91309

原文标题:开发者分享| [玩转先楫SPI外设系列之一] 细说SPI主机发送性能最大化实现方案

文章出处:【微信号:HPMicro,微信公众号:先楫半导体HPMicro】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种高性能多通道通用DMA设计与实现

    为充分发挥异构多核DSP芯片的实时计算能力,设计并实现了一种高性能多通道的通用DMA,该DMA最大支持64个通道的数据搬运,并支持一维、二维、转置以及级联描述符等多种传输模式。芯片实测
    的头像 发表于 11-20 15:52 1064次阅读
    一种高<b class='flag-5'>性能</b>多通道通用<b class='flag-5'>DMA</b>设计与<b class='flag-5'>实现</b>

    STM32 SPI DMA 的使用

    可以执行其它任务,只有在整个数据块传输结束后,需要处理这些数据时才会中断主处理器的操作。它可以在对系统性能产生较小影响的情况下,实现大量数据的传输。 五、SPI_DMA的通信过程·设置外设地址·设置
    发表于 07-19 19:02

    SPI DMA的无线传输速率

    请问,SPI DMA作为从机接收速度可以达到多快 SPI DMA的传输方式是一次性接收多少字节?1024个字节吗 我用作为服务器模式发送给T
    发表于 06-21 10:58

    DMA与DAC之间如何配合工作

    要输出正弦波,需要好几个外设配合:Timer、DAC、DMA。TImer用来设置正弦波的频率的;DAC顾名思义将数字量转换成模拟量,在这里就是转化成电压信号;DMA直接控制DAC输出,而不用麻烦芯片
    发表于 08-18 08:09

    SPI主从机DMA通信如何实现

    SPI主从机硬件连接关系是怎样的?SPI主从机DMA通信如何实现
    发表于 02-17 06:15

    SPI改变时钟频率或者加上DMASPI FLASH性能有何影响?

    写入的影响都不大,速度都是一样的.提升时钟频率的话,要求驱动能力也要跟上(例如加上DMA),不然改变变化不大.甚至倒退?问题所以我测试的是否有问题?加入DMA对读取和擦除为什么可以有影响?为什么怎么改变方式,对于擦除没有任何影响
    发表于 02-02 15:24

    SPI—CH32V307VCT6实现SPI从机DMA收发

    SPI从机DMA收发使用CH32V307VCT6单片机实现主从SPI数据交换SPI从机IO口配置从机SP
    发表于 03-08 10:50

    测试一下SPI读写SD卡的速度

    的判断等操作,而且单字节传输也严重影响效率。如果自己优化一下,相信效率会有很大的提升。有兴趣的小伙伴可以试试。我们这次其实主要是测试SPI+DMA速度,所以就不在这里纠结了。  2.SPI+DMA接口
    发表于 03-23 14:47

    GD32-Colibri-F207实验板SPI-DMA

    GD32-Colibri-F207实验板SPI-DMA,很好的GD32资料,快来学习吧。
    发表于 04-21 16:35 43次下载

    如何使用STM32单片机实现DMA的同时发送和接收

    SPI通信中,可以同时开启发送和接收DMA请求,自动数据的发送和接收,完成数据的交换 基本步骤是: 1. 配置好SPI相应引脚功能 2. 配置和初始化SPI
    发表于 12-07 15:26 1w次阅读

    GD32F103配置SPI+DMA收发数据

    本文介绍如何配置GD32F103系列的SPIDMA,并贴出相关代码。
    发表于 12-22 19:15 108次下载
    GD32F103配置<b class='flag-5'>SPI+DMA</b>收发数据

    stm32f103使用dma和fpga进行spi通信

    stm32作为从机,fpga作为主机。进行spi通信。stm32使用dma进行数据接收。在dma中断中进行接收数据和处理。通过调节fpga里面spi数据的发送频率。来保证stm32实时
    发表于 12-22 19:29 95次下载
    stm32f103使用<b class='flag-5'>dma</b>和fpga进行<b class='flag-5'>spi</b>通信

    细说SPI主机发送性能最大化实现方案

    spififo的接口,并没用DMA来进行加速优化。本篇就是基于SPI配合DMA实现理论速度
    的头像 发表于 07-31 23:03 3233次阅读
    细说<b class='flag-5'>SPI</b>主机发送<b class='flag-5'>性能</b>最大化<b class='flag-5'>实现</b>方案

    基于STM32H7 EXTI+SPI+DMA双缓冲应用演示

    最近有STM32用户咨询---如何基于STM32H7系列芯片用EXTI0中断同步触发SPI DMA实现DMA双缓冲功能。当然,在论坛上也有发布类似咨询帖。其实,老早之前我算是未雨绸缪
    的头像 发表于 08-21 09:12 4782次阅读
    基于STM32H7 EXTI+<b class='flag-5'>SPI+DMA</b>双缓冲应用演示

    使用i.MX RT500实现SPI/DMA AN14170应用指南

    电子发烧友网站提供《使用i.MX RT500实现SPI/DMA AN14170应用指南.pdf》资料免费下载
    发表于 02-01 10:05 0次下载
    使用i.MX RT500<b class='flag-5'>实现</b><b class='flag-5'>SPI</b>/<b class='flag-5'>DMA</b> AN14170应用指南