Проблема связи 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;
}
}
@Saha222, 👍0
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);
}
// функция, которая выполняется всякий раз, когда данные поступают от ведущего
// эта функция зарегистрирована как событие, см. раздел setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // перебираем все
char c = Wire.read(); // получаем байт в виде символа
Serial.print(c); // вывести символ
}
int x = Wire.read(); // получить байт как целое число
Serial.println(x); // вывести целое число
}
Это альтернативный пример настройки с использованием nodemcu (который, кстати, не работает в подчиненном режиме).
- Как использовать SPI на Arduino?
- Сбой связи SPI
- Разница в распиновке (типы?) Uno/Mega
- AMIS30543 - Код библиотеки | Порядок pinDirection и pinOut
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как получить уникальный идентификатор для всех плат Arduino?
- Как очистить буфер FIFO на MPU6050?