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

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

ラズパイにSPI 接続でセンサーを接続してオシロで計測

次はオシロスコープでないとSPIの通信速度を最適化ができない事例です。

ラズパイで  SPI の機能を使用できるようにするには以下の設定が必要です。

起動前にSD カードのconfig.txtを編集します。これも公式ページに記述がございますが英語ですのでここで簡単に説明いたします。

config.txtに下記の1行の設定を追加してください

dtparam=spi=on

I2Cのときのように先頭に#が付いている場合は#を削除してください。

次にラズパイを起動し、下記のファイルにさらに2行の設定の追記が必要です。

ファイル

/etc/modules

追記する文字列

spidev
spi-bcm2835

次に下記のコマンドでラズパイを再起動します。

$ sudo reboot

再起動後にラズパイで spi が使用可能になっているか確認を行います。コマンドラインで下記のコマンドを入力してください

$ ls /dev/spidev0.*

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

/dev/spidev0.0   /dev/spidev0.1

が存在すればラズパイで SPIを使用するための設定は成功です。

それでは、またラズパイの電源を切り、SPI接続で MPU-9250 をつなげてみます(図4-1)。

ラズパイの40ピン端子の23番(SPI_CLK)を青色のジャンパー線で MPU-9250 の SCL/SCLK に接続します。同様にラズパイの40ピン端子の21番(SPI_MISO)を白色のジャンパー線で MPU-9250 の AD0/SDO に接続、ラズパイの40ピン端子の19番(SPI_M0SI)を黄色のジャンパー線で MPU-9250 の SDA/SDI に接続、ラズパイの40ピン端子の24番(SPI_CE0_N)を黄色のジャンパー線で MPU-9250 の ~CS に接続、ラズパイの40ピン端子の6番(Ground)を黒色のジャンパー線で MPU-9250 の GND に接続します。I2Cは合計3線でしたが、SPIは合計5線で接続します(図4-2、図4-3)。

image26_69ef522e8872a250832abec94446cd364bc45e2b.jpg

図4- 1ブレッドボードでMPU-9250を SPI 接続した全体写真

image27_5de0a00e52012336dac24d3f0e6c5fe769347611.jpg

図4- 2 ラズパイの40ピンヘッダーのSPI バス配線部(中央の青と白と黄色配線)

image28_e75c96f9a87751094bb81652ab471d718d5ecd7a.jpg

図4- 3 MPU-9250にSPI で配線した状態

まず、Linux の SPI 通信をテストするためのツールである spidev-test.c のソースを取ってきてビルドします。spidev-test.c のソースコードですが、kernel.org にホスティングされている本家の Linux カーネルにツールとして含まれており、Linux kernel の開発と共にどんどん更新されています。kernel の更新と共に本内容の記述が適応できなくなる可能性があるので kernel v4.14 に含まれるspidev-test.cを利用します。

下記のコマンドを順番に、ラズパイのシリアルコンソールのコマンドラインで実行してください。

$ wget https://raw.github.com/torvalds/linux/v4.14/tools/spi/spidev_test.c
$ gcc spidev_test.c -o spidev_test -Wall

次に下記のコマンドを実行します。

$ ls spidev_test

無事に spidev_test が出来上がっていたらビルドまで成功です。

それでは、spidev-test を使って MPU-9260 が動作しているかを確認するためにデバイス ID (WHO_AM_I)を読めるか試します。次のコマンドを実行してください。(図4-4)

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

上記コマンドのオプションですが -D /dev/spidev0.0 は CS0 を接続したデバイスの指定になります。ラズパイは CS ピンとして40ピンヘッダーに24番の CE0 と26番の CE1 があります。今回は24番の CE0に MPU-9250 の CS ピンを接続したので、SPI バスのチップ0を選択する/dev/spidev0.0 を指定します。将来、SPI デバイスをさらに追加する場合は 26番の CE1 を使い、オプションの指定を-D /dev/spidev0.1 にするとアクセスできます。

オプションの -v  は spidev_test で送信と受信データの表示を指示しています。-v が無いと受信データが画面に表示されなくて動作確認ができません。

