Отправка нескольких данных с интерфейсом SPI, контролируемым осциллографом

spi

У меня есть несколько 32-битных данных, хранящихся в массиве, и я хочу последовательно отправлять их по интерфейсу SPI. Я хочу проверить, правильно ли мой код отправляет данные по SPI-интерфейсу, поэтому загружаю код и подключаю свой Linkit7697 к осциллографу. Ожидаемая форма сигнала выглядит следующим образом:

Но это оказывается так:

Кажется, что все данные составлены вместе в каждые 32 бита. - Что случилось? Есть идеи?

Вот мой код:

#include <SPI.h>

#define SPI_MOSI (11)
#define SPI_MISO (12)
#define SPI_CS (10)
#define SPI_CLK (13)


uint32_t test[]={
  0xF0000000,   //11110000000000000000000000000000 
  0x00F00000,   //00000000111100000000000000000000
  0x0000F000,   //00000000000000001111000000000000
  0x0000000F    //00000000000000000000000000001111
  };            


int i = 0;

void setup() {
  digitalWrite(SPI_CS,HIGH); //Set slave select to high, linkit7697 is Master
  SPI.begin();
  SPI.beginTransaction(SPISettings(20000000,MSBFIRST,SPI_MODE0 ));
  
  
}

void loop() {
  
  for (i = 0; i < 4; i++){
    digitalWrite(SPI_CS,LOW);
    SPI.transfer(&test[i],4);
    digitalWrite(SPI_CS, HIGH);
    
  }

}

, 👍1

Обсуждение

беглый просмотр библиотеки показывает функции "transfer16" и "transfer32"., @jsotola

Не до конца понимая описание вашей проблемы, я предполагаю, что "SPI.transfer ()" фактически отключит все после младшего байта вашего элемента данных (потому что он ожидает один байт), таким образом, отправляя только один байт на число. Как писал jsotola, функция transfer32 () предназначена для передачи 32 - разрядных чисел. Вы должны использовать его, @chrisl

Я использовал побитовый оператор для преобразования 32-битных данных в два 16-битных данных и использовал SPI.transfer16() для выполнения передачи. Я уверен, что побитовый оператор работает (потому что я использую последовательный монитор для печати результата). Но когда я подключаю Linkit7697 к осциллографу, он показывает форму сигнала, как я упоминал выше., @jcwu


1 ответ


1
SPI.transfer(&test[i],4);

SPI.transfer() передает один байт каждый раз и поэтому ожидает указатель на байт (например, uint8_t), когда вы передаете адрес uint32_t. Что вам нужно сделать, так это привести адрес uint32_t в указатель uint8_t перед передачей его в SPI.transfer.

uint8_t *ptr = (uint8_t *) &test;

SPI.beginTransaction(SPISettings(20000000,MSBFIRST,SPI_MODE0 ));
digitalWrite(SPI_CS,LOW);
for (i = 0; i < sizeof(test); i++) {
  SPI.transfer(*ptr++, 4);
}
digitalWrite(SPI_CS, HIGH);
SPI.endTransaction();

Пожалуйста, также обратите внимание , что Arduino-это маленькая конечная машина, поэтому, если у вас есть данные как 0x41424344, первый байт, который будет передан, будет 0x44.

Еще одна вещь, всегда хорошо вызвать SPI.endTransaction(), он освобождает шину SPI, чтобы позволить другим устройствам SPI использовать шину данных.

,