class SPI – 직렬 주변장치 인터페이스 버스 프로토콜(컨트롤러 측)

SPI는 컨트롤러가 구동하는 동기식 직렬 프로토콜입니다. 물리적 수준에서 버스는 SCK, MOSI, MISO의 3개 라인으로 구성됩니다. 여러 장치가 동일한 버스를 공유할 수 있습니다. 각 장치는 버스에서 통신할 특정 장치를 선택하기 위해 별도의 네 번째 신호인 CS(Chip Select)를 가져야 합니다. CS 신호의 관리는 사용자 코드에서(machine.Pin 클래스를 통해) 이루어져야 합니다.

하드웨어 SPI와 소프트웨어 SPI 구현 모두 SPISoftSPI 클래스를 통해 존재합니다. 하드웨어 SPI는 읽기/쓰기를 수행하기 위해 시스템의 기반 하드웨어 지원을 사용하며, 일반적으로 효율적이고 빠르지만 사용할 수 있는 핀에 제약이 있을 수 있습니다. 소프트웨어 SPI는 비트뱅잉으로 구현되어 어떤 핀에서도 사용할 수 있지만 효율적이지는 않습니다. 이 클래스들은 동일한 메서드를 제공하며 주로 생성 방식에서 차이가 있습니다.

사용 예시:

from machine import SPI, Pin

spi = SPI(0, baudrate=400000)           # Create SPI peripheral 0 at frequency of 400kHz.
                                        # Depending on the use case, extra parameters may be required
                                        # to select the bus characteristics and/or pins to use.
cs = Pin(4, mode=Pin.OUT, value=1)      # Create chip-select on pin 4.

try:
    cs(0)                               # Select peripheral.
    spi.write(b"12345678")              # Write 8 bytes, and don't care about received data.
finally:
    cs(1)                               # Deselect peripheral.

try:
    cs(0)                               # Select peripheral.
    rxdata = spi.read(8, 0x42)          # Read 8 bytes while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

rxdata = bytearray(8)
try:
    cs(0)                               # Select peripheral.
    spi.readinto(rxdata, 0x42)          # Read 8 bytes inplace while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
    cs(0)                               # Select peripheral.
    spi.write_readinto(txdata, rxdata)  # Simultaneously write and read bytes.
finally:
    cs(1)                               # Deselect peripheral.

생성자

class machine.SPI(id: int, baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

지정된 버스 id에 SPI 객체를 생성합니다. id의 값은 특정 포트와 그 하드웨어에 따라 다릅니다. 0, 1 등의 값은 일반적으로 하드웨어 SPI 블록 #0, #1 등을 선택하는 데 사용됩니다.

추가 매개변수 없이 호출하면 SPI 객체는 생성되지만 초기화되지는 않습니다(버스가 마지막으로 초기화된 설정이 있다면 그 설정을 가집니다). 추가 인수가 주어지면 버스가 초기화됩니다. 초기화 매개변수는 init을 참조하십시오.

메서드

init(baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

지정된 매개변수로 SPI 버스를 초기화합니다:

  • baudrate는 SCK 클럭 속도입니다.

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

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

  • bits는 각 전송의 비트 단위 폭입니다. 모든 하드웨어에서 지원이 보장되는 값은 8뿐입니다.

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

  • sck, mosi, miso는 버스 신호에 사용할 핀(machine.Pin) 객체입니다. 대부분의 하드웨어 SPI 블록(생성자의 id 매개변수로 선택됨)에서는 핀이 고정되어 있어 변경할 수 없습니다. 일부 경우에는 하드웨어 블록이 하드웨어 SPI 블록에 대해 2~3개의 대체 핀 세트를 허용합니다. 임의의 핀 할당은 비트뱅잉 SPI 드라이버(id = -1)에서만 가능합니다.

하드웨어 SPI의 경우 실제 클럭 주파수는 요청된 baudrate보다 낮을 수 있습니다. 이는 플랫폼 하드웨어에 따라 다릅니다. 실제 속도는 SPI 객체를 출력하여 확인할 수 있습니다.

deinit() None

SPI 버스를 끕니다.

read(nbytes: int, write: int = 0x00) bytes

write로 주어진 단일 바이트를 계속 쓰면서 nbytes로 지정된 수만큼의 바이트를 읽습니다. 읽은 데이터를 담은 bytes 객체를 반환합니다.

readinto(buf: bytearray, write: int = 0x00) None

write로 주어진 단일 바이트를 계속 쓰면서 buf로 지정된 버퍼로 읽어 들입니다. None을 반환합니다.

write(buf: bytes) None

buf에 담긴 바이트를 씁니다. None을 반환합니다.

write_readinto(write_buf: bytes, read_buf: bytearray) None

read_buf로 읽어 들이면서 write_buf의 바이트를 씁니다. 두 버퍼는 동일하거나 다를 수 있지만 길이는 같아야 합니다. None을 반환합니다.

상수

MSB: int

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

LSB: int

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

class SoftSPI – 소프트웨어 에뮬레이션 SPI 버스

SoftSPI 클래스는 임의의 GPIO 핀을 비트뱅잉하여 SPI를 구현합니다. SPI와 동일한 메서드 표면을 노출하므로, 하드웨어 SPI를 대상으로 하는 기존 코드를 생성자 변경만으로 소프트웨어로 전환할 수 있습니다. 필요한 핀이 하드웨어 SPI 블록에 배선되어 있지 않거나, 사용 가능한 하드웨어 버스보다 더 많이 필요하거나, 주변장치가 하드웨어가 생성할 수 없는 비표준 클럭 위상을 요구할 때 사용하십시오.

생성자

class machine.SoftSPI(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

소프트웨어 SPI 객체를 생성합니다. sck, mosi, miso는 반드시 제공해야 합니다 – 암시적 핀 선택은 없습니다. 다른 매개변수의 의미는 SPI.init()을 참조하십시오. 비트뱅 루프에 오버헤드가 더 많기 때문에 기본 baudrate는 하드웨어 SPI보다 낮습니다.

메서드

init(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SoftSPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

지정된 매개변수로 소프트웨어 SPI 버스를 다시 초기화합니다. 제공된 인수만 갱신되며, 나머지는 이전 값을 유지합니다. 각 인수의 의미는 SPI.init()을 참조하십시오.

deinit() None

비트뱅 드라이버가 점유한 GPIO 핀을 해제하고 버스 구동을 중지합니다.

read(nbytes: int, write: int = 0x00) bytes

단일 바이트 write를 계속 쓰면서 nbytes 바이트를 읽습니다. 수신된 데이터를 담은 bytes 객체를 반환합니다.

readinto(buf: bytearray, write: int = 0x00) None

단일 바이트 write를 계속 쓰면서 buf로 읽어 들입니다. None을 반환합니다.

write(buf: bytes) None

buf를 버스에 씁니다. 수신된 바이트는 폐기됩니다.

write_readinto(write_buf: bytes, read_buf: bytearray) None

write_buf를 쓰는 동시에 read_buf로 읽어 들입니다. 두 버퍼는 길이가 같아야 하며, 서로 별칭일 수 있습니다.

상수

MSB: int

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

LSB: int

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