浅谈EEPROM with configurable device address之配置方法

和传统I2C  EEPROM通过3路pin脚电平选择设备地址不同,ST近年来推出了一系列通过I2C软件分配地址的EEPROM产品。以 M24512E-F为例,它是一颗 configurable device address的EEPROM



以前在I2C总线并联EEPROM,是通过E0~E2引脚去决定每个EEPROM设备地址LSB后三位,但是M24512E-F这3个引脚变成了NC。也就是说M24512E-F并不依赖于这3个引脚去决定它的设备地址LSB,而是需要主机通过I2C给它分配地址。它可以轻松实现和原来硬件选择一样的地址,那么它就可以和传统的EEPROM实现pin-pin兼容


M24512E-F的I2C命令格式分为1byte  Device select code(相当于设备地址)+ 2byte  byte address(相当于寄存器地址)。只有正确选择Device和 byte address,才可以对它进行命令和读写操作。详情参见datasheet  Table 8~ Table 10. 而新的chip使用前,最好给它分配一个设备地址并锁定。

下面介绍如何分配设备地址:

通过命令Configurable device address分配地址

1.首先I2C向从机发送Device select code:0XB0(1011 0000):其中bit7~4,1011是固定码;bit3~1,是设备地址(chip enable address),出厂设置为000;bit0是读写选择,写是0


2. 从机(M24512E-F) ACK应答后,继续发送2 byte   byte address:0XA0, 0X00;其中 First byte address  bit7~5,是命令字,必须是110,bit4~0随意,我们就写0即可; Second byte address 所有位随意,我们也写0.

3. I2C发完以上2步命令,就已经选中了M24512E-F的地址分配模式,等待ACK应答后,就可以写 Configurable device address register (CDA)重新分配地址了

M24512E-F的Configurable device address register (CDA)寄存器定义如下:


其中bit7~4随意,写0即可;bit3~bit1(C2~C0)就是可自定义的设备地址;bit0 DAL是地址锁存,出厂设置时它为0,这时候C2~C0可以更改,当DAL被写为1时,C2~C0将被锁存,永远不能更改了。(为了避免可能出现的误操作,我们建议分配好设备地址后,将DAL置1,,把地址永久锁存)

举例:若此时我希望给这颗M24512E-F分配地址6,并且分配完毕后将它永久锁存。那么bit3~0我就应该写1101,即主机向从机写数据0X0D.

完成以上3个步骤,这颗M24512E-F的地址就分配好并锁存了。


软件代码如下:
uint8_t I2C_ADDRESS = 0XB0;                              //定义 Device select code
uint8_t lenth =3;                                                     //定义数组长度
uint8_t aTxBuffer[lenth] = {0XA0, 0X00,0X0D};          //定义byte address以及写入CDA的值

int main(void)
{
#ifdef MASTER_BOARD
GPIO_InitTypeDef GPIO_InitStruct;
#endif

HAL_Init();                                                        //初始化HAL
SystemClock_Config();                                     //初始化时钟
MX_GPIO_Init();                                              //初始化IO口
MX_I2C1_Init();                                               //初始化I2C1

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11,GPIO_PIN_RESET);                                   //PA11口控制EEPROM的WC(write control),引脚置低,使EEPROM可写
HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, &aTxBuffer, lenth, 10000);        //写I2C

while(1)
{

}
)

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能