STM32F0 SPI的问题

[复制链接]
12289|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, 下载次数: 151)
aozima 发表于 2012-7-7 19:05 | 显示全部楼层
是否开启了调试功能,数据被其它人读走了?
比如memory窗口。
 楼主| blowlow 发表于 2012-7-9 11:53 | 显示全部楼层
搞定了,原来STM32F0的SPI配置和STM32F103的配置相差很大。 没有例程参考就不要搞了,会头晕的。
 楼主| blowlow 发表于 2012-7-9 11:54 | 显示全部楼层
自己搞定啦。
香水城 发表于 2012-7-9 12:13 | 显示全部楼层
呵呵,STM32F0的例程函数库已经上市了,LZ可以去下载一个了

http://www.st.com/internet/com/S ... 0_stdperiph_lib.zip
hefengwei 发表于 2012-7-9 12:16 | 显示全部楼层
35元 STM32F103RBT最小系统 http://shwork.taobao.com
IJK 发表于 2012-7-9 15:54 | 显示全部楼层
STM32F0的SPI配置和STM32F103的配置,确实有些差别,主要差别在于STM32F0的SPI有FIFO,修改起来不算太难。
llglqh 发表于 2012-7-10 11:23 | 显示全部楼层
楼主能否共享下成功后的,例程?
好人一生平安!
zhaoqichao 发表于 2012-7-10 12:18 | 显示全部楼层
学习了
iLink 发表于 2012-12-28 11:17 | 显示全部楼层
有没有FIFO,是否开启全双工,差别很大。以前在有FIFO的ARM7TDMI上跑过的SPI代码,根据STM32F4代码改了一下,结果不好用了,浪费我1天半时间。
paul_vt 发表于 2014-1-23 16:27 | 显示全部楼层
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
yang96019 发表于 2014-7-28 14:53 | 显示全部楼层
赞一个!
wcg2000 发表于 2014-9-5 10:09 | 显示全部楼层
paul_vt 发表于 2014-1-23 16:27
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

就这个给出解决方法,感谢
afuliu 发表于 2015-1-13 09:56 | 显示全部楼层
paul_vt 发表于 2014-1-23 16:27
加上
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);

多谢楼主!:)
beicheng 发表于 2015-2-9 14:34 | 显示全部楼层
大哥,最后的配置是什么样子的啊。
crazybee 发表于 2015-7-11 22:21 | 显示全部楼层
有没有小例程?用LIB也行,操作就双向8位通讯。。。
zyingjie 发表于 2015-7-11 22:51 来自手机 | 显示全部楼层
LZ搞定了来分享下吧
FireRiver9 发表于 2015-7-12 13:27 | 显示全部楼层
STM32F0的SPI配置和STM32F103的配置主要差别在于STM32F0的SPI有FIFO
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

69

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部