Skocz do zawartości
JerryPK

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.

Udostępnij ten post


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?

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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 */
  }

Udostępnij ten post


Link to post
Share on other sites

niestety dla zadnej wartosci adresu w zakresie 0-256 nie mam odczytu wartosci who_i_am

z tym zeby skakalo co 2 to chodzilo ci o to ze adres napewno bedzie parzysty?

Udostępnij ten post


Link to post
Share on other sites

A dobrze podłączyłeś linie SDA i SCL? 
 

Spróbuj takiego kodu ale uruchom go przed pętlą while.

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

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

SDA polaczylem z PB7

SCL-PB6

Vin-3V3

GND-GND

Zamieszcze jeszcze raz caly projekt z maksymalnie skroconym kodem. Zamiana na te linijki tez nie przyniosla efektu.

 17_akcelerometr.rar

Udostępnij ten post


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

Udostępnij ten post


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

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!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć 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...