IIC_Send_Byte(0XA0+((WriteAddr/256)<<1))之我的见解

2019-08-16 21:35发布

因为是刚学习STM32,所以也看到很多人对这行代码不是很理解,我就来说说我自己的理解吧,也不知道是不是就这么,不对的话大神们多多指正,
首先因为EPPROM有不同型号,24C02 地址1010 A1 A2 A3 R/W 而其他的型号 A1 A2 A3 则变为 a10 a9 a8 。

其实0XA0相当于一扇门,而这一扇门里面有256位住户,也就是一个字节。WriteAddr/256这句话,就当于超过了一个字节,则需要移位了。
1010 A1 A2 a8 0 就等于另外一扇门, 里面也有256位住户。若再超过,则使用A2的门地址,依次类推。

不知道我的理解正不正确。请大家多多指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wuxixiaoli
1楼-- · 2019-08-17 03:22
该类器件要通过iic总线操作,读写过程中都要先寻址,这类器件地址有两个字节组成,如下表,1010是固定的,A表示器件地址,可以拉高和拉低,iic总线上可以并接2的几次方个器件。P表示具体的内部地址数,比如at24c02共有256个字节,第二个地址字节完全可以满足,不用P。但是at24c04一个有512个字节,需要9位地址线,第一个字节中的p就表示地址线了,p=0表示低256字节,1表示高256字节。
注意:一般页写可以连续写8个数据。主机每发送一个字节都要接受从机的应答信号。


该类器件是采用iic总线进行操作的,器件地址根据容量的不同稍有不同,如下
对于芯片的A0,A1,A2脚:
24C01/02,A0,A1,A2都是从设备地址。
24C04,A1,A2是从设备地址,A0没用
24C08,A2是从设备地址,A0,A1没用
24C16及以上,A0,A1,A2都没用了。

其中,A表示期间地址,p表示也地址,在读写的时候首先是起始条件+器件地址
器件地址如上所示在16k中,需要两个字节表示内部地址,正是p2/1/0 和8位具体的地址
TinyBoy
2楼-- · 2019-08-17 11:13
回复【3楼】Fong0716:
---------------------------------
只能说编程就死编程了,多联系下生活嘛,你发送东西给人家,是不是希望人家回应一下,东西收到了,人家发送东西给你,你是不是也要礼貌回应一下东西收到了,你发送数据,还发应答,你的假应答仍然代替不了别人的真应答,假的就是假的,有和没有一样。所以你写,就等待应答,读就发送应答,合情合理。
正点原子
3楼-- · 2019-08-17 07:56
其实就是对于大容量的EEPROM型号,本来作为片选地址线的1~3位用来表示数据地址了。
Fong0716
4楼-- · 2019-08-17 08:18
回复【2楼】正点原子:
---------------------------------
原子哥,程序中的IIC_Wait_Ack();等待应答,我都修改为IIC_Ack(); 应答信号,程序也能够正常运行,那么为什么要用IIC_Wait_Ack()呢?
styleno1
5楼-- · 2019-08-17 12:41
 精彩回答 2  元偷偷看……
mxiaotao
6楼-- · 2019-08-17 13:26
Fong0716 发表于 2015-1-23 14:36
回复【2楼】正点原子:
---------------------------------
原子哥,程序中的IIC_Wait_Ack();等待应答,我都 ...

使用iic_wait_ack()我感觉方便查错

一周热门 更多>