Подключение между двумя 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 );
    }
}

, 👍0

Обсуждение

Вы хотите, чтобы один 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


1 ответ


1

Наличие строки от Arduino 1 до Arduino 2, указывающей, что Arduino 2 должен что-то сделать, достаточно.

Простой способ: линия, которая является входом с обеих сторон с включенными внутренними блоками. Обе стороны следят за этим.

Когда Arduino 1 хочет писать, он проверяет, чтобы строка была высокой, затем он выводит вывод на выход и опускает его, а когда закончит, освобождает его, возвращаясь к входу (с помощью команды pinMode ()).

Когда Arduino 2 видит низкий уровень, он ждет, пока он поднимется выше, затем вводит и выводит данные и опускает их до тех пор, пока не закончит чтение.

Arduino 1 видит низкий уровень и воздерживается от любой записи, пока он снова не станет высоким.

Это называется арбитражем и является примером одного простого метода.

,

хорошо - когда или как arduino 2 может узнать, что arduino 1 закончил запись ?, @HAask

Arduino 1 возвращает общий вывод на вход, что позволяет ему подниматься выше., @CrossRoads