Skocz do zawartości

Brak połączenia z LSM303D przez I2C


JerryPK

Pomocna odpowiedź

To mój pierwszy post na forum więc witam wszystkich 🙂 Chociaż czytelnikiem jestem już od dawna;p

Posiadam płytkę stm32f411re i próbuję przetestować akcelerometr jak w tytule(Był dołączony do kursu STM32F1). Do pomocy korzystałem z obu kursów STM32: F4 (HAL) oraz Kurs F1. Próbowałem już różnych konfiguracji interfejsu, różnych pinów itp. jednak ciągle nie mogę nawet odczytać rejestru WHO_AM_I.

Konfiguracja I2C:

static void MX_I2C1_Init(void)
{

 hi2c1.Instance = I2C1;
 hi2c1.Init.ClockSpeed = 400000;
 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
 hi2c1.Init.OwnAddress1 = 0;
 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 hi2c1.Init.OwnAddress2 = 0;
 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
 if (HAL_I2C_Init(&hi2c1) != HAL_OK)
 {
   Error_Handler();
 }

}

Adres układu:

#define LSM303D_ADDR (0x3a << 1)

(Próbowałem też 0x3c oraz opcji bez przesunięcia bitowego)

Pętla główna:

while (1)
 {
 HAL_I2C_Mem_Read(&hi2c1, LSM303D_ADDR, 0x0f, 1, &who_am_i, 1, 100);
 }

Gdzie 0x0f to adres rejestru WHO_AM_I z dokumentacji zamieszczonej w kursie, a &who_am_i to adres zmiennej globalnej typu uint_8t.

Dokumentacja LSM303D

Układ zmontowany poprawnie, SDA i SCL podpinam pod piny ustawione w Cube, dodatkowo masa i 3v3 do Vin.

Oczekiwana wartość rejestru to wg dokumentacji 0x49, jednak śledzenie zmiennej w STMStudio zawsze wskazuje 0.

Zaznaczę jeszcze, że próbowałem też odczytywać konkretne wartości z akcelerometru po uprzedniej konfiguracji, ale nigdy nie zadziałało. Zakładam więc, że jest jakiś podstawowy problem z komunikacją układów, dlatego chcę zacząć od poprawnego odczytu who_am_i.

Dajcie znać, jeśli czegoś brakuje w opisie. Dzięki.

Link do komentarza
Share on other sites

Dobre pytanie. Zapomniałem 😉. Natomiast w kursie jest napisane:

Moduł akcelerometru posiada wbudowane rezystory podciągające, więc nie ma konieczności podłączania rezystorów do linii SDA i SCL

Za to jak teraz sprawdzam w dokumentacji wyraźnie stoi:

If an I2C interface is used, pull-up resistors (recommended value 10 k) must be placed on

the two I2C bus lines

To teraz seria głupich pytań😉:

- mogłem jakoś uszkodzić układ przez brak tych rezystorów?

- trzeba je po prostu wpiąć szeregowo pomiędzy piny SDA oraz SCL na kontrolerze a analogiczne na akcelerometrze?

Link do komentarza
Share on other sites

Dobre pytanie. Zapomniałem 😉. Natomiast w kursie jest napisane:
Moduł akcelerometru posiada wbudowane rezystory podciągające, więc nie ma konieczności podłączania rezystorów do linii SDA i SCL

To teraz pytanie brzmi czy używasz madułu takiego jak w kursie, czy innego, czy też "gołego" akcelerometru?

Za to jak teraz sprawdzam w dokumentacji wyraźnie stoi:

If an I2C interface is used, pull-up resistors (recommended value 10 k) must be placed on

the two I2C bus lines

Tak stoi w dokumentacji, bo dokumentacja jest do samego czipu. Jeśli ty masz "moduł", czyli płytkę z wlutowanym czipem i dodatkowymi komponentami koniecznymi do jego pracy, to rzeczywiście mogą tam już oporniki podciągające być.

To teraz seria głupich pytań😉:

- mogłem jakoś uszkodzić układ przez brak tych rezystorów?

Nie. Po prostu akcelerometr nie dostał żadnego sygnału.

- trzeba je po prostu wpiąć szeregowo pomiędzy piny SDA oraz SCL na kontrolerze a analogiczne na akcelerometrze?

Nie. Mają być oporniki podciągające -- czyli powodujące, że na liniach jest napięcie gdy nic nie jest do nich podłączone. Musisz je dać pomiędzy każdą z linii a zasilanie.

Polecam poczytać o interfejsie I2C (choćby na wikipedii), to może trochę rozjaśnić.

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

POdbijam temat. Mam identyczny problem, brak odczytu who_i_am

Sprobowalem podlaczyc rezystory (chociaz ten akcelerometr jest juz chyba w nie wyposazony) lecz to  tez nie dalo efektu. Rezystory podlaczylem do linii SDA i SCL a  nastepnie podlaczylem je do napiecie 3V3.

Dobrze zrozumialem ze to o to chodzilo?

Co jeszcze moze byc przyczyna braku polaczenia. Napiecie i natezenie na jest zerowe.

17_akcelerator.rar

Edytowano przez danielbr3
Link do komentarza
Share on other sites

Przepraszam, że wprowadziłem Cię w błąd przez swoje niedopatrzenie zamiast Write spróbuj Read.

HAL_I2C_Mem_Read(&i2c, 0x3a, 0x0f, 1, &value, 1, 1000);

Właściwie to czym podglądasz jaką wartość ma zmienna value po wykonaniu się tej linijki? Debbugerem?

Edytowano przez krzychu0905gmai
  • Lubię! 1
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.