和传统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的地址就分配好并锁存了。
以前在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)
{
}
)