データの取得するプログラムは、データ校正部分が結構複雑になります。最初からそのプログラムを作成すると全体の見通しが悪くなってしまいます。そこで、最初はSPI通信の動作確認を行うためのシンプルなプログラムを作成することにします。センサのメモリマップを見ると、0xD0番地にセンサのIDが保存されています。ここに保存されている値は0x60で固定となっています。そこで、0xD0番地のデータをSPI通信で読み取るプログラムを作成し、0x60が正しく取得できるか確認することによりSPI通信の動作確認を行いたいと思います。ところで、プログラムで0xD0番地のデータを読み取るのはいいとしても、まだLCDモジュールは動いていませんので、読み取った値をLCDモジュールに表示して確認することはできません。IDEの「デバッグ機能」を使用します。デバッグ機能については、実際に使用する際に詳しく説明しますので、ここでは簡単に説明します。IDE上でプログラムを作成→ビルド→PICマイコンに書き込み→動作、というステップでした。このような手順では、PICマイコンが思った通りに動作する場合は問題ないですが、うまく動かない場合、PICマイコンの中で何が起こっているのか知りたいですよね。IDEのデバッグ機能を使うと、PICマイコン内部で動作しているプログラムを指定した行で動作を止めたりして、その結果を確認しながら動作させることができます。言葉ではなかなかイメージがつかないと思いますので、プログラム作成後、実際に手を動かして確認してみてください。使用するピンの確認SPI通信を行うために、PICマイコンとセンサモジュールは以下のように接続しました。このように接続すると、PICマイコン側のSPI通信用のピンは以下のように割り当てることになります。出力SPI通信は、RC4〜RC7のピンをデジタル制御しながら行います。(またはLATCbits.LATC4、PORTCbits.RC6)などの記述になりますが、どのピンがどの信号線か分かりづらくなりますので、以下のように#defineすることにします。チップセレクトPICマイコンのピン入出力設定は、SCK(クロック)、MOSI(マスター→スレーブ)、SS(スレーブセレクト/チップセレクト)は出力、MISO(スレーブ→マスター)は入力になります。PICマイコン全般に言えることですが、出力値制御はLATレジスタ、入力値制御はPORTレジスタを使用します。そのため、MISOのみPORTCレジスタ、それ以外はLATCレジスタを使用しています。0xD0番地の読み出しSPI通信で0xDO番地の読み出す場合、以下のように通信を行います。SPI通信手順は以下のようになります。SPI通信の基本関数作成SPI通信手順が確認できたところで、プログラムを作成します。SPI通信は以下の部分の8ビット送信と8ビット受信の部分を関数として作成しておきます。8ビット送信関数8ビット送信の部分は、以下のようにプログラムを作成します。8ビットの送信と受信の関数内部では、チップセレクト信号の制御は行わないことにします。チップセレクト信号はこの関数を使用する側で制御することにします。この図のように、SCKピン(クロック)を0にするMOSIピン(マスター→データ)に送信するビットデータをセットするSCKピン(クロック)を1にするという制御を8回繰り返せばSPIデータ送信ができます。プログラムとしては以下のように作成してみました。}}2点補足いたします。1点目は変数型についてです。char」などを使用して変数宣言していました。実践編では、変数のビット数が分かりやすいint_t型を使用することにしました。この変数型を使用する場合、stdint.hをインクルードする必要があります。以下はその変数型になります。integer)、数字がビット数を表しますので、かなり分かりやすいと思います。Arduinoではこの変数型を使用することが一般的なようです。2点目はビット演算についてです。最近のiOSやAndroidなどのプログラミングではあまりビット演算が必要な場面は出てこないと思います。一方で電子工作で使用するPICマイコンやArduinoでは、意外にビット演算が必要な場合があります。実践編のプログラムの中では、「<<」や「|」などの記号がよく出てきますので、よくわからない場合はもう一度ビット演算全般を復習されてみてください。8ビット受信関数8ビット受信の部分は、以下のようにプログラムを作成します。この図のように、SCKピン(クロック)を0にするSCKピン(クロック)を1にする(この段階でスレーブのデータが読めるようになっているMISO(スレーブ→マスター)のデータを読むという制御を8回繰り返せばSPIデータ送信ができます。プログラムとしては以下のように作成してみました。