class SPI – 컨트롤러 구동 직렬 프로토콜

SPI는 컨트롤러에 의해 구동되는 동기식 직렬 프로토콜입니다. 물리적 수준에서는 세 개의 라인(SCK, MOSI, MISO)과 주변장치별 칩-셀렉트 라인을 사용합니다.

사용법은 I2C와 유사하며, 주요 차이점은 버스를 초기화할 때 전달되는 매개변수입니다:

from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)

유일하게 필수인 매개변수는 mode(SPI.CONTROLLER 또는 SPI.PERIPHERAL)입니다. polaritySCK의 유휴 레벨(0 또는 1)입니다. phase는 데이터를 첫 번째(0) 클록 엣지에서 샘플링할지 두 번째(1) 클록 엣지에서 샘플링할지 선택합니다. crcNone(CRC 없음)이거나 CRC 다항식입니다.

데이터 전송:

data = spi.send_recv(b"1234")        # send 4 bytes and receive 4 bytes
buf = bytearray(4)
spi.send_recv(b"1234", buf)          # send 4 bytes and receive 4 into buf
spi.send_recv(buf, buf)              # send/receive 4 bytes through buf

생성자

class pyb.SPI(bus: int | str, *args, **kwargs)

주어진 bus(정수 SPI 주변장치 인덱스, 예: SPI2의 경우 2)에 SPI 객체를 생성합니다. 추가 매개변수가 없으면 객체는 생성되지만 초기화되지 않습니다(이전 버스 설정이 있으면 유지됩니다); 추가 인자가 주어지면 버스가 해당 인자로 초기화됩니다. 사용 가능한 매개변수는 init()를 참조하십시오.

SPI(2)는 모든 STM32 OpenMV Cam에서 동일한 헤더 핀에 연결되어 있습니다; OpenMV Cam N6은 추가로 SPI(4)를 노출합니다:

버스

NSS

SCK

MISO

MOSI

SPI(2) (모든 STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4) (OpenMV Cam N6 전용)

P15

P16

P17

P18

NSS는 어느 버스에서도 SPI 주변장치에 의해 구동되지 않습니다; 일반 GPIO 칩-셀렉트로 자유롭게 사용할 수 있습니다.

메서드

deinit() None

SPI 버스를 끕니다.

init(mode: int, baudrate: int = 328125, *, prescaler: int = -1, polarity: int = 1, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, ti: bool = False, crc: int | None = None) None

주어진 매개변수로 SPI 버스를 초기화합니다:

  • modeSPI.CONTROLLER 또는 SPI.PERIPHERAL 중 하나여야 합니다.

  • baudrate는 SCK 클록 속도입니다(컨트롤러에서만 의미가 있습니다).

  • prescaler는 APB 버스 주파수에서 SCK를 유도하는 데 사용되는 프리스케일러입니다; prescaler를 사용하면 baudrate를 무시합니다.

  • polarity는 0 또는 1일 수 있으며, 유휴 클록 라인이 머무르는 레벨입니다.

  • phase는 0 또는 1일 수 있으며, 각각 첫 번째 또는 두 번째 클록 에지에서 데이터를 샘플링합니다.

  • bits는 8 또는 16일 수 있으며, 전송되는 각 워드의 비트 수입니다.

  • firstbitSPI.MSB 또는 SPI.LSB일 수 있습니다.

  • ti가 True이면 Motorola가 아닌 Texas Instruments 신호 규약을 나타냅니다.

  • crc는 CRC가 없으면 None, 또는 다항식 지정자일 수 있습니다.

SPI 클록 주파수가 baudrate와 정확히 일치하지 않을 수 있습니다. 하드웨어는 부모 APB 버스 주파수를 2의 거듭제곱 프리스케일러(2, 4, 8, 16, 32, 64, 128 또는 256)로 나눈 클록만 지원합니다; 드라이버는 요청된 baudrate를 초과하지 않는 가장 높은 값을 선택합니다. SPI(2)는 APB1에 있습니다. 클록을 정밀하게 제어하려면 baudrate 대신 prescaler를 직접 설정하십시오.

SPI 객체를 출력하면 계산된 보드 레이트와 선택된 프리스케일러가 표시됩니다.

recv(recv: int | bytearray, *, timeout: int = 5000) bytes

버스에서 데이터를 수신합니다:

  • recv는 수신할 바이트 수를 나타내는 정수이거나, 수신된 바이트로 채워질 변경 가능한 버퍼일 수 있습니다.

  • timeout은 수신을 기다리는 타임아웃(밀리초)입니다.

반환 값: recv가 정수이면 수신된 바이트의 새 버퍼, 그렇지 않으면 recv에 전달된 동일한 버퍼입니다.

send(send: int | bytes | bytearray, *, timeout: int = 5000) None

버스에서 데이터를 전송합니다:

  • send는 전송할 데이터입니다(전송할 정수 또는 버퍼 객체).

  • timeout은 전송을 기다리는 타임아웃(밀리초)입니다.

send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes

버스에서 데이터를 동시에 송수신합니다:

  • send는 전송할 데이터입니다(전송할 정수 또는 버퍼 객체).

  • recv는 수신된 바이트로 채워질 변경 가능한 버퍼입니다. send와 같을 수도 있고 생략할 수도 있습니다. 생략하면 새 버퍼가 생성됩니다.

  • timeout은 수신을 기다리는 타임아웃(밀리초)입니다.

반환 값: 수신된 바이트가 담긴 버퍼입니다.

상수

CONTROLLER: int

SPI 버스를 마스터(컨트롤러)로 초기화합니다 – OpenMV Cam이 SCKMOSI를 구동하고 트랜잭션을 담당합니다.

PERIPHERAL: int

SPI 버스를 슬레이브(주변장치)로 초기화합니다 – OpenMV Cam이 원격 컨트롤러에 의해 구동되는 클록 펄스에 응답합니다.

MSB: int

최상위 비트를 먼저 송수신하려면 firstbit에 전달합니다(가장 일반적인 순서).

LSB: int

최하위 비트를 먼저 송수신하려면 firstbit에 전달합니다.