Tutorial: Arduino i magistrala SPI

jest to pierwszy z dwóch rozdziałów, w których zaczniemy badać magistralę danych SPI i jak możemy sterować urządzeniami używającymi jej w naszych systemach Arduino.

magistrala SPI może wydawać się złożonym interfejsem do opanowania, jednak dzięki krótkim studiom tego wyjaśnienia i praktycznym przykładom wkrótce staniesz się magistralą! Aby to zrobić, poznamy niezbędną teorię, a następnie zastosujemy ją, kontrolując różne urządzenia. W tym samouczku wszystko będzie tak proste, jak to możliwe.

ale przede wszystkim o co chodzi? I trochę teorii …

SPI to skrót od „Serial Peripheral Interface”. Jest to synchroniczna szeregowa szyna danych-dane mogą podróżować w obu kierunkach w tym samym czasie, w przeciwieństwie do (na przykład) magistrali I2C, która nie może tego zrobić. Aby umożliwić synchroniczną transmisję danych, szyna SPI wykorzystuje cztery przewody. Są one nazywane:

  • MOSI – Master-out, Slave-in. Ta linia przenosi dane z naszego Arduino do urządzeń sterowanych SPI;
  • MISO-Master-in, Slave out. Ta linia przenosi dane z urządzeń sterowanych SPI z powrotem do Arduino;
  • SS – Slave-select. Ta linia informuje urządzenie na magistrali, że chcemy się z nim komunikować. Każde urządzenie SPI potrzebuje unikalnej linii SS z powrotem do Arduino;
  • SCK – Serial clock.

w tych samouczkach uważamy tablicę Arduino za master, a urządzenia SPI za Slave. Na naszych płytach Arduino Uno i kompatybilnych stosowane są piny:

  • SS – digital 10. Możesz użyć innych pinów cyfrowych, ale 10 jest zazwyczaj domyślne, ponieważ znajduje się obok innych pinów SPI;
  • MOSI-digital 11;
  • MISO-digital 12;
  • SCK-digital 13;

użytkownicy Arduino Mega – MISO to 50, MOSI to 51, SCK to 52, A SS to zwykle 53. Jeśli używasz Arduino Leonardo, piny SPI znajdują się na pinach nagłówka ICSP. Więcej informacji znajdziesz tutaj. Za pomocą magistrali SPI można sterować jednym lub kilkoma urządzeniami. Na przykład, dla jednego urządzenia okablowanie będzie:

sspiss1

dane podróżują tam iz powrotem wzdłuż linii MOSI i MISO między naszym Arduino a urządzeniem SPI. Może się to zdarzyć tylko wtedy, gdy linia SS jest ustawiona na niską. Innymi słowy, aby komunikować się z konkretnym urządzeniem SPI w magistrali, ustawiamy linię SS na niską, a następnie komunikujemy się z nią, a następnie ustawiamy linię z powrotem na wysoką. Jeśli mamy dwa lub więcej urządzeń SPI na magistrali, okablowanie będzie wyglądać następująco:

sspiss2

zauważ, że istnieją dwie linie SS – potrzebujemy jednej dla każdego urządzenia SPI na magistrali. Możesz użyć dowolnego wolnego pin wyjścia cyfrowego na Arduino jako linii SS. Pamiętaj tylko, aby wszystkie linie SS były wysokie, z wyjątkiem linii podłączonej do urządzenia SPI, którego chcesz używać w tym czasie.

dane są przesyłane do urządzenia SPI w postaci bajtów. Powinieneś już wiedzieć, że osiem bitów tworzy jeden bajt, co oznacza liczbę binarną o wartości od zera do 255.

komunikując się z naszymi urządzeniami SPI, musimy wiedzieć, w jaki sposób urządzenie radzi sobie z danymi – najpierw MSB lub LSB. MSB (bit najbardziej znaczący) jest lewą stroną liczby binarnej, a LSB (bit najmniej znaczący) jest prawą stroną liczby. To jest:

binnum

oprócz wysyłania wartości liczbowych wzdłuż szyny SPI, liczby binarne mogą również reprezentować polecenia. Możesz reprezentować osiem ustawień włączania / wyłączania przy użyciu jednego bajtu danych, więc parametry urządzenia można ustawić, wysyłając bajt danych. Parametry te różnią się w zależności od urządzenia i powinny być zilustrowane w Karcie Danych danego urządzenia. Na przykład cyfrowy potencjometr IC z sześcioma garnkami:

