United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

ラズパイにセンサー追加をオシロでデバッグしよう(その5)SPI編2とまとめ

前回の記事では、オシロスコープによる観察の結果、MOSI, MISOを逆に接続していたことが判明しました。そこで、ラズパイからの黄色のジャンパー線のMOSI と白色のジャンパー線の MISO のMPU-9250 への接続をやり直します(図4-10)。

UART と SPI のように送信と受信が2本線で別々に行われるプロトコルでは、私はよく接続を逆にするミスをしてしまいます。

image35_191b80f2d27757a605c6f76696079c5288276453.jpg

図4- 10 MPU-9250 の白色のジャンパー線と黄色のジャンパー線を入れ替えた状態

そして再度オシロスコープで SPI 信号をキャプチャーしてみます(図4-11)。

しかし今度は受信信号に何も出ておらずデバイスIDがきちんと読めていません。

image36_6d5cec538fcdf3a70f73a7e2ac16fc7a67cb818b.jpg

図4- 11 MISO とMOSIピンを修正してキャプチャーした画面

読みだそうとするレジスターアドレスが間違えているのかもしれないと思い、MPU-9260のデータシートを読み直してみると、SPI の読み出しのときはレジスターのデータシートのアドレスに 0x80 を足す必要があるという記述を見つけました。

従って、次のコマンドでレジスターのアドレスを 0x75 から 0xF5 (0x75 + 0x80)に修正して spidev_test を下記のように実行してみました(図4-12)。

$ ./spidev_test -D /dev/spidev0.0 -v -p '\xf5\x00' -s 500000

次のような結果が表示されました。

spi mode: 0x0
bits per word: 8 max speed: 500000 Hz (500 KHz) 
TX | F5 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ . 
RX | 00 71 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ q

ここでようやくデバイスIDの 0x71 が読めました。初めてラズパイと MPU-9250 の間の SPI通信が成功したのが確認できました。

image37_67aeaa2ae0235b9bee7588fe98d724a63316d959.jpg

図4- 12 アドレスを直して spidev_test を実行した画面

MPU-9250 のように、時々 I2C でレジスターのアドレスと SPI でのレジスターのアドレスが違うデバイスに出くわすことがあります。それにもかかわらずデータシートの表示は I2C でレジスターのアドレスで記述されていることが多く、私がハマりやすいパターンです。

ここまでで SPI プロトコルで MPU-9250 が正常にアクセスできたことが確認できました。

ところで、SPI はI2C よりアクセスが速いのがメリットです。次に spidev_test ツールで今までの 500K Hz から、Linux で SPI プロトコルの最大値として使われる 50M Hz の間でどこまで CLK 周波数を早くできるのか試してみようと思います。

この手順は spdev_test のオプションの -s 500000 (500KHz) の値を変更して試行錯誤してみることになります。この時に、ラズパイでのコマンドでの確認とオシロスコープの波形の確認をそれぞれ行います。

(1)CLK 周波数を上げたときにラズパイの ほうでspidev_test コマンドで正常なデータを受信ができるかどうか確認します。

(2)CLK 周波数を上げたときにオシロスコープで SPI 通信時の波形の形が矩形波から大きく崩れているかどうか確認します。

両方確認することでトラブルが起きにくい最大CLK 周波数の目安がわかります。

それでは、500K Hzと 5M Hz で試してみましょう。

先ほどまでと同じ500K Hzの時のコマンドです。この時のオシロスコープの画面を覚えておきます(図4-13)。

$ ./spidev_test -D /dev/spidev0.0 -v -p '\xf5\x00' -s 500000
image39_244b25876911f372b0e5abc8a16026c59ec78e38.jpg

図4- 13 500K Hz の時の波形

次に5M Hzを試してみます(図4-14)。

$ ./spidev_test -D /dev/spidev0.0 -v -p '\xf5\x00' -s 5000000

(-s 50000から、-s 5000000 と 0を増やしました)

次のような結果が表示されました。

spi mode: 0x0
bits per word: 8
max speed: 5000000 Hz (5000 KHz) 
TX | F5 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ .
RX | 00 38 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ q

デバイスIDが 0x71 であるはずですが、0x38 といきなりデータが化けています。

5M_0000-s_b75411d33ebd7f72942ce3036dfe39d5c8dec2e0.jpg

図4- 14  5M Hz の時の spidev_test の結果

5M Hzのときのオシロスコープで見た波形も矩形波が三角波に近くなっていました(図4-15)。

final_22ecdda816078382589504f334f74e5438ed3fd7.jpg

図4- 15  5M Hz の時の波形

