クラス 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 では書き込んだバイト数を返します。