搜索
bottom↓
回复: 33

吐槽一下STM32的SPI作为从机的问题

[复制链接]

出0入0汤圆

发表于 2015-4-28 13:28:46 | 显示全部楼层 |阅读模式
本帖最后由 hantnt 于 2015-4-28 13:31 编辑

之前一直以为STM32就iic有bug,今天又发现当spi作为从机使用时会出现各种莫名其妙的问题。
首先是接收机制的问题,接收时只检测SCK的跳变沿,很容易发生错位问题,而且复位SPI移位寄存器内容依然,可能有人要怀疑是不是我自己程序的问题,但是我所有代码都是直接调用库函数的。
其次是在间歇接收几十次之后就会发生丢字节的问题,这个问题就很严重了。
最终放弃了用stm32作为spi从机的通信方式,还是用UART吧,白折腾了一天。
ps:我自己用FPGA写的SPI接口从机从未出现过类似问题。

编辑原因:改错别字 其实-其次

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

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

出0入0汤圆

发表于 2015-4-28 15:37:33 | 显示全部楼层
还真有这问题啊

出0入0汤圆

发表于 2015-4-28 15:38:54 | 显示全部楼层
没有用过STM32的SPI做从机,不知真假。

出0入0汤圆

发表于 2015-4-28 15:55:00 | 显示全部楼层
1. 接收时只检测SCK的跳变沿,为何会容易发生错位问题?

2. 复位SPI移位寄存器内容依然,那你认为应该是何值?0x00 或 0xFF,不同的值有分别吗?

出0入0汤圆

发表于 2015-4-28 16:05:52 | 显示全部楼层
STM32的SPI一直在使用,楼主的水平不够而已。大家都散了吧,没有重大消息

出0入0汤圆

发表于 2015-4-28 16:14:48 | 显示全部楼层
我用429DMA发 103DMA收 循环模式 很正常

出0入0汤圆

 楼主| 发表于 2015-4-28 17:11:12 | 显示全部楼层
dmxfeng 发表于 2015-4-28 16:14
我用429DMA发 103DMA收 循环模式 很正常

我用示波器的地碰一下就丢字节

出235入8汤圆

发表于 2015-4-28 17:34:13 | 显示全部楼层
会不会是信号质量不行呀。主SPI可以调驱动强度的吗。把不行的SPI抓出来看看。

出0入0汤圆

发表于 2015-4-28 17:51:47 | 显示全部楼层
要么程序有问题,要么硬件设计有问题,如果ST连SPI从机都做不好还怎么在社会上混呀

出0入0汤圆

发表于 2015-4-28 18:07:27 | 显示全部楼层
我也用了STM32的SPI做从机,FPGA做主机,运行稳定

出0入0汤圆

发表于 2015-4-28 19:17:04 | 显示全部楼层
间歇接收几十次之后就会发生丢字节的问题是你的主从CPOL、CPHA不匹配导致的。另外,电源不良的确很容易使SPI受到干扰。

出0入0汤圆

 楼主| 发表于 2015-4-28 19:29:30 | 显示全部楼层
senjet 发表于 2015-4-28 19:17
间歇接收几十次之后就会发生丢字节的问题是你的主从CPOL、CPHA不匹配导致的。另外,电源不良的确很容易使SP ...

下午改成了usart,usart很好用,spi没有开始停止的收发机制,容易发生错位。

出0入0汤圆

发表于 2015-4-28 19:39:20 | 显示全部楼层
但是USART有SPI速率快吗?

出0入0汤圆

 楼主| 发表于 2015-4-28 19:44:48 | 显示全部楼层
zhaoxukiller 发表于 2015-4-28 19:39
但是USART有SPI速率快吗?

还好,最高2.25Mbps,足够满足我的需求了,至少很稳定。

出0入0汤圆

发表于 2015-4-28 20:17:54 | 显示全部楼层
SPI配置问题,好好看手册

出0入0汤圆

 楼主| 发表于 2015-4-28 20:32:26 | 显示全部楼层
