搜索
bottom↓
回复: 27

这算是SPI的硬件bug吗,SPI时钟二分频时SCK信号无法连续

[复制链接]

出0入24汤圆

发表于 2018-7-9 15:02:49 | 显示全部楼层 |阅读模式
刚刚测试发现SPI的时钟是AHB总线HCLK时钟二分频时,SPI的SCK时钟不连贯,字节与字节之间存在不确定的延时

环境:芯片,STM32F103C8T6,测试SPI1和SPI2,分别位于APB2和APB1总线,CPU主频20M(选择这个频率是为了方便设置时钟分频,APB1无法超过36M)使用DMA发送,DMA优先级设置为最高,SPI和DMA都是字节发送

测试:修改PCLK时钟分频系数,和SPI时钟分频系数,观察SCK时钟是否连贯

时钟数
分为三种情况
1,APB时钟1分频,SPI 2分频,SCK不连贯
2,APB时钟2分频,SPI 2分频,SCK连贯
2,APB时钟1分频,SPI 4分频,SCK连贯

不连贯的SCK时钟

连贯的SCK时钟

结论:SPI时钟是HCLK时钟2分频时,SPI无法连续发送(其它CPU主频,或者仅使能一个SPI,不影响这个结论)

可能的原因分析:1,SPI的BUG,二分频时,内部时钟同步存在问题之类的
                          2,DMA带宽不够,或者仲裁有问题,但是从发送寄存器非空开始请求DMA传输到移位寄存器移位完成,中间足足有16个CPU时钟周期,不太可能仲裁不过来或者带宽不够

请诸位坛友帮忙分析分析

Cube配置出来的代码,核心的只有这几句话
  1.   while (1)
  2.   {

  3.       if (HAL_DMA_GetState(&hdma_spi1_tx)== HAL_DMA_STATE_READY)
  4.       {
  5.           WS2812b_Display2();
  6.           HAL_SPI_Transmit_DMA(&hspi1, spi_SendBuf, SENDLENGTH);
  7.       }
  8.       
  9.       if (HAL_DMA_GetState(&hdma_spi2_tx)== HAL_DMA_STATE_READY)
  10.       {
  11.         
  12.           HAL_SPI_Transmit_DMA(&hspi2, spi_SendBuf, SENDLENGTH);
  13.       }


  14.   /* USER CODE END WHILE */

  15.   /* USER CODE BEGIN 3 */

  16.   }
复制代码



附上测试代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2018-7-9 15:48:40 | 显示全部楼层
难说。。。

出0入0汤圆

发表于 2018-7-9 16:06:49 | 显示全部楼层
连续是指发送连续字节?

出0入0汤圆

发表于 2018-7-9 16:07:49 | 显示全部楼层
这不是bug,谁规定SPI 的时钟一定要连续?

另外,一个字节的8个位并不会出现此问题,此现象只出现在byte与byte之间。你用其它MCU,如果没有DMA,在SPI发送完当前字节后,MCU准备数据的时间大于1个位的时间的话,一样会出现这种情况。

出0入24汤圆

 楼主| 发表于 2018-7-9 16:37:23 | 显示全部楼层
sme 发表于 2018-7-9 16:07
这不是bug,谁规定SPI 的时钟一定要连续?

另外,一个字节的8个位并不会出现此问题,此现象只出现在byte与 ...



ST规定的必须连续

我关注的是为什么二分频的时候无法做到连续,大于二分频就能做到
另外16位发送就能做到二分频连续发送

用其它MCU,或者STM32不开DMA,同样可以做到时钟连续

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入24汤圆

 楼主| 发表于 2018-7-9 16:39:51 | 显示全部楼层
新的测试,SPI1和SPI2都使用16位模式,二分频的时候可以保持时钟连续
两个SPI一个8位模式,另一个16位模式,二分频,16位的正常,8位的不连续

出0入0汤圆

