Skocz do zawartości

Brak połączenia z LSM303D przez I2C


Pomocna odpowiedź

Napisano

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.

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?

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

  • 2 lat(a) później...
(edytowany)

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

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

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 */
  }
(edytowany)

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
(edytowany)

Sprawdzalem debbugerem oraz poprzez stm studio.

Po zmianie linijki nie ma zmian. W debbugerze komunikat:  The target is not running when halt was requested, stopping GDB.

Edytowano przez danielbr3

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