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.
Что я делаю не так?
@balboa, 👍3
Обсуждение1 ответ
Лучший ответ:
SPI.transfer(&SPI_message,2)
, к сожалению, является разрушительным. Буфер обновляется полученными значениями. Существует функция-член SPI[1], которую можно использовать для 16-битных данных; SPI.transfer16(SPI_message)
.
Чтобы исправить скетч, либо инициализируйте буфер перед каждым вызовом (как рекомендует @domen), либо используйте 16-битную функцию передачи.
Существуют и другие API-интерфейсы SPI, которые включают функцию неразрушающей передачи, например чтение/запись. См. [2].
Удачи!
Ссылка.
- https://www.arduino.cc/en/Reference/SPITransfer
- https://github.com/mikaelpatel/Arduino-SPI/blob /master/src/SPI.h#L137
- Как использовать SPI на Arduino?
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Программирование ведомого SPI для Arduino
- Последовательная связь между несколькими устройствами (или ардуино)
- Максимальная скорость SPI для ведомого Uno/clone?
- Как изменить контакт выбора ведомого устройства по умолчанию (цифровой контакт 10) на Arduino UNO R3 для связи по SPI?
SPI.transfer(&SPI_message,2)
является разрушительным. Буфер обновляется полученными значениями., @Mikael PatelЯ так понимаю это Ардуино? Можете ли вы уменьшить тактовую частоту SPI? В настоящее время ваш логический анализатор, похоже, находится на пределе возможностей. Будет ли работать, если разделить второй перевод на два перевода по 1B? --- То, что сказал Микаэль, вероятно, является причиной вашей проблемы., @domen
@MikaelPatel Но все же я должен видеть 0xABCD на моей линии MOSI на шине SPI? Я здесь не пытаюсь считать данные из переменной, а наблюдаю сигналы на линии SPI., @balboa
Цикл выполняется только в первый раз, затем SPI_message перезаписывается и отправляются нули. Попробуйте повторно инициализировать его до 0xabcd в цикле., @domen
@domen Точно! это я наблюдал! Теперь это работает., @balboa
@MikaelPatel ваш комментарий отвечает на мой вопрос вместе с объяснением домена. Если вы превратите это в ответ, я смогу его принять. Спасибо вам обоим за помощь!, @balboa