打印

SPI存储器W25X16,Debug时卡在SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE

[复制链接]
13198|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanse51|  楼主 | 2013-2-17 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于CS5532硬件SPI一直调不顺。于是就想看看W25X16这个程式怎么硬件SPI实现的。结果Debugs时,卡在这里:
u32 SPI_FLASH_ReadDeviceID(void)
{
  u32 Temp = 0;
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send "RDID " instruction */
  SPI_FLASH_SendByte(W25X_DeviceID);  //   读ID
  SPI_FLASH_SendByte(Dummy_Byte);
  SPI_FLASH_SendByte(Dummy_Byte);
  SPI_FLASH_SendByte(Dummy_Byte);
  
  /* Read a byte from the FLASH */
  Temp = SPI_FLASH_SendByte(Dummy_Byte);
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();
  return Temp;
}
u8 SPI_FLASH_SendByte(u8 byte) //调用这个函数
{
  /* Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  /* Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(SPI1, byte);
  /* 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_I2S_ReceiveData(SPI1);
}
但是,在编译烧进板子后,串口输出一切正常。表明是成功编译执行程序的。不知是为什么,请高手多多指教。
沙发
杨爱林林| | 2013-2-17 17:15 | 只看该作者
也就是说
发送不成功  检查配置

使用特权

评论回复
板凳
qq65411253| | 2013-2-19 11:13 | 只看该作者
rxne只能读一次,如果调试器读取了,那么程序就永远读不到了。

使用特权

评论回复
地板
zhaoyu2005| | 2013-2-19 17:13 | 只看该作者
重点检查SPI配置程序和模块时钟,如果有条件就检测下输出的时钟和数据是否正常
如果还不行,就换个板子,我碰到一次片子其他模块工作正常,一个SPI坏掉的情况,另一个没坏,我在本版发过

使用特权

评论回复
5
yanse51|  楼主 | 2013-2-20 15:23 | 只看该作者
按照例程讲述的,实验现象一切正常。就是JTAG调试时,无法顺利出来现象

使用特权

评论回复
6
yxx284| | 2013-2-20 17:44 | 只看该作者
不要查询SPI_I2S_FLAG_RXNE位,可以换成查询busy,检测忙状态。我之前也也到过这个问题
即换成SPI_I2S_FLAG_BSY

使用特权

评论回复
7
yxx284| | 2013-2-20 17:53 | 只看该作者
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

使用特权

评论回复
8
yanse51|  楼主 | 2013-2-20 20:57 | 只看该作者
yxx284 发表于 2013-2-20 17:53
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

多谢,我试试先。

使用特权

评论回复
9
明月小厨| | 2013-3-1 06:40 | 只看该作者
yxx284 发表于 2013-2-20 17:44
不要查询SPI_I2S_FLAG_RXNE位,可以换成查询busy,检测忙状态。我之前也也到过这个问题
即换成SPI_I2S_FLAG ...

有这种事情吗?我调试时用SPI2读W25X16的ID,始终没成功;读的结果是0xFFFF;郁闷

使用特权

评论回复
10
石方炎| | 2015-5-11 22:43 | 只看该作者
yxx284 发表于 2013-2-20 17:53
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

多谢了  解决了大难题  也不知道是不是stm32的bug

使用特权

评论回复
11
zh113214| | 2015-5-12 07:01 | 只看该作者
赞!!

使用特权

评论回复
12
hunky| | 2016-9-18 22:06 | 只看该作者
前辈们的指示是没有问题的,重点价差spi配置问题和时钟模块,我使用的是spi2,配置时钟时将RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);写成了RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);虽然查看RCC_APB1Periph_SPI2是正确的,但是前面的RCC_APB2PeriphClockCmd不相匹配无法启动功能,而且编译器不提示错误。
希望大家借鉴,避免犯类似的错误

使用特权

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

本版积分规则

39

主题

88

帖子

0

粉丝