Skocz do zawartości

Brak połączenia z LSM303D przez I2C


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 to post
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 to post
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 to post
Share on other sites

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 to post
Share on other sites

Jak ja mam taki problem to najczęściej adres urządzenia jest inny niż w dokumentacji że względu na to jak układ jest podłączony na płycie najlepiej przeskanować wszystkie adresy i2c i się znajdzie wtedy.

  • Lubię! 1
Link to post
Share on other sites

Chodzi o cos takiego?

while (1)
  {
      adres++;
      HAL_I2C_Mem_Read(&hi2c1, adres, 0x0f, 1, &who_am_i, 1, 100);
      if (who_am_i==0x49)
      {
        wait()
      }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
Link to post
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 to post
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

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.