关于SPI_Flash_Read函数的一个疑问。

2019-08-22 15:45发布

[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);这样的语句
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
bbslhb
1楼-- · 2019-08-22 21:34
//发送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了。
正点原子
2楼-- · 2019-08-23 01:51
这两句,怎么能用1句代替???

你自己好好想想。
原本要发3个字节,才能表示24位,被你一改,完了,变成2个字节了,能用才怪。
why always me
3楼-- · 2019-08-23 06:42
回复【2楼】正点原子:
---------------------------------
不好意思,还是有点点不怎么清楚

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

这样也行呢?  或者其他的14 10,也行的啊,但是17,7这样就不行啦。
正点原子
4楼-- · 2019-08-23 09:33
 精彩回答 2  元偷偷看……
why always me
5楼-- · 2019-08-23 14:24
回复【4楼】正点原子:
---------------------------------
谢谢
w0rmis20
6楼-- · 2019-08-23 17:13
去看看C语言吧,基础打不好容易塌

一周热门 更多>