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í (port A3)

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

;--- az potud je to obecne pouzitelna cast SPI -------------------------------------

;... nasleduji procedury zavisle na typu modulu, jako priklad, 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

Všechny zde uváděné zdrojáky mají stejnou strukturu, jsou vytvořeny podle stejné šablony. Na prvním řádku každého zdrojáku musí být direktiva stm8/, jinak překlad skončí chybou. Program má inicializační část (SETUP), kde je nastaven vrchol zásobníku, je vynulována paměť ram, nastaví se rychlost CPU a proběhne základní nastavení použitého hardware, například UART, CPI, I2C, GPIO, atd. Vyhrazené piny pro UART, SPI, I2C a analogy jsou v této tabulce:

STM8S103F3P6
určení jednotlivých pinů
Napájení5V, 3V3 a zem GND
GPIOvšechny piny An, Bn, Cn, Dn
UARTTX=pin D5, RX=pin D6
SPIMISO=pin C7, MOSI=pin C6, SCK=C5, CS/SS=pin A3
I2CSCL=pin B4, SDA=pin B5
ANALOGA0=pin C4, A1=pin D2, A2=pin D3, A3=pin D5, A4=pin D6
ST-LINKpiny pro programátor SWIM a NRST

V nekonečné smyčce (LOOP) se pak provádi samotná činnost. Úplně na konci je tabulka vektorů přerušení v segmentu vectit s popisy, které zařízení může přerušení vyvolat.
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, utilita ST Visual Programmer a dále jsou zde velmí podrobné manuály v PDF (v angličtině) odledně popisu mikrokontroléru a jeho instrukčního souboru.

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í u návodů a ukázek ohledně elektroniky (viz 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   sitemap
tyto stránky jsou provozovány jako hobby, bez reklam a bez sběru osobních dat (c) 2026 iisivak.cz