sdata1

To urządzenie wymaga dwóch bajtów danych. Bajt ADDR informuje urządzenie, które z sześciu potencjometrów ma sterować (numerowane od 0 do 5), a bajt danych jest wartością dla potencjometru (0~255). Możemy użyć liczb całkowitych do reprezentowania tych dwóch wartości. Na przykład, aby ustawić potencjometr numer dwa na 125, wyślemy 2, a następnie 125 do urządzenia.

Jak wysyłać dane do urządzeń SPI w naszych szkicach?

przede wszystkim musimy skorzystać z biblioteki SPI. Jest on dołączony do domyślnej instalacji Arduino IDE, więc umieść na początku szkicu następujący tekst:

#include "SPI.h"

następny, w void.setup() deklaruje, które piny będą używane dla SS i ustawia je jako wyjście. Na przykład

pinMode(ss, OUTPUT);

gdzie ss zostało wcześniej zadeklarowane jako liczba całkowita o wartości dziesięć. Teraz, aby aktywować magistralę SPI:

SPI.begin();

i wreszcie musimy powiedzieć szkicowi, w jaki sposób wysłać dane, MSB lub LSB najpierw za pomocą

SPI.setBitOrder(MSBFIRST);

lub

SPI.setBitOrder(LSBFIRST);

, gdy nadszedł czas, aby wysłać dane w dół magistrala SPI do naszego urządzenia, trzy rzeczy muszą się zdarzyć. Najpierw ustaw cyfrowy pin z SS na niski:

digitalWrite(SS, LOW);

następnie wyślij dane w bajtach, jeden bajt na raz za pomocą:

SPI.transfer(value);

wartość może być liczbą całkowitą / bajtem od zera do 255. Wreszcie, po zakończeniu wysyłania danych do urządzenia, Zakończ transmisję, ustawiając ss high:

digitalWrite(ss, HIGH);

wysyłanie danych jest dość proste. Generalnie najtrudniejszą częścią dla ludzi jest interpretacja karty danych urządzenia, aby zrozumieć, w jaki sposób polecenia i dane muszą być skonstruowane do transmisji. Ale przy odrobinie praktyki te małe przeszkody można pokonać.

teraz kilka praktycznych przykładów!

czas wsiąść do magistrali SPI i sterować niektórymi urządzeniami. Postępując zgodnie z poniższymi przykładami, powinieneś uzyskać praktyczne zrozumienie, w jaki sposób szyna SPI i urządzenia mogą być używane z naszymi płytami Arduino.

MCP4162 przykład

nasz pierwszy przykład wykorzysta prostą, ale interesującą część – potencjometr cyfrowy (użyliśmy go również w samouczku I2C). Tym razem mamy mikrochip MCP4162-seria 10K reostat:

digipotss

Oto karta danych do przeglądania. Aby go kontrolować musimy wysłać dwa bajty danych-pierwszy bajt jest bajtem sterującym i na szczęście dla tego przykładu jest to zawsze zero (ponieważ adres dla wartości wycieraczki to 00h). Drugi bajt to wartość do Ustawienia wycieraczki, która kontroluje rezystancję. Aby ustawić wycieraczkę, musimy zrobić trzy rzeczy w naszym szkicu…

najpierw ustaw linię SS (Slave select) na niską:

digitalWrite(10, LOW);

następnie wyślij dwa bajty danych:

SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

na koniec ustaw linię SS z powrotem na wysoką:

digitalWrite(10, HIGH);

łatwo to zrobić. Połączenie z naszą płytą Arduino jest bardzo proste – rozważ pinout MCP4162:

mcp4162pinout

Vdd łączy się z 5V, VSS do GND, CS do digital 10, SCK do digital 13, SDI do digital 11 i SDO do Cyfrowa 12. Teraz przejdźmy przez dostępne wartości MCP4162 w następującym szkicu:

/* SPI bus demo using a Microchip MCP4162 digital potentiometer */#include "SPI.h" // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=200; // used for various delaysvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our MCP4162 requires data to be sent MSB (most significant byte) first}void setValue(int value){ digitalWrite(ss, LOW); SPI.transfer(0); // send command byte SPI.transfer(value); // send value (0~255) digitalWrite(ss, HIGH);}void loop(){ for (int a=0; a<256; a++) { setValue(a); delay(del); } for (int a=255; a>=0; --a) { setValue(a); delay(del); }}

