*

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開発(10)-opOUTPUT_CLEAR_COUNTコマンド

どもです。 前回のエントリーのラストで、「モーターを動かすコマンド」と書きましたが、今回紹介するコ

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

eclipse_4.3_kepler

eclipse/CDTにおけるgdbでのデバッグ中に発生するpythonのエラー

どもです。 今回のエントリーは、Eclipse上でのデバッグの際に「pythonのエンコードエラー

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド

記事を読む

RasPi_Qt

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

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

記事を読む

Arduino_Logo

ホールセンサーの種類と使い方

どもです。 今回のエントリは、表題にある「ホールセンサー」についてです。 1.「ホールセンサ

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよEV3を動かしていきます。 新しい環境に対して、最もよ

記事を読む

python

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

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

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

no image

C言語でEV3開発(13)-opOUTPUT_STEP_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである 「opOUTPUT_STEP_S

記事を読む

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

GitHub
C/C++のスタブを自動生成するツールを公開しました

(テーマ) C/C++のスタブを自動生成するツールを公開しました

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

no image
PC自作2019 – Windows10への移行

どもです。 突然ですが、PCを交換しました。 1. 何があ

RasPi_Qt
QtでRaspberryPi/GUI開発(12)-gpioの状態をGUIに反映する

どもです。 今回は、gpioピンの状態(HIGH/LOW)の変化を画

raspberry-pi
RaspberryPi起動時にpigpiodがスタートしないようにする

どもです。 これまでpigpioを使用してRaspberryPiから

→もっと見る

PAGE TOP ↑