lujun723 发表于 2015-4-28 20:17
SPI配置问题,好好看手册

你的意思是说主从CPOL、CPHA吗? 我用的官方库,宏定义是一样的配置,没有道理F4的库和F1的库宏定义意义不一样的吧。

出0入0汤圆

发表于 2015-4-28 23:31:44 | 显示全部楼层
一直用SPI  主从机都是STM32     在同一个板上。 没有出现过问题。 有简单的校验机制。

出0入0汤圆

发表于 2015-4-29 09:06:47 | 显示全部楼层
我用STM32 SPI从机也遇到问题,上网搜了一下,有人反映过有问题。我的通信速度要求不高,后来改模拟从机完事。

出0入54汤圆

发表于 2015-4-29 09:16:29 | 显示全部楼层
我一直用SPI从机,硬件CS。FPGA做SPI主机,从未发生问题啊,STM32F429,目前用到最高速是12Mbps

SPI使用了DMA。另外楼主说的用示波器碰下就容易丢位,这个不能怪STM32,你这一碰产生的干扰可能会有好几个脉冲,这个会让STM32认作是SCK,SPI本来的时钟本来就是边沿检测,UART异步是到固定位置检测高低电平来判断0还是1.
你要测试的话应该是先把示波器接上,再通电来抓波形,而不是在通讯过程中用表笔去触碰来抓数据。

另外你说的启停没有不知道是什么意思?CS拉低的话STM32就开始准备接收SCK了。CS拉高的话STM32就停止接收SCK,同时表示当前传输完毕。

出0入0汤圆

 楼主| 发表于 2015-4-29 12:35:40 | 显示全部楼层
lusson 发表于 2015-4-29 09:16
我一直用SPI从机,硬件CS。FPGA做SPI主机,从未发生问题啊,STM32F429,目前用到最高速是12Mbps

SPI使用了 ...

哦,那估计是我没有用硬件cs的原因。发现库函数固然方便,但是稳定性欠佳,改用USART通信以后在通讯过程中拔掉线同样会发生下次无法正确接收数据的问题。
看来要想要可靠的通讯还是得自己写通讯函数才行,库函数很多东西都未考虑到。
芯片本身应该并不存在问题,还是程序本身不够健全,现在不得不自己重写这部分代码了。

出0入54汤圆

发表于 2015-4-29 13:35:06 | 显示全部楼层
通讯过程中拔掉再接上无法正确接收数据,是你协议的问题吧。。

出0入0汤圆

发表于 2015-4-29 13:39:25 | 显示全部楼层
hantnt 发表于 2015-4-29 12:35
哦,那估计是我没有用硬件cs的原因。发现库函数固然方便,但是稳定性欠佳,改用USART通信以后在通讯过程 ...

库函数只是帮你减少配置寄存器,怎么用,当然是你的问题了,怪不到库函数的,写库函数的人也不会预见你会怎么用,灵活性都在程序员这,如果都做死了,又会有新的问题

出0入0汤圆

 楼主| 发表于 2015-4-29 13:44:21 | 显示全部楼层
lusson 发表于 2015-4-29 13:35
通讯过程中拔掉再接上无法正确接收数据,是你协议的问题吧。。

我用的这个函数if(HAL_UART_Receive_IT(&Uart2Handle, (uint8_t *)RxBuffer, 10) == HAL_OK),
拔掉再接上就无法再次进入该该函数了,debug一下发现好几个标志位都被置位,还是得自己写的靠谱点儿,ST的库不想再去研究了,上次就发现有bug了,这次不会再去上面花时间了。

出0入0汤圆

 楼主| 发表于 2015-4-29 13:46:09 | 显示全部楼层
albert.hu 发表于 2015-4-29 13:39
库函数只是帮你减少配置寄存器,怎么用,当然是你的问题了,怪不到库函数的,写库函数的人也不会预见你会 ...

