De seriële uitbreidingspoort
De uitbreidingspoort op de micro-controller is eveneens een seriële
poort, waarbij echter ook de clock wordt meegestuurd. De poort kan
gebruikt worden voor communicatie tussen twee of meer micro-controllers,
en voor uitbreiding van de I/O capaciteit. Dit type poort wordt SPI
(Serial Peripheral Interface) genoemd.
De communicatie gaat via twee datalijnen. Deze datalijnen zorgen voor
communicatie in twee richtingen tegelijk (full-duplex.) De clock-lijn
geeft het ritme aan waarmee de bits verstuurd en ontvangen worden.
Netwerken
Elke micro-controller kan als 'master' of als 'slave' ingesteld worden.
De master beheert de communicatie tussen de processoren. De master
genereert de clock (op de PD4 pin.) Voor de slaves is de clock een ingang
(ook op de PD4 pin.) Een controller is een master wanneer de SS-pin op PD5
een '1' is. Als deze pin een '0' wordt gemaakt, is de controller een
slave. In een netwerkje mag op elk moment maar één van de controllers
een master zijn, de anderen zijn dan allemaal een slave.
Twee pinnen verzorgen het datatransport tussen de controllers. De data
gaat van de master naar de slave(s) via de MOSI pinnen op PD3, en van de
slaves naar de master via de MISO pinnen op PD2. De communicatie gaat in
twee richtingen tegelijk. Op het moment dat de master een byte in het
zend-register zet (het SPDR register), wordt dit seriëel naar de slave(s)
verstuurd. Daar komt het aan in het SPDR register van de slave(s).
Tegelijkertijd kan het byte dat door één van de slaves in zijn SPDR
register werd gezet naar de master verstuurd worden. Een slave kan zelf
bepalen of hij data naar de master terugstuurt of niet. Uiteraard mag er
maar één slave tegelijkertijd data naar de master terugsturen.
Speciale I/O functies toevoegen
Uitbreiding van de I/O capaciteit kan via speciale IC's die over een
seriële poort beschikken zoals die ook op de micro-controller is
aangebracht. Dergelijke IC's zijn beschikbaar voor het besturen van LCD
displays, analoge ingangen, analoge uitgangen, etc.
Ook gewone TTL IC's kunnen gebruikt worden om het aantal digitale I/O's te
vergroten. Een voorbeeld is verderop gegeven.
De I/O uitbreiden
De uitbreiding van de digitale I/O kan via goedkope TTL of CMOS IC's,
die in staat zijn seriële data om te zetten naar parallel (voor het
uitbreiden van het aantal uitgangen), of van parallel naar seriëel (voor
het uitbreiden van het aantal ingangen.)
Deze IC's hebben een data in- of uitgang, en een clock ingang.
Daarnaast moeten ze beschikken over een 'strobe' of 'load' ingang.
Geschikte IC's zijn bijvoorbeeld de 74HC4094 voor extra uitgangen, of de
74HC165 voor extra ingangen.
De procedure is als volgt:
- De 'load' ingang van het IC met de extra ingangen wordt geaktiveerd,
zodat de parallelle data in dit IC wordt ingelezen.
- Het byte dat bestemd is voor het IC met de extra uitgangen wordt in het
SPDR register gezet.
- De micro-controller verstuurt nu het te verzenden byte seriëel naar
het IC met de extra uitgangen, en tegelijkertijd wordt het IC met de extra
ingangen seriëel gelezen.
- De 'strobe' ingang van het IC met de extra uitgangen wordt geaktiveerd,
zodat de door het IC seriëel ontvangen data op de parallelle uitgangen
wordt gezet.
- Het uit het IC met de extra ingangen opgehaalde byte kan worden gelezen
uit het SPDR register.
Met behulp van de SPR1 en SPR0 bits in het SPCR register wordt
geprogrammeerd hoe snel het transport van de data gaat.
|
SPR1
|
SPR0
|
bitrate
|
|
0
|
0
|
1 MHz
|
|
0
|
1
|
500 kHz
|
|
1
|
0
|
125 kHz
|
|
1
|
1
|
62.5 kHz
|
Twee andere bits in het SPCR register bepalen hoe de clock-uitgang zich
zal gedragen. Als CPOL een '0' is, is de clock-uitgang een '0' wanneer er
geen datatransport is. Als het CPOL bit een '1' is, is de clock-uitgang in
rust een '1'. Het CPHA bit bepaalt of het bittransport op een opgaande
flank van de clock moet gebeuren (CPHA is een '1'), of op een neergaande
flank (CPHA is een '0'.) Wanneer de bovengenoemde IC's gebruikt worden,
moet zowel CPOL als CPHA een '1' gemaakt worden.
Het SPCR register bevat ook een bit waarmee de micro-controller als
master geprogrammeerd kan worden. Als de poort gebruikt wordt voor
uitbreiding van de digitale I/O, moet de micro-controller als master
functioneren. Het MSTR bit in het SPCR register moet dus een '1' gemaakt
worden.
Interrupts
Wanneer het te verzenden byte verstuurd is, kan een interrupt
gegenereerd worden. Dit gebeurt wanneer het SPIE bit in het SPCR register
een '1' gemaakt wordt.
Open-collector uitgangen
Het DWOM bit in het SPCR register bepaalt of de uitgangen van poort D
(alle uitgangen) gewone uitgangen zijn (en zowel naar de +5V als naar
massa kunnen schakelen) of 'open-collector' uitgangen (dan kunnen ze
alleen naar massa schakelen.) Het is verstandig om dit bit op '0' te
zetten.
Seriële poort aanzetten
Het SPE bit in het SPCR register bepaalt of de seriële poort aan
staat, of is uitgeschakeld. Dit bit moet een '1' zijn om de poort te
kunnen gebruiken.
Statusregister
De status van de seriële poort kan worden afgelezen van het SPSR
register. Het WCOL bit in dit register wordt een '1' wanneer naar het SPDR
register wordt geschreven terwijl er nog een byte getransporteerd wordt.
Dit bit is vooral van belang wanneer de micro-controller als 'slave' in
een netwerk is opgenomen.
Het MODF bit wordt een '1' gemaakt wanneer de SS pin op PD5 een '0'
gemaakt wordt, terwijl het MSTR bit in het SPCR register een '1' is. Ook
dit bit is alleen van belang wanneer de micro-controller in een netwerk is
opgenomen.
Wanneer de seriële poort als uitbreidingspoort wordt gebruikt, kan de
SS pin op PD5 gewoon als digitale ingang of uitgang gebruikt worden. De
richting van de pin wordt vastgelegd met behulp van bit5 in het DDRD
register. Met een '1' in dit bit, is de SS pin een uitgang, en met een '0'
in dit bit is de pin een ingang.
8 extra uitgangen
Het onderstaande voorbeeld geeft aan hoe het aantal
digitale uitgangen uitgebreid kan worden met 8 extra bits.
In dit schema wordt de SS pin gebruikt om de seriëel in het IC geladen
data door te geven naar de parallelle uitgangen.
Het aantal uitgangen kan zeer eenvoudig verder uitgebreid worden, door
meerdere van deze IC's achter elkaar te zetten. De seriële uitgang van
het eerste IC (beschikbaar op pin 9) wordt dan verbonden met de seriële
ingang van het volgende IC, etc. Wanneer op deze wijze bijvoorbeeld 6 IC's
achter elkaar zijn geplaatst, moeten via de seriële poort 6 bytes worden
verstuurd. Het byte dat als eerste verstuurd werd, komt terecht in het
laatste IC. Als alle bytes verstuurd zijn, hebben alle IC's een nieuwe
waarde ingelezen. Deze nieuwe waarde kan naar de uitgangen worden
doorgegeven via de 'strobe' pinnen, die allemaal parallel kunnen zijn
aangesloten op PD5. Ook de clocks kunnen parallel worden aangesloten, op
PD4.
Een subroutine om data via de uitbreidingspoort te versturen is
hieronder gegeven.
spiss equ bit5 |SS pin op PD5, gebruikt voor de strobe
spimosi equ bit3 |data uitgang
spiclk equ bit4 |seriële clock
* initialiseer de uitbreidingspoort
ldab ddrd |maak de pinnen uitgangen
orab #(spiss or spiclk or spimosi)
stab ddrd
ldab portd |en maak de strobe een '0'
andb #(not(spiss))
stab portd
ldab spcr |kies de snelheid en andere opties
orab #(spe or mstr or cpol or cpha)
andb #not(spie or dwom or spr1 or spr0)
stab spcr
rts
* stuur een byte naar de uitbreidingspoort
putspi equ $
stab spdr |zet het byte in de zender
putspi0 tst spsr
bpl putspi0 |en wacht tot het weg is
rts
* strobe de nieuwe data naar de uitgangen van het IC
strobespi equ $
pshb
ldab portd
orab #spiss
stab portd |maak de strobe een '1'
andb #not(spiss)
stab portd |en daarna weer een '0'
pulb
rts
Registers voor de uitbreidingspoort
De registers die voor de instellingen van de uitbreidingspoort van
belang zijn, zijn:
SPCR $1028
|
spie
|
spe
|
dwom
|
mstr
|
cpol
|
cpha
|
spr1
|
spr0
|
SPSR $1029
SPDR $102A
|
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
|