|
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.
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ů:
| MISO | data z modulu do mikrokontroléru (port C7) |
| MOSI | data z mikrokontroléru (port C6) do modulu |
| SCK | hodiny, generuje je mikrokontrolér (port C5) |
| CS/SS | vý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:
| určení jednotlivých pinů |
| Napájení | 5V, 3V3 a zem GND |
| GPIO | všechny piny An, Bn, Cn, Dn |
| UART | TX=pin D5, RX=pin D6 |
| SPI | MISO=pin C7, MOSI=pin C6, SCK=C5, CS/SS=pin A3 |
| I2C | SCL=pin B4, SDA=pin B5 |
| ANALOG | A0=pin C4, A1=pin D2, A2=pin D3, A3=pin D5, A4=pin D6 |
| ST-LINK | piny 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.
|