打印
[STM32F1]

【继续求助】关于stm32的spi从机,从机返回的数据有错位

[复制链接]
9003|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
970253146|  楼主 | 2015-6-13 00:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 970253146 于 2015-6-13 00:25 编辑

之前曾经发帖求助,但问题还没得到解决。再描述一下我的问题。就是我现在用stm32f103rct6做spi从机。然后主机给出8个时钟时候。MISO引脚上接了逻辑分析仪看的数据,并不是我从机DR寄存器里面的那个值。比如说我从机DR里赋值是11110000,可是MISO上看到的波形是00111100.我主从时序配置都是一样的这个毋庸置疑,mode的slave跟master也没有选错。从机我是这样操作的:

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "sys.h"
#include "delay.h"

int main(void)
{
                SPI_InitTypeDef  SPI_InitStructure;
                GPIO_InitTypeDef  GPIO_InitStructure;        
               
          ErrorStatus HSEStartUpStatus;
                RCC_DeInit();                                                //ÅäÖÃRCCʱÖÓ//
          RCC_HSEConfig(RCC_HSE_ON);
                HSEStartUpStatus = RCC_WaitForHSEStartUp();
                if(HSEStartUpStatus == SUCCESS)
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    FLASH_SetLatency(FLASH_Latency_2);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
  }
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        
                RCC_APB2PeriphClockCmd(         RCC_APB2Periph_GPIOB, ENABLE );                                                                //³õʼ»¯GPIO¡¡//
                GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_15 |  GPIO_Pin_13);                        
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);        
               
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
                GPIO_Init(GPIOB, &GPIO_InitStructure);        
        
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );                //³õʼ»¯SPI        
                SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
                SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
                SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               
                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               
                SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        
                SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                
                SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        
                SPI_InitStructure.SPI_CRCPolynomial = 7;        
                SPI_Init(SPI2, &SPI_InitStructure);
                SPI_Cmd(SPI2, ENABLE);
                SPI_I2S_SendData(SPI1,0xf0);

按道理来说,执行完SPI_I2S_SendData(SPI1,0xf0);数据就进去从机的DR里面了,时钟来之后就一位一位的出来,是可以用逻辑分析仪抓到11110000的波形的,但现在不是。求助啊,就这个问题困扰我两周了,我水平很低,实在没什么办法。主机是好的
沙发
amanda_s| | 2015-6-15 17:12 | 只看该作者
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢?

使用特权

评论回复
板凳
玄德| | 2015-6-15 22:20 | 只看该作者
现在谈代码,为时尚早;

关键是从机要求的波形是什么样?主机又给了什么样?二者吻合吗?


使用特权

评论回复
地板
970253146|  楼主 | 2015-6-18 14:46 | 只看该作者
amanda_s 发表于 2015-6-15 17:12
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢? ...

你好。谢谢你的回答。其实我是这样操作的。我配置好了从机之后,就用主机给从机发送了8个时钟。然后用逻辑分析仪观察slave出来的波形,就这么简单,我用同样的方法去观察主机,能看到主机里面DR数据的波形以及时钟信号的。。。。但对从机。。然后就看到那个波形不正确。我现在没管主机接收。我也不知道问题出在哪里。我查了很多,有网友说有些口要配置成float模式,我也试过了。都是同样的结果。不过呢这个问题我不得不放一下了。我都已经花了两周时间在上面了。。。实在没办法了

使用特权

评论回复
5
970253146|  楼主 | 2015-6-18 14:46 | 只看该作者
本帖最后由 970253146 于 2015-6-18 14:48 编辑
amanda_s 发表于 2015-6-15 17:12
程序看起来没问题。是不是你抓的波形有问题。
直接读接收到的值对不对呢? ...
按道理来说,主机给出时钟,然后MISO引脚会看到从机DR寄存器里面的值一个一个跑出来时候的波形才对啊。这个问题就是在我学习SPI时,无意中遇到的。我就想把原因揪出来。两周了。。:'(

使用特权

评论回复
6
970253146|  楼主 | 2015-6-18 14:51 | 只看该作者
玄德 发表于 2015-6-15 22:20
现在谈代码,为时尚早;

关键是从机要求的波形是什么样?主机又给了什么样?二者吻合吗?

坚决要抵制***那个烂.到不能再烂的货:@:@!!!!!我在主机跟从机DR里分别赋值了啊,主机给出数据是观察SCLK跟MOSI引脚嘛,主机都是正确的啊,就是从机,也就是MISO引脚上观察到的数据有错,也不是全错,就是感觉多移了1位。但主机从几时钟极性都是一样的呢~!

使用特权

评论回复
7
玄德| | 2015-6-18 22:21 | 只看该作者

先站在主机的角度想:MISO 与 SCK 的极性,主机能正确识别吗?如果不能,该怎么调整?

