2017年6月4日日曜日

【raspberry pi】 SPIの波形はどうなってるの?(1)

ラズパイのSPIを動かそうとしています.

SPIライブラリはいろいろとあるので順次試用したく思いますが、ソフトウエアのサイトを読んでも、肝心のSPI端子の波形がどうなっているのかはちっとも判りません.ひら的には、SPI端子の先に繋がる回路を設計したいわけですので、SPI端子波形を知らないと困ってしまうという状況なわけです.

raspberry piのメインLSIのデータシートにはこのような図が掲載されています.
このタイミングチャートからは、沢山の情報を読み取れます.
・最初に8bit送信、後で8bit受信である  (MSB first)
・1バイトの送受信毎にCEが動くみたいだ   (違うかもだが)
・送信データはneg-edgeでFFを駆動する.受信データはpos-edgeでラッチする

だけど、、、本当かなぁ?
SPIバスを有効活用するためには、送受信を同時にやればいいじゃん.上図のような、送受信をわざわざ時間ずらしなんかするかね? 疑問を感ずる.
SPIバスには様々なタイミング仕様があるのだと思います.だとすると、ラズパイのSPIはどういう仕様で動いてるんだろう?

実際にオシロでモニタしてみました.


-----
いくつかあるSPIのデバドラのうち、raspberry piサイトにあるSPI loopback Cプログラムを動かしてみました.

まずラズパイの回路は、右図のSPI_MOSIとSPI_MISOをショートしてloopbackとします.loopbackという文字が目に入った時点で上のtiming chartはウソだろって想像がついちゃいます.
オシロで観測するのは、SPI_CE0/SPI_MOSI/SPI_SCLKの3箇所です.

次にプログラムは、上のリンクページの一番下の方にあります.ラズパイのターミナルから、そこに書いてある通りに操作します.

ソースをdownloadします.
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c

コンパイル
gcc -o spidev_test spidev_test.c

実行ファイルを起動し、SPIを動かします.
./spidev_test -D /dev/spidev0.0

すると、次の結果が表示されます.16進数が38バイト表示されます.これが、SPIバスを通じてloopbackした結果です.
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

ちなみに、ラズパイコネクタのMISOとMOSIのloopback接続をせずに動かすと、全部00になってしまいます.

蛇足ながら、spidev_test のoptionで、16bit転送や24bit転送や32bit転送を試みましたが、8bit以外はエラーで断られました


↓それで、38バイトのloopbackをさせたときのSPIバスの実測波形を示します.
SCLKの赤い四角で囲った範囲には8発のclockを含んでいますから、1バイト分です.この波形写真には先頭15バイト分のデータが表示されています.
MOSIを1バイトづつに区切ると、FF,FF,FF,FF,FF,FF,40,00,00....というシーケンスが見えます.
このオシロ波形は、次のことを示しています.
・沢山のバイトデータを一気読みする最中に、CEはパタパタしない
・送信データと受信データは同時である   (あぁやっぱり)


------
raspberry piサイトには他にもSPIをドライブする手段が案内されていますので、後日それらも試みたいと思います.

その中にshellでSPIへ出力できる手段が記載されています.
echo -ne "\x81\x00\xff" > /dev/spidev0.0
簡単なので早速試してみました.
spidev_testで得たのと同じ結果でした.




↓なんだ、これとは全然違うじゃんということが判りました.


かしこ

0 件のコメント:

コメントを投稿