Serial Peripheral Interface (SPI)
SPI är ett vanligt sätt att kommunicera med yttre enheter från en mikrokontroller som t.ex. sensorer, flashminne, EEPROM eller andra mikrokontrollers. Oftast så sker överföringen mellan olika SPI-enheter via fyra anslutningar; MISO (Master In Slave Out), MOSI (Master Out Slave In), SCK (Synchronization Clock) samt SS (Slave Select).
Om man bara har en enhet på SPI-bussen så kan man koppla SS direkt till GND och spar på så sätt en pinne på mikrokontrollern, om inte så får man se till att själv kontrollera de olika slavenheternas SS i mjukvaran. Som synes på bilden ovan så är shiftregistren i Master- och Slav-enheterna kopplade i en ring. Det innebär att samtidigt som man skickar en byte från mastern så tas en byte emot från slaven, alltså full duplex.
Nedan syns hur man ansluter flera slavenheter. MOSI, MISO och SCK är är ihopkopplade och med SS1 och SS2 väljer man vilken slav man ska kommunicera med. Det är viktigt att bara en slav i taget är vald eftersom signalerna annars kommer att krocka med, som bäst, felaktiga värden eller i värsta fall, trasig elektronik.
Vårt lilla projekt
Den display som används här är en COM-09764 från Sparkfun. Den kan ta emot data antingen via RS232 med TTL-nivåer eller via SPI. Ladda gärna hem databladet. Den finns att köpa med olika färger på segmenten, i det här fallet används en gul display.
Eftersom vi bara ska skriva till displayen och inte läsa data så behöver vi bara använda tre pinnar. Om man vill så kan man även ansluta reset mellan displayen och arduinon. Glöm inte att även spänningsmatningen ska anslutas.
Totalt behöver bara 5 anslutningar göras, sex om man vill koppla reset.
Biblioteksfunktioner
Istället för att skriva helt egna funktioner för SPI.hanteringen så använder vi istället det färdiga biblioteket. De funktioner som finns specificerade i SPI.h underlättar verkligen hanteringen av kommunikationen. Värt att nämna är att biblioteket bara stöder Arduinon som master. Om man vill ha en Arduino som slave så får man skriva rutiner för det själv.
Programmet
/* SPI.ino
*
* Enkelt program för att demonstrera enklast möjliga SPI-
* kommunikation. Visat ordet Halo en halv sekund med 1,5
* sekunds paus.
*/
#include <SPI.h> // inkludera SPI-definitioner
const int chipSelect = 10; // Pinne för Slave Select
void setup()
{
pinMode(chipSelect,OUTPUT); // Sätt SS till utgång
SPI.begin(); // Initiera SPI
SPI.setDataMode(SPI_MODE0); // Sätt SPI mode till 0
SPI.setClockDivider(SPI_CLOCK_DIV64); // Sätt maxhastighet på klocka
Writecommand('z',1); // Sätt ljusstyrka
}
void loop()
{
Write('H'); // Skriv "HALO" till displayen
Write('A');
Write('L');
Write('O');
delay(500); // Vänta en halv sekund
Write(' '); // Skriv " " till displayen
Write(' ');
Write(' ');
Write(' ');
delay(1500); // Vänta 1,5 sekunder
}
/*
* Två subrutiner för att förenklar skrivandet till displayen
*/
void Write(byte data) {
digitalWrite(chipSelect,LOW); // Välj displayen som slav
SPI.transfer(data); // Skriv data till displayen
digitalWrite(chipSelect,HIGH); // Stäng av displayen smo slav
}
void Writecommand(byte command,byte data)
{
digitalWrite(chipSelect,LOW); // Välj displayen som slav
SPI.transfer(command); // Skriv data till displayen
SPI.transfer(data); // Skriv data till displayen
digitalWrite (chipSelect,HIGH); // Stäng av displayen smo slav
}
Lämna ett svar