Elektronika, ukázky pro STM8S103F3, plus programování v assembleru.


Radiopřijímač FM s RDS pomocí modulu Si4703

ukázka ovládání modulu radiopříjímače Si4703 přes sběrnici i2c a čtení dat z RDS

modul Si4703

Jde o radiopřijímač VKV, s modulem s Si4703 podporující příjem dat z RDS. Modul se ovládá pomocí sběrnice i2c. Čtení i zápis řídících slov do registrů je velmi podobný předtím popsanému modulu s čipem TEA5767. Během zápisu i čtení se žádná čísla registrů nezadávají. Prostě odešlete/přečtete souvislou řadu byte. V datasheetu Si4703 sice registry číslovány jsou, ale asi jen pro orientaci. Registry jsou šestnactibitové a je jich celkem šestnáct (32 byte).
Zápis začíná vždy od registru 0x02 a odeslat by se mělo šest slov (12 byte). Tím se zapíší registry 0x02 až 0x07 včetně. Registr 0x02 je pro volbu režimu a zapnutí/vypnutí modulu. Regisitr 0x03 slouží k naladění stanice, registry 0x04, 0x05 a 0x06 jsou konfigurační. V registru 0x07 se zapíná oscilátor, bez toho modul nehraje. Následují ještě registry 0x08 a 0x09, ale ty jsou uvedeny jako testovací a činnost modulu nějspíše neovlivňují. V této ukázce se modul nastavuje na mono. Pro stereo je nutný silnější signál.
Čtení začíná registrem 0x0A. Můžete načíst všech šestnáct registrů v tomto pořadí: 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, pak teprve následují registry 0x00 až 0x09. Registry 0x0A a 0x0B jsou stavové a registry 0x0C, 0x0D, 0x0E a 0x0F jsou data RDS. Ještě zbývá dodat, že registr 0x00 je ID zařízení (device ID) a 0x01 je ID čipu (chip ID).

schema

Propojení modulů je opět velmi jednoduché: napájení 3.3V, dva datové vodiče pro i2c (scl, sda), GPIO2 kvůli přerušení a RST (reset), nutný při zapnutí modulu. Toto schéma není úplné, je nutný ještě displej a nějaké ovládání. Ovládat se může buď pomocí tlačítek, nebo infra ovladačem. Na modulu je konektor 3,5mm jack, který slouží k připojení sluchátek. Kabel od sluchátek je zároveň anténa. Pokud by se měl připojit nf zesilovač, anténa se připojuje k pravému kanálu konektoru jack, tak jak je naznačeno ve schématu. Ladění frekvencí je oproti TEA5767 jednodušší. Zadává se přímo číslo kanálu, které lze snadno vypočítat.

        frekvence[khz] - okraj pásma
kanál = ---------------------------- 
             šířka kanálu[kHz]
Například pro 99.3MHz (Evropa2 z vysílače Praděd) vyjde číslo kanálu 118.
             99300 - 87500                      993 - 875
99.3 MHz =>  ------------- => pokrátit / 100 => --------- => 993 - 875 = 118
                  100                               1
Stačí tedy prostě vzít požadovanou frekvenci v MHz bez desetinné čárky, od ní odečíst 875 a máte číslo kanálu. Šířka kanálu je pro Evropu 100 kHz a nastavuje se v registru 0x05 položka "channel spacing" bity[5:4]. Pozor, defaultně je zde přednastaveno 200 kHz (USA). Celé nastavení konfigurace je patrné ze zdrojáku níže.

Čtení dat z RDS:
Aby příjem dat byl možný a spolehnivý, je potřebný poměrně silný signál. Načítání dat z RDS je zde přes přerušení. Jeví se mi to jako nejspolehlivější. Pro jednoduchost jsem se omezil pouze na přečtení názvu stanice, radiotextu a časové značky. Informací je však poskytováno daleko více. Data RDS jsou vysílány ve čtyřech blocích po šestnacti bitech (čtyři 16-ti bitová slova):

  • RDSA - reg.0x0C jedinečné ID stanice, asi ho přiděluje nějaká nadnárodní autorita
  • RDSB - reg.0x0D určuje, co obsahují data v RDSC a RDSD
  • RDSC - reg.0x0E data určená pomocí RDSB
  • RDSD - reg.0x0F data určená pomocí RDSB

Určující slovo RDSB vypadá asi nějak takto:

  15   14   13   12     11     10    9    8     7    6     5      4     3    2    1    0
  --- typ bloku ---     ver    --------- PTY ---------     TP     TA    - pozice textu -
názevbitpopis
typ bloku15-12určuje, o jaká data v RDSC a RDSD jde
   0 (0000b)=název stanice
   2 (0010b)=radiotext
   4 (0100b)=časová značka
