Как передать более 1 байта сразу по шине SPI?
У меня есть ЦАП AD5685R, с которым я пытаюсь связаться через SPI. Согласно таблице данных,
...Эти биты [24] передаются во входной регистр на 24 падающих фронтах
SCLK
и обновляются на восходящем фронте/SYNC
где /SYNC
используется в качестве chip-select.
Я считаю, что SPI.transfer Arduino
ожидает получения 8 бит после отправки 8 бит. Но для этого конкретного ЦАП мне нужно отправить 24 прямых бита на 24 тактовых ребра, прежде чем отпустить chip-select. Возможно ли это?
@Dang Khoa, 👍6
4 ответа
Лучший ответ:
Я считаю
, что SPI.transfer Arduino
ожидает получения 8 бит после отправки 8 бит.
Неверно. С помощью SPI байт синхронизируется одновременно с байтом. Хотя, возможно, этот байт-просто фиктивный байт, если подчиненному нечего сказать.
Таким образом, для 24 бит просто выделите 3 байта, не отключая select. Поскольку SPI является синхронным протоколом, не должно быть никаких проблем с задержкой между байтами при условии сохранения выбора.
Похоже, он просто установил cs низко и сделал трехбайтовую передачу, а затем поднял ее высоко. Вот чей-то пример того, как это сделать:
http://www.reigndesign.com/blog/controlling-a-10-bit-digital-potentiometer-via-spi-with-arduino/
Код ниже взят с вышеприведенной страницы.
#include <SPI.h>
const int csPin = 10;
void setup() {
SPI.begin();
SPI.setBitOrder(MSBFIRST); //Мы знаем это из технического паспорта
pinMode(csPin,OUTPUT);
digitalWrite(csPin, HIGH);
}
void loop() {
for(int i=0; i<1023; i++) {
digitalPotWrite(0,i);
delay(10);
}
}
void digitalPotWrite(int address, int value) {
digitalWrite(csPin, LOW); //select slave
byte command = 0xB0; //0xB0 = 10110000
command += address;
SPI.transfer(command);
byte byte1 = (value >> 8);
byte byte0 = (value & 0xFF); //0xFF = B11111111
SPI.transfer(byte1);
SPI.transfer(byte0);
digitalWrite(csPin, HIGH); //отменить выбор ведомого устройства
}
В протоколе SPI вы получаете один байт обратно за каждый отправленный вами файл. Если вас не интересует ответ от устройства, вы можете просто игнорировать возвращаемые байты.
У SPI нет рукопожатия. Вы просто должны посылать не быстрее, чем может справиться подчиненное устройство. В случае AD5685R это 50 МГц.
Для многобайтной передачи вы сохраняете значение chip select утвержденным (низким) между каждым байтом, установив TransferMode в SPI_CONTINUE в вызове SPI.transfer. Для последнего байта вы отключите выбор чипа (установите его высоким), установив параметр TransferMode равным SPI_LAST в вызове SPI.transfer..
Обратите внимание, что существует также версия SPI.transfer
для многобайтовых (буферных) передач:
SPI.transfer(buffer, size)
Я использовал передачу буфера в своей библиотеке для TLC59711 (см. Код) и обнаружил, что передача буфера происходит быстрее, чем передача байтов по отдельности с помощью SPI.transfer(val)
; переключение на передачу буфера является одной из причин, по которой моя библиотека примерно в 3,5 раза быстрее, чем предыдущая библиотека для TLC59711.
Это относительно новое, работает в Arduino 1.8, не уверен насчет 1.0., @qwr
- Как использовать SPI на Arduino?
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- OVF в последовательном мониторе вместо данных
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Путаница между SPI и I2C для SSD1306 OLED
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
Если только у вас нет одного из этих странных SPI-устройств с положительным выбором., @Ignacio Vazquez-Abrams