OpenEdv-开源电子网

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

第25章 I2C实验 问两个问题

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
发表于 2014-5-25 17:56:43 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]//在AT24CXX指定地址读出一个数据 //ReadAddr:开始读数的地址 //返回值 :读到的数据 u8 AT24CXX_ReadOneByte(u16 ReadAddr) { u8 temp=0; IIC_Start(); if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr>>8);//发送高地址 IIC_Wait_Ack(); }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址 IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); //进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop();//产生一个停止条件 return temp; }[/mw_shl_code]
I2C对24CXX的读写都是先发送8位的控制字,下面这个格式


然后我的问题是:
1、当 EE_TYPE>AT24C16 的时候,为什么可以把高地址(0-3位)和控制字一起发送?
2、当芯片为 24C1024, 地址为 17 位的时候,把函数这样改对吗? 
[mw_shl_code=c,true]u8 AT24CXX_ReadOneByte(u32 ReadAddr) {                       u8 temp=0;                                                                                       IIC_Start();       IIC_Send_Byte(0XA0);       //发送写命令     IIC_Wait_Ack();     IIC_Send_Byte((u8)(ReadAddr>>16));//发送地址,只有一位     IIC_Wait_Ack();     IIC_Send_Byte((u8)(ReadAddr>>8));//发送地址,8位     IIC_Wait_Ack();     IIC_Send_Byte((u8)(ReadAddr%256));   //发送低地址     IIC_Wait_Ack();             IIC_Start();                   IIC_Send_Byte(0XA1);           //进入接收模式                    IIC_Wait_Ack();         temp=IIC_Read_Byte(0);                IIC_Stop();//产生一个停止条件             return temp; }[/mw_shl_code]

@正点原子 谢谢 

最佳答案

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

1、按照芯片的通迅时序和数据操作即可 2、你这代码好像有点问题,你仔细看下17位怎么发送 3、先发送第16位,接着发送15~8,最后发送7~0位,你对照一下你的代码看下问题在什么地方
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-25 17:56:44 | 显示全部楼层
1、按照芯片的通迅时序和数据操作即可
2、你这代码好像有点问题,你仔细看下17位怎么发送
3、先发送第16位,接着发送15~8,最后发送7~0位,你对照一下你的代码看下问题在什么地方
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-25 17:56:44 | 显示全部楼层
回复【3楼】我要当警察了:
---------------------------------
IIC_Send_Byte((u8)((ReadAddr>>16)&0x01));
IIC_Wait_Ack();
IIC_Send_Byte((u8)(ReadAddr>>8));
IIC_Wait_Ack();
IIC_Send_Byte((u8)ReadAddr);
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-3-22
在线时间
0 小时
 楼主| 发表于 2014-5-26 09:23:52 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
对第二个问题的代码,我做了编辑修改。 17位地址,先发送第17位,再发送中间的8位,最后发送低8位。您看看,是这样吧?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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