atd. (typů je více, ale tato ukázka s nimi nepracuje)
verze (A nebo B)11pokud jde o název stanice, nebo radiotext (typ bloku 0000b, 0010b)
   u verze A RDSC i RDSD obsahují dva znaky, celkem čtyři znaky
   u verze B je v RDSC nějaké jiné info a RDSD obsahuje dva znaky
PTY, typ programu10-65 bitů určujících žánr (v EU např. 1 = News, 10 = Pop Music...)
TP, dopravní zprávy5stanice vysílá dopravní zprávy
TA, dopravní relace4stanice vysílá dopravní relaci (jaký je v tom rozdíl nevím)
pozice textu3-0určuje pozici (index v pro textový řetězec) právě přijatého fragmentu názvu stanice, nebo radiotextu, je potřeba jej vynásobit čtyřmi, nebo dvěma podle verze určené bitem 11 v RSDB (A nebo B)

Ukázka zde pracuje s typem bloku 0A/0B - název stanice, 2A/2B - radiotext a 4A - časová značka. Pokud jde o text (název, radiotext), jsou znaky umístěny v RDSC pouze u verze A (viz bit 11 RDSB) a vždy v RDSD. U verze B jsou znaky pouze v RDSD, RDSC obsahuje nějakou jinou informaci. U verze A jsou to tedy čtyři znaky a u verze B dva. Kam fragment textu patří je určeno v RDSB v bitech 3-0. Délka vysílaného radiotextu může mít 64 znaků u verze A a 32 znaků u verze B.
U časové značky jsem se zatím zabýval pouze hodinou a minutou. Hodinu udává pět bitů, kde první je v nultém bitu v RDSC, pak následují další čtyři bity v RDSD (15-12). V dalších šesti bitech jsou minuty (11-6). Bit 5 určuje znaménko pro výpočet posunu UTC (bity 4-0). UTC je po půlhodinách, ale v kódu jsem řešil pouze celé hodiny se znaménkem plus, což odpovídá našemu časovému pásmu.

Obsah RDSC a RDSD u časové značky:

RDSC                                     RDSD
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0    15 14 13 12   11 10  9  8  7  6    5    4 3 2 1 0
                                    -- hod 5 bitu --   - minuty 6 bitu -   +/-   -- UTC --

Si4703 by měl umět ošetřit případné chyby přenosu. Ve stavovém registru 0x0B jsou položky BLERB, BLERC, BLERD (BLERA je v registru 0x0A) vždy po dvou bitech, které udávají chybovost přenosu pro každý blok. Pokud je přenost bez chyby, obsahují nulovou hodnotu. Aby "BLERy" fungovaly musí být zapnut "RDS verbose", což je bit 11 v registru 0x02 (RSDM=1). V ukázce testuji bloky B, C a D, které uložím do paměti pouze v případě bezchybného přečtení.

vyrez
název stanice a radiotext v paměti

Zdrojový kód:
Jde jen o jakýsi polotovar, který nastaví a zapne modul Si4703, naladí jednu stanici a čte data z RDS do paměti. Dále připravuje stavové informace, podle kterých by se mělo nějak reagovat (viz zdroják). Je potřeba dodělat zobrazování na nějaký displej. Pak hlavně nějaké ovládání jako ladění stanic, nastavení hlasitosti, přepínání mono/stereo, atd. Možná se do toho ještě pustím...


všeobecné informace

U modulů, které jsem v rámci svých možností odladil a otestoval, jsem vytvořil prográmek, který lze formou copy-paste vytáhnout (buď celý, nebo pouze potřebné kusy kódu) a použít jej v nějaké Vaší aplikaci. Zkopírovat se musí potřebný kód, proměnné v paměti a deklarace konstant (equ).

Na stránkách výrobce ST Microelectronics je ke stažení vývojové prostředí ST Visual develop a dále jsou zde velmí podrobné manuály v PDF (v angličtině) odledně popisu mikrokontroléru a jeho instrukčního souboru.

Každý zde uváděný zdroják má stejnou strukturu. Na začátku jsou deklarace adres použitých systémových registrů (UART, I2C, GPIO...), což je klíčové. Tyto adresy jsou popsány jednak v datasheetu STM8, a také jsou k dispozici ve zdrojovém kódu, který je nainstalován spolu s prostředím ST Visual develop ve složce [Program Files]\ STMicroelectronics\ st_toolset\ asm\ include\ STM8S103F.asm). Asi je možné ji deklarovat jako include, ale zde jsou ve zdrojáku definovány pouze ty, které jsou použity.
Dále je inicializační část, kde je vynulována paměť ram, nastaví se rychost CPU a proběhne základní nastavení použitého hardware, například rychlost UARTu, GPIO input/output, atd. Pak už následují rutiny pro konkrétní modul.V nekonečné smyčce infinite_loop je ukázka činnosti. Samotné rutiny lze podle potřeby vykopírovat do jiného projektu. Úplně na konci je tabulka vektorů přerušení v segmentu vectit s popisy, které zařízení může přerušení vyvolat.

