UNO SPI slave чтение с UNO SPI Master beginTransaction

Для проекта я пытаюсь понять SPI.

Последний проект, в котором я буду использовать это, предназначен для чтения SPI с автомобильного радиоприемника.

Это радио записывает адрес 0x80 ЖК-дисплея DDRAM. МОЕ намерение состоит в том, чтобы прочитать запись на этот адрес и, если биты верны, заменить waht.

IE Radio говорит написать букву E в 0x80, используя mega2560 прочитать это, а затем вставить другую букву, а затем записать на экран радио. Таким образом, радио-это мастер с Мега и ЖК-дисплеем в качестве цепных рабов.

Я использую базовый код для записи на экран. Это было написано для полной замены радио, поэтому я пытаюсь имитировать радио, используя UNO в качестве ведущего, и экран, используя Uno в качестве ведомого.

У меня есть демо-версия, работающая с circuits4you.com

Я пытаюсь изменить его, чтобы использовать те же настройки STI, что и в базовом коде замены радио, который я буду изменять для своего окончательного проекта. Я знаю, что этот код правильно записывается на экран. Проблема в том, что код использует SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3)); поскольку он предназначен для замены функций радио.

Я пытаюсь заставить эту линию работать на стендовых испытаниях im 2 UNO, чтобы я мог сделать mega рабом в окончательном проекте.

МАСТЕР-код SPI



void setup (void) {
   Serial.begin(9600); //установите скорость передачи данных в бодах на 115200 для usart
   digitalWrite(SS, HIGH); // отключить выбор ведомого устройства
   SPI.begin ();

}

void loop (void) {
    SPI.beginTransaction(SPISettings(9600, MSBFIRST, SPI_MODE3)); 

   char c;
   digitalWrite(SS, LOW); // включить выбор ведомого устройства
   // отправить тестовую строку
   for (const char * p = "Hello, world!\r" ; c = *p; p++) 
   {
      SPI.transfer (c);
      Serial.println(c);
   }
   digitalWrite(SS, HIGH); // отключить выбор ведомого устройства
   delay(2000);
   SPI.endTransaction();
}

Проблема, по-видимому, возникает из-за того, что SPI.attachInterrupt() не совместим с SPI.beginTransaction это правильно и есть ли способ обойти это?

Ведомый код SPI

include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;


void setup (void) {
   Serial.begin (9600);
   pinMode(MISO, OUTPUT); // должен отправить на master in, чтобы он был установлен в качестве вывода
   SPCR |= _BV(SPE); // включение SPI в подчиненном режиме
   indx = 0; // буфер пуст
   process = false;
   SPI.attachInterrupt(); // включить прерывание

}

ISR (SPI_STC_vect) // Процедура прерывания SPI 
{ 
   byte c = SPDR; // считывание байта из регистра данных SPI
   if (indx < sizeof buff) {
      buff [indx++] = c; // сохранение данных в следующем индексе массива buff
      if (c == '\r') //проверьте конец слова
      process = true;
   }
}

void loop (void) {


   if (process) {
      process = false; //сброс процесса
      Serial.println (buff); //печать массива на последовательном мониторе
      indx= 0; //кнопка сброса в ноль
   }

}

, 👍1

Обсуждение

Пожалуйста, покажите свою модификацию (использование и положение) SPI.setDataMode() в приведенном выше коде., @KG1


1 ответ


1

Итак, теперь у меня все работает. Похоже, что это был Раб, не понимающий режим передачи данных. Я нашел SPI.setDataMode() он указан как Не используемый в справочном руководстве по Arduino.com но для меня это сработало отлично.

,