class SPI -- Serial Peripheral Interface バスプロトコル(コントローラ側)

SPI はコントローラによって駆動される同期式シリアルプロトコルです。物理レベルでは、バスは 3 本の信号線で構成されます: SCK、MOSI、MISO。複数のデバイスが同じバスを共有できます。各デバイスには、バス上の特定のデバイスを選択して通信するために、別途 4 本目の信号 CS(Chip Select)が必要です。CS 信号の管理はユーザーコード内(machine.Pin クラスを介して)で行う必要があります。

ハードウェア SPI とソフトウェア SPI の両方の実装が SPI クラスと SoftSPI クラスを介して存在します。ハードウェア 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 で、それぞれ最初または 2 番目のクロックエッジでデータをサンプリングします。

  • bits は各転送のビット幅です。すべてのハードウェアでサポートが保証されているのは 8 のみです。

  • firstbitSPI.MSB または SPI.LSB を指定できます。

  • sckmosimiso はバス信号に使用するピン(machine.Pin)オブジェクトです。ほとんどのハードウェア SPI ブロック(コンストラクタの id パラメータで選択)では、ピンは固定されており変更できません。一部のケースでは、ハードウェアブロックがハードウェア SPI ブロックに対して 2〜3 通りの代替ピンセットを許可します。任意のピン割り当てが可能なのはビットバンギング SPI ドライバ(id = -1)のみです。

ハードウェア SPI の場合、実際のクロック周波数は要求した baudrate より低くなる可能性があります。これはプラットフォームのハードウェアに依存します。実際のレートは SPI オブジェクトを print することで確認できます。

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 オブジェクトを構築します。sckmosimiso は必ず指定する必要があります。暗黙的なピン選択はありません。その他のパラメータの意味については 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 に渡します。