Rychlý návod jak vytvořit nový projekt v prostředí ST Visual Dvelop:
  • V Hlavním menu vybrat File a New workspace.
  • Zvolit položku Create workspace and project
  • Objeví se dialog pro zadání skupiny projektů.
  • Vyplňte pole workspace filename (název skupiny projektů)
  • Vyyplňte pole workspace location (složka pro umístění)
  • Naskočí další okno pro projekt.
  • Vyplňte pole project filename (název projektu)
  • Vyplňte pole project location (složka pro umístěni projektu, zde doporučuji vybrat podsložku skupiny projektů).
  • Do pole toolchain vyberte ST Assembler Linker.
  • Pole toolchain root ponechte nezměněno.
  • Naběhne výběr pro konkrétní CPU.
  • Vyberte v něm STM8S103F3P.

Tím se vytvoří projekt. Na levé straně se objeví strom Workspace, kde ve větvi source files otevřete main.asm, které je hlavní zdroják projektu. Je předvyplněn o počáteční definici segmentů a tabulku přerušení. Můžete jej vyčistit a pak do něj přes copy-paste (CTRL+A - CTRL+C -> CTRL+V) vložit některé s zde uváděných mých (nebo Vašich) zdrojáků. Soubory mapping.asm a mapping.inc systém vytvořil automaticky a není doporučeno do nich zasahovat, protože systém je interně přepisuje. Do téhož workspace můžete vkládat více projektů, každý však musí mít svou složku.
Do existujícího workspace pak lze přidávat libovolný počet projektů, pomocí pravého tlačítka myši na kořenové (nejvyšší) větvi stromu "workspace". Podmínkou je, aby každý projekt byl v samostatné složce (adresáři). Do podvětví source files, nebo include files, každého projektu se mohou přidávat další moduly. Další podrobnosti ohledně práce v prostředí ST Visual develop je v tomto manuálu (anglicky).

Nahrání (vypálení) programu do modulu:

RTC Především připojte k modulu vývojové desky STM8S103F3 programátor ST-Link. K tomu jsou určeny čtyři piny na desce vpravo: 3V3, SWIM, GND a NRST (viz obrázek vlevo).
Program lze vypálit přímo z prostředí "ST Visual Dvelopu" takto: v hlavním menu vyberte Build - Build (F7). Pokud překlad a sestavení proběhhne bez chyb, spusťte Debug - Start debugging. Tím se projekt nahraje (vypálí), naskočí okno debuggeru a případně můžete projekt spustit (F5), nebo krokovat (F10).
Vypálit program do STM8 se dá i jednodušeji pomocí ST Visual Programmer, pokud máte k dispozici již "visual developem" přeložený soubor (F7-build, viz výše) *.s19. Tento vznikne v podsložce projektu DEBUG, nebo RELEASE. Otevřete jej přes hlavní menu-File-Open a přes hlavní menu-Program-Current tab program vypálíte. Případně ještě můžete správnost vypálení ověřit pomocí hlavní menu-Verify-Current tab. Další podobnosti odhledně používání ST Visual Programmeru jsou v jeho nápovědě: hlavní menu-Help-Index.

Dúležité upozornění: Zde presentovaný modul mikrokontroléru má výstupy 5V, 3V3 a GND. Na výstupu 5V ve skutečnosti není 5 voltů, ale vstupní napětí, kterým celý tento modul napájíte, buď přes piny +/-, nebo přes konektor mikroUSB, což může být 4.5 - 15V. Buďte opatrní, co k tomu pinu (5V) připojíte, připojovaný modul můžete tímto zničit. Doporučuji modul napájet výhradně z 5V zdroje.

Vzkazník - dotazy, názory, připominky, hlášení chyb, atd:
případný E-mail nebude nikde zveřejněn, uveďte jej, pouze pokud si přejete odpověď.

Elektronika, ukázky pro Arduino a STM8, plus programování v Delphi (Lazarusu).
Všechna zapojení modulů v ukázkách (viz elektrická schémata) pracují s velmi malým napětím 3.3V až 12V a neobsahují návod na napájecí zdroj. Pokud se rozhodnete některé z těchto zařízení postavit, důrazně doporučuji používat zdroje s výstupním napětím maximálně 12V, podle schválených norem platných v ČR. Autor návodů za případné škody nepřebírá žádnou odpovědnost.
nahoru

(c) 2026 iisivak.xf.cz