それでは CLK 周波数を 2M Hz に落としてみます。その時のオシロスコープ(図4-16)とラズパイでの実行画面(図4-17)です。

image391_244b25876911f372b0e5abc8a16026c59ec78e38.jpg

図4- 16 2M Hz の時の波形

image40_404ba91c4cd07fb1926324b66be1004629ec22d1.jpg

図4- 17  2M Hz の時の spidev_test の結果

ラズパイの読み出しではデータ化けが起きていないので、オシロスコープのズーム機能を使い矩形波を拡大してみます(図4-18)。

image41_ee41460f0ee468aff1c3402108cc2bc52772c253.jpg

図4- 18  2M Hz の時のズーム画面

ズーム画面でも矩形波の立ち上がりと立下りが少し直線から曲線に変化していますが、経験的にプロトコル通信としてはトラブルが出なさそうな波形です。

ここまでの作業で、今回は最大周波数は 2M Hz でプログラミングするのが無難そうです。

もちろん、今回はブレッドボードでの空中配線ですので配線の仕方の影響が出ていると思われます。フレキシブルケーブルでの接続や PCB 基板で直接ラズパイの40ピンヘッダーに接続の場合はもっと最大周波数を上げることができると思われます。

このように波形の形を見ながらの SPI 通信速度の調整は、ロジックアナライザーではできずオシロスコープが活躍します。

最後に

まだ個人でオシロスコープを購入される方は多くないと思います。

私もオシロスコープを購入しようとした時に各社から発売されているオシロスコープの機種が多くて選択に迷いました。上級機種は個人では購入が無理な金額になります。かといって安価な値段の機種を購入してよいものかと悩みました。

知り合いなどからアナログオシロを譲り受けることができたり、5,000円ぐらいで中古品が入手が可能でしたら、それも良い選択だと思います。ただ個人の家庭ですと作業スペースに限りがあることが多いと思います。アナログオシロは構造上奥行きが深くスペースをかなり取ってしまいます。デジタルオシロスコープならコンパクトなサイズのモデルがあります。

初めてデジタルオシロスコープを購入しようと思っても、複数の会社から発売されている複数のモデルの中から、どのオシロスコープが自分のニーズに合うのかの判断は難しいと思います。

そこで私個人の判断材料を列挙したいと思います。

個人や趣味でのエンジニアリングでは金額は高くても20万円以内、可能であれば10万円以下でないと厳しいことが多いと思います。予算内で気を付けるスペックですが、計測できる周波数帯域は最低でも 50MHz、 可能であれば 100MHz が妥当な範囲だと思います。サンプリング周波数は1G Sample/s か 2G Sample/s が目安になると思います。この価格帯ですとアナログ2チャンネルが多いと思います。また画面の波形を見て判断することになりますので液晶画面は 800x480 ぐらいあると楽です。そしてカタログには載っていないことがありますが、画面の波形更新速度が速いほどアナログオシロスコープに近くなり波形のキャプチャーの取りこぼしが少なくなります。

そして、ある程度評判が確立しているメジャーブランドを選ぶことをお勧めします。開発をしているときに正しく動かない時は基盤やデバイスや道具などを疑いたくなります。大半は自分のプログラムや配線ミスが原因であるにも関わらずです。そこでトラブルや実際の動作の確認にオシロスコープを使います。その結果、道具であるオシロスコープが自分の間違いやバグが原因であると断定してくれる必要があります。この時にオシロスコープを信頼できないと問題解決に時間がかかってしまう結果につながりやすいです。

今回の例の用に I2C と SPI で問題を発見するにはシリアルデコード機能があると非常に効率的になります。今回キーサイト社からお借りしたDSOX 1102G は2ch オシロスコープであるにもかかわらず外部チャンネルも使い合計3チャンネルで SPI プロトコルのデコードが可能でした。

本件ではラズパイに UART, I2C や SPI で電子工作するときのオシロスコープを使ったデバッグ方法を紹介しました。Arduino やラズパイなどの出現で個人でも I2C や SPI を使った電子工作が以前より容易になりました。ラズパイで I2C を活用する例を紹介する情報は多くありますが、SPI デバイスの使い方の情報はまだ少ないのが実情です。

これを機会にラズパイで SPI デバイスを使う方が増えると幸いです。

終わり。

記事一覧:

* Summary - Project Leadership and developer under multi-cultural circumstance and cooperation with external team and/or open source communities. * Technical profile Developing flight controller. https://github.com/DCoJA/yatagarasu-red Library to enable GPIO, I2C and SPI on Linux Boards. http://www.96boards.org/blog/programing-i2c-devices-libmra Youtube channel https://www.youtube.com/channel/UCnda3kAWPcxMnDBoaSM6uXQ