OpenEdv-开源电子网

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

IIC求助:在指定地址写入长度为Len的数据

[复制链接]

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-5-19
在线时间
5 小时
发表于 2016-7-27 20:04:25 | 显示全部楼层 |阅读模式
3金钱
在看I2C的例程在看的时候,其它都能明白,但下面这两段程序总感觉没有完全弄明白! AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);        temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1),分别调用了一个字节的读和写程序;但(DataToWrite>>(8*t))&0xff 和(ReadAddr+Len-t-1)但这两个就是没明白,能帮忙解释下吗? 谢谢   
//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//WriteAddr  :开始写入的地址  
//DataToWrite:数据数组首地址
//Len        :要写入数据的长度2,4
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{         
        u8 t;
        for(t=0;t<Len;t++)
        {
                AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
        }                                                                                                    
}

//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr   :开始读出的地址
//返回值     :数据
//Len        :要读出数据的长度2,4
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{         
        u8 t;
        u32 temp=0;
        for(t=0;t<Len;t++)
        {
                temp<<=8;
                temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);                                            
        }
        return temp;

最佳答案

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

u32是4个字节的 0xAABBCCDD AA是8位 BB是8位 CC DD 也是8位 那么 >>8位 就是吧DD切掉 一开始是>>0 所以是0xAABBCCDD &0xFF 只是取8位 也就是DD 然后>>8位 就变成0x00AABBCC &0xFF 得到的就是CC 下面一样的原理 有点锯木头的感觉
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2016-7-27 20:04:26 | 显示全部楼层
u32是4个字节的   0xAABBCCDD     AA是8位   BB是8位   CC   DD  也是8位
那么  >>8位  就是吧DD切掉    一开始是>>0   所以是0xAABBCCDD   &0xFF
只是取8位  也就是DD  然后>>8位    就变成0x00AABBCC   &0xFF    得到的就是CC

下面一样的原理  有点锯木头的感觉   
自己选择的路,成家前走完。
回复

使用道具 举报

14

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-3-21
在线时间
63 小时
发表于 2016-7-27 20:37:36 | 显示全部楼层
AT24CXX_WriteOneByte和AT24CXX_ReadOneByte都是只读一个字节的 根据长度进行循环
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-5-19
在线时间
5 小时
 楼主| 发表于 2016-7-28 21:17:09 | 显示全部楼层
谢谢!终于明白了,把u32给忘了!相当于每次都是传送8个位, 从低字节开始写入,那也就是写入的数据最大不能超过4个字节是吗?超过4个节字后面就全是0了
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-5-19
在线时间
5 小时
 楼主| 发表于 2016-7-28 21:21:47 | 显示全部楼层
另外请问一下, temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);  为什么还要-1呢,-1是不是readaddr的实际地址是数据的存放地址+1
回复

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2016-3-27
在线时间
104 小时
发表于 2016-7-28 22:20:25 | 显示全部楼层
xiaoxin 发表于 2016-7-28 21:21
另外请问一下, temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);  为什么还要-1呢,-1是不是readaddr的实际 ...

不是因为temp先<<8位吗?
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-5-19
在线时间
5 小时
 楼主| 发表于 2016-8-1 21:28:16 | 显示全部楼层

用笔一个个算出来了!先temp=0,temp<<=8;temp还是等于0,然后 执行temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1)读出的是,要读数据的高位!下次循环来的时候,先执行temp<<=8位,也就是把第一次读到的数据放到高8位去,然后再执行temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1)... 总之,写的时候是从低位到高位,读的时候是从高位到低位
回复

使用道具 举报

7

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-7-18
在线时间
19 小时
发表于 2020-6-30 13:10:47 | 显示全部楼层
xiaoxin 发表于 2016-7-28 21:21
另外请问一下, temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);  为什么还要-1呢,-1是不是readaddr的实际 ...

楼主,能不能再解释下为啥减一,举个例子也行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 16:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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