SPI-транзакции в Arduino

У меня есть задача, в которой я должен выполнять транзакции SPI в режиме прерывания. Означает, что я должен обрабатывать данные в обработчике IRQ (как для байтов tx, так и для rx). Как мне подойти? У меня есть плата arduino (2560) и щит CAN (см. студию) с интерфейсом SPI.

Изменить: С веб-сайта: https://www.arduino.cc/en/reference/SPI

Для большинства устройств SPI после SPI.beginTransaction() вы напишете ведомый пин выбора НИЗКИЙ, вызовите SPI.transfer() любое количество раз, чтобы передавать данные, затем записывать на вывод SS HIGH и, наконец, вызывать SPI.endTransaction()

Мой вопрос: каким образом обрабатывается функция SPI.transfer()? Байты передаются/получаются в обработчике прерывания или путем опроса?

, 👍0

Обсуждение

Какая плата Ардуино? Это может изменить ситуацию., @Delta_G

Есть много библиотек. Ваш вопрос очень широкий. Есть даже несколько библиотек SPI и I2C. Вам нужно сузить свой вопрос. **Какая** библиотека вас беспокоит? Что вы имеете в виду, выполняя транзакцию «в режиме прерывания»? Вы имеете в виду **во время** прерывания? Или что транзакция должна **использовать** прерывания?, @Nick Gammon

Ваш вопрос настолько широк, что я предлагаю вам прочитать [Как задать хороший вопрос для Arduino Stack Exchange] (https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good-question- for-arduino-stack-exchange). Ответ на вопрос «основаны ли эти библиотеки на прерываниях или на опросах» вкратце звучит так: «это зависит». Поэтому вам нужно сузить вопрос, чтобы получить полезный ответ., @Nick Gammon

@Delta_G добавлено в вопрос, @MANI

@НикГаммон, да. Я знаю, что есть много библиотек. Это проблема. Я отредактировал вопрос. И да, "транзакция должна использовать прерывания". Скажите мне, если я должен сузить его больше., @MANI


1 ответ


2

У меня есть длинный справочный вопрос о SPI, который может вам помочь.

Для передачи вовне вам не нужно использовать прерывание. И не опрашивается. Данные просто помещаются в регистр SPI, и аппаратное обеспечение синхронизирует данные с заданной скоростью SPI.

Чтобы перевести внутрь, вы просто читаете реестр. Однако, чтобы знать, когда вам нужно его прочитать, вы, вероятно, поместите чтение в процедуру прерывания.

Я предлагаю вам прочитать ссылку выше, а затем, если хотите, вы можете расширить свой вопрос еще больше.

Источник для передачи SPI, который, я думаю, применим к Atmega2560, выглядит следующим образом:

// Запись на шину SPI (вывод MOSI), а также получение (вывод MISO)
  inline static uint8_t transfer(uint8_t data) {
    SPDR = data;
/*
* Следующий NOP вводит небольшую задержку, которая может предотвратить ожидание
* Повторение формы цикла при работе на максимальной скорости. Это дает
* примерно на 10% больше скорости, даже если это кажется нелогичным. В нижней
* скорости незаметно.
*/
    asm volatile("nop");
    while (!(SPSR & _BV(SPIF))) ; // ждать
    return SPDR;
  }

Вы можете видеть, что есть краткий опрос (строка "пока") для регистра, который поддерживает процессор, чтобы показать, закончилась ли передача. Затем регистр читается и возвращается. Так что да, опрос есть.

Теперь, если вы используете прерывание (см. ссылку выше), то вы будете знать, что флаг был установлен, и, следовательно, задержки (в опросе) не будет.

,