[PROJEKT] Tuner FM na układzie Si4703 firmy Silicon Labs i LPC1768

Sklep KAMAMI.pl wprowadził do oferty moduł z układem Si4703 (Silicon Labs). Układ Si4703 to kompletny odbiornik radiowy FM z wieloma zaawansowanymi funkcjami, m.in.:

  • odbiór fal o częstotliwościach w zakresie 76…108 MHz,
  • automatyczne wyszukiwanie stacji (seek),
  • pomiar poiozmu sygnału radiowego,
  • interfejsy SPI i I2C,
  • odbiór danych RDS.

 

 

 

Płytka modułu oprócz samego układu odbiornika zawiera m.in. wzmacniacz audio, gniazdo mini-jack stereo służące do dołączenia słuchawek oraz pole lutownicze dla 8-szpilkowego złącza goldpin. W celu zademonstrowania działania modułu przygotowaliśmy prosty przykład dla płytki startowej miniLPC1768 z mikrokontrolerem LPC1768. Sposób dołączenia modułu do płytki miniLPC1768 przedstawiono na rysunku 1.


Rys. 1. Sposób dołączenia modułu z układem Si4703 do płytki miniLPC1768

Komunikacja z układem Si4703

Nie będziemy się szczegółowo zajmować implementacją obsługi interfejsu I2C oraz linii GPIO, ponieważ biblioteki udostępnione przez firmę NXP są łatwe w użyciu, rzut oka na kod źródłowy powinien rozwiać wszelkie wątpliwości. Konfiguracja linii GPIO odbywa się w funkcji InitGPIO:

Funkcja konfiguruje linie P1.24, P1.25 oraz P0.19, będą one potrzebne podczas inicjalizacji układu Si4703. Interfejs I2C konfigurowany jest w funkcji InitI2C:

Do współpracy z modułem potrzebujemy jeszcze dwóch funkcji, które umożliwią zapis i odczyt rejestrów układu:

Na pierwszy rzut oka sposób zapisu i odczytu rejestrów może wydać się dziwny, ale zaraz wszystko stanie się jasne. Zwykle chcąc odczytać bądź zapisać rejestr musimy wysłać do układu najpierw jego adres w szynie I2C, następnie adres rejestru, w tym momencie możemy odbierać lub wysyłać dane. W przypadku układu Si4703 sprawa wygląda nieco inaczej: wysyłamy tylko adres układu, ale nie wysyłamy adresów rejestrów, tylko od razu odczytujemy lub zapisujemy je sekwencyjnie. Co więcej kolejność rejestrów przy zapisie i odczycie jest inna, przy zapisie ładowane są po kolei rejestry o adresach 0x2..0x7, przy odczycie najpierw odczytywane są rejestry 0xA..0xF, następnie 0x0..0x9.

Inicjalizacja układu Si4703

Układ Si4703 może być kontrolowany przez interfejsy SPI lub I2C zależnie sposobu jego inicjalizacji, w przykładzie posłużymy się interfejsem I2C. Aby uruchomić interfejs I2C układu Si4703 musimy wykonać odpowiednią sekwencję startową:

    • dołączyć zasilanie
    • ustawić stan niski na liniach SDIO i /RST oraz wysoki na /SEN (nasz moduł ma tę linię dołączoną do plusa zasilania, więc możemy nie dołączać jej do mikrokontrolera)
    • ustawić stan wysoki na linii /RST

Teraz możemy uruchomić odbiornik, aby to zrobić należy:

  • ustawić bit XOSCEN w rejestrze 0x7
  • odczekać ok. pół sekundy
  • ustawić bit ENABLE w rejestrze 0x2
  • skonfigurować odbiornik do pracy Europie, czyli ustawić bity DE w rejestrze SYSCONFIG1 i SPACE0 w SYSCONFIG2

Podstawowe funkcje

W przykładzie umożliwiono regulację głośności oraz częstotliwości odbieranej stacji korzystając z ekranu dotykowego. Regulacja głośności polega na zapisaniu wartości głośności (0..15) do odpowiedniego rejestru, to zadanie realizuje funkcja setVolume:

Aby ustawić częstotliwość stacji należy:

    • wpisać nową częstotliwość do rejestru CHANNEL
    • ustawić bit TUNE w rejestrze CHANNEL
    • poczekać aż bit STC w rejestrze STATUSRSSI zostanie ustawiony
    • wyzerować bit TUNE w rejestrze CHANNEL
    • poczekać aż bit STC w rejestrze STATUSRSSI zostanie wyzerowany

Powyższe czynności wykonuje funkcja gotoChannel:

Do pobrania

O autorze