Skocz do zawartości

Kurs STM32 F1 HAL - #11 - I2C w praktyce, pamięć EEPROM


Pomocna odpowiedź

Napisano
html_mig_img
Wcześniej poznaliśmy dwa interfejsy szeregowe: UART i SPI. Pierwszy wymagał tylko dwóch linii, ale był dość powolny. Drugi pracował znacznie szybciej wykorzystując więcej wyprowadzeń.Teraz zajmiemy się I2C, który kwalifikuje się gdzieś pomiędzy wcześniejszymi interfejsami.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

  • 1 rok później...

Witam Wszystkich.

Coś nie ograniam. Piszesz "Podczas zapisywania należy odwołać się do adresu 0xA0, a podczas odczytywania z 0xA1.". Tym czasem w kodzie jest

HAL_I2C_Mem_Read(&i2c, 0xa0, 0x10, 1, (uint8_t*)&counter, sizeof(counter), HAL_MAX_DELAY);

i ponoć działa. O co chodzi z tym 0xA1.

Pzr

J

@Kocurrus, witam na forum 🙂

Na podstawie ostatniego bitu adresu wiadome jest czy chcesz zapisać, czy odczytać informacje z urządzenia. W związku z tym, jeśli wywołujesz funkcję Read to wiadome jest "z automatu", że trzeba odwołać się do adresu z 1 na końcu. Analogicznie, przy wywołaniu funkcji zapisującej dane, na końcu adresu użyte musi zostać zawsze 0. Nie ma większej różnicy, który z adresów podasz w tych konkretnych funkcjach, bo one i tak nie zwracają uwagi na ostatni bit adresu. Cel używania danej funkcji definiuje już domyślnie ostatni bit 😉 To takie ułatwienie zaimplementowane w HALu.

  • 9 miesiące później...

Skoro EEPROM ma 128B oraz 128 komórek pamięci to wynika z tego, że jedna komórka ma 1 bajt, jak to możliwe że do komórki można przesłać kilka bajtów albo odczytywać z niej tak duże wartości(większe niż 256)?

EEPROM jest adresowany bajtowo, czyli można zarówno zapisywać, jak i odczytywać pojedyncze bajty. W jednym bajcie nie można zapisać "dużej" wartości, do tego wykorzystuje się po prostu kilka bajtów. Działa to dokładnie jak w przypadku pamięci RAM - przykładowo zmienna typu uint32_t zajmuje 4 bajty i dzięki temu może przechowywać wartości większe niż 255. Można ją zapisać w pamięci eeprom również wykorzystując 4 bajty, ale w jednym się po prostu nie zmieści.

  • Lubię! 1
  • 3 miesiące później...

Miałem problem z odczytywaniem z pamięci EEPROM w pierwszej wersji kodu z artykułu.
Mianowicie wartość zmiennej "test" nie zdążyła się zapisać do pamięci, a ja już chciałem ją odczytać. Jeśli ktoś również miał taki problem polecam pomiędzy funkcją "HAL_I2C_Mem_Write()", a funkcją "HAL_I2C_Mem_Read()" wstawić fantastyczny, magiczny "HAL_Delay()" na co najmniej 3 ms, bądź sprawdzać status zwracany przez te funkcje 🙂 

  • 4 miesiące później...

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...