*

QtでRaspberryPi/GUI開発(9)-SPI通信をしてみた

公開日: : 最終更新日:2019/01/30 C言語, pigpio, RaspberryPi, 開発

どもです。
えー。
「Qtで…」とか書いておきながら、今回はQtは出てきません。

今回のエントリでは、RaspberryPi3とpigpio(ライブラリ)を使用してSPI通信をしてみました。
SPI通信に触るのが久しぶり、pigpioを使ってのSPI通信については初めてになります。
また、調べた範囲ではpigpioを使用したRaspberryPi3のSPI通信についての情報は、あまり見つかりません。
なので、同じように困ってる(?)方の助けになればと思い、エントリを書いてみます。

最初は「ループバック」から挑戦です。

1.SPI通信って?
はい。
そもそも、という話です。
「Serial Peripheral Interface」の略称で、同期式シリアル通信の1つです。
細かい説明は、ネットや書籍の情報に任せることにして、ここでは詳細な説明はしません。
今回のエントリでは、「同期式の通信方法」くらいに覚えておけばよいかと考えます。

2.RaspberryPi3でのピン配置は?
SPI通信で使用するピンについて、RaspberryPi3では下記のように配置されています。

  • SCLK → 23番(GPIO-11)
  • MOSI → 21番(GPIO-9)
  • MISO → 19番(GPIO-10)
  • CE0 → 24番(GPIO-8)
  • CE1 → 26番(GPIO-7)

各ピンの配置についてSCLK、MOSI、およびMISOについては、「ALT0」モードでの動作になります。

なお、これらのピン配置については、RaspberryPi3のコマンドライン上で

と入力することで、確認できます。
分かりやすい表が、コマンドライン上に表示されます。

3.pigpioの設定
前の段で、RaspberryPi3のピン配置が分かりました。
次は、pigpioを用いてピンの設定をする必要があります。
と思ったら、pigpioでは「spiOpen()」を実行することで、必要なピン設定は行われるようです。
ただし、この関数では別の設定が必要なようです。
即ち、「通信速度」と「モード」です。

「通信速度」については[bits per second]単位の値を、「モード」については極性とかフェーズとかによって、「0」から「3」まで選択されます。
このモードの設定に従って、信号の出力と読込みのタイミングが変化します。
この「モード」とデータの振る舞いについてはココの内容が詳しくて、分かりやすいかと思います。

少し具体的にすると、以下の手順で設定します。
①:gpioInitialise() – ライブラリを初期化する。
②:spiOpen() – SPI通信の設定を行いつつ、通信ハンドラを取得する。

なお、終了時は
①:spiClose() – SPI通信の設定を解除する。
②:gpioTerminate() – ライブラリを終了する。

の順番で関数を呼び出す必要があります。

4.pigpioでの送受信
pigpioを使用して実際にデータの送受信を行う場合、を使用します。
この関数では、指定されたバッファの規定されたサイズ(バイト)のデータを送信し、また受信したデータを指定されたバッファに格納します。
即ち、データの送受信を一気に実施してくれます。
pigpioには、送信/受信それぞれのためにspiReadspiWriteが用意されています。
spiXferという関数も用意されています。
この関数は、データの送受信を1つの関数の中で実施してくれます。
今回は、この「spiXfer」を使用します。

5.実装してみた
今回のループバックの実験では、下記のコードを実装しています。

このコードは、下記のようにビルドします。

H/W的には、19番(GPIO-10)と21番(GPIO-9)のピンを短絡しておいて下さい。

ピンを短絡した状態でビルドしたファイルを実行すると、送信したデータをそのまま受信する、という動作になります。

今回のエントリでは、ループバックテストになりますが、RaspberryPi3でのSPI通信の手順および方法について記載しました。
次回は、SPI通信で実際に他のデバイス/センサーなんかと通信をしてみようと思います。

またQtを使わない…可能性が大いにあります。

ではっ!

参考にしたサイト

・pigpio – http://abyz.me.uk/rpi/pigpio/index.html
・ArduinoでSPI通信を行う方法 – http://stupiddog.jp/note/archives/976

2019/01/30 更新
文言を色々修正しました。

関連記事

no image

C言語でEV3開発(8)-opOUTPUT_POWERコマンド

どもです。 今回のエントリーでは、EV3でモーターを動かします。 なお、今回のエントリーでも

記事を読む

source_trail_eye_catch

Sourcetrailを試してみました

どもです。 つい最近、ソースコードの解析に役に立ちそうなツールを見つけたので、ここで少し紹介をしま

記事を読む

python

Ev3開発サポートツール(4)-Pythonによるグラフ表示

どもです。 前回のエントリーで、VisualStudioCommunityでのPythonの開発環

記事を読む

Arduino_DHT11

温度(湿度)センサを使ってみた(1)-ArduinoでDHT11

どもです。 今回は、久しぶりにセンサーを購入して使ってみたので、それについて記載します。 1.使

記事を読む

MY_MFC_LOGO

MFCプログラミング(1):CFileまたはCStdioFileクラスを使用してファイル出力

どもです。 突然ですが、仕事でMFCを使用することになりました。 MFCはこれまで触ったことがな

記事を読む

no image

C言語でEV3開発(11)-opOUTPUT_STEP_POWERコマンド

どもです。 今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。 コマンド

記事を読む

toppers

C言語でEV3開発(19)-コマンド通信処理でEchoBackしてみた

どもです。 前回は、Bluetoothの接続状態の変化に伴う、状態遷移について書きました。 今回

記事を読む

raspberry-pi

ライブラリでRasPiのピンにアクセス(3)-割り込み対応

どもです。 少し間が空いてしまいましたが、RaspberryPiのピンをより簡便に使用するため

記事を読む

think_about_utest

単体テストの効率化を考える(6)-スタブの自動生成ツール

どもです。 「単体テストの効率化について考える」の6回目です。 1回目から5回目まではコチラ

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その2)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱりQtは出てきません。

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

think_about_utest
VisualStudioで実行した単体テストの結果の出力(3)-テスト実行からレポート生成までをツールで自動化

どもです。 前々回、前回と、VisualStudio/C#での単

think_about_utest
VisualStudioで実行した単体テストの結果の出力(2)-出力ファイルの読める化

どもです。 前回の続きです。 前回は、VisualStud

think_about_utest
VisualStudioで実行した単体テストの結果の出力(1)-ファイルへの出力

どもです。 最近、VisualStudio/C#でよく開発してい

think_about_utest
単体テストの効率化を考える(6)-スタブの自動生成ツール

どもです。 「単体テストの効率化について考える」の6回目です。

think_about_utest
単体テストの効率化を考える(5)-スタブの自動生成への入力

どもです。 「単体テストの効率化について考える」の5回目です。

→もっと見る

PAGE TOP ↑