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      
}