ST Microelectronicsが送るSTM32開発エコシステムによる開発実習第4弾 SPI 実習編です高速な通信ポーツとして広く普及し、高いサンプルレッドが必要な ADCやダックなどに利用される SPI 動かすプログラムの実装体験をしていただきますそれでは始めましょうこの実習ではマイコンに内蔵されている2つの SPI を使ってSPI Masterとスレイブを構築し、SPI Master からデータを送信し、SPIスレイブがそれを受信することを実現いたします使用する機材はニュークレーボードと2つの SPI をボード上で接続するメスメスタイプのジャンパーケーブル4本ですGPR実習の時と同じようにCube MX を開きますCube MX の初期画面からニュープロジェクトにある3つのボタンのうち1番上のアクセス2 MCUセレクターをクリックしポップアップされたウィンドウの左側のフレームラインになりますシリーズはSTM32F4OラインはSTM32F401OマッケージはLQFP6ONをそれぞれ選択しますそうしますと、右側のフレームにフィルタによって絞られたデバイスの一覧を見ることができますその中のSTM32F401REをダブルクリックしますデバイスを選択しますと図のような画面が現れQFP64パッケージの図で示されたSTM32F401REが見えます続いてクロックの設定をしていきます画面上部にありますクロックコンフィグレーションのタブをクリックして開きます開いた画面ではコアクロックやPdlペリファラに必要なクロックと全てのクロック設定が自由愛上で行います開いた画面の中央よりにHELKの設定がありますデフォルトでは16MHzに設定されていますので最大周波数の84MHzに設定しますそれではSPIの細かい設定について行います今回SPIマスターとして使用するのはSPI-2です左側のフレーム内にありますコネクティビティグループからSPI-2を選択しモード&コンフィグレーションウィンドウを開きます開いたウィンドウの上段にありますモードフルデュープレックスマスターハードやNSSシグナルをハードやNSSアウトプットシグナルに設定しますNSSはSPIのチップセレクトの信号でこの設定を行うとSPIマスターが通信を始める際に自動的にNSSピンをローにし通信が完了するとハイに戻してくれますこの設定が完了すると接続に必要なピンの設定が完了します続いてクロックの設定を行いますSPI-2はAPB-1につながっておりPeriferalClockはPCLK-1の42MHzに設定されていますなおSPI-1はABP-2につながっておりPeriferalClockはPCLK-2の最大84MHzに設定可能ですですのでSPI-1を使った場合42MHzのBitClockを使って通信することが可能です今回SPI実習ではジャンパ線を使って接続しているので高い周波数のBitClockで通信を行うと通信エラーになる場合がありますそこで今回はデフォルトの2分の1の設定すなわち42W-2の21MHzから256分の1に変更し42W-256の164KHzに落とします続いてSPI-2の割り込みを有効化しますコンフィグレーション内のNVICセッティングスタブを開きSPI-2グローバルインタラフトのイネブルドにチェックを入れて有効化します次にスレーブのSPIの設定を行いますSPIスレーブとして使用するのはSPI-3ですさっきのSPI-2と同様ConnectPTグループからSPI-3を設定なくしモーダンドコンフィグレーションインドを開きますSPI-3はスレーブとして設定しますのでモードフルデュープレックススレーブハードウェアNSSシグナルをハードウェアNSSインプットシグナルに設定しますスレーブ側にはプリスケーラーの設定はありませんスレーブの設定の際にはこの画面からNSSの設定を必ず行ってください忘れるとNSSピンが割り当てられないためマスターからのセレクト信号を受け取ることができませんレバイスのパッケージ画面から直接割り当てて作業したとしても緑色にはならずこのメニューで設定することで初めて緑色に変化し機能としてアサインされます続いてSPI-3の割り込みを有効化しますコンフィグレーション内のLVICセッティングスタブを開きSPI-3グローバルインタラクトのイネーブルドリンセックを入れて有効化します最後にLVICの詳細設定を行います左側のフレームからシステムコア選びその中のLVICを選択するとモードアンドコンフィグレーションウィンドが開きます先ほどの設定ですでにSPI-2と3の割り込みは有効化してありますので今回もシスティック割り込みを優先させるためSPI-2のプリアンプションプライオリティを2に設定しそれぞれ割り込みの優先度を下げます以上の設定によってデバイスのピンにそれぞれのペリフィアルの機能が割り当てられましたペリフィアルの設定から行うことでもデフォルトのピンアサイメントが自動的に行われますはい ここまでの設定で図のようなピンの配置になりましたSPI-2のMISO MISIデータピンですねこちら PC-2と3にSPI-2のクロックはPV-10NSSピンチップセレクトのピンはPV-12アサインされましたで マイコンの設計をしているときによくあることなんですけどもこのピン 機能のピンはなるべく同じような場所に配置したい例えばこの右下あたりにまとめたいとかいう場合があります 配線の都合とかですねそのほかパッケージの関係で他の場所に移動させたいそんなことがあると思いますCubeXにはですね 便利な機能がありまして移動させたいピンをコントローキーを押しながらクリックしますと移動可能な先のピンにマーキングを押してくるこのPV-14右側PV-12が青色に点滅しているのが分かりますかねクリックするために点滅します このようにですね移動先可能なピンをコントローキーを押しながらありますと移動したいピンをコントローキーを押しながらクリックしますと移動先可能なピンがインジケーターとして青色に点滅しますともしこの場所で良ければこのままコントローキーを押してこのMISOのピンをクリックしてドラッグを押しますとこのように濃い青色に変わりましてこのように移動させることができます同様にSPI-2 MOSI こちらもですね移動させたいのでPV-15にドラッグを押してきますとどうせですからこちらもSPI-2のクロックなんですけど13に移動できるということなのでこのように移動することができますこのようにですね基板の設計を考慮したピンの配置をしたいときに移動させ可能なピンがどれなのかというのをコントローキーを押しながらクリックすることで一発で判断することができましてそのままドラコンドアップするとその大きなのピンが移動先のピンにこの実習ではこのままですとこの先の実習仕様がありますのでコントローゼットキーを押してですねAndを押して戻してくださいデフォルトのままでコードの作業を進めますのでこの先コードジェネースの際はデフォルトのままでよろしくお願いしますここまでの設定で迷光の設定は終了ですこの後は生成するプロジェクトファイルに関する設定を行っていきます画面上部にありますプロジェクトマネージャーをクリックして開きますまずはじめにプロジェクトの名前を設定しますプロジェクトネームにプロジェクトの名前を設定しプロジェクトロケーションにはプロジェクトを保存するルートディリクトリーを設定しますここで重要な注意点ですプロジェクト名やプロジェクトを保存するフォルダのパスに全角半角スペース、漢字カダなどの2バイト文字を含めてはいけません使うツールによってはパスが通らなくなりプロジェクトをビルドする際にエラーになることが報告されています次にコード生成時の詳細設定を行います画面左側の上から2番目にありますコードジネーターをクリックしますデフォルトではビルドに必要ない全てのファイルをプロジェクトフォルダにコピーする設定になっておりプロジェクトを作るたびに膨大な量のファイルが複製されPCのストレージをアパックすることになりますそこで最上段設定2番目のコピーオンリーネスサリーライバリーファイルズに変更し不必要なファイルのコピーを防ぎますこれで初期化コードを生成する準備が全て整いました設定してこなかった細かな内容に関しましてはベッドキューブメックスのユーザーマニュアル等をご紹介しますのでそちらを参考にしていろいろ試してみてくださいでは画面右上にありますGenerateコードをクリックしますしばらくしてコード生成が完了すると生成されたプロジェクトファイルを設定したツールチェーンで開くかフォルダを開くか一旦終了するかの選択肢を訪ねてきますEW ARMを使って開くのでOpenプロジェクトをクリックして開きますここで念のためビルのが通ることを確認しますEW ARMのプロジェクトメニューからすべてを再ビルドを選択しビルドしますSPI実習では3つのプログラムを実装していきます1つ目はSPI割り込みの状態を監視して受信と送信のタイミングを制御するメイン関数処理で2つ目はSPIの送信関連割り込み処理3つ目はSPIの受信関連割り込み処理ですそれぞれ詳しく見ていきましょうまずメイン関数処理ですメイン関数内ではマイコンのさまざまな初期化を行いSPIが目的の動作をするように設定しますその後各ステータ選数を0に初期化送受信バッファを0に初期化後SPI受信を開始しSPI送信を開始しますSPI割り込み処理によって各ステータ選数に値が代入されることをループ処理にて監視し送受信を行います次に送信関連割り込み処理です送信関連割り込み処理ではSPIマスターが指定されたデータ数を送信完了した際にSPIにステータ選数に位置を代入するだけです受信関連割り込み処理ではSPIマスターから送信されてくるデータを指定数受信した際にSPI3ステータ選数に位置を代入するだけです実際の受信したデータは受信開始の関数の引数で指定したバファーに入力されています続いて実際のコードを記入する際の重要な注意点をご説明いたしますCubeMXで生成されたコードにはユーザーコードビギンとユーザーコードエンドのコメントの記載がありこのコメント分の間にのみユーザーコードを追加することが可能ですこのルールに乗って追加したユーザーコードはGPIOの設定等を変えたなどなどをして再度CubeMXにてコード生成した場合でも保護されます逆にこのコメント分の範囲外の部分にユーザーコードを追加したりCubeMXで自動生成されたコードを編集しますと再度コードを生成した際に追期したコードは切れしまい変更した部分は全て元に戻ってしまいますなおユーザーがこのコメント分を模範して記入してもコード再生成時に消えてしまいますので必ず生成されたコード内のコメント分の間に追期するようお願いいたしますでは実際にmain.cファイルにコードを追期していきますまず追期箇所1箇所目ですユーザーコードbeginincludeユーザーコードendincludeの間に追期していきます今回PCとの数字新データはAsciiモジレツを使えますのでsoring.hをincludeします追期箇所2箇所目ですユーザーコードbeginpvユーザーコードendpvの間に追期していきますSPI割り込み判定のための変数であるSPIにStataSenseとSPI3StataSenseを追期します共闘のUnderscore2つですので気をつけてくださいまた操縦新データを確認する12バイト分のwafferのSPIにwafferとSPI3wafferを追期します追期箇所3箇所目ですユーザーコードbegin3ユーザーコードend3の間に追期していきます説明のためスライド分けてありますがコピエ用にスライドも受けてありますのでコピエの際にはのちょうどそのスライドから行ってください実際のメインロープの処理を追加します操縦新wafferをクリアし操縦新wafferに文字列を生成し確認します主人を開始後操縦を行いユーザーとStataSenseを監視して分岐するコードを追加しますあるSPIレシーブITはSPI重心完了割り込み判定させるSPI重心開始のための関数で第一引数に使用するSPIのハンドラを第二引数に重心するためのwafferを第三引数に重心倍と数を与えますあるSPIトラスミットITはSPI重心完了割り込みを発生させるSPI重心開始のための関数で第一引数に使用するSPIのハンドラを第二引数に重心するためのwafferを第三引数に重心倍と数を与えます続き箇所3箇所目の続きです重心と重心を開始したらそれぞれの割り込み関数内で1に設定されるSPIにStatusとSPI屋さんStatusをボーリングして監視しますともに1となっていればそれぞれのStatusを0にクリアしポーリングループからブレイクして抜けます続き箇所3箇所目のコッピー用のスライドです続き箇所4箇所目ですユーザーコードビギン4ユーザーコードエンド4の間に追期していきますこちらにはSPI重心完了割り込みコールバック関数処理を追期してきますまず最初にSPIの重心完了割り込みコールバック関数処理を追期しますどのSPIからの重心完了割り込み化を判断しSPIにStatus選数に一応代入するコードです次にSPI重心完了割り込みコールバック関数処理を追期しますどのSPIからの重心完了割り込み化を判断しSPI3、Status選数に一応代入するコードです続き箇所4箇所目のコッピー用のスライドです追期が終わりましたらプロジェクトメニューの中ほどにありますメイクを選択してビルドしますビルド完了後エラーやワーニングないことを確認しますビルドが完了しましたらSPI2と3を接続するためボード上のピンをジャンパ線を使って接続します必ずボードはPCのUSBポートからケーブルを外し接続を切った状態で行ってくださいまずSPI2と3のビットクロックピンを接続しますボードのUSBコネクターを上に見た時左側のM4コネクターCN7の外側一番上の一番ピンと右側のM4コネクターCN10の内側下から7番目の25番ピンをジャンパ線で接続します続いてSPI2と3のMISOピンを接続しますMISOはマスターインプットスレーブアウトプットなのでSPIマスターとスレーブのデータ線の接続は同じ機能名のピンを接続すればいいので簡単です左側のM4コネクターCN7の内側一番上の2番ピンと同じM4コネクターCN7の外側下から2番目の35番ピンをジャンパ線で接続します続いてSPI2と3のMOSIピンを接続します左側のM4コネクターCN7の外側上から2番目の3番ピンと同じM4コネクターCN7の外側下から1番目の37番ピンをジャンパ線で接続します最後にSPI2と3のNSSピンを接続します左側のM4コネクターCN7の内側下から4番目の32番ピンと右側のM4コネクターCN7の外側上から8番目の16番ピンをジャンパ線で接続しますお手元のニュークレボードをPCと接続します接続されるとモード右上にあるLD1が赤色に点灯しモード中ほどにあるLD3も赤色に点灯しますでは実際にモードに書き込んでデバークしましょうプロジェクトメニューからダウンロードしてデバークを選択しモードにデータをダウンロードしますボードと通信中LD1が点滅しますダウンロードが完了するとデバークモードに切り替わりますモードのLD1は緑色に点灯しますでは実際にデバークしていきますまずメインループ内の2箇所にブレイクポイントを設定します1つ目は春SPRレシーブIT関数をコールするところです2つ目は続くファイル分の中のブレイクです両番号はコード編集の仕方によって微妙に変わりますので目安としてください次にプログラム実行中の編集を参照する落ち機能を設定しますEWMの表示メニューから落ちを選択し落ち位置を選択しますそうするとソースコード編集画面右側に落ち位置ウインドウが開きます今回参照する編集は送信バッファのSPI2バッファと自信バッファのSPI3バッファでするぞれ落ち位置ウインドウに入力して設定しますそれでは準備が整いましたキーボードの動きを押して実行しますするとすぐに先に設定した1番目のブレイクポイントで停止しますこの時送信バッファであるSPI2バッファ2送信データであるSDM32F401REの文字列が確認されています変数名の左にあるプラスマークをクリックするとバッファの中身が確認できます再度F動きを押して実行しますするとすぐに先に設定した2番目のブレイクポイントで停止しますこの時SPI3バッファ2SPI2から送信された文字列が確認されています変数名の左にあるプラスマークをクリックするとバッファの中身が確認できます正しくSDM32F401REの文字列が受信できていますでしょうかそれでは実際のデーワック画面を表示しますまずブレイクポイントを貼ってきます113業目あたりのHAL SPL-CVITのところにブレイクポイントを貼りますもう一つはファルブの中にありますブレイクのところにブレイクを貼りますブレイクポイントがありますその後表示メニューこちらの方からウォッチを選びますウォッチの位置を選びまして選択しますクリックしますと画面右側にウォッチ1ウィンドウが表れますここにHPI2BufferとHPI3Bufferを追加していきますコピーペースするのが一番簡単ですねこちらもHPI3Bufferを得てきます左の充実ボタンを押すとバッと広がりましてバッファの中身が見れるようになっています中身文字列0全部塗るになっています押しましたらこれを実行していきますすると最初のブレイクポイントのところで止まりましてHPI2Bufferに初期化されたSTEM32F401REこの文字列が入った状態で止まります続けてそのまま実行して次のブレイクポイントであるところに止まりますと受信Bufferである SPA3BufferにSPA2からのデータが受信された結果のSTEM32F401REの文字列が入ることが確認できます実際にユーザーアプリケーションに追加した際に使ったHALドライバの簡単なご説明をいたしますまず1つ目はHAL SPIReceiveITですSPI受信完了割込の発生を伴うSPI受信関数ですこちらの第一引数にはSPIのハンドラを指定します第二引数には受信データを確認するBufferを第三引数には受信サイズをバイト数で指定します2つ目はHAL SPITransmitITですSPI受信完了割込の発生を伴うSPI受信関数ですこちらの第一引数にはSPIのハンドラを指定します第2引数には受信データを確認しているBufferを第三引数には受信サイズをバイト数で指定します最後はHAL SPIRX TXコンプリートコールバックですCPLTはコンプリートの略ですSPIの受信もしくは送信完了割込の発生時にコールされる関数で第1引数にどのSPIからの割込だったのかの情報が確認されています実際のドライバーのソースコードはプロジェクトを保存したフォルダにあるドライバーズディレクトリー内のSTEMさんにF4XXHALドライバーフォルダにありますドライバーの使用方法に関しましては該当のソースコードやヘッダやコメント分またはWebに公開しているユーザーマニュアル1000年約25番UM1725にてお確認ください資料にはWebリンクを埋め込んでありますのでクリックして参照してくださいでは最後に動いたままのデバックを終了しますEWARMのデバックメニューからデバックの停止を選びデバックモードを終了しますその後EWARMもCubeMXも終了させます実習していただいた感想はいかがでしょうか比較的簡単に動作させることができたかと思いますSTEMさんにマイコンは各種のソフト屋が準備されています次のスライドにSTEMさんにマイコンの特殊可能なベンニナリンクをまとめましたのでお活用くださいこれでSPIG周辺を終了します続いてADC自習に入りますSTEMさんに開発エコシステムによる開発自習ADC自習辺を開いてください