クラス SPI -- コントローラ駆動のシリアルプロトコル¶
SPI はコントローラにより駆動するシリアルプロトコルです。物理レベルでは3つのライン、SCK, MOSI, MISO があります。
I2C の利用モデルを参照してください。SPI も非常に似ています。主な違いは、SPI バスを初期化するためのパラメータです:
from pyb import SPI
spi = SPI(1, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)
必要なパラメータはモードのみで、SPI.CONTROLLER または SPI.PERIPHERAL を指定します。polarity は 0 または 1 で、アイドル状態のクロックラインのレベルを表します。phaseは 0 または 1 で、データを最初のクロックエッジまたは2つ目のクロックエッジでサンプリングするかを表します。crc に None を指定した場合は CRC を使わないこととなり、値を指定した場合は CRC の多項式指定になります。
SPIの追加のメソッド:
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/recv 4 bytes from/to buf
コンストラクタ¶
- class pyb.SPI(bus, ...)¶
指定バスの SPI オブジェクトを作成します。
bus
は 1 または 2、または 'X' または 'Y' で指定できます。追加のパラメータがない場合、SPI オブジェクトは作成されますが、初期化は行われません(前回のバスの初期化設定があれば適用されます)。追加の引数が与えられた場合、バスが初期化されます。初期化のパラメータについてはinit
を参照してください。SPIバスの物理ピンは次のとおりです:
SPI(1)
は X 位置となります:(NSS, SCK, MISO, MOSI) = (X5, X6, X7, X8) = (PA4, PA5, PA6, PA7)
SPI(2)
は Y 位置となります:(NSS, SCK, MISO, MOSI) = (Y5, Y6, Y7, Y8) = (PB12, PB13, PB14, PB15)
現時点で、SPI ドライバーでは NSS ピンは使われておらず、他の目的で自由に使えます。
メソッド¶
- SPI.deinit()¶
SPI バスをオフにします。
- SPI.init(mode, baudrate=328125, *, prescaler=-1, polarity=1, phase=0, bits=8, firstbit=SPI.MSB, ti=False, crc=None)¶
与えたパラメータで SPI バスを初期化します。
mode
はSPI.CONTROLLER
またはSPI.PERIPHERAL
のいずれかである必要があります。baudrate
は SCK クロックレートです(コントローラの場合のみ有効)。prescaler
は APB バス周波数から SCK を導出するために使用するプリスケーラです。prescaler
の指定はbaudrate
指定をオーバーライドします。polarity
は 0 か 1 であり、アイドリング状態のときのクロックのレベルを指定します。phase
は 0 か 1 であり、それぞれ、1番目または2番目のクロックエッジでのデータ読取りを指定します。bits
は 8 または 16 で、各転送ワードのビット数を指定します。firstbit
は SPI.MSB か SPI.LSB です。ti
が Trueの場合、Texas Instruments の信号規約を示します。そうでない場合は、モトローラの信号規約を示します。crc に None を指定した場合は CRC を使わないこととなり、値を指定した場合は CRC の多項式指定になります。
SPI クロック周波数は常に要求したボーレートになるとは限りません。ハードウェアは、APBバス周波数(
pyb.freq()
を参照)をプリスケーラで除算した値のボーレートのみをサポートします。プリスケーラは 2, 4, 8, 16, 32, 64, 128, 256 でなければなりません。SPI(1) は AHB2 にあり、SPI(2)は AHB1 にあります。SPI クロック周波数を正確に制御するにはbaudrate
の代わりにprescaler
を指定してください。SPI オブジェクトをプリントすると、計算されたボーレートと選択したプリスケーラが表示されます。
- SPI.recv(recv, *, timeout=5000)¶
バス上のデータを受信します:
recv
には整数または可変バッファを指定します。整数の場合は受信するバイト数の指定になります。可変バッファの場合、そのバッファが受信したバイトで埋められますtimeout
は受信を待機するタイムアウト時間をミリ秒単位で指定します。
戻り値: パラメータ
recv
が整数であれば、受信したバイト数を格納した新しいバッファを返します。さもなければrecv
に渡したのと同じバッファを返します。
- SPI.send(send, *, timeout=5000)¶
バスにデータを送信します:
send
は送信するデータです(送信する整数か、バッファオブジェクト)。timeout
は送信を待機するタイムアウト時間をミリ秒単位で指定します。
Return value:
None
.
- SPI.send_recv(send, recv=None, *, timeout=5000)¶
バス上で同時にデータを送受信します:
send
は送信するデータです(送信する整数か、バッファオブジェクト)。recv
は受信したバイトで埋められる可変バッファです。recv
はsend
と同じものを使えますし、省略することもできます。省略した場合、新しいバッファが作成されます。timeout
は受信を待機するタイムアウト時間をミリ秒単位で指定します。
戻り値: 受信したバイトで埋められたバッファ。
定数¶
- SPI.CONTROLLER¶
- SPI.PERIPHERAL¶
SPI バスをコントローラモードまたはペリフェラルモードに初期化するために使います
- SPI.LSB¶
- SPI.MSB¶
先頭ビットを最下位ビット(LSB)または最上位ビット(MSB)に設定します。