Arduino интерфейс SPI

 

 

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

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • резистор на 1 кОм;
  • макетная плата;
  • провода «папа-папа».

Описание SPI (Serial Peripheral Interface)

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

Serial Peripheral Interface - описание
Serial Peripheral Interface — описание, обзор

Для работы по протоколу SPI Arduino использует 4 линии (провода). В этом интерфейсе ведущее устройство (обычно это плата Ардуино) всегда одно, а ведомых может быть несколько (в качестве ведомых устройств могут выступать датчики, дисплеи или другие микроконтроллеры). На картинке выше показан принцип работы протокола SPI Arduino Nano с одним или несколькими ведомыми устройствами (slave).

Интерфейс SPI Arduino Nano, Uno, Mega

SPI интерфейс Ардуино использует 4 линии – MISO, MOSI, SCLK и SS:

  • MISO (Master in Slave Out) – линия для передачи данных ведущему;
  • MOSI (Master Out Slave In) – линия для передачи данных ведомому;
  • CLK (Serial Clock) – линия для синхронизации устройств, формируемая ведущим;
  • SS (Slave Select) – линия для включения/выключения ведомых устройств.
Интерфейс SPI Arduino Uno, Nano и Mega
Интерфейс SPI на платах Arduino Uno, Nano и Mega
линия SPI Arduino Uno SPI Arduino Nano SPI Arduino Mega
MISO 12 12 50
MOSI 11 11 51
SCK 13 13 52
SC 10 10 53

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

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

Подключение двух Ардуино по SPI интерфейсу
Подключение двух плат Ардуино по SPI интерфейсу

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

Скетч для ведущей платы Arduino Uno 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);
}

Пояснения к коду:

  1. в программе для включения/выключения используется встроенный светодиод на 13 пине.



Скетч для ведомой платы SPI Arduino Uno (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);
  }
}

Пояснения к коду:

  1. в программе для включения/выключения используется встроенный светодиод на 13 пине.

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

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

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

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

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

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

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



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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.