ATNEL tech-forum
https://forum.atnel.pl/

MPL3115A2 i I2C problem z komunikacją
https://forum.atnel.pl/topic17247.html
Strona 1 z 1

Autor:  Tom277 [ 5 sty 2017, o 08:20 ]
Tytuł:  MPL3115A2 i I2C problem z komunikacją

Usiłuję dogadać się z czujnikiem MPL3115A2. Niestety problem mam chyba już na etapie samej komunikacji I2C. W swoich bojach wykorzystuję (a przynamniej próbuję) bibliotekę z BB do komunikacji I2C, ale może po kolei.
Sprzętowo mam wszystko ok. sprawdziłem programem z Arduino. Czujnik ładnie dogaduje się z procesorem wysyłając na terminal ciśnienie, wysokość oraz temperaturę.
Chciałem, wzorem Mirka poradników oprzeć się na bibliotece z wspomnianego wyżej Arduino, ale w pewnym momencie odniosłem wrażenie, że czytam Dziennik Ustaw. W pliku z funkcjami do obsługi MPL3115A2 jest załączony plik obsługi I2C. Z kolei w pliku I2C dołączony jest kolejny z kolejnymi funkcjami a następnie kolejny itd. Z Arduino jestem kompletnie zielony, i po wyrwaniu połowy włosów odpuściłem ten kierunek.
Ponownie zacząłem studiować dokumentację do samego czujnika MPL31115A2. Po kilkunastu godzinach przyzwyczajania się do treści wydawało mi się, że coś zaczynam rozumieć. Więc zbudowałem prosty main wzorem grafu z dokumentacji, no i klapa.
Stosując „debag” diodą led doszedłem do wniosku, że problem leży już na etapie wysyłania komunikatów na szynę I2C.
Proszę o podpowiedź, o co chodzi w poniższej funkcji?
Co to jest „IICC_MST = 1;” i to „IICS_BUSY” i po co jest „error |= 0x01;”
Rozumiem, że „IICC_MST = 1;” to przypisanie zmiennej IICC_MST wartości 1, ale po co? Chyba mi czegoś brakuje, w/w zmienne są chyba globalnymi zmiennymi.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powyższy kod jest z pdf-a AN4481, obsługa czujnika MPL3115A2 jest z AN4519 obydwa pdf-y w załączniku.
Chyba się zapętliłem w swoich rozważaniach, proszę o podpowiedź. Od trzech dni siedzę nad tematem i nie drgnąłem z miejsca.

Autor:  Mellanogaster [ 5 sty 2017, o 09:25 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Witaj!
Najpierw na spokojnie przestudiuj sobie pdf'a (Zwłaszcza "fig. 7" i "fig. 8" ). Tam masz krok po kroku objaśnione jak wygląda komunikacja z czujnikiem.
Zapoznaj się również z (bo warto!) z obsługą błędów - w skrócie pewne flagi są zgłaszane w odpowiednim rejestrze uC-ka. Tutaj niestety trzeba bardziej w internecie poszperać bo w nocie AVRów nie wszystko opisano, a szkoda (przynajmniej w tych co sprawdzałem :P)
Biblioteki z BB są bardzo OK. Co prawda można, a nawet polecam je troszkę podrasować pod obsługę konkretnego SLAVE'a ;)
W wyżej opisany sposób napisałem kiedyś własną procedurę do obsługi HTU21D - chciałem napisać kod który rozumiem i przy okazji się wiele nauczyłem. Zajęło mi to niewiele czasu, a diabeł okazał się nie taki straszny jak na początku się zdawało ;)

