Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
Witam Nie wiem czy ktoś miał styczność z tym układem (tak na prawdę z modułem) odbiornika FM. Właśnie wszedłem w posiadanie takowego. Przygotowałem sobie pod niego płytkę testową bo moduł ma wyprowadzenia o rastrze 2mm a nie jestem zwolennikiem robienia pająków
Moduł jest zasilany z 3,3 V i sterowany przez I2C. Oczywiście jest do niego nota aplikacyjna, ale opis komunikacji i2c jest lekko dziwny. Po pierwsze rejestry są 16 bitowe a nie 8, więc nie jestem pewny jako podejść do ich obsługi. Czy traktować je jako tablice 2 elementową... Poza tym w nocie widnieje taki zapis:
"There is no visible register address in I2C interface transfers. The I2C interface has a fixed start register address (0x02h for write transfer and 0x0Ah for read transfer), and an internal incremental address counter."
Czy ktoś może miał z tym styczność. A może ma ktoś jakiś przykładowy kod.
P.S. Przy okazji dodaję kilka elementów bibliotecznych do Eagla, wiem że kiedyś Jaglarz zbierał
Załączniki:
Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.
Leży ci u mnie taki układzik tylko coś się zabrać za niego nie mogę. Moduł jest fajny bo ma RDS A zapis z noty który cytujesz oznacza, że nie możesz zacząć zapisywać lub czytać od dowolnego rejestru tylko od tych z góry określonych. Czyli jak chcesz się dowiedzieć co jest w rejestrze 0x0C to musisz przeczytać zawartość 3 rejestrów. Z odczytem każdego wewnętrzny układ sam zwiększy adres kolejnego odczytywanego rejestru.
A dlaczego masz tworzyć 2-elementową tablicę? Czyżby zmienne 16 bitowe z jakiegoś powodu przestały istnieć?
_________________ Jestem początkujący i moje porady mogą być błędne
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
Właśnie analizuję obsługę tego w bibliotece z Arduino. Jest specjalna funkcja która po prostu przesuwa zmienną 16 bitową o 8 bitów i ten drugi bajt wtedy nadaje. W ogóle zaczerpnąłem z tej biblioteki całą masę typów i zdefiniowanych wartości do rejestrów.
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
MirkoT napisał(a):
A zapis z noty który cytujesz oznacza, że nie możesz zacząć zapisywać lub czytać od dowolnego rejestru tylko od tych z góry określonych. Czyli jak chcesz się dowiedzieć co jest w rejestrze 0x0C to musisz przeczytać zawartość 3 rejestrów. Z odczytem każdego wewnętrzny układ sam zwiększy adres kolejnego odczytywanego rejestru.
Też tak rozumiem ten zapis. Ale po wgryzieniu się w bibliotekę arduino do tego modułu znalazłem tam dwie funkcje:
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać pierwsza faktycznie zapisuje sekwencyjnie rejestry rozpoczynając od 0x02 Natomiast druga zapisuje wybrany rejestr, przy czym operuje innym adresem I2C_SEQ - 0x10 I2C_INDX - 0x11
A zapis z noty który cytujesz oznacza, że nie możesz zacząć zapisywać lub czytać od dowolnego rejestru tylko od tych z góry określonych. Czyli jak chcesz się dowiedzieć co jest w rejestrze 0x0C to musisz przeczytać zawartość 3 rejestrów. Z odczytem każdego wewnętrzny układ sam zwiększy adres kolejnego odczytywanego rejestru.
Też tak rozumiem ten zapis. Ale po wgryzieniu się w bibliotekę arduino do tego modułu znalazłem tam dwie funkcje:
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać pierwsza faktycznie zapisuje sekwencyjnie rejestry rozpoczynając od 0x02 Natomiast druga zapisuje wybrany rejestr, przy czym operuje innym adresem I2C_SEQ - 0x10 I2C_INDX - 0x11
W Arduino to działa.
To ciekawe bo w PDF nie ma na ten temat ani słowa. Może to jest jakaś funkcja nieudokumentowana? Albo z jakiegoś innego nie całkiem powszechnie dostępnego PDF
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
MirkoT napisał(a):
To ciekawe bo w PDF nie ma na ten temat ani słowa. Może to jest jakaś funkcja nieudokumentowana? Albo z jakiegoś innego nie całkiem powszechnie dostępnego PDF
Coś tam jest innego w tej transmisji, jakaś specyfika. Kod w Arduino działa, ale jak przeniosłem go do C to zapis poza rejestr 0x02 już nie działa. Niby wszystko jest taka samo, ale program w tym miejscu się wiesza, zapewne czeka na ACK który nie przychodzi. Nie wiem jak działa funkcja Wire w Arduino, bo może jakiś inny start transmisji jest wymagana w tym module.
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
Podłączyłem do I2C analizator Saleae No i teraz już kompletnie coś dziwnego jest. Master nadaje adres układy SLAVE nie 0x11 nie 0x10 ale 0x22 przy zapisie i 0x21 przy odczycie.
Mirku Ty się bawiłeś tym układem z tego co widzę. Masz jakieś wytyczne co do komunikacji I2C ?
Bawiłem się ale już prawie albo ponad rok temu .... powstał już nawet wstępny projekt jak widać do książki tyle, że ani nie zdążyłem go dokończyć do końca że tak powiem, ani zmieścić już w YB jak wspominałem. Na dzisiaj to już nawet praktycznie nic nie pamiętam z tamtego czasu ... ale nawet gdybym pamiętał to... ... Nie jestem w stanie omawiać z wyprzedzeniem tego co będzie w książce czy w książkach przykro mi i liczę na zrozumienie.
ale ...
to mnie NAJBARDZIEJ zadziwia ...
sq8dsr napisał(a):
Podłączyłem do I2C analizator Saleae
Na prawdę - bo hmm kolega robi reverseengennering od .... no mega od tyłu .... a po co ?
Proponuję zabawić się w doktora, kubę rozpruwacza MIS(i)O
czyli zamiast bawić się w andruino to je ... hmmm rozpruć .... zapewniam, że tędy bliżej .... niż przez "od tyłu" czyli analizator
To jest moja wskazówka i podpowiedź - zamiast zastanawiać się nad pruciem i2c za pomocą salae ... poważnie
Po to robiłem ten cykl poradników na temat OLED i operacji MIS(i)O ... nie tak sobie, tylko żeby pokazać jak korzystać z andruino. Bo z tego co widzę, to mnóstwo osób korzysta z andruino ale żeby mu zajrzeć do brzucha - to już nie ... po co ? ... I tu popełniają największy błąd, bo te flaczki w środku bywają o wiele cenniejsze niż gotowce w postaci tych tzw skeczów, na podstawie których wielu użytkowników nadruino - owszem odpali jakieś pojedyncze projekty z netu, nawet coś sobie pozmienia w nich na własne potrzeby. Ale gdy przychodzi połączyć ze sobą dwa a nie daj Boże trzy albo więcej projektów (skeczów) andruno w jeden projekt to wtedy biada i nie wiadomo jak.
Podsumowując - czasem warto jednak zejść o krok niżej i zacząć powoli i coraz częściej patrzeć przez pryzmat C
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
mirekk36 napisał(a):
zyli zamiast bawić się w andruino to je ... hmmm rozpruć .... zapewniam, że tędy bliżej .... niż przez "od tyłu" czyli analizator
Ale ja Mirku dokładnie to właśnie robię. Rozpruwam Misia Tzn bibliotekę do Arduino. Chcę to oprogramować sobie w czystym C. Niestety pierwsze próby nie przyniosły rezultatu.... Nie bardzo rozumiem samą transmisję I2C w tym przypadku. Przeniosłem funkcje z biblioteki Arduino do C. Ale niestety nie działa. Oczywiście muszę robić jakiś błąd. Dlatego podłączyłem moduł do Aurduino i odpaliłem go na źródłowej bibliotece. Choćby po to, żeby sprawdzić czy on w ogóle działa. No i oczywiście działa. Dlatego teraz porównuję co ja wysyłam ze swojego programu w C a co wysyła pierwotna biblioteka.
Ok, tylko mi chodziło o to, że z tego co pamiętam to w tej bibliotece było zdaje się wszystko widać ... czyli zarówno jakie adresy na i2c miały być i jakie komendy wysyłane - no wszystko ....
i to miałem na myśli, bo uwierz mi, że na prawdę szczegółów nie pamiętam ale też jak pierwszy raz do tego się przymierzałem to właśnie zacząłem od poprucia jakiejś andruinowej biblioteki
zmyliło mnie to, że pisałeś - że badasz salae adresy i2c a jak mówię - adresowanie powinno być wprost widoczne w bibliotece
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
Cytuj:
zmyliło mnie to, że pisałeś - że badasz salae adresy i2c a jak mówię - adresowanie powinno być wprost widoczne w bibliotece
I jest widoczne. Są dwa adresy 0x10 i 0x11 pierwszy jest używany do transmisji sekwencyjnej (zgodnej z notą) gdzie wskaźnik sam się inkrementuje od adresu 0x02, adrigi (0x11) jest używany do dostępu do wybranego rejestru (co jest nieopisane w nocie). Natomiast nie wiem czemu, ale ja ta biblioteka działa na Arduino to używa adresu 0x22 i 0x21. Arduino używa jako najniższych funkcji do I2C funkcji dostępnych w klasie Wire i też do końca nie wiem jak one podchodzą do transmisji. Tzn jak zrobić podwójny start itd.
Dołączył(a): 05 sie 2013 Posty: 1154 Lokalizacja: Lublin / Kraków
Pomógł: 72
Mam ten moduł już ogarnięty. Bazowałem na bibliotece z EP. Trochę ją rozbebeszyłem, bo pewne rzeczy mi się nie podobają. Ale jako że projekt cały czas się rozwija to jeszcze jej nie optymalizowałem. Może to nie ma większego znaczenia, ale uważam że w wielu miejscach można zmienić typy danych z 16 bitowych na 8 bitowe. Poza "potknąłem się" o problem zawieszania się modułu co skutkowało zawieszaniem się programu (oczekiwanie w pętli while na zmianę flagi TWINT). Mam też pewne problemy z RDSem. Tzn RDS działa, ale często są problemy z jego odbiorem, albo gubienie ramek. Tak jakby transmisja była nieczytelna. Nie przejmuje się tym specjalnie na razie, bo faktycznie może być duże tło zakłóceń. W docelowym projekcie będzie ekranowanie itd więc dopiero wtedy będę mógł powiedzieć coś więcej.
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości
Nie możesz rozpoczynać nowych wątków Nie możesz odpowiadać w wątkach Nie możesz edytować swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników