OpenEdv-开源电子网

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

IIC实验

[复制链接]

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
发表于 2013-11-21 10:48:39 | 显示全部楼层 |阅读模式
//在24XX指定地址开始写入指定长度为LEN的内容
//WriteAddr :开始写入的地址
//DataToWrite:数据数组首地址
//Len       :长度
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);
}    
}
菜鸟的问题来了:这里不是说
DataToWrite是数据数组的首地址吗?但是函数AT24CXX_WriteOneByte()的第二个参数是数据啊,请问这里的数据首地址和数据是怎么通过上面红色对的那个表达式对应起来的啊?

紧接着后面从指定地址读长度为LEN的数据这个函数我也有点小疑惑,貌似读出来的数据适合原来存储的顺序相反啊,比如说原来相邻两个地址数据分别为:0X01,0X11,读出来的16位数据则为0X1101。是这样吧?

还有:我用原子的源代码,为什么程序烧进去之后没有按下KEY0,LCD上直接显示"24C02 Write Finished!"呢?

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-21 18:12:33 | 显示全部楼层
回复【楼主位】黑小子mxx:
---------------------------------
备注有误,不好意思啊.
改成:

//在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);
}     
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
 楼主| 发表于 2013-11-22 01:08:52 | 显示全部楼层
回复【2楼】正点回复【2楼】正点原子:
---------------------------------
如果DataToWrite是一个数组的话,那么AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);里面的DataToWrite就应该是该数组的首地址啊,对地址进行移位运算和与运算怎么能得到里面的数据呢?(因为AT24CXX_WriteOneByte函数的第二个参数是具体的数据啊!)
还有:该地址是u32型的,怎么和0xFF进行与运算啊?

您再看看这个,这是SPI实验中的flash.c的、中好几个函数都用到的语句:
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址    
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>8));   
    SPIx_ReadWriteByte((u8)Dst_Addr);
目的是为了发送24位地址,和上面那个函数目的是为了发送数据不同啊!但是两者采取的方式感觉是一样的(都是通过对地址进行移位)。
 
还麻烦原子哥指点迷津,可能我是钻进死胡同了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-22 23:17:43 | 显示全部楼层
回复【3楼】黑小子mxx:
---------------------------------
这个函数,最大只能写4个字节.也就一个U32,搞定了.
所以不是存首地址用的!!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
 楼主| 发表于 2013-11-23 12:42:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原来是这样啊,我还在纳闷说总共最大才4个字节还定义一个数组干嘛。始终把它当做一个数组所以就钻进死胡同了!
另外:(DataToWrite>>(8*t))前面需要加强制类型转换吗?因为后面的0XFF是8位的啊!位数不相同能进行与运算吗?(C语言没学好,还希望原子哥给个答案)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-23 16:47:05 | 显示全部楼层
当然可以.
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
 楼主| 发表于 2013-11-24 20:34:06 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
那一个16位的数和一个8位的数进行与运算的话,就是用16位数的低八位和8位数进行与咯?结果为8位?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-25 20:34:30 | 显示全部楼层
是的
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
 楼主| 发表于 2013-11-26 09:20:09 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
明白了,谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 17:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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