Проблема связи SPI Arduino

Я пытаюсь настроить SPI-связь между двумя Arduino (UNO и Mega), Я хочу прочитать состояние выходного вывода ведомого устройства от ведущего устройства.

Я подключил диод к выводу 9 Mega и хотел отобразить его состояние на виртуальном терминале master (Uno). Проблема в том, что когда светодиод мигает, я не получаю значения только на уровне терминала, но когда я удерживаю его равным нулю или 1, дисплей отображается правильно. Я использовал другой код, который нашел в Интернете.

МАСТЕР - код

#include <SPI.h>
const byte btn =8;

void setup(void) {

Serial.begin (9600);
pinMode (btn, INPUT_PULLUP);
digitalWrite (SS, HIGH);
SPI.begin ();
SPI.setClockDivider (SPI_CLOCK_DIV8);

}

void loop(void) {

byte Mvalsent,Mvalreceived;
digitalWrite (SS, LOW);
for (int jj=0; jj<255; jj++)
  {
      Mvalsent =jj;
      Mvalreceived =SPI.transfer (Mvalsent);
      Serial.print ("Retou d'etat ");
      Serial.print (Mvalsent);
      Serial.print ("\t ,l'etat de la diode est ");
      Serial.println (Mvalreceived);
      delay (400);
  }

  digitalWrite (SS,HIGH);

}

ПОДЧИНЕННЫЙ код

#include <SPI.h>
byte state;
const byte led =9; 
volatile boolean process_it;
volatile byte Svalreceived, Svalsent;
int jj=0;
void setup (void)
{
  Serial.begin (9600);
pinMode (led,OUTPUT);
//установить вывод MISO в качестве выходного
pinMode (MISO, OUTPUT);
//включить SPI в подчиненном режиме
SPCR |= _BV (SPE);
//приготовьтесь к процессу
process_it = false;
//теперь включите прерывания
SPI.attachInterrupt ();
}
ISR (SPI_STC_vect)
{
  Svalreceived = SPDR;
  process_it =true;
}
void loop (void)
{
 if (process_it)
 {

   digitalWrite (led, LOW);
   state =digitalRead(led);
   SPDR = state;
   Serial.print("l'etat de la diode est: ");
    Serial.println (state);
    delay (400);


    process_it =false;
  }
}    

, 👍0


1 ответ


1

Почему бы не использовать I2C slave-master между arduino? Вы можете одновременно подключать другие arduino или устройства к I2C (при условии, что каждое из них использует отдельный адрес).

И вы по-прежнему сохраняете SPI, например, для адаптера карты microsd.

Следуйте этому официальному руководству:

МАСТЕР ARDUINO 1

// Мастер записи проводов
// автор : Николас Замбетти <http://www.zambetti.com >

// Демонстрирует использование библиотеки Wire
// Записывает данные на подчиненное устройство I2C/TWI
// См. Пример "Проводного подчиненного приемника" для использования с этим

// Создано 29 марта 2006 года

// Этот пример кода находится в общественном достоянии.


#include <Wire.h>

void setup() {
  Wire.begin(); // присоединиться к шине i2c (адрес необязателен для master)
}

byte x = 0;

void loop() {
  Wire.beginTransmission(8); // передача на устройство #8
  Wire.write("x is ");        // отправляет пять байт
  Wire.write(x);              // отправляет один байт
  Wire.endTransmission();    // прекратить передачу

  x++;
  delay(500);
}

ПОДЧИНЕННЫЙ ARDUINO 2

// Проводной подчиненный приемник
// автор : Николас Замбетти <http://www.zambetti.com >

// Демонстрирует использование библиотеки Wire
// Получает данные как подчиненное устройство I2C/ TWI
// Обратитесь к примеру "Мастер записи проводов" для использования с этим

// Создано 29 марта 2006 года

// Этот пример кода находится в общественном достоянии.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // присоединиться к шине i2c с адресом #8
  Wire.onReceive(receiveEvent); // событие регистрации
  Serial.begin(9600);           // запустить последовательный для вывода
}

void loop() {
  delay(100);
}

// функция, которая выполняется всякий раз, когда данные поступают от ведущего
// эта функция зарегистрирована как событие, см. раздел настройка()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // перебираем все
    char c = Wire.read(); // получаем байт в виде символа
    Serial.print(c);         // вывести символ
  }
  int x = Wire.read();    // получить байт как целое число
  Serial.println(x);         // вывести целое число
}

Это альтернативный пример настройки с использованием nodemcu (который, кстати, не работает в подчиненном режиме).

,