Перейти к содержанию

Шина SPI Arduino Uno, подключение устройств

SPI Arduino подключение нескольких устройств

Arduino SPI (Serial Peripheral Interface) переводится как «последовательный периферийный интерфейс» и является протоколом последовательной связи. Платы Ардуино используют несколько протоколов для связи с датчиками и периферийными устройствами, одним из наиболее часто используемых является шина SPI. В статье рассмотрим этот интерфейс, как подключить к микроконтроллеру несколько устройств по протоколу SPI.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • тактовые кнопки
  • резисторы
  • макетная плата
  • коннекторы
  • скачать библиотеку SPI.h

Дополнительные материалы на эту тему:

  1. Интерфейс i2c Ардуино, сканер i2c шины
  2. Interrupts — прерывания Ардуино для начинающих
  3. Цифровые и аналоговые пины Ардуино

Последовательный периферийный интерфейс Arduino SPI (Serial Peripheral Interface) является полностью дуплексным — данные передаются и принимаются по проводам одновременно. Ведущее устройство посылает данные ведомому, а ведомое может одновременно посылать данные ведущему (обычно микроконтроллеру Ардуино). Последовательный интерфейс был разработан компанией Motorola в 1970 году.

Протокол SPI Arduino Nano: описание, пример

Протокол SPI Arduino Uno, Nano: описание, пример

  • MISO (Master in Slave Out) — линия для отправки данных ведущему устройству;
  • MOSI (Master Out Slave In) — линия для отправки данных на ведомое устройство;
  • CLK (Serial Clock) — линия синхронизации, генерируемая ведущим устройством;
  • SS (Slave Select) — линия для включения/выключения ведомых устройств.

Для работы по протоколу spi Ардуино использует 4 линии (обозначены на плате, как MISO, MOSI, SCLK и SS). В этом интерфейсе всегда есть одно ведущее устройство (обычно это плата Ардуино) и несколько ведомых устройств (это датчики, модули, OLED дисплеи или другие микроконтроллеры). На изображении выше показано, как работает протокол Arduino Uno SPI с одним или несколькими устройствами, подключенных к Ардуино.

Реализация интерфейса SPI Arduino Mega и Uno

Реализация интерфейса SPI на Arduino Uno и Mega

выводы Arduino Uno spi Arduino Nano spi Arduino Mega spi
MISO 12 12 50
MOSI 11 11 51
SCK 13 13 52
SC 10 10 53

Чтобы инициировать обмен данными, порт ведомого устройства (SS) должен быть установлен в низкий уровень, если порт установлен в высокий уровень, то ведомое устройство будет игнорировать ведущего. На предыдущем изображении показана схема подключения трех устройств по протоколу spi, где линии SCLK, MISO, MOSI являются общими, а линии SS у устройств подключены к отдельным выводам (SS1, SS2, SS3).

Как подключить две платы Ардуино по шине SPI

Как подключить две платы Ардуино по шине SPI

Схема подключения двух плат для и создания соединения между ними по SPI показана на рисунке. Проект требует загрузки двух программ: первая — для ведущей Arduino Uno, вторая — для ведомой Arduino Uno. Когда вы нажимаете кнопку на ведущей плате, загорается светодиод, подключенный к ведомой плате. При нажатии кнопки на ведомом микроконтроллере Ардуино Уно загорается светодиод на ведущей плате.

Скетч для ведущей платы Arduino Nano SPI (master)


#include "SPI.h"
#define LED 13           
#define ipbutton 2
 
int buttonvalue;
int x;
 
void setup () {  
  pinMode(ipbutton, INPUT);
  pinMode(LED, OUTPUT);
  
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  digitalWrite(SS, HIGH);
}
 
void loop() {
  byte Mastersend, Mastereceive;          
  buttonvalue = digitalRead(ipbutton);
  if(buttonvalue == HIGH) { x = 1; }
  else { x = 0; }
  
  digitalWrite(SS, LOW); 
  Mastersend = x;                            
  Mastereceive = SPI.transfer(Mastersend);
  
  if(Mastereceive == 1) { digitalWrite(LED, HIGH); }
  else { digitalWrite(LED, LOW); }
  delay(100);
}

Скетч для ведомой платы Arduino Nano SPI (slave)

#include "SPI.h"
#define LEDpin 13
#define buttonpin 2
 
volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;
 
void setup() { 
  pinMode(buttonpin, INPUT);
  pinMode(LEDpin, OUTPUT);
  pinMode(MISO, OUTPUT);
  SPCR |= _BV(SPE);
  received = false;
  SPI.attachInterrupt();
}
 
ISR (SPI_STC_vect) {
  Slavereceived = SPDR;
  received = true;
}
 
void loop() {
  if(received) {
    if (Slavereceived==1) { digitalWrite(LEDpin, HIGH); }
    else { digitalWrite(LEDpin, LOW); }
      
    buttonvalue = digitalRead(buttonpin);
    if (buttonvalue == HIGH) { x=1; }
    else { x=0; }
      
    Slavesend=x;                             
    SPDR = Slavesend; 
    delay(100);
  }
}

Библиотека SPI.h Arduino команды, описание

SPI Arduino подключение нескольких устройств

#include «SPI.h» — подключение библиотеки в программе.

SPI.begin() — инициализирует шину SPI, устанавливая режимы SCK, MOSI и SS для вывода данных, подавая на выводы SCK и MOSI низкое напряжение, а на вывод SS — высокое напряжение.

SPI.setClockDivider(divider) — устанавливает коэффициент деления тактового сигнала SPI относительно тактовой частоты микроконтроллера Arduino. Вы можете использовать делители 2, 4, 8, 16, 32, 64 или 128.

SPI.attachInterrupt(handler) — включает режим прерывания в ведомом устройстве. Прерывание возникает всякий раз, когда ведомое устройство получает данные от ведущего устройства.

SPI.transfer(val) — эта функция используется для одновременного приема и передачи данных между ведущим и ведомым устройствами.

Заключение. Связь на SPI Arduino является одним из основных коммуникационных интерфейсов между Arduino и устройствами. Протоколы SPI, IIC и UART очень часто используются при программировании микроконтроллеров, и знание принципов работы SPI будет полезно каждому. В этой статье мы кратко рассмотрели библиотеку SPI.h, основные принципы связи и подключения нескольких устройств через интерфейс SPI.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

newzaym
➜