수색…


비고

칩 선택 신호

대부분의 슬레이브는 액티브 로우 칩 선택 입력을 갖는다. 따라서 칩 선택 핀을 초기화하고 사용하는 적절한 코드는 다음과 같습니다.

#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 모드를 변경하면 슬레이브를 혼란스럽게 할 수 있으므로 항상 슬레이브를 선택하기 전에 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);

코드의 다른 부분이 beginTransaction()endTransaction() 에 대한 호출 쌍 사이에서 SPI를 사용하려고하면 오류가 발생할 수 있습니다. 구현 방법은 구현에 따라 다릅니다.

Arduino 참조 : SPISettings를 참조 하십시오 .

인터럽트 서비스 루틴에서 SPI 사용

ISI 내에서 SPI를 사용해야하는 경우 다른 트랜잭션이 동시에 수행되지 않을 수 있습니다. SPI 라이브러리는이를 촉진하기 위해 usingInterrupt(interrupt_number) 를 제공합니다. beginTransaction() 이 호출 될 때마다 주어진 인터럽트를 비활성화하여 작동하므로 beginTransaction()endTransaction() 대한 호출에서 인터럽트가 발생하지 않습니다.

또한 Arduino 참조 : 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 트랜잭션을 적절하게 사용한다 (비고 참조)
  • 1 바이트를 전송하기 위해서만 SPI를 사용합니다. 여기에 사용되지 않는 배열을 전송하는 방법도 있습니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow