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?
@noobiejp, 👍1
1 ответ
Обнаружена проблема в библиотеке 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, чтобы она не повлияла на другие коды.
- Программирование ведомого SPI для Arduino
- Использование экрана SD-карты на Arduino Due
- Запуск передачи SPI с помощью прерывания в Arduino Due
- Поддерживает ли MFRC522 собственный SPI Arduino Due?
- Проблема с настройкой Arduino Due SPI на АЦП.
- Отправка данных через SPI с DMA
- Arduino Due как Triggered DMA SPI Slave - возможно?
- Использование выводов ICSP в качестве SPI в Arduino Due