Skocz do zawartości
Komentator

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

Pomocna odpowiedź

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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)?

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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 🙂 

Udostępnij ten post


Link to post
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...