クラス SPI -- シリアルペリフェラルインタフェース バスプロトコル(コントローラ側)

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

ハードウェア SPI の実装は machine.SPI クラス、ソフトウェア SPI の 実装は machine.SoftSPI クラスにより利用できます。ハードウェア SPI は、システムの基盤ハードウェアサポートを使って読み書きします。たいていは効率的で高速ですが、利用できるピンに制限のある場合があります。ソフトウェア SPI はビットバンギングによって実装されており、どのピンでも利用できますが、効率的ではありません。両クラスとも利用可能なメソッドは同じで、構築方法が異なるのが大きな違いです。

使用例:

from machine import SPI, Pin

spi = SPI(0, baudrate=400000)           # 周波数 400kHz で SPI ペリフェラル 0 を作成
                                        # ユースケースによっては、追加のパラメータが必要な場合があります。使用するバスの
                                        # 特性やピンを選択するための追加のパラメータが必要になる場合があります。
cs = Pin(4, mode=Pin.OUT, value=1)      # ピン 4 でチップセレクトを作成。

try:
    cs(0)                               # ペリフェラルを選択。
    spi.write(b"12345678")            # 8 バイトを書き出し、受信データについては無視。
finally:
    cs(1)                               # ペリフェラルを選択解除。

try:
    cs(0)                               # ペリフェラルを選択。
    rxdata = spi.read(8, 0x42)          # 0x42 をバイトごとに書き出しながら、合計 8 バイトを読み込む。
finally:
    cs(1)                               # ペリフェラルを選択解除。

rxdata = bytearray(8)
try:
    cs(0)                               # ペリフェラルを選択。
    spi.readinto(rxdata, 0x42)          # 0x42 をバイトごとに書き出しながら、合計 8 バイトを指定場所に読み込む。
finally:
    cs(1)                               # ペリフェラルを選択解除。

txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
    cs(0)                               # ペリフェラルを選択。
    spi.write_readinto(txdata, rxdata)  # バイト列の書出しと読込みを同時に行う。
finally:
    cs(1)                               # ペリフェラルを選択解除。

コンストラクタ

class machine.SPI(id, ...)

id で指定したバスで SPI オブジェクトを構築します。 id に指定できる値はポートとそのハードウェアに依存します。値 0, 1 などは一般的に、ハードウェア SPI ブロック #0, #1 などを選択するために使われます。

追加のパラメータを指定しないと、SPI オブジェクトは作成されますが初期化されません(そのような場合、バスが過去に初期化されたことがあれば、その定が引き継がれます)。追加のパラメータが与えられると、バスは初期化されます。追加のパラメータについては init を参照してください。

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

ソフトウェア SPI オブジェクトを新規に構築します。追加のパラメータを指定する必要があり、たいていは少なくとも sck, mosi, miso を指定します。パラメータの説明は SPI.init を参照してください。

メソッド

SPI.init(baudrate=1000000, *, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=None, mosi=None, miso=None, pins=(SCK, MOSI, MISO))

与えたパラメータで SPI バスを初期化します。

  • baudrate は SCK のクロックレートです。
  • polarity は 0 か 1 であり、アイドリング状態のときのクロックのレベルを指定します。
  • phase は 0 か 1 であり、それぞれ、1番目または2番目のクロックエッジでのデータ読取りを指定します。
  • bits は各転送のビット幅です。すべてのハードウェアでサポートされることが保証されているのは 8 だけです。
  • firstbit は SPI.MSB か SPI.LSB です。
  • sck, mosi, miso はバス信号に使用するピン(machine.Pin)オブジェクトです。ほとんどのハードウェア SPI ブロック(コンストラクタのパラメータ id で指定)では、ピンが固定されていて変更できません。場合によっては、ハードウェアブロックが、1つのハードウェアSPIブロックに対して2~3の代替ピンセットを許しています。任意のピン割り当ては、ビットバンギング SPI ドライバー(id = -1)に対してのみ可能です。
  • pins - WiPy ポートには sck, mosi, miso 引数がありません。その代わり pins パラメータでタプルとしてそれらを指定できます。

ハードウェア SPI の場合、実際のクロック周波数は要求されたボーレートより低いかもしれません。これはプラットフォームのハードウェアに依存します。実際のレートは SPI オブジェクトを print 関数で表示することにより判ります。

SPI.deinit()

SPI バスをオフにします。

SPI.read(nbytes, write=0x00)

write で指定した1バイトを連続で書き込みながら、 nbytes で指定したバイト数を読み込みます。読み込んだデータを持つ bytes 型オブジェクトを返します。

SPI.readinto(buf, write=0x00)

write で指定した1バイトを連続で書き込みながら、 buf に指定したバッファに読み込みます。 None を返します

注記: WiPy では読み込んだバイト数を返します。

SPI.write(buf)

buf に含まれる bytes 型オブジェクトを書き込みます。 None を返します。

注記: WiPy では書き込んだバイト数を返します。

SPI.write_readinto(write_buf, read_buf)

read_buf に読込みながら write_buf の bytes 型オブジェクトを書き込みます。両バッファは同じでも異なっていてもかまいませんが、同じ長さでなければなりません。 None を返します。

注記: WiPy では書き込んだバイト数を返します。

定数

SPI.CONTROLLER

SPI バスをコントローラに初期化するためのものです。これは WiPy のみで使います。

SPI.MSB
SoftSPI.MSB

最初のビットを最上位ビットに設定します

SPI.LSB
SoftSPI.LSB

最初のビットを最下位ビットに設定します