Двухстороннее общение двух UNO через SPI
- Войдите на сайт для отправки комментариев
Пт, 13/01/2017 - 19:11
Здравствуйте!
Задумка такая: есть две Уны, первая Уна (Мастер) отправляет второй (Слейву) 0. Слейв это число инкрементирует и отправляет обратно Мастеру. Мастер снова инкрементирует число и отправляет Слейву.
Изучил вот эти материалы, но так и не понял, как это сделать:
http://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-a...
Опираясь на мой опыт в I2C и UART - код у обеих плат будет почти одинаковый (только надо будет поменять местами функции отправки и приема), поэтому я попробовал просто объединить код мастера и слейва в один. Получилось вот что:
#include <SPI.h>
int data = 0;
volatile bool process_it;
void setup (void)
{
Serial.begin (115200);
//Чтобы слать Мастеру
pinMode (MISO, OUTPUT);
//Подготовка для работы с прерываниями
process_it = false;
//Подключаем прерывания
SPI.attachInterrupt();
//Занижаем скорость отправки за счет предделителя
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop (void)
{
dataSend();
dataReceive();
}
void dataSend()
{
//Делаем Слейв-Селект высокоуровневым
digitalWrite(SS, HIGH);
//Включаем СПИ (режим отправки)
SPI.begin ();
char c = data;
//Делаем Слейв-Селеект низкоуровневым - даем Слейву понять, что сейчас ему будут слать что-то
digitalWrite(SS, LOW);
//Отсылаем пробную строку
SPI.transfer (c);
//Делаем Слейв-Селект высокоуровневым
digitalWrite(SS, HIGH);
Serial.println ("Что-то отправилось");
//Спим
delay (1000);
}
ISR (SPI_STC_vect)
{
//Ловим байт из СПИ
byte c = SPDR;
//Увеличиваем на единицу
data = c++;
process_it = true;
}
void dataReceive()
{
//Включаем СПИ (режим приема)
SPCR |= bit (SPE);
//Если сработало прерывание - к нам шлют что-то
if (process_it)
{
Serial.println ("Что-то пришло");
process_it = false;
}
}
Буду очень благодарен, если поможете исправить мой код! Пример рабочего кода тоже будет очень кстати :)
Serial.println ("Что-то пришло");сериал штука медленная. Может лучше лампочкой помигать?Serial.println ("Что-то пришло");сериал штука медленная. Может лучше лампочкой помигать?Можно и лампочкой :) Лишь бы данные доходили, инкрементировались и возвращались обратно.
Я так понял, вы его вызываете после приема каждого бита. А сериал имеет своих прерываний и работает оооочень медленно... Хотя я вообще тупень в этом деле и могу сильно ошибаться :)