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("::");
}

, 👍0


1 ответ


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 ().

,

Допустим, я выбрал 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