Связка 2-х ардуин по SPI. Дуплекс.
- Войдите на сайт для отправки комментариев
Втр, 29/04/2014 - 11:10
Доброго времени суток! Имеются 2 ардуинки, связал их по интерфейсу SPI. Передача данных производится только в одну сторону. Народ подскажите как организовать дуплексное соединение?
SPI по своей сути дуплексный потокол, каждый раз когда мастер проталкивает бит данных на слайв через MOSI, слайв проталкивает свой бит обратно на мастер через MISO
задача какая?
ну пока, задача элементарная. arduino1 посылает на ардуино2 какое-то значение, ардуино2 принимает и если это значение допустим равно 1, то он на ардуино1 посылает, допустим число 10)
Обычно как делают. Например первый байт который мастер передает слайву это команда. В вашем случае команды допустим 0 - получение новых данных 1 - передача ответных данных
сессия начинается с передачи команды. Слайв получив 0 принимает данные, получив 1 отдает
ну вот у меня такой код
//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); надо отправить на мастер какое-то любое значение)
https://gist.github.com/chrismeyersfsu/3317769