SPI Arduino slave не получает данные правильно
Использование платы микроконтроллера STM32L476RG Nucleo в качестве SPI master и Arduino mega в качестве ведомого устройства с выводом 52 для SCLK, выводом 53 для SS и выводом 51 для MOSI на Arduino. Нет никаких проблем с передачей STM32, так как логический анализатор USB, который я использую (параллельно arduino), показывает правильный выход на главной стороне, так что это проблема Arduino:
Проблема в том, что Arduino не получает сигнал должным образом. Код arduino:
#include <SPI.h>
#include<stdint.h>
#define SPI_SCK 52
#define SPI_MISO 50
#define SPI_MOSI 51
#define SPI_SS 53
char dataBuff[500];
//Инициализация ведомого устройства SPI.
void SPI_SlaveInit(void)
{
// Initialize SPI pins.
pinMode(SCK, INPUT);
pinMode(MOSI, INPUT);
pinMode(MISO, OUTPUT);
pinMode(SS, INPUT);
//make SPI as slave
// Включить SPI в качестве ведомого устройства.
SPCR = (1 << SPE);
}
//Эта функция возвращает содержимое SPDR
uint8_t SPI_SlaveReceive(void)
{
/* Дождитесь завершения приема*/
while(!(SPSR & (1<<SPIF)));
/* Регистр возвращаемых данных */
return SPDR;
}
//отправляет один байт данных
void SPI_SlaveTransmit(char data)
{
/* Начать передачу */
SPDR = data;
/* Дождитесь завершения передачи */
while(!(SPSR & (1<<SPIF)));
}
// Функция setup() запускается сразу после сброса.
void setup()
{
// Инициализация последовательной связи
Serial.begin(9600);
// Инициализация ведомого устройства SPI.
SPI_SlaveInit();
Serial.println("Slave Initialized");
}
// Функция цикла работает непрерывно после setup().
void loop()
{
uint32_t i;
uint16_t dataLen = 0;
Serial.println("Slave waiting for ss to go low");
while(digitalRead(SS));
i = 0;
dataLen = SPI_SlaveReceive();
for(i = 0 ; i < dataLen ; i++ )
{
dataBuff[i] = SPI_SlaveReceive();
}
// Serial.println(String(i,HEX));
dataBuff[i] = '\0';
Serial.println("Rcvd:");
Serial.println(dataBuff);
Serial.print("Length:");
Serial.println(dataLen);
}
Сообщение, которое я передаю, - это мое полное имя и состоит из 12 символов. Мастер сначала отправляет длину сообщения (в данном случае 12), чтобы arduino знал, сколько символов нужно получить, а затем сообщение передается. На выходе логического анализатора все выглядит нормально, и я вижу это сообщение. Однако я продолжаю получать подобные результаты на последовательном мониторе Arduino:
Я должен также отметить, что использую преобразователь логического уровня sparkfun между ведущим и ведомым устройствами для повышения уровня сигнала STM32 3,3 В до 5 В для входа arduino: (Представьте, что arduino-это не uno, а master на следующем рисунке с контактами, измененными на те, которые я перечислил выше)
Я не вижу никакого сообщения рядом с "Rcvd:" и большую часть времени оно имеет длину 0, если не больше числа, намного превышающего 12. В чем, по-видимому, проблема?
@Osz, 👍2
Обсуждение0
- Путаница между SPI и I2C для SSD1306 OLED
- Последовательная связь между несколькими устройствами (или ардуино)
- Параллельная связь между несколькими Ардуино
- Multiple Wire.write() не работает для Arduino Nano I2C
- Плохие данные : Последовательная связь Arduino Mega и NodeMCU
- Водонепроницаемый датчик температуры SPI.
- Убедиться, что плата всегда подключена к одному и тому же порту
- Ошибка в связи I2C Между Arduino и Raspberry Pi
Ваш логический анализатор декодирует набор нулевых байтов между буквами, первый из которых будет интерпретироваться "Serial.println ()" как конец строки. Если вы хотите знать, что получает Arduino, вместо этого вам следует напечатать все байты (в шестнадцатеричном формате) в цикле. Также обратите внимание, что прием в ISR будет более надежным, чем полагаться на количество принятых байтов и время ожидания., @Edgar Bonet
Подчиненный код встречается довольно редко, вы можете ознакомиться с реализацией ника гэммона здесь: https://forum.arduino.cc/index.php?topic=52111.0 . Поток довольно старый, но именно так будет реализован подчиненный., @Sim Son