发表于 2018-7-9 17:03:33 | 显示全部楼层
楼主要不要先评估一下DMA的性能

出0入0汤圆

发表于 2018-7-9 17:10:11 | 显示全部楼层
我印象中F1的DMA性能比较捉鸡。那个DMA只有一个Master,还没有FIFO。我以前测过M2M传输,感觉比较慢,好像要10几个周期才能传一次。

出0入0汤圆

发表于 2018-7-9 17:26:21 | 显示全部楼层
DMA操作带宽是有限制的,DMA的硬搬运也是相对轮训或中断方式而言的
不信,你开1个SPI的DMA和2个SPI的DMA,看看是不是时钟连续的门限频率都不同,明显DMA多了容易趴下

出0入0汤圆

发表于 2018-7-9 17:38:22 | 显示全部楼层
20061002838 发表于 2018-7-9 16:37
ST规定的必须连续

我关注的是为什么二分频的时候无法做到连续,大于二分频就能做到

你的截圖是說滿足條件會讓sck是連續,沒有說必須是連續的。

出0入0汤圆

发表于 2018-7-9 17:51:13 | 显示全部楼层
20061002838 发表于 2018-7-9 16:37
ST规定的必须连续

我关注的是为什么二分频的时候无法做到连续,大于二分频就能做到

没有说必须连续,另外前提条件是“软件足够快”。

其实就是带宽(或者是响应时间)的问题,其它MCU要做到连续,无非是SPI频率和你MCU的主频相差甚远,你用软件方式控制SPI,主频和SPI频率接近,你看还能连续不?

出0入0汤圆

发表于 2018-7-9 22:35:40 | 显示全部楼层
把HCLK提高, 一切问题都解决了。有这么高的性能为啥不用呢。

出0入1209汤圆

发表于 2018-7-9 22:58:42 | 显示全部楼层
ST连那个千年的硬件NSS不能用的bug都不修,这个算毛。当然人家ST说那不是BUG,就没有那功能。

出0入36汤圆

发表于 2018-7-9 22:59:19 来自手机 | 显示全部楼层
我同时开了6个dma……还没细看波形……

出0入24汤圆

 楼主| 发表于 2018-7-10 01:04:56 | 显示全部楼层
又做了两个测试,一个是TIM触发DMA传输数据到GPIO口,测量TIM CC通道翻转和GPIO跳变之间的时间差
另一个是DMA存储器到存储器模式输出数据到多个GPIO口,测量连续的两个GPIO跳变之间的时间差
结果是两个时间差,差不多都是HCLK时钟的9-11倍,说明一次完整的DMA传输需要9-11个HCLK周期,跟规格书上面参数的吻合
从延迟角度考虑,TXE置位后,有差不多14个HCLK时钟周期用于DMA传输下一个SPI数据,非常勉强


根据上面的公式,20M 主时钟下,APB2上最大数据带宽为 20M/14 =  1.4M次/秒
SPI实际发送时,1/(0.1us*8)= 1.25M次/秒,接近于最大带宽,也是非常勉强
说明DMA延迟和带宽都有可能造成SCK不连续

TIM触发DMA传输数据到GPIO口,每次TIM翻转触发一个GPIO的跳变,时钟72M

DMA存储器到存储器模式输出数据到多个GPIO口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出140入8汤圆

发表于 2018-7-10 05:57:53 | 显示全部楼层
DMA 用多了,DMA仲裁器也会很累的,记得自己以前做过一个407的项目,把所有DMA流用完了,全开了收发中断…出现莫名其妙的问题…

出0入475汤圆

发表于 2018-7-10 08:19:47 来自手机 | 显示全部楼层
吓得我赶紧去看看我的spi的DMA输出时钟是否连续,我恰好就是利用了他的这个特性来满足我的需要,不过根据上面的一些分析,感觉应该是问题不大,至少以前的查看中没有出现这个问题。再加上系统时钟60来M,spi才2M,可能还好吧

出0入22汤圆