然后站在从机的角度,同样想一想 MOSI 、SCK 的关系。

什么时候双方都认可对方,就可以正确通信了。

使用特权

评论回复
8
zzinzaghi| | 2015-11-16 15:59 | 只看该作者
我也碰到类似的问题,slave spi总是偏差一位,每次都会自动偏一位
后来发现是mode的问题,上电后clk自动变了一下导致slave每次偏差一位
不知道楼主的为什么这样

使用特权

评论回复
9
amanda_s| | 2015-11-20 11:42 | 只看该作者
zzinzaghi 发表于 2015-11-16 15:59
我也碰到类似的问题,slave spi总是偏差一位,每次都会自动偏一位
后来发现是mode的问题,上电后clk自动变 ...

具体是什么mode问题?能说详细点么?

使用特权

评论回复
10
lai832| | 2015-11-20 12:39 | 只看该作者
给你参考一下,
https://bbs.21ic.com/icview-1209740-1-1.html
也是主,从通信问题,我也弄了很久,在网上
http://lksong.blog.163.com/blog/static/1160899222013113123940279/
看到解决方法
你参考一下

使用特权

评论回复
11
970253146|  楼主 | 2015-11-25 16:15 | 只看该作者
lai832 发表于 2015-11-20 12:39
给你参考一下,
https://bbs.21ic.com/icview-1209740-1-1.html
也是主,从通信问题,我也弄了很久,在网上

帖子这么久了还有人回复,真好~!我当时弄那个问题足足一个半月,每天都在纠结。你想啊,本来是很简单的两小段程序,把我那段时间折磨得。。。。我看了一下你发给我的链接,那么说要解决这个问题的话,主从时钟极性就不能按理论上那样,设置成相同。按道理说,spi通信主机从机极性必须是一样的。但在stm32里面你要设成一样的就会有数据错位,对吧~!

使用特权

评论回复
12
lai832| | 2015-12-15 09:37 | 只看该作者
970253146 发表于 2015-11-25 16:15
帖子这么久了还有人回复,真好~!我当时弄那个问题足足一个半月,每天都在纠结。你想啊,本来是很简单的 ...

最后,我改成了TI模式.稳定

使用特权

评论回复
13
970253146|  楼主 | 2015-12-15 22:12 | 只看该作者
lai832 发表于 2015-12-15 09:37
最后,我改成了TI模式.稳定

所以说stm32的spi有bug,你同意不?这是我看别人下的结论,他遇到的问题跟我们的差不多

使用特权

评论回复
14
lai832| | 2015-12-23 11:07 | 只看该作者
970253146 发表于 2015-12-15 22:12
所以说stm32的spi有bug,你同意不?这是我看别人下的结论,他遇到的问题跟我们的差不多 ...

不在行这个,说不稳定,驱动其它器件时,时序设置很正常,只在两STM32主从机通迅时这样,而且我没有使用NSS脚,情况有些片面,所以还不足以说STM的SPI有BUG,
只希望后面的朋友不用在这上面花过多的时间

使用特权

评论回复
15
970253146|  楼主 | 2015-12-23 12:49 | 只看该作者
lai832 发表于 2015-12-23 11:07
不在行这个,说不稳定,驱动其它器件时,时序设置很正常,只在两STM32主从机通迅时这样,而且我没有使用NSS脚, ...

的确是,我当时花了一个多月。而且当时网上关于这个spi问题的**帖子几乎找不到。我还多买了2块开发板,一开始我以为自己那两块是坏的。。。以后的朋友们不要在这上面浪费时间了

使用特权

评论回复
16
zxm19820916| | 2016-5-12 17:02 | 只看该作者
奇怪,我主机用的是103ZE,从机用的是M0芯片,时钟极性配置为一样的才能正常通信。应该是要配置成一样的才对。
不知道楼主为什么会数据错位。

使用特权

评论回复
17
970253146|  楼主 | 2016-5-15 17:29 | 只看该作者
zxm19820916 发表于 2016-5-12 17:02
奇怪,我主机用的是103ZE,从机用的是M0芯片,时钟极性配置为一样的才能正常通信。应该是要配置成一样的才 ...

这个现象不止我一个人遇到过,确实是很奇怪。按道理是要配置成一样才可以的

使用特权

评论回复
18
a89102381| | 2017-5-17 17:40 | 只看该作者
求助呀,我也碰到这样的问题了,老是错位,而且主机和丛机中的任意一个复位下就又错位的不一样,好坑爹,希望楼主指点下,恳请得到楼主联系方式,拜托了

使用特权

评论回复
19
seupenn| | 2019-7-31 09:55 | 只看该作者
后来到底是怎么解决的??亲

使用特权

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

本版积分规则

93

主题

289

帖子

5

粉丝