16-битный SPI на Arduino Due

Я пытаюсь управлять AD7091-8 с помощью Arduino Due.

Эта микросхема требует 16-битного чтения/записи SPI. Я читал, что могу изменить биты передачи и приема Arduino DUE, изменив регистр (биты 4-7 SPI_CSR).

Мне удалось изменить SPI Due с 8 на 16 бит. Подтвердил это, посмотрев на SCLK и MOSI в прицеле. Однако данные, которые я хочу передать, становятся прерывистыми.

Я хочу отправить 0x1000. На 8 битах, используя строку

SPI.transfer(10,0x10,SPI_LAST);

Я действительно вижу, что это отправляется через MOSI.

Однако, когда я использую 16 бит, линия

SPI.transfer(10,0x1000,SPI_LAST);

Он становится либо 0x0000, либо 0x0008. Я теряю бит или он становится LSB_FIRST. Не MSB_FIRST.

Ниже приведен фактический код.

#include <SPI.h>
#include "C:\Users\Smart Surface 2\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.11\system\CMSIS\Device\ATMEL\sam3xa\include\component\component_spi.h"
#include "C:\Users\Smart Surface 2\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.11\system\CMSIS\Device\ATMEL\sam3xa\include\instance\instance_spi0.h"

#define CS 10

void setup() {

  pinMode(CONV,OUTPUT);

  Serial.begin(9600);
  SPI.begin(CS);
  SPI.setDataMode(CS, SPI_MODE0);
  SPI.setClockDivider(CS,21);  

  REG_SPI0_WPMR=0x53504900;
  REG_SPI0_CR=0x1;
  SPI0->SPI_CSR[0]=0x00001580; 

  SPI.setBitOrder(MSBFIRST);
  delay(1);
}

void loop() {

  SPI.transfer(CS,0x1000,SPI_LAST);

  int a = SPI.transfer(CS,0x0000, SPI_LAST);
  delay(1000);

  Serial.println(a);
}

Как я могу сделать свои данные надежными и сделать заказ в первую очередь через MSB?

, 👍1


1 ответ


2

Обнаружена проблема в библиотеке SPI.

Когда я выполняю команду SPI.transfer, данные сохраняются в переменной байтового типа. И я передаю ему 16-битные данные.

Я изменил строку 84 файла SPI.h на

uint16_t transfer(byte _pin, uint16_t _data, SPITransferMode _mode = SPI_LAST);

так что он вернет и получит 16-битные данные.

Также необходимо изменить соответствующую функцию в SPI.cpp (строка 174)

uint16_t SPIClass::transfer(byte _pin, uint16_t _data, SPITransferMode _mode)

чтобы они совпадали.

Я скопировал и переименовал измененную библиотеку SPI, чтобы она не повлияла на другие коды.

,