デイジーチェーンで繋いでいたモータードライバー(L6470)にデータを送るときに、
wiringpiを用いたときの書き方がわからずにハマってました。
RPi.GPIOでCSのpinをLOW → データ送信 → CSのpinをHIGH の方法もありますが、
WiringPiを使うパターンだと記述量が少なくて済む。
結論:シフトする数に合わせてstruct.pack()の引数を整える
import wiringpi as wp
import struct
SPI_CH = 0
SPI_HZ = 100000
# SPI データ送信
def send(SPI_CH, byte_ary_1, byte_ary_2):
# バイト配列には[0x10, 0xc0, 0x15], [0x10, 0x00, 0x21]などが来るものと仮定します
# バイト配列の中の個数が違うときは事前に0x00で埋めて配列数を最大数に合わせています
byte_len = len(byte_ary_1)
for i in range(byte_len):
# デイジーチェーンの時は各モーターへの値を1バイトずつのパックにするのがミソ
#(ドライバによるかも)
# なお、データは押し出される形でシフトするので、データの順番に注意
mosi = struct.pack("BB", byte_ary_2[i], byte_ary_1[i]) # ←ここで各バイトをパックする
# 1台なら mosi=struct.pack("B", ary)
# 2台なら mosi=struct.pack("BB", ary1, ary2)
wp.wiringPiSPIDataRW(SPI_CH, mosi)
if __name__ == "__main__":
wp.wiringPiSPISetup(SPI_CH,SPI_HZ)
send(SPI_CH, [<任意のバイト配列>], [<任意のバイト配列>] )
やり方が分かればこれだけのことだったんですけどね。
あとはバイト配列の中身の数が異なるときや、データ取得するときなどは送信するバイト配列数にも気をつけましょう。