Skocz do zawartości

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


Komentator

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.

Link do komentarza
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

Link do komentarza
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.

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

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
Link do komentarza
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 🙂 

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.