Skocz do zawartości

AT24C256C EEPROM Zapis/Odczyt STM32F411


henryxxl

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.