JerryPK Napisano Grudzień 17, 2016 Udostępnij Napisano Grudzień 17, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 17, 2016 Udostępnij Grudzień 17, 2016 Nie zapomniałeś czasem o opornikach podciągających? Cytuj Link do komentarza Share on other sites More sharing options...
JerryPK Grudzień 17, 2016 Autor tematu Udostępnij Grudzień 17, 2016 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 onthe 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? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 17, 2016 Udostępnij Grudzień 17, 2016 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 onthe 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ć. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
danielbr3 Wrzesień 12, 2019 Udostępnij Wrzesień 12, 2019 (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 Wrzesień 12, 2019 przez danielbr3 Cytuj Link do komentarza Share on other sites More sharing options...
krzychu0905gmai Wrzesień 12, 2019 Udostępnij Wrzesień 12, 2019 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
danielbr3 Wrzesień 12, 2019 Udostępnij Wrzesień 12, 2019 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 */ } Cytuj Link do komentarza Share on other sites More sharing options...
krzychu0905gmai Wrzesień 13, 2019 Udostępnij Wrzesień 13, 2019 Adres ma skakać co 2. Cytuj Link do komentarza Share on other sites More sharing options...
danielbr3 Wrzesień 13, 2019 Udostępnij Wrzesień 13, 2019 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? Cytuj Link do komentarza Share on other sites More sharing options...
krzyhu0905gmail Wrzesień 18, 2019 Udostępnij Wrzesień 18, 2019 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); 1 Cytuj Link do komentarza Share on other sites More sharing options...
danielbr3 Wrzesień 22, 2019 Udostępnij Wrzesień 22, 2019 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 Cytuj Link do komentarza Share on other sites More sharing options...
krzychu0905gmai Wrzesień 22, 2019 Udostępnij Wrzesień 22, 2019 (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 Wrzesień 22, 2019 przez krzychu0905gmai 1 Cytuj Link do komentarza Share on other sites More sharing options...
danielbr3 Wrzesień 22, 2019 Udostępnij Wrzesień 22, 2019 (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 Wrzesień 22, 2019 przez danielbr3 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!