Отправка нескольких данных с интерфейсом 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);
}
}
@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 использовать шину данных.
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как передать более 1 байта сразу по шине SPI?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
беглый просмотр библиотеки показывает функции "transfer16" и "transfer32"., @jsotola
Не до конца понимая описание вашей проблемы, я предполагаю, что "SPI.transfer ()" фактически отключит все после младшего байта вашего элемента данных (потому что он ожидает один байт), таким образом, отправляя только один байт на число. Как писал jsotola, функция transfer32 () предназначена для передачи 32 - разрядных чисел. Вы должны использовать его, @chrisl
Я использовал побитовый оператор для преобразования 32-битных данных в два 16-битных данных и использовал
SPI.transfer16()
для выполнения передачи. Я уверен, что побитовый оператор работает (потому что я использую последовательный монитор для печати результата). Но когда я подключаю Linkit7697 к осциллографу, он показывает форму сигнала, как я упоминал выше., @jcwu