Максимальная скорость 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;
}
@Thesaurus Rex, 👍1
Обсуждение1 ответ
Максимальная скорость для Arduino в качестве ведомого устройства-F_CPU/4, так что это 4 Мбит / с. Когда Arduino является мастером, он может работать на F_CPU/2, так что это 8 Мбит / с
Спасибо за ваш ответ ! У вас есть какой-нибудь источник, подтверждающий это ?, @Thesaurus Rex
Вы можете найти это в таблице данных ATmega328. ATmega328-это чип на Arduino Uno., @bouaaah
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- SPI.transfer(buffer, size) не отправляет данные из буфера
- Как контролировать скорость двухпроводного вентилятора с помощью Arduino и только потенциометра?
Теоретический максимум-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