オプションの-p '\x75\x00'は、ラズパイから MPU-9250 に 0x75番アドレスのレジスターを読みに行くデータを送信する指示をしています。MPU-9250のデータシートを読みますデバイスIDである 0x71 が受信できるはずです。

オプションの-s 500000は、SPIの通信速度(正確には SPI_CLK の周波数)をHz単位で指示します。最初は速度の遅い 500000 Hz (500 KHz) で試します。

image29_40839931d37b62f45fbff66787c92dbd98407bbf.jpg

図4- 4 spidev_test を実行した結果の画面

spidev_test を実行した結果の画面の結果を見ると、RX | 00 00 と表示されており、MPU-9250 のデバイスIDである 0x71 が見当たりません。正常に動いていない結果です。

動かない原因究明のためにSPI通信で必須の4線である CS, CLK, MOSI, MISO の波形を一つづつオシロスコープで確認していきます。

まず CS の信号が出ているかどうかを確認するため、チャンネル1で CS の波形を計測するためにMPU-9250 の CS ピンにプローブを接続します(図4-5)。

image30_287f8f6be6e99ec514b49c4d4533048c793cfd3e.jpg

図4- 5 MPU-9250 の CS ピンにプローブを接続した状態

そしてオシロスコープで波形の立下りでトリガーがかかる設定を行います。

再度先ほどの spedev_test コマンドを実行して結果を見ます(図4-6)。

image31_60566041bd5270bff8f540cb49d593d122c0cf17.jpg

図4- 6 MPU-9250 の CS ピンの波形画面

すると、CS 信号は spidev_test の実行で HIGH から LOW に一定期間移行しているのがわかったので、CS信号は正常に出力されているのが確認できました。他のSPI信号に疑いが出てきました。

次に、チャンネル1に CLK を、チャンネル2に MOSI を、外部チャンネルに CS を接続して、MISO で spedev_test で指定した  0x71 が出力されているか調べてみます(図4-7、図4-8)。

私は MOSI とMISO ピンのどちらが送信信号でどちらが受信信号を出しているのか忘れてしまいがちですが、 MOSI は Master Out Slave In の略であり(マスターからスレーブへの信号)、マスターはラズパイでスレーブは MPU-9250 であるなので、MOSI は送信信号ピンだと覚えるようにしています。

image32_2e9586d16a8bfd677e09e6b83dc0e8695543ce90.jpg

図4- 7 MPU-9250 の CS ピンとCLKピンとMISOピンにプローブを接続した状態

image33_c39d2721477a719ce89c9ffb31df836d2271f2d0.jpg

図4- 8 CS ピンとCLKピンとMOSIピンにプローブを接続した状態のオシロスコープ

ここでオシロスコープの取扱説明書を読み、SPI 信号のシリアルデコードとトリガーの設定を行います。この時、チャンネル1でCLKを、チャンネル2で MOSI と MISO を、外部トリガーを CS にします。

そして、spidev_test を実行したときの波形のキャプチャーします(図4-9)。

IMG_7324_0000-s_9d0c725db94209fb5836e6c2be72cbb2449843c2.jpg

図4- 9  CS ピンとCLKピンとMOSIピンをキャプチャーした画面

オシロスコープの画面を見ると CS 信号は LOW になり、その間に CLK 信号が矩形波で出力され、それに合わせて MOSI/MISO の信号が出ています。典型的な SPI 通信の信号です。従って、ラズパイからは /dev/spidev0.0 にアクセスが無事に行われていることがわかります。

しかし、期待していた MPU-9250 からの受信(読み出し)のデバイスIDである 0x71 ではなく 0x75 が画面に表示されています。可能性として考えられるのは spidev_test でのオプションの -p '\x75\x00' で送信されている 0x75 が表示されているのが疑われます。本来ならば受信データがオシロスコープに表示されるのを期待したのですが、送信データが映っていることがわかりました。

この表示でMOSI, MISO を私が逆に接続してしまったことが判明しました。長くなってしまったので、次回に続きます。

記事一覧:

* 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