Поиск…


замечания

Сигналы выбора микросхемы

Большинство подчиненных устройств имеют активный вход для выбора чипа. Поэтому правильный код для инициализации и использования вывода микросхемы:

#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect

// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect

Отмена выбора подчиненного устройства столь же важна, как и его выбор, поскольку подчиненный может управлять линией MISO во время ее выбора. Там может быть много подчиненных, но только один может управлять MISO. Если подчиненное устройство не отменено должным образом, два или более ведомых устройства могут управлять MISO, что может привести к замыканию контактов между их выходами и может повредить устройства.

операции

Транзакции служат двум целям:

  • рассказать SPI, когда мы хотим начать и использовать его в определенном контексте
  • настроить SPI для конкретного чипа

Строка часов имеет разные состояния незанятости в разных режимах SPI. Изменение режима SPI во время выбора подчиненного устройства может привести к запуску подчиненного устройства, поэтому всегда выбирайте режим SPI перед выбором подчиненного устройства. Режим SPI может быть установлен с объектом SPISettings переданным в SPI.beginTransaction :

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();

SPISettings также может храниться в другом месте:

SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);

Если другая часть кода пытается использовать SPI между двумя вызовами beginTransaction() и endTransaction() , может возникнуть ошибка - то, как это делается, зависит от реализации.

См. Также Arduino Reference: SPISettings

Использование SPI в процедурах обслуживания прерываний

Если SPI должен использоваться в ISR, никакая другая транзакция не может происходить одновременно. Библиотека SPI обеспечивает usingInterrupt(interrupt_number) чтобы облегчить это. Он работает, отключая заданное прерывание всякий раз, когда beginTransaction() , поэтому прерывание не может beginTransaction() между этой парой вызовов to beginTransaction() и endTransaction() .

См. Также Arduino Reference: SPI: usingInterrupt

Основы: инициализация SPI и вывод выбора микросхемы, а также передача 1 байта

#include <SPI.h>
#define CSPIN 1

void setup() {
  pinMode(CSPIN, OUTPUT); // init chip select pin as an output
  digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"

  SPI.begin();

  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(CSPIN, 0);

  unsigned char sent = 0x01;
  unsigned char received = SPI.transfer(sent);
  // more data could be transferred here

  digitalWrite(CSPIN, 1);
  SPI.endTransaction();

  SPI.end();
}

void loop() {
  // we don't need loop code in this example.
}

Этот пример:

  • правильно инициализирует и использует вывод выбора микросхемы (см. примечания)
  • правильно использует транзакцию SPI (см. примечания)
  • использует только SPI для передачи одного байта. Существует также способ передачи массивов, который здесь не используется.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow