Соединяем два Arduino по SPI
Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) является высокоскоростным интерфейсом передачи данных между микроконтроллерами и например микросхемами памяти Flash. Соединив два Arduino по интерфейсу SPI я получил успешную передачу данных со скоростью 4 Мбит/сек., для сравнения -- максимальная скорость передачи по интерфейсу TWI составляет 400 кбит/сек.
Схема соединения
В данной схеме один Arduino работает в режиме мастера, второй Arduino работает в режиме подчинённого (slave), поэтому в данной схеме его вывод nSS замкнут на землю.
Программа мастер-Arduino
В целях отладки к мастер-Arduino я дополнительно подключил кнопку, с помощью которой можно остановить передачу данных. Исходный код скетча:
/**
* Тестовый скетч соединения двух Arduino по интерфейсу SPI.
* Программа мастер-Arduino.
* http://sites.google.com/site/vanyambauseslinux/arduino/soedinaem-dva-arduino-po-spi
*/
#include <SPI.h>
#define LED 7
#define BTN 6
unsigned char count = 0;
void masterSPI_Setup()
{
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4);
SPI.begin();
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
}
void setup()
{
pinMode(BTN, INPUT);
pinMode(LED, OUTPUT);
Serial.begin(57600);
masterSPI_Setup();
}
void loop()
{
if (digitalRead(BTN)) {
count += 1;
digitalWrite(LED, HIGH);
digitalWrite(SS, LOW);
unsigned char response = SPI.transfer(count);
digitalWrite(SS, HIGH);
Serial.print(count, HEX);
Serial.print(" response: ");
Serial.println(response, HEX);
delay(250);
digitalWrite(LED, LOW);
delay(250);
}
}
Программа slave-Arduino
Исходный код скетча slave-Arduino:
/**
* Тестовый скетч соединения двух Arduino по интерфейсу SPI.
* Программа slave-Arduino.
* http://sites.google.com/site/vanyambauseslinux/arduino/soedinaem-dva-arduino-po-spi
*/
#include <SPI.h>
#define LED 7
unsigned char count = 0;
void slaveSPI_Setup()
{
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV4);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
}
unsigned char slaveSPI_read()
{
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
void setup()
{
pinMode(LED, OUTPUT);
Serial.begin(57600);
slaveSPI_Setup();
}
void loop()
{
count += 1;
digitalWrite(LED, digitalRead(SS));
unsigned char ch = slaveSPI_read();
Serial.print(count, DEC);
Serial.print(": ");
Serial.println(ch, HEX);
}
При загрузке скетчей соединение ICSP-ICSP следует разомкнуть.
Автор: Андрей Шаройко <vanyamboe@gmail.com>