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

[复制链接]
 楼主| 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坏掉的情况,另一个没坏,我在本版发过
 楼主| yanse51 发表于 2013-2-20 15:23 | 显示全部楼层
按照例程讲述的,实验现象一切正常。就是JTAG调试时,无法顺利出来现象
yxx284 发表于 2013-2-20 17:44 | 显示全部楼层
不要查询SPI_I2S_FLAG_RXNE位,可以换成查询busy,检测忙状态。我之前也也到过这个问题
即换成SPI_I2S_FLAG_BSY
yxx284 发表于 2013-2-20 17:53 | 显示全部楼层
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
 楼主| yanse51 发表于 2013-2-20 20:57 | 显示全部楼层
yxx284 发表于 2013-2-20 17:53
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

多谢,我试试先。
明月小厨 发表于 2013-3-1 06:40 | 显示全部楼层
yxx284 发表于 2013-2-20 17:44
不要查询SPI_I2S_FLAG_RXNE位,可以换成查询busy,检测忙状态。我之前也也到过这个问题
即换成SPI_I2S_FLAG ...

有这种事情吗?我调试时用SPI2读W25X16的ID,始终没成功;读的结果是0xFFFF;郁闷
石方炎 发表于 2015-5-11 22:43 | 显示全部楼层
yxx284 发表于 2013-2-20 17:53
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);

多谢了  解决了大难题  也不知道是不是stm32的bug
zh113214 发表于 2015-5-12 07:01 | 显示全部楼层
赞!!
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

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