要是我去写这些函数,我肯定会将这些意外情况都考虑进去的,库不行只能说明他们的程序员考虑欠佳。

出0入0汤圆

发表于 2015-4-29 14:37:23 | 显示全部楼层
hantnt 发表于 2015-4-29 13:46
要是我去写这些函数,我肯定会将这些意外情况都考虑进去的,库不行只能说明他们的程序员考虑欠佳。 ...

那你自己写一个好了,本来ST的库就只是简化寄存器操作,不是什么应用程序框架,这是人家的目的,你需要框架,并不代表别人就需要

出0入0汤圆

 楼主| 发表于 2015-4-29 15:34:23 | 显示全部楼层
albert.hu 发表于 2015-4-29 14:37
那你自己写一个好了,本来ST的库就只是简化寄存器操作,不是什么应用程序框架,这是人家的目的,你需要框 ...

我写了差错控制,以及检错机制,现在即使拔掉线再插上也能继续正常通信了。

出0入0汤圆

发表于 2015-4-29 15:54:14 | 显示全部楼层
最好是,自己看完手册后自己配置。我没有用库函数。  示波器也可以随时测量,随时拔插都能正常通讯。

出0入4汤圆

发表于 2015-5-21 16:10:44 | 显示全部楼层
dmxfeng 发表于 2015-4-28 16:14
我用429DMA发 103DMA收 循环模式 很正常

大神可有demo程序给我学习一下?我在调407的从机,使用DMA方式,直接没反应。

出0入0汤圆

发表于 2015-5-21 17:42:52 | 显示全部楼层
zqf441775525 发表于 2015-5-21 16:10
大神可有demo程序给我学习一下?我在调407的从机,使用DMA方式,直接没反应。 ...



这个是429的程序

本帖子中包含更多资源

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

x

出0入4汤圆

发表于 2015-5-21 18:58:19 | 显示全部楼层
dmxfeng 发表于 2015-5-21 17:42
这个是429的程序

好的,非常感谢!学习一下。

出0入0汤圆

发表于 2016-3-21 14:02:02 | 显示全部楼层
http://www.usbxyz.com/archives/226
USB2SPI从机接收数据不丢失数据

出0入0汤圆

发表于 2016-5-3 15:31:06 | 显示全部楼层
我也遇到类似的情况,应该和楼主遇到的情况相同,楼主表述有点不太清楚,我遇到的问题是这样的:有两块STM32F107,一块做主机,一块做从机,从机SPI未使用硬件CS,正常情况下SPI可以正常通信,但当对主CPU烧写程序或者进行复位操作时,如果此时SPI正在传输数据,那么从机SPI的移位寄存器中就已经存入了部分数据位,然后主CPU重新开始运行,正常向从机SPI发送数据,由于从机SPI未使用硬件CS,从机SPI的移位寄存器中仍存有先前的部分数据,因此会导致数据错位。(之前没有用过STM32的SPI做从机,考虑不周,没有将硬件CS引脚引出来)

想采用的解决方式是:主机通过IO口向从机发送同步标识(也就是用软件模拟CS),每次发送一帧前,均通知从机SPI将移位寄存器清空。

但理想很丰满,现实却很骨感。找了半天也没找到怎么清空从机SPI的移位寄存器。哪位大神可以给点指点呀。在此先谢过。

出0入0汤圆

发表于 2017-9-1 17:43:53 | 显示全部楼层
ailibuli 发表于 2016-5-3 15:31
我也遇到类似的情况,应该和楼主遇到的情况相同,楼主表述有点不太清楚,我遇到的问题是这样的:有两块STM3 ...

在SPI中断里面  增加先关闭SPI 再打开 SPI  就ok了
SPI2->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_SPE);
SPI2->CR1 |= SPI_CR1_SPE;

出0入4汤圆

发表于 2017-9-1 17:50:32 | 显示全部楼层
我用STM32的SPI从机通信做了很多了,没发现有问题,最多的每次连续传输10K字节,200mS传输一次,没发现问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-22 03:17

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

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