OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11016|回复: 10

关于SPI_Flash_Read函数的一个疑问。

[复制链接]

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
发表于 2014-10-19 22:31:42 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]//读取SPI FLASH //在指定地址开始读取指定长度的数据 //pBuffer:数据存储区 //ReadAddr:开始读取的地址(24bit) //NumByteToRead:要读取的字节数(最大65535) void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead) { u16 i; SPI_FLASH_CS=0; //使能器件 SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令 SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址 SPI1_ReadWriteByte((u8)((ReadAddr)>>8)); SPI1_ReadWriteByte((u8)ReadAddr); for(i=0;i<NumByteToRead;i++) { pBuffer=SPI1_ReadWriteByte(0XFF); //循环读数 让MOSI维持高, 写入0XFF是根据flash的原理来的: flash 的写,是 只能从1 -> 0 而不能 从0->1所以 在写1的时候,如果原来数据是0,想写入1的话,就需要擦除 } SPI_FLASH_CS=1; //取消片选 } [/mw_shl_code]

在原子哥的SPI实验教程中,flash读取函数是这样的。

当我把:

    SPI1_ReadWriteByte((u8)((ReadAddr)>>16));   //发送24bit地址   
    SPI1_ReadWriteByte((u8)((ReadAddr)>>8));

这两句改为

SPI1_ReadWriteByte((u8)((ReadAddr)>>24));时,数据就无法读出。

这是因为STM32是32位的芯片,只能进行16位的移位吗?

可是在SD卡实验中,也有SD_SPI_ReadWriteByte(arg >> 24);这样的语句

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-10-20 20:48:40 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
不好意思,还是有点点不怎么清楚

为什么改成
SPI1_ReadWriteByte((u8)((ReadAddr)>>15));   //发送24bit地址    
 SPI1_ReadWriteByte((u8)((ReadAddr)>>9)); 

这样也行呢?  或者其他的14 10,也行的啊,但是17,7这样就不行啦。
回复 支持 0 反对 1

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2017-4-7 10:59:27 | 显示全部楼层
给你举个例子;
24bit二进制:1010 1010 0010 0010 0101 0101
SPI1_ReadWriteByte((u8)((ReadAddr)>>16))这句发送的是(u8)(1010 1010 0010 0010 0101 0101)>>16=(1010 1010);
SPI1_ReadWriteByte((u8)((ReadAddr)>>8))这句发送的是(u8)(1010 1010 0010 0010 0101 0101)>>8=(0010 0010);
SPI1_ReadWriteByte((u8)((ReadAddr)))这句发送的是(u8)(1010 1010 0010 0010 0101 0101)=(0101 0101);
人家这个是24bit的地址信号,spi一次只发送8bit,高位到地位发送,就是先发送23-16bit,再发送15-8bit,再发送7-0bit
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 1 反对 0

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-26
在线时间
5 小时
发表于 2015-3-12 14:43:22 | 显示全部楼层
//发送24bit地址
每次只能发送8个bit,所以这个24bit的地址需要连续发送3次。注意函数是按照从24bit的高位到低位顺次发送的。
假设这个24bit地址为ABCDEF,即10101011,11001101,11101111,刚好24个二进制数。
则这3次需要顺次发送的值分别为AB、CD、EF。怎么从ABCDEF分别得到AB、CD、EF呢?
ABCDEF右移16位后再(U8)强制转换为8位后得到AB
ABCDEF右移8位后再(U8)强制转换为8位后得到CD
ABCDEF经过(U8)强制转换为8位后得到EF

>>这个是bit操作,即位操作。ABCDEF>>24后,就成了0了。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-19 23:24:30 | 显示全部楼层
这两句,怎么能用1句代替???

你自己好好想想。
原本要发3个字节,才能表示24位,被你一改,完了,变成2个字节了,能用才怪。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-20 22:40:33 | 显示全部楼层
回复【3楼】why always me:
---------------------------------
 这么乱改,我 没时间陪你玩 。。。
你自己慢慢折腾吧,我时间有限,不好意思啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-1-22
在线时间
0 小时
 楼主| 发表于 2014-10-20 22:44:16 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-10-21 09:52:21 | 显示全部楼层
去看看C语言吧,基础打不好容易塌
目前在玩STM32,BBB,RPi
回复 支持 反对

使用道具 举报

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-12-12
在线时间
13 小时
发表于 2014-10-21 10:58:16 | 显示全部楼层
。。。。。。。
回复 支持 反对

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-7-24 15:39:20 | 显示全部楼层
这不就是发送数据的起始24 位地址吗!先发地址高8位,再发中8位,再发低8位
合肥-文盲
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2017-1-8
在线时间
27 小时
发表于 2017-4-7 10:11:04 | 显示全部楼层
bbslhb 发表于 2015-3-12 14:43
//发送24bit地址
每次只能发送8个bit,所以这个24bit的地址需要连续发送3次。注意函数是按照从24bit的高位 ...

解释的很好啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 08:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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