打印

STM32F0 SPI的问题

[复制链接]
11071|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
blowlow|  楼主 | 2012-7-7 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103上跑的好好的SPI Driver,弄到STM32F0 discovery上试试,发现不工作。

配置:
----------------------------------------------------------------------------
  SPI_StructInit( &SPI_InitStructure );
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_Init(SPI1, &SPI_InitStructure);

收发函数:
---------------------------------------------------------------
uint8_t SPI_RW(uint8_t uchar)
{
  /* Loop while DR register in not emplty */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  /* Send byte through the SPI1 peripheral */
  SPI_SendData8(SPI1, uchar);
   
  /* Wait to receive a byte */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

  /* Return the byte read from the SPI bus */
  return SPI_ReceiveData8(SPI1);
}

问题定位:
---------------------------------------------
1. 用逻辑分析仪抓输出,发现SCK和MOSI输出正常, SCK输出8个时钟脉冲

2. debug跟踪,发现程序死在 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 这一句上,实在是没道理啊。

3. 前面再加上一条 SPI_SendData8(SPI1, uchar);  连续发送两个8bit数据, 发现程序能跑下去了,就是说SPI_I2S_FLAG_RXNE终于有效了!!

但是这样的hack实在是不能用啊。 我猜是个硬件bug,请问哪位能帮忙验证一下??

工程文件和代码在这里: F0 WMCU.zip (50.52 KB)
沙发
aozima| | 2012-7-7 19:05 | 只看该作者
是否开启了调试功能,数据被其它人读走了?
比如memory窗口。

使用特权

评论回复
板凳
blowlow|  楼主 | 2012-7-9 11:53 | 只看该作者
搞定了,原来STM32F0的SPI配置和STM32F103的配置相差很大。 没有例程参考就不要搞了,会头晕的。

使用特权

评论回复
地板
blowlow|  楼主 | 2012-7-9 11:54 | 只看该作者
自己搞定啦。

使用特权

评论回复
5
香水城| | 2012-7-9 12:13 | 只看该作者
呵呵,STM32F0的例程函数库已经上市了,LZ可以去下载一个了

http://www.st.com/internet/com/S ... 0_stdperiph_lib.zip

使用特权

评论回复
6
hefengwei| | 2012-7-9 12:16 | 只看该作者
35元 STM32F103RBT最小系统 http://shwork.taobao.com

使用特权

评论回复
7
IJK| | 2012-7-9 15:54 | 只看该作者
STM32F0的SPI配置和STM32F103的配置,确实有些差别,主要差别在于STM32F0的SPI有FIFO,修改起来不算太难。

使用特权

评论回复
8
llglqh| | 2012-7-10 11:23 | 只看该作者
楼主能否共享下成功后的,例程?
好人一生平安!

使用特权

评论回复
9
zhaoqichao| | 2012-7-10 12:18 | 只看该作者
学习了

使用特权

评论回复
10
iLink| | 2012-12-28 11:17 | 只看该作者
有没有FIFO,是否开启全双工,差别很大。以前在有FIFO的ARM7TDMI上跑过的SPI代码,根据STM32F4代码改了一下,结果不好用了,浪费我1天半时间。

使用特权

评论回复
11
paul_vt| | 2014-1-23 16:27 | 只看该作者
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

使用特权

评论回复
12
yang96019| | 2014-7-28 14:53 | 只看该作者
赞一个!

使用特权

评论回复
13
wcg2000| | 2014-9-5 10:09 | 只看该作者
paul_vt 发表于 2014-1-23 16:27
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

就这个给出解决方法,感谢

使用特权

评论回复
14
afuliu| | 2015-1-13 09:56 | 只看该作者
paul_vt 发表于 2014-1-23 16:27
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

多谢楼主!:)

使用特权

评论回复
15
beicheng| | 2015-2-9 14:34 | 只看该作者
大哥,最后的配置是什么样子的啊。

使用特权

评论回复
16
crazybee| | 2015-7-11 22:21 | 只看该作者
有没有小例程?用LIB也行,操作就双向8位通讯。。。

使用特权

评论回复
17
zyingjie| | 2015-7-11 22:51 | 只看该作者
LZ搞定了来分享下吧

使用特权

评论回复
18
FireRiver9| | 2015-7-12 13:27 | 只看该作者
STM32F0的SPI配置和STM32F103的配置主要差别在于STM32F0的SPI有FIFO

使用特权

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

本版积分规则

2

主题

69

帖子

1

粉丝