初级会员

- 积分
- 62
- 金钱
- 62
- 注册时间
- 2019-5-31
- 在线时间
- 18 小时
|
发表于 2020-2-16 23:21:01
|
显示全部楼层
首先回答为什么发0x00:
####这个是跟0x90这个指令有关的,查阅w25Qxx数据手册可以看到0x90这个指令后面必须跟6个地址位,时序图中标
为6个0x00,所以说发0x00这个主要看你用的指令有没有相关要求。你可以理解为发0x00就是0x90指令的一种固定格式。
####首先要说的是0xff这个也是一个指令,该指令主要用于退出SPI的QPI模式,也就是说只有你开启了QPI模式,0xff指令
才有用,否则它就是一个没意义的数据。在你这个问题的背景下,0xff是没意义的,那为什么要发这个没意义的数据呢?
这就跟SPI协议的数据收发规则有关了,这段代码的目标是要获取芯片的ID,所以我们在下发获取芯片ID指令后,必须
去接受从设备(也就是芯片)发送回来的信息,而SPI协议的主设备和从设备用的是同一时钟,因此要想获取从设备发送
过来的数据,我们主设备必须先打声招呼,也就是先发送一个没意义的数据到从设备,给它一个暗示,而为了不产生意外的
影响,这里才选择发送0xff这个数据。
那么问题来了 Temp|=SPI2_ReadWriteByte(0xFF)<<8;Temp|=SPI2_ReadWriteByte(0xFF); 为什么要发两次0xff呢?
查看w25Qxx数据手册的0x90指令时序图我们不难发现,在我们发送0x90指令结束后,下一个时钟脉冲里,从设备(芯片)
就开始发送我们需要的ID信息了,而这个信息是16位的,但我们调用的函数返回值却只有8位,故而定义了一个16位的Temp
临时变量接受ID信息,刚刚说了我们调用的函数只能返回8位数据,所以我们要分两次获取ID信息,所以第一次借助移位运算
先把第一部分的ID信息移动到Temp的高8位,第二次再接受ID信息剩下的8位,这样一来我们想要的ID信息就完美地存放到Temp
变量里边了。至于移位运算符,这个是C语言的知识,关键就是运算符优先级。 |
|