teraz, aby zobaczyć wyniki szkicu. W poniższym klipie wideo a przechodzimy przez Zakres rezystancji i mierzymy wartość reostatu za pomocą multimetru:

przed przejściem do przodu, jeśli Potencjometry cyfrowe są dla Ciebie nowe, rozważ przeczytanie tego krótkiego przewodnika napisanego przez Microchip na temat różnic między potencjometrami mechanicznymi i cyfrowymi.

inny przykład:

w tym przykładzie użyjemy czterokanałowego cyfrowego potencjometru Analog Devices AD5204 (karta danych.pdf). Zawiera cztery potencjometry liniowe 10K ohm, a każdy potencjometr jest regulowany do jednej z 256 pozycji.

ustawienia są zmienne, co oznacza, że nie są pamiętane po wyłączeniu zasilania. Dlatego po przyłożeniu zasilania Potencjometry są wstępnie ustawione na środku skali. Naszym przykładem jest przykład montażu powierzchniowego SOIC-24, jednak jest również produkowany w formacie DIP.

ad5204ss

aby ułatwić życie, można go przylutować do płyty breakout SOIC, która przekształca go w pakiet z otworem przelotowym:

ad5204boardss1

w tym przykładzie kontrolujemy jasność cztery diody LED. Okablowanie jest bardzo proste. Wyprowadzenia znajdują się w arkuszu danych.

ex34p2schematic1

oraz szkic:

#include <SPI.h> // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=5; // used for fading delayvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our AD5204 requires data to be sent MSB (most significant byte) first. See data sheet page 5 allOff(); // we do this as pot memories are volatile}void allOff()// sets all potentiometers to minimum value{ for (int z=0; z<4; z++) { setPot(z,0); }}void allOn()// sets all potentiometers to maximum value{ for (int z=0; z<4; z++) { setPot(z,255); }}void setPot(int pot, int level)// sets potentiometer 'pot' to level 'level'{ digitalWrite(ss, LOW); SPI.transfer(pot); SPI.transfer(level); digitalWrite(ss, HIGH);}void blinkAll(int count){ for (int z=0; zvoid indFade(){ for (int a=0; a<4; a++) { for (int l=0; l<255; l++) { setPot(a,l); delay(del); } for (int l=255; l>=0; --l) { setPot(a,l); delay(del); } }}void allFade(int count){ for (int a=0; a<count; a++)="" {="" for="" (int="" l="0;" l<255;="" l++)="" setpot(0,l);="" setpot(1,l);="" setpot(2,l);="" setpot(3,l);="" delay(del);="" }="">=0; --l) { setPot(0,l); setPot(1,l); setPot(2,l); setPot(3,l); delay(del); } }}void loop(){ blinkAll(3); delay(1000); indFade(); allFade(3);}

funkcje alloff() i allOn() służą do Ustawienia potencjometrów odpowiednio na minimum i maksimum. Używamy alloff () na początku szkicu, aby wyłączyć Diody LED. Jest to konieczne, ponieważ przy włączaniu wycieraczki są zwykle ustawione w połowie drogi.

ponadto używamy ich w funkcji blinkAll() do … mrugania diodami LED. Funkcja setPot () przyjmuje liczbę wycieraczki (0~3) i wartość do Ustawienia tej wycieraczki (0~255). Wreszcie funkcja indFade () wykonuje dobrą robotę, aby gasnąć każdą diodę LED w kolejności włączania i wyłączania – powodując efekt bardzo podobny do modulacji szerokości impulsu.

wreszcie jest w akcji:

więc masz to-mam nadzieję, że łatwe do zrozumienia wprowadzenie do świata magistrali SPI i jak sterować urządzeniami wewnątrz. Jak zawsze, teraz to do Ciebie i Twojej wyobraźni, aby znaleźć coś do kontrolowania lub dostać się do innych shenanigans. W następnym artykule o SPI przyjrzymy się odczytywaniu i zapisywaniu danych za pomocą magistrali SPI.

Ten post został dodany przez pmdway.com-wszystko dla twórców i entuzjastów elektroniki, z darmową dostawą na całym świecie.

aby być na bieżąco z nowymi postami na tronixstuff.com, zapisz się na listę mailingową w polu po prawej stronie lub Śledź nas na Twitterze @tronixstuff.

podziel się z innymi:

Drukuj

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *