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)입니다. polarity는 SCK의 유휴 레벨(0 또는 1)입니다. phase는 데이터를 첫 번째(0) 클록 엣지에서 샘플링할지 두 번째(1) 클록 엣지에서 샘플링할지 선택합니다. crc는 None(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)P3P2P1P0SPI(4)(OpenMV Cam N6 전용)P15P16P17P18NSS는 어느 버스에서도 SPI 주변장치에 의해 구동되지 않습니다; 일반 GPIO 칩-셀렉트로 자유롭게 사용할 수 있습니다.메서드¶
- 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 버스를 초기화합니다:
mode는SPI.CONTROLLER또는SPI.PERIPHERAL중 하나여야 합니다.baudrate는 SCK 클록 속도입니다(컨트롤러에서만 의미가 있습니다).prescaler는 APB 버스 주파수에서 SCK를 유도하는 데 사용되는 프리스케일러입니다;prescaler를 사용하면baudrate를 무시합니다.polarity는 0 또는 1일 수 있으며, 유휴 클록 라인이 머무르는 레벨입니다.phase는 0 또는 1일 수 있으며, 각각 첫 번째 또는 두 번째 클록 에지에서 데이터를 샘플링합니다.bits는 8 또는 16일 수 있으며, 전송되는 각 워드의 비트 수입니다.firstbit은SPI.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에 전달된 동일한 버퍼입니다.
상수¶