OpenEdv-开源电子网

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

关于移位的问题

[复制链接]

29

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
511
金钱
511
注册时间
2015-10-11
在线时间
102 小时
发表于 2016-2-27 10:05:41 | 显示全部楼层 |阅读模式
1金钱
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
        u16 i;                                                                                       
        W25QXX_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[i]=SPI1_ReadWriteByte(0XFF);   //循环读数  
    }
        W25QXX_CS=1;                                                   
}
以上代码中的
SPI1_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址   
    SPI1_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)ReadAddr);  是把ReadAddr移到哪里去了啊,按道理是一出去后就没有了啊,怎么又开始移了,望大神指教啊

最佳答案

查看完整内容[请看2#楼]

按位来理解吧!SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址 [/backcolor] SPI1_ReadWriteByte((u8)((ReadAddr)>>8)); [/backcolor] SPI1_ReadWriteByte((u8)ReadAddr); 是把ReadAddr移到哪里去了啊,按道理是一出去后就没有了啊,怎么又开始移了,望大神指教啊[/backcolor] 0x00 0xaa ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3340
金钱
3340
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-2-27 10:05:42 | 显示全部楼层
本帖最后由 likunxue 于 2016-2-27 13:37 编辑

按位来理解吧!SPI1_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址   
SPI1_ReadWriteByte((u8)((ReadAddr)>>8));   
SPI1_ReadWriteByte((u8)ReadAddr);  是把ReadAddr移到哪里去了啊,按道理是一出去后就没有了啊,怎么又开始移了,望大神指教啊
                                                                                                     0x00        0xaa        0x55         0xff
首先 假若  ReadAddr 是一个32位的变量  值为 0x00AA55FF;   二进制表示:  00000000  10101010  01010101  11111111    共32个位
                                                                                                     32            24           16            8
SPI1_ReadWriteByte((u8)((ReadAddr)>>16));       这里的 (u8)((ReadAddr)>>16)  意意是把 ReadAddr的值前移16个位 变化为  二进制 00000000  00000000  00000000  10101010   然后 (u8) 将其强制转化为8位数据结构  变为 0XAA 发送出去,  
但记住  这时ReadAddr的值并没有改变,依然是 原值  0X00AA55AA;  看C语言基础的书去理解 左值操作  (只取了一个 0XAA的值发送出去)SPI1_ReadWriteByte((u8)((ReadAddr)>>8));    按上面的意思 取到的值是 0X55;
因为 ReadAddr>>8 后 结果是 00000000 00000000  10101010  01010101     强制转换为8位后, 高位不要, 只取低8位 到到0X55;
SPI1_ReadWriteByte((u8)ReadAddr);  取到的值是   0XFF; 高位都不要,只取低8位
分三次将 ReadAddr 中的24位值按8位的方式发送出去.

能理解不?




回复

使用道具 举报

29

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
511
金钱
511
注册时间
2015-10-11
在线时间
102 小时
 楼主| 发表于 2016-3-6 12:33:22 | 显示全部楼层
谢谢了,感激你
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 07:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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