I2C中24C02从地址设置 区分器件地址和 寄存器地址

I2C中24C02从地址设置

设备地址

    首先,先看一下AT24C02的芯片资料,我们会发现AT24C02有三个地址A0,A1,A2。同时,我们会在资料的Device Address介绍发现I2C器件一共有七位地址码,还有一位是读/写(R/W)操作位,而在AT24C02的前四位已经固定为1010。R/W为1则为 读操作,为0则为写操作。R/W位我们要设置为0(写操作)

规则为:1010(A0)(A1)(A2)(R/W)

    然后,看一下自己的设置PCB上的AT24C02的三位地址引脚的接法。

例子1:

那么对应的A0,A1,A2都是接的VCC,所以为A0=1,A1=1,A2=1;可以知道AT24C02的设备写地址为10101110(0xae),读设备地址为10101111(0xaf);

 

例子2:

那么对应的A0,A1,A2都是接的GND,所以为A0=0,A1=0,A2=0;可以知道AT24C02的设备写地址为10100000(0xa0),读设备地址为10100001(0xa1);

扫描二维码关注公众号,回复: 12786690 查看本文章

哈哈,“设备地址”就这么确定了,其实也很简单。

参考 http://blog.chinaunix.net/uid-29727172-id-5573269.html

转载于:https://www.cnblogs.com/caolinsummer/p/5660863.html

-------------------------------------------------------------------------------------------

EEPROM应该是学习IIC总线时候最先接触的东西了,EEPROM的优点是可以随机存取,不像Flash存储器一样需要先擦除在能写入,而且擦写次数多存储时间长,但是缺点是存储空间非常有限,像我这用的Atmel的AT24C08只有8Kbit的存储空间,也就是只有1KB,存储一些参数是够的,但是存储文档、音频什么的就算了,还好我现在项目只要存储一些参数,AT24C02的空间不够,所以用了空间相对大一点的AT24C08。

本以为两个的程序是差不多的,但是还有些值得注意的地方要记录一下的。


由于AT24C02的存储空间是256Byte,IIC发送寻址地址的时候一个字节就够了,也就是发送完器件地址之后直接发送一个字节的寄存器地址就可以了,但是AT24C08的存储空间是1024Byte,一个字节的寄存器地址不够寻址,需要10位的寻址空间。

我之前写过一篇文章:http://blog.csdn.net/tq384998430/article/details/53580267

IIC读写16位地址的寄存器


一般来说IIC器件的内部寄存器地址都是8位的,这样在进行读写操作时,发送完器件地址之后直接发送一个字节的寄存器地址,然后即可以进行读写。

但是有的器件内部寄存器是按照16位地址编排的,例如一些EEPROM器件,由于存储的数据量较大就会需要较大的寻址空间,对于这种的器件的内部寄存器寻址就需要多个字节的地址,也就是在发送完器件地址之后需要发送多个寄存器地址字节,

具体实现如下程序所示:

u8 IIC_Read2(u8 device,u16 addr)
{
    u8 temp;
    IIC_Start();
    IIC_SendByte(device);
    IIC_Wait_Ack();
    IIC_SendByte((u8)(addr >> 8));
    IIC_Wait_Ack();
    IIC_SendByte((u8)addr);
    IIC_Wait_Ack();
    IIC_Start();
    IIC_SendByte(device+1);
    IIC_Wait_Ack();
    temp = IIC_ReadByte();
    IIC_NAck();//发送nACK
    IIC_Stop();
    return temp;
}
通过程序可以看到发送完器件地址device之后先后发送了寄存器地址的高字节和低字节,然后再进行读取。
 

里面说明了IIC读写16位地址的寄存器的方式,就是发送两个字节的寄存器地址,先发送地址的高字节,再发送地址的低字节,但是这一招在AT24C08上不适用,

然后就逼我看一下AT24C08的数据手册http://pdf1.alldatasheet.com/datasheet-pdf/view/509421/ATMEL/AT24C08C-SSHM-T.html,上面第10页写道:


Standard EEPROM Access: The 4K and 8K EEPROM device requires an 8-bit device address word following a start
condition to enable the chip for a read or write operation. The device address word consists of a mandatory “1010” (0xA)
sequence for the first four Most Significant Bits (MSB) as shown in Figure 8-1 on page 11. This is common to all the
EEPROM devices.
The 4K EEPROM only uses the A2 and A1 device address bits with the third bit being a memory page address bit. The
two device address bits must compare to their corresponding hard-wired input pins. The A0 pin is no connect.
The 8K EEPROM only uses the A2 device address bit with the next two bits being for memory page addressing. The A2
address bit must compare to its corresponding hard-wired input pin. The A1 and A0 pins are no connect.


AT24C08的器件地址的定义如下:

这里写图片描述

说得很清楚,AT24C08将器件地址(Device Addr)中的A1和A0位作为Page address,也就是说A1和A0是存储器的10位地址中的最高两位,我们再读写数据的时候要将地址的最高两位(page地址)放在这里。示例程序如下:

void IIC_Send(u8 device,u16 addr,u8 dat)
{
    IIC_Start();
    IIC_SendByte(device | (addr >> 8));
    IIC_Wait_Ack();
    IIC_SendByte((u8)addr);  
    IIC_Wait_Ack();  
    IIC_SendByte(dat);
    IIC_Wait_Ack();
    IIC_Stop();
}
————————————————
版权声明:本文为CSDN博主「Mr qqtang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tq384998430/article/details/79227271

猜你喜欢

转载自blog.csdn.net/chenhuanqiangnihao/article/details/114997299