Toto je starší verze dokumentu!
Vytvořte řídicí systém pro modul FM rádia s čipsetem Si470X. Zaměřte se na korektní dekódování maximálního množství informací vysílaných v RDS. Vizualizujte ovládání na dotykovém displeji kitu 32F429IDISCOVERY, implementujte nastavování hlasitosti, manuální a automatické ladění.
RDS (Radio Data System) je způsob přenosu doplňkových informací u VKV FM rádiového vysílání. Přehledně o něm pojednává kromě Wikipedie například Český rozhlas. Cílem tohoto projektu je vytěžit maximum těchto RDS dat, správně je interpretovat a zobrazit. Výstupem by ideálně mohla být snadno použitelná knihovna pro tyto účely, schopná využívat HAL knihovny a ovladače periferií.
Pro vizualizaci se nabízí hotová řešení - obecně existuje mnoho hotových knihoven, které pomáhají při vývoji grafických rozhraní na embedded zařízeních, jako například STemWin nebo TouchGFX přímo od ST, nebo open-source projekty jako například LittlevGL, o níž je pojednáno níže.
V neposední řadě by tato stránka ráda sloužila jako návod, jak začít vývoj na použitém kitu „od nuly“ s využitím bezplatně dostupných nástrojů.
Zadání obsahuje požadavek využít vývojový kit 32F429IDISCOVERY, jehož klíčové vlastnosti lze nalézt na oficiálním webu výrobce.
Modul rádiového přijímače postavený na Si4703 od Silicon Labs. Výrobce sám poskytuje zevrubnou dokumentaci k čipsetu Si4703, a dokonce také dokumentaci k nakládání s RDS na tomto čipsetu.
Před samotným započetím práce bylo nutné připravit veškeré nástroje pro vývoj. Jedním z osobních cílů mimo zadání projektu bylo, aby byl tento popsaný postup tvorby opakovatelný a modifikovatelný, a také pokud možno i multiplatformně realizovatelný. Pro co nejpohodlnější, univerzální a volně dostupné řešení byly zvoleny následující nástroje, vyzkoušené na Windows 10 a Linux Mint:
Protože řešení si klade za cíl být otevřené, byla do experimentů během vývoje zařazena knihovna LittlevGL. Tu její autor testoval na stejném vývojovém kitu jako je použitý v tomto projektu a své postřehy shrnul v krátkém článku na LittlevGL Embedded GUI Blog.
Práci na projektu lze rozdělit do několika přípravných etap, které postupně vedly nejprve k ověření dílčích celků.
Nejprve bylo nutné nainstalovat a připravit vývojová prostředí. Vše je intuitivní a během několika málo minut již mohl na desce běžet testovací program.
Samotný modul Si4703 bylo nutné nejprve vyzkoušet. Nejsnazším (nejrychlejším) způsobem v zapojení s Arduino Uno, k němuž je již hotová knihovna pro tento modul a jednoduchý návod, bylo ověřeno, že modulu funguje vlastní zapojení obvodu, tak jeho komunikace.
Na základě výše uvedeného článku o grafické knihovně LittlevGL byly úspěšně vyzkoušeny demoverze a benchmarky knihovny. Volně dostupný testovací projekt postačilo stáhnout, doplnit případné chybějící soubory a nahrát úspěšně po přeložení do desky.
Zbývalo tedy propojit tyto ověřené dílčí celky v systém.
Projekt si klade za cíl být pružný a modifikovatelný pomocí použitých nástrojů, takže chce využít maximální množství standardních a zdokumentovaných funkcí pro pozdější modifikovatelnost a reprodukovatelnost. Jinými slovy, usnadnit použité principy natolik, že kdyby projekt někdo četl, tak ať nehledá dlouhé týdny jako já. Rovněž by rád přesáhl hranice projektu předmětu MPOA a poskytl jak zkušenosti (inspiraci) k Si4703 tak LittlevGL. Veškerý kód je a bude volně dostupný v repositáři na githubu: https://github.com/radjur/Si470x
Začátkem byl tedy nový projekt v prostředí CubeMX, které umožňuje v grafickém prostředí konfigurovat periferie mikrokontroléru, respektive přímo používaného vývojového kitu. Výstupem je poté kód, generovaný automaticky na základě nastavených parametrů, který lze při dodržení uživatelských oblastí v generovaném kódu měnit i zpětně. Veškeré periferie jsou řízeny HAL (hardware abstraction layer) drivery, jejichž kompletní dokumentaci lze nalézt přímo u STM, ale i v komentářích kódů vygenerovaných CubeMX. Vlastní aplikaci lze pak vepisovat do oblastí vymezených komentáři „USER CODE BEGIN“ a „USER CODE END“, přičemž při opětovném generování zůstanou tyto oddíly zachovány.
/* How to initialize I2C 3 peripheral pre-configured by CubeMX, opening the project as is in SW4STM32. */ HAL_I2C_MspInit(&hi2c3); //reffering to I2C_HandleTypeDef hi2c3 handler of 3rd I2C peripheral /* That's it. The rest is configured, ready to use driver e.g. HAL_I2C_Mem_Write() etc. */
Začalo testování periferií, potřebných pro komunikaci. Úspěšně se povedlo otestovat komunikaci po sběrnici I2C, kde nejprve bylo v roli Slave nakonfigurováno Arduino Uno, které přeposílalo přijaté bajty přes UART do počítače, aby bylo možné hned sledovat dění a ověřit, že přenos dat probíhá korektně. Následně se pro ladění využilo jedno z vlastních rozhraní UART vývojového kitu, které pro další testování posloužilo jako pomocný výstup.
Vše potřebné bylo připraveno, avšak před samotným přistoupením k vývoji obslužných funkcí pro Si4703 proběhl průzkum již dostupných, hotových aplikací. Protože modul Si4703 je oblíbený v komunitě Arduino, nejrozšířenějším hotovým řešením je Spark Fun Breakout knihovna, dostupná z githubu SparkFun. Github skýtá také volně dostupné řešení pro STM32F10. U obou citovaných zdrojů lze pozorovat obdobný přístup k obsluze, navrhovaný v samotném datasheetu AN230 na straně 12 (odkaz výše), kde se doporučuje doslova ukládání hodnot každého ze 16 registrů lokálně k zjednodušení manipulace s bity v registrech a k redukování počtu čtení a zápisů na sběrnici, k nimž se odkazuje jako ke stínovým registrům ukládaným jako pole 16 slov (2×8 bitů, respektive 2×1 byte). Tyto se vždy načtou z Si4703 do kitu (MCU), dle potřeby pozmění, a opět uloží zpět do Si4703.
Čtení a zápis funguje na principu sběrnice I2C, avšak má svá specifika. Komunikace probíhá ve tří- nebo dvouvodičovém zapojení, které se volí při zapínání zařízení.