淺談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)
{

}
)

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能