radzio.dxp.pl

Pamięci EEPROM typu 24C32,24C64, 24C128, 24C256 posiadają pojemność od 32 do 512 kilobitów, co odpowiada pojemności od 4 do 64 kilobajtów. Pamięci te posiadają szeregowy interfejs I2C.

Rozkład wyprowadzeń układów pamięci 24C32-24C512 przedstawia poniższy rysunek

eeprom

Zapis do pamięci
Przebieg na magistrali podczas zapisu jednego bajtu danych pod określony adres w pamięci pokazany jest na poniższym rysunku

eeprom

Procedura zapisu bajtu danych pod określony adres realizuje następujące zadania :

  • wysłanie sekwencji START
  • wysłanie bajtu adresu układu pamięci na magistrali (DEV SEL) z bitem R/W w stanie niskim (zapis)
  • wysłanie starszego bajtu adresu komórki pamięci w uprzednio zaadresowanym układzie pamięci
  • wysłanie młodszego bajtu adresu komórki pamięci w uprzednio zaadresowanym układzie pamięci
  • wysłanie bajtu danych przeznaczonego do zapisu
  • wysłanie sekwencji STOP

Przykładowa procedura może wyglądać następująco :

twistart();
twiwrite(0xA0 | (DEV_SEL << 1));
twiwrite((BYTE_ADDR & 0xFF00) >> 8);
twiwrite(BYTE_ADDR & 0x00FF);
twiwrite(DATA);
twistop();

Odczyt z pamięci
Przebieg na magistrali podczas odczytu jednego bajtu danych spod dowolnego adresu przedstawia poniższy rysunek

eeprom

Procedura odczytu bajtu danych spod określonego adresu realizuje następujące zadania :

  • wysłanie sekwencji START
  • wysłanie bajtu adresu układu pamięci na magistrali (DEV SEL) z bitem R/W w stanie niskim (zapis)
  • wysłanie starszego bajtu adresu komórki pamięci, spod której nastąpi odczyt
  • wysłanie młodszego bajtu adresu komórki pamięci, spod której nastąpi odczyt
  • wysłanie sygnału start
  • wysłanie bajtu adresu układu pamięci na magistrali (DEV SEL) z bitem R/W w stanie wysokim (odczyt)
  • odebranie bajtu danych wysłanych przez układ pamięci
  • wystawienie sygnału braku potwierdzenia (NACK)
  • wysłanie sekwencji STOP

Przykładowa procedura może wyglądać następująco :

unsigned char tmp;
twistart();
twiwrite(0xA0 | (DEV_SEL << 1));
twiwrite((BYTE_ADDR & 0xFF00) >> 8);
twiwrite(BYTE_ADDR & 0x00FF);
twistart();
twiwrite(0xA0 | (DEV_SEL << 1) | 0x01);
tmp = twiread(NOACK);
return tmp;

 
(c) Radosław Kwiecień