野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13602|回复: 5

关于SPI_FLASH例程中的疑问

[复制链接]
发表于 2016-3-3 09:55:26 | 显示全部楼层 |阅读模式
图一中为了得到硬件ID。连续发送4个指令,第5个指令由从机发送给主机ID.发送时调用图二的函数,看不懂图二中的while为什么不会影响第2个、第3个、第4个数据的发送。总觉得while会死循环。

求大神指点图二的两个while为什么不会死循环?

图1

图1

图2

图2
回复

使用道具 举报

发表于 2016-3-3 12:31:25 | 显示全部楼层
那不是死循环,标志位变成SET的时候就会跳出循环了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-3 14:11:19 | 显示全部楼层
flyleaf 发表于 2016-3-3 12:31
那不是死循环,标志位变成SET的时候就会跳出循环了

其实是不理解标志位为什么会自动变1,是不是发送完毕或者接收完毕都会置1啊?
回复 支持 反对

使用道具 举报

发表于 2016-3-3 14:12:14 | 显示全部楼层
舞告烟岛 发表于 2016-3-3 14:11
其实是不理解标志位为什么会自动变1,是不是发送完毕或者接收完毕都会置1啊?

这是寄存器的状态位,完成后外设会更新寄存器的状态标志
回复 支持 1 反对 0

使用道具 举报

发表于 2016-3-10 20:44:26 | 显示全部楼层
正如你在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);
这里我们只有在最后一个函数才保持函数的返回值,因为我们知道这个时候的返回值是我们需要的
而前面四个函数我们都没保存其函数返回值,只不过这些返回值没有意义;这时并不是说函数没有返回值,而已我们没有保存而已
http://www.firebbs.cn/forum.php? ... 3&highlight=spi
但是不知道为什么会有返回值,那个返回值到底是什么值?手册上也没说!!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-3-18 09:19:14 | 显示全部楼层
231274097 发表于 2016-3-10 20:44
正如你在1楼写的,确实是在发送4个数据后才会有设备ID值返回。
发送 SPI_FLASH_SendByte(0XAB)的时候,
...

非常感谢你的耐心指导。谢谢你。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 13:29 , Processed in 0.026864 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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