*

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

Objective-CからC++コードを呼び出す

どもどもです。 今回は、突然ながらMacに関係する投稿です。 ソフト関係のことを勉強していて

記事を読む

raspberry-pi

ライブラリでRasPiのピンにアクセス(1)-ライブラリを作ります

どもです。 これまでこのブログでは、RaspberryPiのGPIOとかSPIを使用したアプリ

記事を読む

toppers

C言語でEV3開発(28)-EV3の移動距離を計算できるようにしてみた

どもです。 今回は、Ev3の移動距離の算出についてです。 1.算出方法について 移動距離は

記事を読む

iot_at_home_eye_catch

IoT開発(11)
ESP-WROOM-02を長時間駆動させた

どもです。この記事は、下記の記事の続き、「測定可能な期間」の結果発表です。IoT開発(5) ESP-

記事を読む

iot_at_home_eye_catch

IoT開発(14)
ESP-WROOM-02の稼働時間を延ばす工夫をしてみる

どもです。この記事は、以下の続きです。 IoT開発(4)-ESP-WROOM-02を電池で駆動

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

think_about_utest

middle_unit
最小…よりも(ほんの)少し大きいテストフレームワーク

どもです。 今回は、単体テストのフレームワークについて書きます。 1.最小のフレームワーク

記事を読む

no image

C言語でEV3開発(15)-TOPPERS/HRP2 EV3 で PID制御

どもです。 今回のエントリーは、コレまでのエントリーから内容を変えて、モーターの動作の制御をします

記事を読む

Qt_logo_2016

QtでRaspberryPi/GUI開発(2):ためしに時計を作ってみた(其の弐)

どもです。 前回のエントリーでは、ラジオボタンのグループ化と、選択されたボタンの特定方法まで記載し

記事を読む

toppers

C言語でEV3開発(23)-モーターの性能確認

どもです。 今回は、EV3に付属しているモーター(Lモーター/Mモーター)の性能について調べてみた

記事を読む

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="">

c_sharp_eye_catch
セルに「取り消し線」が設定されているかを判定してみた

どもです。 前回、前々回と、エクセルのセル内の文字列から、「取り

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」の削除を簡単にしてみた

どもです。 前回、C#/OpenXmlを用いて、エクセルのセル内

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」を削除してみた

どもです。 今回は、C#/OpenXmlの組み合わせで、エクセル

c_sharp_eye_catch
C#でバッファの内容を表示する処理を実装してみた-
データ型に従って動的に書式を設定する

どもです。 最近、C#でバッファ/配列の値をコンソールに表示した

arduino_relay_switch_003_self_preservation_circuit_eye_catch
Arduinoでリレースイッチ(3)-自己保存回路

どもです。 前回の記事で、リレースイッチ「AE-G5V-DRV」

→もっと見る

PAGE TOP ↑