打印
[STM32F1]

【求助】SPI通信,stm32做从机给主机返回的数据有错位

[复制链接]
3334|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前两天发了一个关于stm32spi通信的帖子。是说两片stm32做主从SPI通信,然后从机返回的数据不正确。后来我做实验验证了,真是从机返回的数据不正确。我在主机程序最后加了if(SPI1->DR==某个数据)然后进行主机的自发自收。是可以的。但。。。比如我从机给的senddata是0x32,在主机里senddata() delay(1000)if(SPI1->DR==0X32)......



     LED灯闪三下




然后小灯并没有闪烁。有网友说会不会是时序的问题,我主从机的程序都是设置成一样的,一眼就能看出来了,难道说主从机设置成一样也会有错?我真搞不明白为什么从机返回的数据会错。究竟错在哪里
我从机的程序很简单的,因为我只要发送一个字节,从机的程序就只有一句senddata(0x32);
还有我想请问一下大家,为什么从机也要设置baudrate分频,从机应该没有baudrate的概念啊,反正从机是基于主机时钟工作的。是把?麻烦会的朋友解答一下谢谢大家了
沙发
amanda_s| | 2015-6-9 16:27 | 只看该作者
对于从机,BR[2:0]位的设置会被忽略。
你是怎么读SPI接收到的数据的?在中断里,还是主循环里查询RXNE标志?
感觉你读的方式有问题。参考一下ST官方的例程吧。

使用特权

评论回复
板凳
970253146|  楼主 | 2015-6-9 18:16 | 只看该作者
amanda_s 发表于 2015-6-9 16:27
对于从机,BR[2:0]位的设置会被忽略。
你是怎么读SPI接收到的数据的?在中断里,还是主循环里查询RXNE标志 ...

您好。这么说吧,先不说主机收到什么数据了。在主机发起时钟的时候,从机的MISO引脚输出的值都不是从机SPI1-DR里面的那个值,我现在主要纠结的就是这个问题啊。从机的MISO引脚给出来的数据都是错的,主机怎么读也没有用嘛。能告诉我为什么从机的MISO引脚会在时钟来临的时候,输出一个都不是我从机程序里面给DR附上的值,或者说可能是什么原因呢,我的主从设置跟极性都没错的。您是armcommunity里面的amanda_s吗?

使用特权

评论回复
地板
icecut| | 2015-6-9 18:24 | 只看该作者
无图无真相.
确切说.你根本不懂 spi...spi 有四种模式你知道么?这和茴香豆的茴字有四种写法是一样的.
不要那串口去理解 spi.

话说你就是被垃圾资料坑了的人.

使用特权

评论回复
5
970253146|  楼主 | 2015-6-10 17:44 | 只看该作者
说得太好了。的确是啊,我学习stm32是自己学的,手头上没什么资料,只得有时候去百度一下。我把从机的程序贴上来了。现在我的问题是主机时钟来了,然后MISO引脚上用逻辑分析仪看,发现数据跟我从机程序里面的值不一样,有2位移位了。从机不是一个时钟数据移一位吗?移出来怎么是错的?请问这是什么原因啊,从机的cpo跟极性都跟主机设置得一样的。特别想不i明白。麻烦您,麻烦您了

00000000000000000000000.jpg (131.48 KB )

00000000000000000000000.jpg

使用特权

评论回复
6
zchong| | 2015-6-10 21:07 | 只看该作者
970253146 发表于 2015-6-10 17:44
说得太好了。的确是啊,我学习stm32是自己学的,手头上没什么资料,只得有时候去百度一下。我把从机的程序 ...

全程监控CLK信号,看看是不是曾经出现过两个CLK

使用特权

评论回复
7
970253146|  楼主 | 2015-6-11 00:50 | 只看该作者
我接上逻辑分析仪了,产生的刚好是8位的时钟。我试过给从机发2次时钟,结果返回的那个错值都一样的。我怀疑数据没有写进去,写进去之后,再来时钟,输出的一定不是第一次的值。现在不知道是**作的问题还是spi的问题了

使用特权

评论回复
8
戈卫东| | 2015-6-11 04:38 | 只看该作者
你没有给出SS信号。
用寄存器的话是 SPI2->CR1 &= ~(1ul<<8); 库函数我就不知道了。。。

使用特权

评论回复
9
970253146|  楼主 | 2015-6-13 00:32 | 只看该作者
戈卫东 发表于 2015-6-11 04:38
你没有给出SS信号。
用寄存器的话是 SPI2->CR1 &= ~(1ul

是nss吗?我这里设置成了软件模式。已经是设置好的了。简单点说吧,就是我给8个时钟从机,按道理说从机会将DR寄存器里面的值一位接着一位的发送出来,现在MISO引脚也有数据,只是跟从机DR里的数据相比,错了两位,如11110000的就变成了00111100..您觉得这是什么原因呢?因为我的要求真是简单的不得了了,只给从机一个数据,然后发时钟给从机,希望在miso引脚看到从机DR的那个数据。

使用特权

评论回复
10
戈卫东| | 2015-6-13 08:14 | 只看该作者
看你贴出来的代码,你虽然设置了软件模式,但并没有设置NSS信号为“ACTIVE”。你明白吗?

使用特权

评论回复
11
戈卫东| | 2015-6-13 09:09 | 只看该作者
不过默认值好像就是Active。。。。。。。。。。。。。。。。。

使用特权

评论回复
12
seupenn| | 2019-7-31 10:55 | 只看该作者
zchong 发表于 2015-6-10 21:07
全程监控CLK信号,看看是不是曾经出现过两个CLK

现在用STM32和ZYNQ SPI通讯,STM32做从机,STM32接收的数据没有问题,但是STM32发出来的数据用示波器看过,确实是把最后一个byte的数据放到了第一个byte发送了,CLK感觉没有问题,MISO上面的第一个byte发送完以后确实有一个脉冲尖尖。。不知道是哪儿还没设置好?用的是库函数SPI中断模式。

使用特权

评论回复
13
LukeLiu123| | 2021-7-5 11:23 | 只看该作者
楼主这个问题怎么解决的?我最近也碰到了同样的问题, 用STM32  SPI作为从机, 在收到时钟时,发出的数据出现移位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

289

帖子

5

粉丝