Подключение между двумя arduino
я хочу подключить SPI 2 arduino master и slave через MUX , для записи и чтения во внешней памяти , когда мастер записи в памяти slave read . пожалуйста, помогите . код для мастера
#include <SPI.h>
//-------FM------------------
#define WENB 0x06
#define RDSR 0x05
#define WRSR 0x01
#define PPROGRAM 0x02
#define SERASE 0x20
#define BERASE 0xd8
#define READ 0x03
#define RDSCUR 0x2B
#define CERASE 0x60//or 0xC7
//------------Укажите адрес-----------
int address = 0x00ff0000;
byte x, Y;
int IN = 5;
int SS1 = 9;
/*char data[]=("don't be afraid ");
char recived[15];*/
//--------------------------
void setup() {
//------------------------------------------
// pinMode(EN,OUTPUT);
pinMode ( SS, OUTPUT ); //ss pin 10
pinMode ( SS1, OUTPUT );
digitalWrite ( SS1, HIGH );
pinMode ( IN, OUTPUT );
digitalWrite ( IN, LOW ); // MUX connect A
//digitalWrite(CS,low);
Serial.begin ( 9600 );
SPI.begin();//запуск SPI-соединения с флэш-памятью
SPI.setClockDivider ( SPI_CLOCK_DIV8 );
SPI.setBitOrder ( MSBFIRST );
digitalWrite ( SS, HIGH );
delay ( 10 );
//- - - - - - - стереть сектор--//-----------
digitalWrite ( SS, LOW );
SPI.transfer ( WENB );
digitalWrite ( SS, HIGH );
//-------------------------------------
digitalWrite ( SS, LOW );
SPI.transfer ( SERASE );
SPI.transfer ( ( address >> 32 ) & 0xff );
SPI.transfer ( ( address >> 16 ) & 0xff );
SPI.transfer ( ( address >> 8 ) & 0xff );
SPI.transfer ( address & 0xff );
digitalWrite ( SS, HIGH );
delay ( 5000 );
//------------------------------------------
//Serial.println("okay fine")
//- - - - - Запрограммируйте Данные В Массив Памяти - - - - -.
//-----------interrupts the slave----------
/* digitalWrite(SS1,LOW);
SPI.transfer(0xff);//are you there?
digitalWrite(SS1,HIGH);
delay(1000);
digitalWrite(IN,HIGH);*/
}
void loop()
{
char c;
int i = 0;
char data[] = "Hello!:";
char recived[7];
byte x;
//----------Включите запись в память - - - - -.
digitalWrite ( SS, LOW );
SPI.transfer ( WENB );
digitalWrite ( SS, HIGH );
delay ( 20 );
//- - - - - Запрограммируйте Данные В Массив Памяти - - - - -.
digitalWrite ( SS, LOW );
SPI.transfer ( PPROGRAM );
SPI.transfer ( ( address >> 32 ) & 0xff );
SPI.transfer ( ( address >> 16 ) & 0xff );
SPI.transfer ( ( address >> 8 ) & 0xff );
SPI.transfer ( address & 0xff );
for ( int i = 0; i < sizeof ( data ); i++ ) {
SPI.transfer ( data[i] );
// Serial.print(data[i]);
}
// отключить Slave Select
digitalWrite ( SS, HIGH );
//--------------------------------------------
delay ( 1000 );
//--------------------------- ----------
i = 0;
Serial.print ( "It's okay saved: " );
while ( data[i] != NULL ) {
Serial.println ( data[i] );
i++;
}
// delay(100);
//-----------interrupts the slave----------
digitalWrite ( SS1, LOW );
SPI.transfer ( 0xff ); //are you there?
digitalWrite ( SS1, HIGH );
delay ( 1000 );
digitalWrite ( IN, HIGH ); // MUX connect B
}
код для ведомого устройства
#include <SPI.h>
//-------FM------------------
#define WENB 0x06
#define RDSR 0x05
#define WRSR 0x01
#define PPROGRAM 0x02
#define SERASE 0x20
#define BERASE 0xd8
#define READ 0x03
#define RDSCUR 0x2B
#define CERASE 0x60//or 0xC7
//------------Укажите адрес-------------
int address = 0x00ff0000;
int SS1 = 9;
char data[] = "Hello!:";
char buff[7];
byte slave;
volatile bool process;
//----------------настройка ведомого устройства----------------
void setup() {
//pinMode(IN,OUTPUT);
pinMode ( SS, OUTPUT ); //SS pin 10
pinMode ( MISO, OUTPUT );
pinMode ( SS1, INPUT );
pinMode ( MOSI, INPUT );
//--------------------------------------------------
Serial.begin ( 9600 );
///SPCR |= bit (SPE);
SPI.begin();//запуск SPI-соединения с флэш-памятью
SPI.setClockDivider ( SPI_CLOCK_DIV8 );
SPI.setBitOrder ( MSBFIRST );
// digitalWrite(SS,HIGH);
//-------------master interrupts the slave----------------------------------------------
// теперь включите прерывания
// SPCR |=bit(SPIE);
//SPCR |=bit(SPE); //установите бит SPE в SPCR(регистр управления spi) , чтобы включить SPI
SPI.attachInterrupt();
}
ISR ( SPI_STC_vect ) {
slave = SPDR;
if ( slave = 0xff ) {
pinMode ( MISO, INPUT );
// pinMode(SS1,INPUT);
pinMode ( MOSI, OUTPUT );
//digitalWrite(IN,HIGH);
digitalWrite ( SS, LOW );
SPI.transfer ( READ );
SPI.transfer ( ( address >> 32 ) & 0xff );
SPI.transfer ( ( address >> 16 ) & 0xff );
SPI.transfer ( ( address >> 8 ) & 0xff );
SPI.transfer ( address & 0xff );
for ( int n = 0; n < sizeof ( data ); n++ ) {
data[n] = SPI.transfer ( 0 );
Serial.print ( data[n] );
}
digitalWrite ( SS, HIGH );
}
}
@HAask, 👍0
Обсуждение1 ответ
Наличие строки от Arduino 1 до Arduino 2, указывающей, что Arduino 2 должен что-то сделать, достаточно.
Простой способ: линия, которая является входом с обеих сторон с включенными внутренними блоками. Обе стороны следят за этим.
Когда Arduino 1 хочет писать, он проверяет, чтобы строка была высокой, затем он выводит вывод на выход и опускает его, а когда закончит, освобождает его, возвращаясь к входу (с помощью команды pinMode ()).
Когда Arduino 2 видит низкий уровень, он ждет, пока он поднимется выше, затем вводит и выводит данные и опускает их до тех пор, пока не закончит чтение.
Arduino 1 видит низкий уровень и воздерживается от любой записи, пока он снова не станет высоким.
Это называется арбитражем и является примером одного простого метода.
хорошо - когда или как arduino 2 может узнать, что arduino 1 закончил запись ?, @HAask
Arduino 1 возвращает общий вывод на вход, что позволяет ему подниматься выше., @CrossRoads
- Хранение данных в SDRAM Arduino Portenta H7
- Зачем нужно использовать delay() после использования Serial.flush() в программе
- Servo_Pointer' was not declared in this scope
- Код CRC8 не работает должным образом
- Операторы If/Else на Arduino не выполняются
- Использование контакта RX TX
- Arduino продолжает зацикливаться
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
Вы хотите, чтобы один Arduino мог получить доступ к памяти другого через SPI? Если да, то с какой частью у вас проблемы? Вы сказали нам, что вы хотите сделать, и вы сбросили на нас код, но вы не сказали нам, что на самом деле происходит (или не происходит) и с чем вам нужна помощь., @Majenko
Боюсь, вам придется прояснить свой вопрос. Вы имеете в виду, что хотите подключить два ардуино к внешней памяти? И один Arduino управляет MUX, чтобы решить, какой Arduino имеет доступ к внешней памяти? Какой МУКС вы используете? Как вы планируете договориться о том, какой Arduino может иметь доступ к памяти? Не лучше ли было бы позволить одному Arduino получить доступ к памяти, а другому отправить свои данные этому "мастеру" Arduino?, @Peter Paul Kiefer
что я хочу сделать! хорошо , у меня есть 2 arduino , я программирую один , чтобы быть хозяином для управления в моем проекте и записи во внешнюю память , и пыльник , чтобы быть рабом и читать из внешней памяти, через MUX, к которому кто может подключиться с памятью, и я управляю в MUX мастером. моя проблема в том, что раб не может точно знать, когда его читают по памяти . Я использовал MUX ADG774 и тип памяти MX25L25735E. вы можете увидеть мой код . Надеюсь теперь все будет ясно, @HAask
Затем вам нужно иметь какую-то форму связи между двумя ардуино, чтобы мастер мог сказать ведомому, когда ему разрешено читать из внешней памяти. И в этом случае вы можете просто забыть о совместном использовании памяти и просто использовать это соединение для передачи данных от одного Arduino к другому., @Majenko
Ведущий и ведомый соединены командой прерывания . а ты как думаешь ?, @HAask
Насколько я понимаю, библиотека SPI в Arduino поддерживает только режим SPI Master. Когда вы вызываете
SPI.begin()
в своем подчиненном коде, он "инициализирует шину SPI, устанавливая SCK, MOSI и SS на выходы, вытягивая SCK и MOSI low, а SS high". Таким образом, ваш " pinMode(MOSI, INPUT);` является переопределением. Прочтите [исходный код](https://github.com/arduino/ArduinoCore-avr/blob/master/libraries/SPI/src/SPI.cpp#L26) для лучшего понимания библиотеки., @hcheungНе правда - Arduino также может быть SPI slave. У Ника Гэммона есть пример здесь https://www.gammon.com.au/spi В этом случае " раб "указывает только на другого пользователя памяти., @CrossRoads
Может быть, вы правы- ("раб" указывает только на другого пользователя памяти), но здесь я использовал MUX для управления в slave. ладно, может быть, мне и не нужно мультиплексировать, если у меня есть 2 arduino . Но теперь я хочу использовать мультиплексор ., @HAask