Максимальная скорость SPI для ведомого Uno/clone?

У меня есть Rapsberry Pi master, отправляющий запросы SPI китайскому подчиненному клону Uno : я отправляю 16 символов на Arduino, который отвечает на 16 других символов. То, что я посылаю, не важно, важен ответ Arduino.

Когда я устанавливаю скорость на Raspberry Pi на уровне 1 Мбит/с с помощью моей программы C, полученный ответ, поступающий от Arduino, в основном является мусором (случайные символы), но эта проблема исчезает с более низкими скоростями.

Итак, это приводит меня к следующему вопросу : какова максимальная скорость SPI для ведомого Uno/clone, чтобы не было ошибок ?

Edit : код Arduino :

#include <SPI.h>

char receivingBuffer[5];
char sendingBuffer[5] = {'T', 'e', 's', 't', '!'};

volatile char bytes_received = 0;

void setup()
{

  SPCR |= bit(SPE);

  pinMode(MISO, OUTPUT);

  SPI.attachInterrupt();

  SPDR = sendingBuffer[bytes_received];

}

ISR(SPI_STC_vect)
{

  if (++bytes_received == 5)
  {

    bytes_received = 0;

  }

  SPDR = sendingBuffer[bytes_received];

}

void loop()
{

  //

}

Кроме того, код C на RPi :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPiSPI.h>

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000 // Hz.

int main(void)
{

   wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED);

   while (1)
   {

      char buf[5] = {'T', 'e', 's', 't', '?'};

      printf("Sending   : %s\n", buf);

      wiringPiSPIDataRW(SPI_CHANNEL, buf, 5);

      printf("Receiving : %s\n\n", buf);

      sleep(1);

   }

   return 1;

}

, 👍1

Обсуждение

Теоретический максимум-8 Мбит/с, то есть F_CPU / 2. Однако важно то, что вы достаточно быстро реагируете на запросы для каждого байта и достаточно быстро заполняете буфер. Это зависит от вашей программы, чтобы определить., @Majenko

Пожалуйста, покажите свой код. То, что вы делаете для того, чтобы ответить, очень важно. Если вы отправляете со скоростью 1 Мбит/с, то у ведомого устройства не так много тактов, чтобы сформулировать ответ., @Nick Gammon

Я добавил код Arduino., @Thesaurus Rex

Что произойдет, если вы установите скорость передачи >1 Мбит / с и поставите задержку между каждым байтом (на стороне Pi) - тогда он начнет работать?, @Majenko

При скорости 1,5 или 2 Мбит / с я получаю первый символ ожидаемого ответа, а остальные символы-это отправленные сообщения., @Thesaurus Rex

У меня есть 1-секундная задержка в цикле _wile()_ между двумя сообщениями, но я использую библиотеку WiringPi для работы с SPI, и я не думаю, что могу поставить задержку между двумя байтами., @Thesaurus Rex

Конечно, можешь. Просто отправьте один байт вместо 5., @Majenko


1 ответ


2

Максимальная скорость для Arduino в качестве ведомого устройства-F_CPU/4, так что это 4 Мбит / с. Когда Arduino является мастером, он может работать на F_CPU/2, так что это 8 Мбит / с

,

Спасибо за ваш ответ ! У вас есть какой-нибудь источник, подтверждающий это ?, @Thesaurus Rex

Вы можете найти это в таблице данных ATmega328. ATmega328-это чип на Arduino Uno., @bouaaah