Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:si470x-rds

Zadání

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í.

Rozbor

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ů.

Nástroje

Použitý hardware

Vývojový kit

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.

https://www.st.com/en/evaluation-tools/32f429idiscovery.html

FM modul Si4703

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.

https://navody.arduino-shop.cz/navody-k-produktum/arduino-fm-radio-si4703.html

Použitý software pro vývoj

Vývojové prostředí

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:

  • STM32CubeMX, multiplatformní nástroj s grafickým rozhraním ke konfiguraci periferií STM32 mikrokontrolérů, který umožňuje přímo konfigurovat použitý kit
  • SW4STM32, multiplatformní IDE (integrated development environment) založené na Eclipse, který podporuje STM32 mikrokontroléry, včetně použitého kitu

Knihovna pro grafické uživatelské rozhraní

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áce na projektu

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ů.

Ověření funkce nástrojů

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.

Vývoj

Slovo úvodem

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á některé informace dlouho, bude-li začínat on nuly 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

Postup práce

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ž hotových aplikací, a to zejména proto aby nevznikla jejich kopie. 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 registrů 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í. Jakmile je nakonfigurováno, může začít čtení/zápis registrů. Je potřeba věnovat pozornost faktu, že čtení probíhá od registru 0x0A a pokračuje přes 0x0F zpět od 0x00 tak, že z 16bitového registru vždy přijde horních 8 bitů a pak dolních 8 bitů vždy v pořadí.

První pokusy o komunikaci probíhaly s využitím HAL I2C Generic Driver, který se ukázal méně vhodný pro tyto účely, protože svou abstrakcí odbíhá od požadovaných kroků nutných během komunikace. Byť snaha dodržet kroky z datasheetu vrátila nějaké nenulové byty, jejich interpretace je chybná.

uint8_t si4703_registers[32] = "";
//force zeros at initial state by default, https://stackoverflow.com/questions/18688971/c-char-array-initialization
 
/* 1. Supply VA and VD. */
/*2. Supply VIO while keeping the RST pin low. Note that power supplies may be sequenced in any order (steps 1
and 2 may be reversed).*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
 
/*3. Configure the proper pins for bus mode selection. See Figure 3, “Powerup, Powerdown, and Reset Flowchart,”
on page 7.*/
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_Delay(1); // some delay needed
 
/*4. Set the RST pin high. The device registers may now be read and written.*/
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(1); // some delay needed
 
/*5. Provide RCLK. If using the internal oscillator option, set the XOSCEN bit. Provide a sufficient delay before
setting the ENABLE bit to ensure that the oscillator has stabilized. The delay will vary depending on the external
oscillator circuit and the ESR of the crystal, and it should include margin to allow for device tolerances. The
recommended minimum delay is no less than 500 ms. A similar delay may be necessary for some external
oscillator circuits. Determine the necessary stabilization time for the clock source in the system.
To experimentally measure the minimum oscillator stabilization time, adjust the delay time between setting the
XOSCEN and ENABLE bits. After powerup, use the Set Property Command described in "5.1.Si4702/03
Commands (Si4702/03 Rev C or Later Device Only)" on page 31 to read property address 0x0700. If the delay
exceeds the minimum oscillator stabilization time, the property value will read 0x1980 ±20%. If the property
value is above this range, the delay time is too short. The selected delay time should include margin to allow for
device tolerances.*/
HAL_I2C_MspInit(&hi2c3);		//wake up the I2C
HAL_I2C_Master_Receive(&hi2c3, SI4703_ADDRESS, si4703_registers, 32, 100); //read for being able to modify
 
/*6. Si4703-C19 Errata Solution 2: Set RDSD = 0x0000. Note that this is a writable register.*/
/*7. Set the ENABLE bit high and the DISABLE bit low to powerup the device.*/

Vhodnějším se zdál být po několikadenním experimentování LL I2C Generic Driver, t/code>edy low-layer, a to primárně protože umožňuje kontrolovat a ovládat stavy komunikace (START, ACK, STOP apod.) na sběrnici I2C. Jeho využití lze v CubeMX nalézt a zapnout v Project Manager>Advanced Settings>Driver Selector. Značná část času byla investována do nastolení korektní komunikace mezi Masterem a Slavem, což se nepodařilo ve stanoveném termínu odladit.

2018/si470x-rds.txt · Poslední úprava: 2019/01/28 08:32 autor: Radovan Juráň