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


Jak použít sběrnici SPI

Tato ukázka se nezabývá podrobným popisem této sběrnice, jako jsou průběhy jednotlicých signálů a podobně. To by vydalo na celý samostatný manuál s množstvím diagramů. Jde zde pouze o její použití ve vztahu k mikrokontroléru STM8S103 a jak jej v assembleru programovat pro tento účel.
SPI na STM8 V ukázce, což je fragment kódu níže, jsou uvedeny adresy systémových registrů pro práci s touto sběrnicí. Dále inicializační část SPI_INIT a procedura pro zapis a zároveň i přečtení jednoho byte SPI_TRAN. Sběrnice SPI je plně duplexní, data se posílají současně oběma směry. SPI komunikuje pomocí těchto signálů:

MISOdata z modulu do mikrokontroléru (port C7)
MOSIdata z mikrokontroléru (port C6) do modulu
SCKhodiny, generuje je mikrokontrolér (port C5)
CS/SSvýběr zařízení, pin je volitelný

Procedura SPI_INIT nastavuje režim SPI vzhledem k hodinám. Určí se klidová úroveň hodin (SPOL) a na jaké hraně, vzestupné, či sestupné se data čtou (CPHA). Nastavuje se také rychlost sběrnice pomocí děličky rychlosti CPU (rychlost CPU/dělička). Také zde určí pin pro výběr modulu CS/SS, v této ukázce na A3 a je aktivní v LOW.
Režim se nastavuje podle toho, co vyžaduje připojovaný modul, se kterým se má komunikovat. Stejně tak i rychlost se nastaví taková, jakou zvládá připojený modul. Procedura SPI_TRAN je základní rutina pro přenosy dat. Jeden byte zapíše a současně jeden byte přečte. Od ní se pak odvozuje případný zápis/čtení delších bloků dat, jako jsou wi-fi přenosy, práce s nějakou externí pamětí a podobně.
I když je SPI obousměrná, často se komunikuje pouze jedním směrem, kdy master (mikrokontrolér) data pouze zapisuje, nebo jen čte. Při čtení i tak musí něco poslat, obvykle nulu. Při zápisu přečtený byte ignoruje. Takto je tomu i v této ukázce. Funkce READ_REG a WRITE_REG se týkají konkrétního modulu, v tomto případě wi-fi modulu LT8920 použitého v projektu "bezdráťák". Zapisují a čtou se 16-bitové registry modulu, kde se nejprve vybere čip pomocí signálu CS (aktivní v logické nule), pak se pošle požadovaný registr modulu a nakonec se pošlou, nebo přečtou data (dva byte MSB a LSB).

Ukázka komunikace s SPI

...

;adresy systemovych registru sbernice SPI
SPI_CR1        equ  $5200 ; SPI control register 1
SPI_CR2        equ  $5201 ; SPI control register 2
SPI_SR         equ  $5203 ; SPI status register
SPI_DR         equ  $5204 ; SPI data register

;systemove adresy portu A pro CS/SS (muze byt i jiny)
PA_ODR         equ  $5000 ; Port A data output
PA_DDR         equ  $5002 ; Port A data direction register
PA_CR1         equ  $5003 ; Port A control register 1

;... inicializacni cast programu ...

SPI_INIT      ;pro CS/SS zde vybran port A3
               bset  PA_DDR, #3     ;pin 3 PA3/D2/SS output
               bset  PA_CR1, #3     ;pin 3 PA3/D2/SS push-pull mode
               bset  PA_ODR, #3     ;pin 3 PA3/D2/SS high 

              ;nastavit SPI CPOL=0 (default), CPHA=1
               mov   SPI_CR2, #3    ; SSM + SSI, viz poznamka dole *)1
               mov   SPI_CR1, #$18  ; rychlost - divider 28=master/64, 18=master/16
               bset  SPI_CR1, #2    ; SPI master mode
               bset  SPI_CR1, #0    ; CPHA=1, cteni na sestupne hrane
               bset  SPI_CR1, #6    ; povoli SPI

;... vykonna cast programu ...

SPI_TRAN      ;posle hodnotu v A a precte hodnotu do A
               ld    SPI_DR, A
wait_sent      btjf  SPI_SR, #1, wait_sent ;cekej na odeslani
               nop
wait_recv      btjf  SPI_SR, #0, wait_recv ;cekej na precteni               
               ld    A, SPI_DR
               ret

;... procedury zavisle na typu modulu, viz jeho datasheet

READ_REG      ;precte registr ulozeny v A, hodnotu vrati v Y
               bres  PA_ODR, #3         ;aktivuj CS (chip select)
               or    A, #$80            ;nahodit priznak cteni
               callr SPI_TRAN           ;pozadovany registr
               push  A
               clr   A
               callr SPI_TRAN           ;precte prvni byte MSB
               ld    YH, A              ;MSB
               clr   A
               callr SPI_TRAN           ;precte druhy byte LSB
               ld    YL, A            
               bset  PA_ODR, #3         ;dekativuj CS (chip select)
               pop   A
               ret

;...

WRITE_REG     ;zapise do registru A, hodnotu Y
               bres  PA_ODR, #3         ;aktivuj CS (chip select)
               and   A, #$7f            ;shodit priznak cteni (zapis)
               callr SPI_TRAN           ;pozadovany registr
               push  A
               ld    A, YH
               callr SPI_TRAN           ;zapise prvni byte MSB
               ld    A, YL
               callr SPI_TRAN           ;zapise druhy byte LSB
               bset  PA_ODR, #3         ;deaktivuj CS (chip select)
               pop   A
               ret

k poznámce *)1: SSM (Slave Select Management) a SSI (Internal Slave Select) souvisí s řízením signálu CS/SS (výběr modulu). Nastaveno je softwarové řízení, kdy výběr modulu určujeme sami v programu. Další podrobnosti jsou v datasheetu STM8S103F3 v kapitole ohledně sběrnice SPI (v angličtině).


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