Связка 2-х ардуин по SPI. Дуплекс.

hong_10
Offline
Зарегистрирован: 30.10.2013

Доброго времени суток! Имеются 2 ардуинки, связал их по интерфейсу SPI. Передача данных производится только в одну сторону. Народ подскажите как организовать дуплексное соединение? 

axill
Offline
Зарегистрирован: 05.09.2011

SPI по своей сути дуплексный потокол, каждый раз когда мастер проталкивает бит данных на слайв через MOSI, слайв проталкивает свой бит обратно на мастер через MISO

задача какая?

hong_10
Offline
Зарегистрирован: 30.10.2013

ну пока, задача элементарная. arduino1 посылает на ардуино2 какое-то значение, ардуино2 принимает и если это значение допустим равно 1, то он на ардуино1 посылает, допустим число 10)

axill
Offline
Зарегистрирован: 05.09.2011

Обычно как делают. Например первый байт который мастер передает слайву это команда. В вашем случае команды допустим 0 - получение новых данных 1 - передача ответных данных

сессия начинается с передачи команды. Слайв получив 0 принимает данные, получив 1 отдает

hong_10
Offline
Зарегистрирован: 30.10.2013

ну вот у меня такой код

//master
#include <SPI.h>
//задаем пин slave select
#define SS_PIN 10
//определяем переменную для хранения передаваемого байта
int ch;

void setup() {
//инициализируем SPI
Serial.begin(9600);
pinMode(SS_PIN, OUTPUT);
  SPI.begin(); 
  
  pinMode(13,OUTPUT);
}

void loop() {
  if (Serial.available())
  {
    ch=Serial.parseInt();
    
  //опускаем линию SS - начинаем передачу
  digitalWrite(SS_PIN, LOW);
  //передаем байт (или скока угодно байт)
  SPI.transfer(ch);
  //поднимаем линию SS - завершаем передачу
  digitalWrite(SS_PIN, HIGH);
  }
}
//SLAVE
//определяем пины SPI
#define MOSI_PIN 11 
#define MISO_PIN 12 
#define SCK_PIN  13
#define SS_PIN 10
//определяем переменную для получаемого байта
byte recievedByte;

void setup() {
  //обнуляем регистр управления SPI
  SPCR = B00000000;
  //разрешаем работу SPI
  SPCR = (1<<SPE);  
  //определяем пины для работы с SPI
  pinMode(6,OUTPUT);
  pinMode(MOSI_PIN, INPUT);
  pinMode(MISO_PIN, OUTPUT);
  pinMode(SCK_PIN, INPUT);
  pinMode(SS_PIN, INPUT);
}

void loop() 
{
  //пока пин slave select опущен
  while (digitalRead(SS_PIN)==LOW)
  {
    //принимаем байт и записываем его в переменную
    recievedByte=spi_receive();    
    if (recievedByte==1) 
    {
      digitalWrite(6,HIGH);      
    
    } else digitalWrite(6,LOW);
    
  }
}

//функция для приема байта
byte spi_receive()
{
  //пока не выставлен флаг окончания передачи, принимаем биты
  while (!(SPSR & (1<<SPIF))){};
  //позвращяем содержимое регистра данных SPI
  return SPDR;                    
}

и вместо  digitalWrite(6,HIGH); надо отправить на мастер какое-то любое значение)

 

toc
Offline
Зарегистрирован: 09.02.2013