Как передать более 1 байта сразу по шине SPI?

spi

У меня есть ЦАП AD5685R, с которым я пытаюсь связаться через SPI. Согласно таблице данных,

...Эти биты [24] передаются во входной регистр на 24 падающих фронтах SCLK и обновляются на восходящем фронте /SYNC

где /SYNC используется в качестве chip-select.

Я считаю, что SPI.transfer Arduino ожидает получения 8 бит после отправки 8 бит. Но для этого конкретного ЦАП мне нужно отправить 24 прямых бита на 24 тактовых ребра, прежде чем отпустить chip-select. Возможно ли это?

, 👍6


4 ответа


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

11

Я считаю, что SPI.transfer Arduino ожидает получения 8 бит после отправки 8 бит.

Неверно. С помощью SPI байт синхронизируется одновременно с байтом. Хотя, возможно, этот байт-просто фиктивный байт, если подчиненному нечего сказать.

Таким образом, для 24 бит просто выделите 3 байта, не отключая select. Поскольку SPI является синхронным протоколом, не должно быть никаких проблем с задержкой между байтами при условии сохранения выбора.

,

4

Похоже, он просто установил 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); //отменить выбор ведомого устройства
}
,

7

В протоколе SPI вы получаете один байт обратно за каждый отправленный вами файл. Если вас не интересует ответ от устройства, вы можете просто игнорировать возвращаемые байты.

У SPI нет рукопожатия. Вы просто должны посылать не быстрее, чем может справиться подчиненное устройство. В случае AD5685R это 50 МГц.

Для многобайтной передачи вы сохраняете значение chip select утвержденным (низким) между каждым байтом, установив TransferMode в SPI_CONTINUE в вызове SPI.transfer. Для последнего байта вы отключите выбор чипа (установите его высоким), установив параметр TransferMode равным SPI_LAST в вызове SPI.transfer..

,

Если только у вас нет одного из этих странных SPI-устройств с положительным выбором., @Ignacio Vazquez-Abrams


7

Обратите внимание, что существует также версия SPI.transfer для многобайтовых (буферных) передач:

SPI.transfer(buffer, size)

Я использовал передачу буфера в своей библиотеке для TLC59711 (см. Код) и обнаружил, что передача буфера происходит быстрее, чем передача байтов по отдельности с помощью SPI.transfer(val); переключение на передачу буфера является одной из причин, по которой моя библиотека примерно в 3,5 раза быстрее, чем предыдущая библиотека для TLC59711.

,

Это относительно новое, работает в Arduino 1.8, не уверен насчет 1.0., @qwr