Соединяем два Arduino по SPI

Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) является высокоскоростным интерфейсом передачи данных между микроконтроллерами и например микросхемами памяти Flash. Соединив два Arduino по интерфейсу SPI я получил успешную передачу данных со скоростью 4 Мбит/сек., для сравнения -- максимальная скорость передачи по интерфейсу TWI составляет 400 кбит/сек.

Схема соединения

В данной схеме один Arduino работает в режиме мастера, второй Arduino работает в режиме подчинённого (slave), поэтому в данной схеме его вывод nSS замкнут на землю.

Соединение двух Arduino по интерфейсу SPI (Serial Peripheral Interface)

Программа мастер-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);

}

}

Скачать скетч мастер-Arduino.

Программа 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);

}

Скачать скетч slave-Arduino.

При загрузке скетчей соединение ICSP-ICSP следует разомкнуть.

Автор: Андрей Шаройко <vanyamboe@gmail.com>