发表于 2018-7-10 08:50:46 来自手机 | 显示全部楼层
我以为dma很厉害呢,原来也有天花板

出0入24汤圆

 楼主| 发表于 2018-7-10 11:48:48 | 显示全部楼层
终极测试,确认是DMA带宽问题导致
主程序里面用WFI指令停掉CPU,避免CPU占用总线带宽
一个IO口输出翻转指示中断程序

两个SPI的情况,改善不大,某些时刻还是不连贯

单个SPI的情况,效果很明显,仅有DMA占用总线时,SCK是连贯的;同时CPU和DMA同时访问总线,会导致不连贯
说明是带宽不够所导致

第二张截图里面,DMA启动不久,CPU就停止工作了,不连贯现象只会出现一次,可以通过先发送两个字节的0x00做到CPU不影响正常发送

  1. void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
  2. {

  3.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);

  4.     HAL_SPI_Transmit_DMA(hspi, spi_SendBuf, SENDLENGTH);
  5.    
  6.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);

  7. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入24汤圆

 楼主| 发表于 2018-7-10 11:56:49 | 显示全部楼层
sme 发表于 2018-7-9 17:51
没有说必须连续,另外前提条件是“软件足够快”。

其实就是带宽(或者是响应时间)的问题,其它MCU要做 ...

确实是带宽原因导致,但不是响应时间(延迟)导致

出0入24汤圆

 楼主| 发表于 2018-7-10 11:57:48 | 显示全部楼层
putty 发表于 2018-7-9 22:35
把HCLK提高, 一切问题都解决了。有这么高的性能为啥不用呢。

不是在研究如何解决问题,而是研究出现问题的原因

出0入24汤圆

 楼主| 发表于 2018-7-10 12:01:42 | 显示全部楼层
1a2b3c 发表于 2018-7-10 08:19
吓得我赶紧去看看我的spi的DMA输出时钟是否连续,我恰好就是利用了他的这个特性来满足我的需要,不过根据上 ...

你这有问题的可能性太小太小,你是60M主频2M SCK,我是20M主频10M SCK ,差了15倍
而且这个现象本身不会影响绝大多数的SPI应用,除非SPI本身的时序要求很严格
这个现象本来就是在驱动WS2812,非SPI得应用中发现的

出0入24汤圆

 楼主| 发表于 2018-7-10 12:02:37 | 显示全部楼层
zxq6 发表于 2018-7-10 08:50
我以为dma很厉害呢,原来也有天花板

是啊,有个天花板,F1,F0,F3的天花板可能还比较矮

出0入0汤圆

发表于 2018-7-10 12:10:47 | 显示全部楼层
感谢楼主,好经验!原来还真没注意这方面问题,以为dma没有天花板的,,,

出30入54汤圆

发表于 2018-7-10 16:33:06 | 显示全部楼层
DMA当然也要占用总线资源的,在一些总线架构里面,如果代码和DMA指向的同一个bank的内存,还会发生DMA的各种问题

出0入0汤圆

发表于 2020-5-23 23:55:00 | 显示全部楼层
看了dspic33的波形,字节与字节中间确实存在不确定延时,但是不影响使用,就没管

出0入0汤圆

发表于 2020-5-24 00:33:38 | 显示全部楼层
本帖最后由 huangxiaolpbany 于 2020-5-24 00:36 编辑
sme 发表于 2018-7-9 16:07
这不是bug,谁规定SPI 的时钟一定要连续?

另外,一个字节的8个位并不会出现此问题,此现象只出现在byte与 ...


回复错误,删除!

出0入300汤圆

发表于 2020-5-26 05:44:21 来自手机 | 显示全部楼层
哈尔库就没严格时序了,我用h750高速输出一个数组的数据到端口,就不能快,中间会断不连续,除非足够慢。这都是因为哈尔库有个定时器非要占用不可。总的来说,设计芯片的人肯定知道,他们就是想让你用的不舒服没任何别的理由。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表