打印

关于STM32的SPI联机调试问题,一起讨论

[复制链接]
5596|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电气罗凯瀚|  楼主 | 2012-5-15 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接触STM32已经3个月了。
期间是下了不少功夫看资料,对STM32的了解逐渐明了。
最近我在用SPI做通讯控制。
出现了一个让人郁闷也很想不通的问题。
STM32 SPI1用于从机接收数据,SPI2用于主机发送数据,在调试的时候一直让J-LINK仿真器联机我的MCU。中间为了联机调试方便。在我去掉J-LINK后,准备交工的时候,我再次试机。出现数据不正常现象。我赶紧插上J-LINK调试,发现又正确了。
后面反复实验,我发现只要J-LINK联机(注意不打开联机调试,只是简单的联机。J-LINK通电状态)。我的数据正常。
为了保证设计工作正常,我加班加点的去找问题,最后我把程序中SPI1的通讯方式改为了两线全双工通讯,MISO悬空。在去掉J-LINK的情况下就正常了。可是在J-LINK联机的情况下错误。我联机调试发现接收的SPI1->DR数据被乘以2。我当时就晕了。
马上要交工了。我硬着头皮把设计交上去,焦急的等待。
我发这个帖只是想大家讨论一下。
现在我把我的SPI配置给大家看看,回头我会继续去处理这个问题。有新发现再给大家说明。还有一点忘记说了,我上位机是通过GY7502_USB-SPI适配器给MCU的SPI1发送数据,这个适配器市面上买500元左右。比较好用。
        SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);     //失能SPI2,数据传输
  SPI_Cmd(SPI2,DISABLE);     //失能SPI2,数据传输
   
  SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;//设置SPI工作模式:设置为从SPI
        SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低
        SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;  //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        //SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
        SPI_Init(SPI1,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);//使能接收缓存非空中断屏蔽
        SPI_Cmd(SPI1,ENABLE);//使能SPI2外设
  //SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;//设置SPI单向或者双向的数据模式:SPI设置为单线双向发送
        SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低
        SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//数据捕获于第一个时钟沿
        SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;  //定义波特率预分频的值:波特率预分频值为2
        SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        //SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
  SPI_Init(SPI2,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
        SPI_Cmd(SPI2,ENABLE);//使能SPI2外设
沙发
香水城| | 2012-5-15 10:45 | 只看该作者
我已经说过很多遍:像这种接上仿真器可以工作,去掉仿真器却不能工作的情况,多数是因为MCU的外围设备上电时间比MCU的上电时间长,造成MCU上电后进行初始化时,这些外围设备还没有准备好,导致初始化失败。

使用特权

评论回复
板凳
yudengyun| | 2012-5-18 17:30 | 只看该作者
:)学习了

使用特权

评论回复
地板
电气罗凯瀚|  楼主 | 2012-5-21 14:06 | 只看该作者
呵呵,谢谢香主。原谅我的不仔细哈。

使用特权

评论回复
5
芯片代理| | 2012-5-21 15:27 | 只看该作者
:od

使用特权

评论回复
6
仙人球W| | 2014-10-17 14:56 | 只看该作者
受教受教!!

使用特权

评论回复
7
korea1441| | 2014-12-1 15:48 | 只看该作者
2楼,那遇到这种问题,该如何解决??

使用特权

评论回复
8
无为之益| | 2015-1-31 17:30 | 只看该作者
本帖最后由 无为之益 于 2015-2-1 23:03 编辑
香水城 发表于 2012-5-15 10:45
我已经说过很多遍:像这种接上仿真器可以工作,去掉仿真器却不能工作的情况,多数是因为MCU的外围设备上电 ...

版主,你好。我用 stm8也遇到这个问题,大概需要延时多长时间呢?
哎,这个问题害死我了,害得我今天周六还来加班。老外就在这等着。他下周就回国去。

使用特权

评论回复
9
无为之益| | 2015-2-1 23:03 | 只看该作者
楼主最后问题怎么解决的啊?

使用特权

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

本版积分规则

0

主题

21

帖子

0

粉丝