野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17359|回复: 6

求助 STM32 ISO-MINI 用SPI读取W25Q64 deviceID 的函数问题

[复制链接]
发表于 2015-10-26 21:42:52 | 显示全部楼层 |阅读模式
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);
  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);
}
请问各位大大和火哥,这段函数是读取W25Q64的设备ID ,W25Q64的数据手册要求是先发送一个0XAB,在连续发送三个字节的任意编码,在第5次发送一个字节的时候,W25Q64会返回它的设备ID号,我现在就有一个问题如果第五次W25Q64才会返回他的设备ID号,那么前面发送数据的时候是如何退出这个函数的啊 /* Wait to receive a byte */
                                              while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

不是就应该一直在那等待吗?我看到原子战舰的这个部分都会加一个超时退出的函数,一直搞不清楚,希望大大们,能帮我解此惑,感激不尽

回复

使用道具 举报

发表于 2015-10-27 09:05:54 | 显示全部楼层
是在那里一直等到有返回数据
最好是加个超时函数,在芯片可以正常工作时这个等待时间是非常小的,加超时函数只是防止芯片不工作情况下导致程序卡死
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-27 17:57:50 | 显示全部楼层
亽亼 发表于 2015-10-27 09:05
是在那里一直等到有返回数据
最好是加个超时函数,在芯片可以正常工作时这个等待时间是非常小的,加超时函 ...

谢谢你的答疑,可是用SPI读取他的设备ID的时候不是要先发送一个0XAB,在连续发送三个任意字节之后,才会返回ID号吗?我的问题是用下面这个函数发送 SPI_FLASH_SendByte(0XAB)的时候,不就一直在while那里等待吗?如何在发送连续的3个字节了?
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);//会在这里等待?如何退出这里,在发送另外的3个任意字节了?
   /* Return the byte read from the SPI bus */如何
   return SPI_I2S_ReceiveData(SPI1);
}
麻烦你给我仔细讲哈,谢谢
回复 支持 反对

使用道具 举报

发表于 2015-10-27 18:55:21 | 显示全部楼层
正如你在1楼写的,确实是在发送4个数据后才会有设备ID值返回。
发送 SPI_FLASH_SendByte(0XAB)的时候,
会在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);等一下,直到条件满足才会跳出
你要直到当你发送SPI_FLASH_SendByte(0XAB)之后,SPI Flash是有返回值的(所以会跳出那个while循环),只不过这个返回值对我们没有意义
同样的,在发送三个SPI_FLASH_SendByte(Dummy_Byte);时都是有返回值的。
  /* Send "RDID " instruction */
  SPI_FLASH_SendByte(W25X_DeviceID);
  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);
这里我们只有在最后一个函数才保持函数的返回值,因为我们知道这个时候的返回值是我们需要的
而前面四个函数我们都没保存其函数返回值,只不过这些返回值没有意义;这时并不是说函数没有返回值,而已我们没有保存而已。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-27 19:43:25 | 显示全部楼层
亽亼 发表于 2015-10-27 18:55
正如你在1楼写的,确实是在发送4个数据后才会有设备ID值返回。
发送 SPI_FLASH_SendByte(0XAB)的时候,
...

真的好谢谢你,解决了我的问题,因为野火的PDF教程和视频都没有说这个原因,我一直很烦恼,真的谢谢你,但是关于那个没有意义的返回值到底是啥了?我在W25Q64的英文手册上也没有看到,麻烦你在给我说哈哈,嘿嘿,麻烦你了,谢谢!问题不能解决透彻真的很恼火的,嘿嘿!
回复 支持 反对

使用道具 举报

发表于 2015-10-28 08:39:12 | 显示全部楼层
那个返回值到底是什么我都没去关注过,也没有关注的必要啊
你可以使用串口调试把它们的值打印到串口看看吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-28 10:14:07 | 显示全部楼层
亽亼 发表于 2015-10-28 08:39
那个返回值到底是什么我都没去关注过,也没有关注的必要啊
你可以使用串口调试把它们的值打印到串口看看吧

谢谢,我明白了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 05:22 , Processed in 0.029803 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表