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; //кнопка сброса в ноль
}
}
@Phillip J Fry, 👍1
Обсуждение1 ответ
Итак, теперь у меня все работает. Похоже, что это был Раб, не понимающий режим передачи данных. Я нашел SPI.setDataMode() он указан как Не используемый в справочном руководстве по Arduino.com но для меня это сработало отлично.
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- Максимальная скорость SPI для ведомого Uno/clone?
- SPI.transfer(buffer, size) не отправляет данные из буфера
Пожалуйста, покажите свою модификацию (использование и положение) SPI.setDataMode() в приведенном выше коде., @KG1