SPI.transfer(buffer, size) не отправляет данные из буфера

У меня возникли проблемы с тем, чтобы SPI.transfer(buffer, size) работал должным образом.

Вот код:

// подключаем библиотеку SPI:
#include <SPI.h>


// устанавливаем контакт 10 в качестве подчиненного устройства для цифрового потенциометра:
const int slaveSelectPin = 10;

uint16_t SPI_message = 0xABCD;

void setup() {
  // устанавливаем подчиненныйSelectPin в качестве вывода:
  pinMode(slaveSelectPin, OUTPUT);
  // инициализируем SPI:
  SPI.begin();

}

void loop() {

  SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
  SPI.transfer(0xEF);
  SPI.transfer(&SPI_message, 2);
  SPI.endTransaction();

  delayMicroseconds(300);

}

Вот выходные данные логического анализатора:

Как видно, вызов SPI.Transfer(0xEF) работает как положено. Однако SPI.transfer(&SPI_message,2) отправляет на шину 0x0000 вместо 0xABCD.

Что я делаю не так?

, 👍3

Обсуждение

SPI.transfer(&SPI_message,2) является разрушительным. Буфер обновляется полученными значениями., @Mikael Patel

Я так понимаю это Ардуино? Можете ли вы уменьшить тактовую частоту SPI? В настоящее время ваш логический анализатор, похоже, находится на пределе возможностей. Будет ли работать, если разделить второй перевод на два перевода по 1B? --- То, что сказал Микаэль, вероятно, является причиной вашей проблемы., @domen

@MikaelPatel Но все же я должен видеть 0xABCD на моей линии MOSI на шине SPI? Я здесь не пытаюсь считать данные из переменной, а наблюдаю сигналы на линии SPI., @balboa

Цикл выполняется только в первый раз, затем SPI_message перезаписывается и отправляются нули. Попробуйте повторно инициализировать его до 0xabcd в цикле., @domen

@domen Точно! это я наблюдал! Теперь это работает., @balboa

@MikaelPatel ваш комментарий отвечает на мой вопрос вместе с объяснением домена. Если вы превратите это в ответ, я смогу его принять. Спасибо вам обоим за помощь!, @balboa


1 ответ


Лучший ответ:

4

SPI.transfer(&SPI_message,2), к сожалению, является разрушительным. Буфер обновляется полученными значениями. Существует функция-член SPI[1], которую можно использовать для 16-битных данных; SPI.transfer16(SPI_message).

Чтобы исправить скетч, либо инициализируйте буфер перед каждым вызовом (как рекомендует @domen), либо используйте 16-битную функцию передачи.

Существуют и другие API-интерфейсы SPI, которые включают функцию неразрушающей передачи, например чтение/запись. См. [2].

Удачи!

Ссылка.

  1. https://www.arduino.cc/en/Reference/SPITransfer
  2. https://github.com/mikaelpatel/Arduino-SPI/blob /master/src/SPI.h#L137
,