TI ADS7250 считывается из SPI и SPI1 одновременно
Я так смущен таблицей ADS2750 здесь, я, кажется, не могу вычислить правильный сдвиг битов для правильного чтения данных из битов 15-27. Я даже не уверен, что некоторые аббревиатуры означают на странице 23 таблица 1. Я получаю, что первые 15 бит пусты, в то время как АЦП принимает показания, а затем последние 12 бит для 12-битного АЦП являются значением из этого АЦП, которое соответствует входу SPI A или B. Кто-нибудь может объяснить мне, как вы будете читать данные на основе этой таблицы, используя информацию из таблицы 2 стр. 24?
Мое оборудование настроено на АЦП7250 VCC 5 Вольт
- D5 SS для SPI и SPI1
- D13 SCK как для SPI , так и для SPI1
- D11 MISO SPI_A от АЦП
- D4 MISO SPI_B от АЦП
- Нет MOSI подключен
Я не уверен, что отправить в SPI.Transfer(0x00)
. Я также не уверен, правильно ли я настраиваю режимы, настройки SPISettings(24*MHZ, MSBFIRST, SPI_MODE1);
так как я не 100% на тактовой частоте. Я также запутался, если это LSB или MSB, так как в таблице данных есть две конфликтующие заметки, функция передачи, используемая LSB, а затем два абзаца говорят: "MSBs ADC_A и ADC_B выводятся"
Я хотел бы получить некоторую помощь в декодировании этого листа данных и получении скрипта, который может считывать данные с этого чипа, используя одновременно SPI и SPI1.
Работа только с чтением SPI сначала добавит SPI1.
unsigned int readRegister(byte thisRegister, int bytesToRead);
const int CS_ADC_ISOLATOR = D5;
__SPISettings settings(24*MHZ, MSBFIRST, SPI_MODE0);
const int buffersize = 30;
unsigned char dataBuffer [buffersize];
const byte READ = 0x22;
// setup() runs once, when the device is first turned on.
void setup() {
Serial.begin(115200);
pinMode (CS_ADC_ISOLATOR, OUTPUT);
digitalWrite (CS_ADC_ISOLATOR, HIGH);
SPI.begin();
SPI1.begin();
}
// loop() runs over and over again, as quickly as it can execute.
void loop() {
digitalWrite (CS_ADC_ISOLATOR, LOW);
SPI.beginTransaction(settings);
for(unsigned char i = 0; i < buffersize; i ++)
{
dataBuffer[i] = SPI.transfer(0x00 << 14);
}
digitalWrite (CS_ADC_ISOLATOR, HIGH);
SPI.endTransaction();
for(unsigned char n = 0; n < buffersize; n ++)
{
Serial.print(dataBuffer[n]);
}
Serial.print("::");
}
1 ответ
Вы не можете использовать обычную библиотеку SPI для правильной связи с этим устройством. Ну, вы можете, но вы сможете использовать только один канал - другой будет полностью проигнорирован.
SPI работает только на одном выводе MISO - вам нужно два. Есть два других типа "SPI", которые используются устройствами, в первую очередь микросхемами флэш-памяти SPI: DSPI и QSPI (двойной SPI и четырехъядерный SPI). Вам нужен DSPI.
К сожалению, Arduino не выполняет DSPI, поэтому вам придется "немного потрясти" его, что означает ручное управление выводами ввода-вывода для создания собственных сигналов SPI в программном обеспечении.
Теперь... перейдем к таблице данных:
Важной частью является временная диаграмма на стр. 9. Из этого вы можете видеть, что вы просто посылаете 32 тактовых импульса, и чип отвечает данными после 15 импульсов.
Так что, если вы просто сделаете 4 8-битных передачи данных обратно, вы получите данные. Не имеет значения, что вы "отправляете" в этих переводах, поскольку контакт MOSI ни к чему не подключен.
Что касается скорости, то 24 МГц-это максимальная скорость, с которой он будет работать. Фактическая скорость определяется Arduino и тем, как быстро вы управляете выводом SCK. Это может быть так же медленно, как 1x10-1000Гц, если вы действительно хотите.
Данные следует считывать с нижней границы SCK.
Таким образом, вы могли бы написать небольшую процедуру, которая выглядит так:
uint32_t resa = 0;
uint32_t resb = 0;
pinMode(SCK, OUTPUT);
pinMode(SDI_A, INPUT);
pinMode(SDI_B, INPUT);
pinMode(CS, OUTPUT);
digitalWrite (CS, HIGH);
digitalWrite (CS, LOW);
for (int i = 0; i < 32; i++) {
digitalWrite(SCK, HIGH);
digitalWrite(SCK, LOW);
resa <<= 1;
resb <<= 1;
resa |= digitalRead(SDI_A);
resb |= digitalRead(SDI_B);
}
digitalWrite (CS, HIGH);
Serial.print("A: "); Serial.println(resa);
Serial.print("B: "); Serial.println(resb);
Таким образом, в течение 32 итераций вы посылаете тактовую частоту сначала ВЫСОКОЙ, затем НИЗКОЙ, затем сдвигаете каждый результат на 1 бит влево, а затем добавляете вновь считанный бит в позицию наименьшего бита.
Вы можете ускорить работу, используя прямое управление портами и избегая медленных функций digitalWrite()
и digitalRead ()
.
- Arduino/ESP8266 нет данных SPI, поступающих от MCP3008
- Взаимодействие ADS8319 с Arduino UNO
- Тактовая частота 2,4 МГц для 3-проводного SPI с использованием Arduino Mega 2560
- Проблема с настройкой Arduino Due SPI на АЦП.
- Использование Arduino для записи аналоговых сигналов с помощью SPI ADC + проблема с частотой дискретизации
- SPI-подключения к ЦАП
- Получение неправильного вывода от АЦП через SPI в Arduino Uno
- Библиотека AD7768-1 "Ардуино"
Допустим, я выбрал MCU с DSPI, у него есть возможности SPI и SPI1, смогу ли я тогда использовать библиотеку SPI или бит по-прежнему будет моим лучшим вариантом? Я использую [Частицу Бора](https://docs.particle.io/assets/images/boron/boron-pinout-v1.0.pdf) , который имеет DSPI., @Nicholas Johnson
Нет, у этого нет DSPI (или, если есть, вы не можете сказать по этой картинке. Который имеет два независимых канала SPI. Это не DSPI. DSPI и QSPI-это всего лишь один канал, но с несколькими выводами данных на одном канале., @Majenko
Так что мне придется, черт возьми, закусить удила... черт возьми. Как бы вы рекомендовали удерживать CL на низком уровне в течение правильного промежутка времени без задержки? Мне бы хотелось что-то, что проверяет данные и снова выводит данные CS на высокий уровень на основе статуса данных, но не могу уверенно придумать решение., @Nicholas Johnson
Извините, я не понимаю. Вы просто понижаете CS, отправляете свои часы и считываете данные, затем снова повышаете CS. Там нечего "проверять"., @Majenko
Хорошо, значит, я должен быть в состоянии снизить CS до 32 циклов CLK и считывать данные, поступающие с АЦП, в любой GPIO вместо стандартной библиотеки SPI. В боре используется [nRF52840](https://infocenter.nordicsemi.com/pdf/nRF52840_PS_v1.1.pdf) на странице 399 таблицы данных говорится о шине SPI, а на странице 286-о четырехъядерном последовательном периферийном интерфейсе. Что я понял из чтения 6.19, так это то, что QSPI здесь бесполезен, потому что две шины SPI предназначены для памяти и не смогут совместно использовать один CLK. Какие у вас есть рекомендации по считыванию АЦП с двумя входами SPI MISO?, @Nicholas Johnson