Связь SPI между Arduino Uno и Raspberry Pi с использованием wiringPi

Я безуспешно пытался реализовать SPI-связь между Raspberry Pi 2 B + (ведущим) и Arduino Uno Rev3 (ведомым), но безуспешно.

Я использовал руководство: http://mitchtech.net/raspberry-pi-arduino-spi/ < / а>

Однако предлагаемые там коды не работают должным образом. Я уже искал решение в Интернете, но не смог его найти. Я использую тот же код для arduino на сайте, но использую следующий код для raspberry pi:

/**
 *  Hello, SPI!
 */

 #include <stdio.h> // printf()
 #include <signal.h> // signal()
 #include <errno.h> // strerro
 #include <string.h>

 #include <wiringPi.h> // GPIO
 #include <wiringPiSPI.h> // SPI

 int volatile interrupt = 0;
 #define len_max 100
 int volatile len = 0;
 unsigned char buffer[len_max];
 static const int speed = 500000;

 int const CE0 = 0;

 void sig_handler(int signo)
 {
   if(signo == SIGINT)
   {
     interrupt = 1;
   }
 }

 void setup(void)
 {
   signal(SIGINT, sig_handler);

   wiringPiSetupGpio () ;

   if(wiringPiSPISetup(CE0, speed) < 0)
   {
     printf("SPI setup failed: %s\n", strerror(errno));
     interrupt = 1;
   }

   printf("System ready.\n");
 }

 void loop(void)
 {
   memcpy(buffer, "Hello world!\n", sizeof buffer);
   len = 12;
   if( wiringPiSPIDataRW (CE0, buffer, len) < 0)
     printf("Error while recieving mesage\n");
   printf("Received mesage: %s \n", buffer);
   delay(1000);
 }

 void close(void)
 {
   printf("Ending activities.\n");
 }

 int main(void)
 {
   setup();
   while(!interrupt) loop();
   close();
   return 0;
 }

Этот код возвращает мне только мусор. Я понятия не имею, что мне делать.


person Fred    schedule 19.08.2015    source источник


Ответы (2)


Если бы вы опубликовали результат, который вы получили при выполнении своего кода, это было бы полезно для выяснения того, что идет не так. Кроме того, похоже, что в руководстве, на которое вы ссылаетесь, используется схематическая установка с моделью Pi B. Я считаю, что b + имеет 15 дополнительных контактов gpio и, следовательно, другую распиновку, поэтому вы можете дважды проверить, что все ваши физические соединения правильно сделал.

person Betai97    schedule 19.08.2015
comment
В основном я получаю пустой текст и случайные символы, ничего непонятного. Насколько мне известно, дополнительные контакты модели B + сохраняют оригинальные и расширяются с помощью нескольких дополнительных. - person Fred; 21.08.2015

Следующий код C для Arduino, который также вдохновлен тем же кодом, что и ваш. Реализуйте подчиненное устройство SPI для Arduino. Я использую USB-совместимое устройство NUSBIO в качестве MASTER SPI и разговариваю с Arduino.

Код действительно работает со скоростью до 10 Кбайт / с. Пока что на более высокой скорости я теряю данные.

`

 include <Adafruit_NeoPixel.h>
 include <SPI.h>
 include <fArduino.h>

#define API_SIZE 128
char buf[API_SIZE];

volatile int bufCheckSum = 0;
volatile int pos = 0;
volatile boolean process_it = false;

void spiSetup(void)
{
    // Move from SPI_CLOCK_DIV4 to SPI_CLOCK_DIV2
    //SPI.setClockDivider(SPI_CLOCK_DIV2);

    SPCR |= bit(SPE); // turn on SPI in slave mode
    pinMode(MISO, OUTPUT); // have to send on master in, *slave out*
    pos = 0;
    process_it = false;
    SPI.attachInterrupt(); // now turn on interrupts
}

// SPI interrupt routine
ISR(SPI_STC_vect)
{
    byte c = SPDR;        // Grab byte from SPI Data Register

    if (pos < sizeof buf) // Add to buffer if room
    {
        if (c == '\r') { // Performance test

            bufCheckSum = 0;
            for (int i = 0; i < pos; i++) {
                bufCheckSum += buf[i];
            }
            pos = 0; // Reset buffer
            SPDR = 1;
            process_it = true;
        }
        else {
            buf[pos++] = c; // Store c in buffer
            SPDR = c;
        }
    }
    else {
        pos = 0;
    }
}

void setup() {

    Board.Delay(1000 * 2); // Wait 1.5 second before initializing the serial com, so  I can start the ArduinoWindowsConsole on the Windows machine
    Board.InitializeComputerCommunication(9600, "Arduino Spi Slave +");
    Board.SetPinMode(10, INPUT);
    Board.SetPinMode(2, INPUT); // JUST FOR TESTING
    spiSetup();
}

void loop() {

    if (process_it) {

        process_it = false;
        if (bufCheckSum != 8255) {
            Serial.println("ko ");
        }
        bufCheckSum = -1;
    }
}

`

person MadeInTheUSB    schedule 05.02.2016