Autor:  tonygryps [ 5 sty 2017, o 09:59 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

W pdf an4481 masz pokazane na stronie 5 jak powinna być zbudowana ramka danych do odzczytu .
Ja bym spróbował tak zbudować funkcję z wykorzystaniem biblioteki z BB.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

gdzie SLA - adres czujnika
adr - adres rejestru
len - ile rejestwów do odczytu
*buf wskaźnik na bufor gdzie mają się zapisać dane musisz zrobić sobie bufor na dane 32bitowy ponieważ dane z czujników są 20 bitowe.
czyli do odczytu ciśnienia będziesz musiał odczytać 3 bajty i je poskładać i masz odczyt ciśnienia.

Autor:  Tom277 [ 5 sty 2017, o 12:08 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Funkcje z BB są dla mnie zrozumiałe, z powodzeniem wykorzystuje je (delikatnie przerobione)do komunikacji z PCF8563. Niestety nie mogę z ich pomocą nawiązać komunikacji z MPL3115A2. Dlatego zacząłem kombinować z funkcjami z pdf-a (te które wkleiłem w pierwszym poście). W pdf-ie faktycznie mam ładnie rozpisane co i jak powinno być w komunikacji z czujnikiem, ale na razie mam chyba problem z samą funkcją wysyłającą pojedynczy bajt do czujnika. Tego nie mogę zrozumieć co tu jest nie tak. Sprawdzałem stosując debug z diodą led ale już po wysłaniu pierwszych komend
Kod:
TWI_start ();

do czujnika program mi się zawiesza.
Chyba tu jest coś nie tak, nie rozumiem tego co jest?

Autor:  fobos [ 5 sty 2017, o 17:25 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Jestem początkującym i moje sugestie mogą Cię wprowadzić w maliny, jeżeli to pomoże zrobiłbym tak. Spróbował bym nawiązać podstawową komunikację :
- sekwencja (sygnatura) startu TWI_start();
- następnie komunikacja z układem slave czyli funkcja TWI_write(adr) adres + bit kierunku transmisji 0 write , w tym miejscu przebuduj program w taki sposób by sprawdzić czy slave nadaje 9 bit ACK, (np dioda) jeżeli 9 bit jest ACK to znaczy, że podstawowa komunikacja jest OK slave odpowiada na adres, następnie zmień adres układu slave w funkcji write na inny (nieprawidłowy) dioda nie powinna się palić (zły adres slave) zrób to po to by uzyskać większą pewność.
- na koniec sekwencja (sygnatura) stop.

Jeżeli Cię to interesuje mogę (możemy ?) to rozwijać dalej ale nie mam pewności czy to właściwa droga i jeszcze jedno wydaje mi się, że łatwiej powyższe zrobić wykorzystując programową implementację I2C, pisałem w uproszczeniu posługując się terminologią ze sprzętowej obsługi.
Inne sugestie to jakie rezystory podciągające zastosowałeś w I2C, jaką częstotliwość ustawiłeś na ICL

Autor:  Mellanogaster [ 5 sty 2017, o 18:40 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Ja polecam zrobić sobie prostą komunikację uart z terminalem na pc i po każdym kroku komunikowania się z czujnikiem (TWI_start.... TWI_write...) wysyłać do terminala zawartość rejestru TWSR.
TO SPRAWDZONY PRZEZE MNIE SPOSÓB i skuteczny ;) w tym przypadku powie nam dużo więcej niż dioda.
A i jeszcze taki cukierasek od lisełka
Lista statusów komunikacji

Autor:  fobos [ 5 sty 2017, o 18:54 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

No "panie kolego" pięknie i wisienka całkiem całkiem dzięki jak dla mnie pomógł.

Autor:  Tom277 [ 6 sty 2017, o 13:19 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Dziękuję za zainteresowanie. Na razie nie udało mi się jeszcze nic osiągnąć w temacie, jak ruszę z miejsca dam znać. Dzięki jeszcze raz.
Pozdrawiam

Autor:  Tom277 [ 6 sty 2017, o 17:53 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

To teraz mam głupie pytanie, wychodzi brak systematycznego układania wiedzy w głowie :oops:
Skoro mam temperaturę podaną z rozdzielczością 12 bitową to co to znaczy? Jak z tego wyłuskać wartość dziesiętna temperatury. Wartość temperatury zmierzona przez czujnik zapisana jest do dwóch rejestrów: Temperature Data Out MSB starcza część oraz Temperature Data Out LSB młodsza część. Są to dwa ośmio bitowe rejestry gdzie młodszy zapełniony jest tylko czterema starszymi bitami. W sumie tworzą wartość 12 bitową.
W przypadku "zwykłego" ADC w mikrokontrolerze gdy mam rozdzielczość np 10 bitową to znaczy, że napięcie referencyjne dzielę przez 1024 i mam prostą informację ile jeden bit to jest V-tów. Jak to jest w omawianym czujniku MPL3115A2? Nie wiem jak to wyłuskać. W AN4519 są funkcje konwersji tyle, że znowu jest coś (nic nie jest jasne)niejasne w tych funkcjach.
Poniżej funkcja konwertująca, pochodzi z AN4519 (umieściłem w pierwszym poście) str.15

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  szymonciow [ 7 sty 2017, o 01:07 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Tom277 napisał(a):
Funkcje z BB są dla mnie zrozumiałe, z powodzeniem wykorzystuje je (delikatnie przerobione)do komunikacji z PCF8563. Niestety nie mogę z ich pomocą nawiązać komunikacji z MPL3115A2. Dlatego zacząłem kombinować z funkcjami z pdf-a (te które wkleiłem w pierwszym poście). W pdf-ie faktycznie mam ładnie rozpisane co i jak powinno być w komunikacji z czujnikiem, ale na razie mam chyba problem z samą funkcją wysyłającą pojedynczy bajt do czujnika. Tego nie mogę zrozumieć co tu jest nie tak. Sprawdzałem stosując debug z diodą led ale już po wysłaniu pierwszych komend
Kod:
TWI_start ();

do czujnika program mi się zawiesza.
Chyba tu jest coś nie tak, nie rozumiem tego co jest?


Z wątku tego nie wyczytałem, powiedz zatem jaki podajesz adres urządzenia dla MPL3115A2?

Spotykane biblioteki w internecie różnie interpretują co to jest "adres urządzenia".
Jest różnica pomiędzy adresem "7 bitowym" i "8 bitowym".

Mirek w BB stosuje adres 8 bitowy, a czytanie od zapisywania do urządzenia rozróżnia poprzez dodawanie 1 do adresu (najmniej znaczący bit ustawiany jest na 1).
PDF do urządzeń zwykle podają adres 7 bitowy, ale z wyraźnym zaznaczeniem:
"The device uses 7-bit addressing and does not acknowledge general call address 000 0000. Slave address has been set
to 60h or 110 0000. 8-bit read is C1h, 8-bit write is C0h
."
Powyżej to dokładny cytat z noty do MPL3115A2.

Można zatem wpaść w pułapkę i definiując w stałych podawać adres 7 bitowy: 0x60 z tym, że do biblioteki Mirka jest potrzebny adres 8 bitowy: 0xC0

Jeśli popatrzymy do adafruitowej biblioteki (arduino) to znajdzimy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Podanie tego adresu do mirkowej biblioteki spowoduje brak komunikacji z czujnikiem, bo poprawna definicja powinna wyglądać tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ciekawe jak to u Ciebie wygląda.

Autor:  Tom277 [ 7 sty 2017, o 13:46 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Podaję adres 8-bitowy, czyli 0xC0 jako adres urządzenia podczas zapisu. W funkcji odbioru do adresu dodawane jest 1 czyli "robi" się z tego adres odczytu.
Kod:
TWI_write(0xC0 + 1);

Wydaje mi się, że powoli zaczynam dogadywać się z czujnikiem. Na razie jeszcze nie wiem tylko czy poprawnie tzn. czy czujnik wysyła mi to co bym chciał. Otrzymuję dane z dwóch rejestrów OUT_T_MSB_Register i OUT_T_LSB_Register (na razie odczytuję tylko temperaturę dla uproszczenia). Wiem, że rejestr OUT_T_LSB to wartość "po kropce" temperatury natomiast rejestr OUT_T_MSB to całe stopnie z informacją czy temperatura jest dodatnia czy ujemna, gdy większa od 0x7F to ujemna. Tylko jak z tej wartości teraz uzyskać wartość dziesiętną temperatury, no bo chyba nie jest tak, że wartość rejestru OUT_T_MSB np 0x19 to zwyczajne 25 stopni?

Autor:  Tom277 [ 8 sty 2017, o 00:02 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

Tak więc po długich bojach, coś otrzymuję z czujnika. Proszę teraz o pomoc w przekonwertowaniu danych z czujnika.
Otrzymałem np takie dane z rejestrów:
OUT_T_MSB = 20
OUT_T_LSB = 16
w dokumentacji jest pokazana funkcja do konwersji części całkowitej.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Podstawiając powyższe dane z czujnika MSB wychodzi mi, że:
a = 240
b = 240
c = 2
r = 2

Znalazłem gdzieś w pdf-ach NXP ciało funkcji SCI_NibbOut(...) oraz jej opisu

"Located in the driver program, the code below performs this conversion. It also adds the additional output formatting step of replacing each leading zero digit with a space character, which is done by passing 0xF0 to SCI_NibbOut(). Looking more closely, you can see that this routine will add 0x30 to 0xF0, resulting in a value of 0x120, which gets truncated to 0x20 (the ASCII space character)"

Ciało funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak bym nie podstawiał to wychodzą bzdury.

a tu funkcja konwersji części po przecinku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pomóżcie proszę, bo godziny / dni lecą a ja dalej w miejscu stoję.

Autor:  Tom277 [ 8 sty 2017, o 12:27 ]
Tytuł:  Re: MPL3115A2 i I2C problem z komunikacją

No nie bądźcie tacy, niech ktoś coś podpowie :) .

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/