Skocz do zawartości

AT24C256C EEPROM Zapis/Odczyt STM32F411


Pomocna odpowiedź

Napisano

Witam.

Próbuję zapisać i odczytać zmienna w pamięci eeprom.

Nóżki A2,A1, A0 i WP mam połączone z gnd.

Zapisuje 0x5a jednak odczyt dostaję 0xff czyli według mnie odczyt działa bo odczytuję wartość nie zapisanej komórki ale dlaczego nie działa zapis? Oto kod:

#define eeprom_adress (0x50<<1)


uint8_t test = 0x5a;
   HAL_I2C_Mem_Write(&hi2c1, eeprom_adress, 0x0, 1, (uint8_t*)&test, sizeof(test), HAL_MAX_DELAY);
HAL_Delay(100);
   uint8_t result = 0;
   HAL_I2C_Mem_Read(&hi2c1, eeprom_adress, 0x0, 1, (uint8_t*)&result, sizeof(result), HAL_MAX_DELAY);

 

eeprom wynik.png

Pamięci EEPROM większe niż 256 bajtów wymagają wysłania dwóch bajtów adresu po bajcie zaadresowania modułu. Ty wysyłasz tylko jeden.

A sprawdzanie co oddają funkcje I/O (a przynajmniej czy oddają HAL_OK) to dobry zwyczaj.

  • Lubię! 2

W tym przypadku rzeczywiście wszystko z formalnego punktu widzenia było dobrze: Mem_Write() pamięć rozumiała jako zapis 0 bajtów danych pod dwubajtowy adres 0x005A 🙂 Operacja kończyła się powodzeniem i następujący po niej odczyt także. Mem_Read() wysyłał tylko starszy bajt adresu więc prawdopodobnie ustawiał go na 0x0000 (albo młodszy zostawał z poprzedniej operacji - to zachowanie chipu chyba nie jest zdefiniowane, czyli było 0x005A), następował Repeated_Start i odczyt jednego bajtu 0xFF.

W każdym razie warto - przynajmniej na etapie testowania sprawdzać oddawane kody.

BTW: W przypadku EEPROMu nie musisz czekać martwych 100ms na zapis. Wystarczy, że będziesz próbował wykonać na kostce cokolwiek z I2C (odczyt 0 bajtów?), bo przez czas zapisu tego typu pamięci zwracają NAK a to możesz łatwo wykryć właśnie kodem błędu. Napisz sobie funkcję np. EE_Wait() czekającą na poprawne zakończenie jakiejkolwiek operacji odczytu i masz z głowy długie czekanie. Pamiętaj, że EEPROMy mają strony i nie wolno ich przekraczać przy wielobajtowych zapisach.

  • Lubię! 1
14 godzin temu, aerograf7 napisał:

@henryxxl wp w stanie niskim chroni pamięć przed zapisem.Podłącz je do Vcc.Sam się na to nabiłem tydzień temu.

 

Według dokumentacji WP musi być do gnd jeżeli chcemy zapisywać i u mnie tak działa problemem było tylko adresowanie 1 bajtowe.

Może masz jakąś inny układ albo błąd na płytce skoro możesz zapisywać jak Wp jest do VCC?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...