PICマイコンでSPIモジュールを設定・使用する方法をまとめた.
はじめに
PICでのSPIモジュールの設定には,MPLAB IDEのMCC機能を使用する方法があるが,今回はこれを使用せず,レジスタの設定を直接mainファイルに記載する方法を紹介する.(実際は初期設定に少しMCUを使用する)
なお,本記事では電子ボリュームLM1972との通信を目標とした設定方法を紹介していくため,PICをslaveとした使用方法など,説明を省く部分もある.
使用するマイコンには,PIC16F1769を採用している.
初期設定
はじめMCCは使用しないと言ったが,やはりクロックやピンの初期設定など,あまり後で弄ることのない部分はMCCを使用して設定したほうが効率的である.今回はクロックに内部クロック8MHzを使用した.
ピン設定であるが,まずSPIで送信を行うにはSDO,SCK,SSの3つのピンが必要となる.大抵のGPIOピンはピン選択機能でモジュールの機能を割り当てることが出来るので,空いているピンを適当に3つ選べばよい.
今回はSDOにRA2,SCKにRC5,SSにRC4を選択した.3つのピンはMCCを使ってデジタル出力に設定しておく.
1.RxyPPSレジスタの設定
RxyPPSレジスタで,ピンの機能をSCKとSDOに設定する.レジスタ値はSCKなら0x12,SDOなら0x14である.
今回はRC5にSCK,RA2にSDOの機能を割り当てるため,以下のようになる.
RC5PPS = 0x12; // RC5:SCK
RA2PPS = 0x14; // RA2:SDO
2.xxxPPSレジスタの設定
SSPCLKPPSと SSPSSPPSは,それぞれSCKとSSをどのピンに割り当てるかを決めるレジスタである.ここが分かりにくいポイントで,RxyPPSレジスタの設定だけではSPIを使うことは出来ないのである.
レジスタの値の詳細については,マイコンのデータシートを参照していただきたい.
SSPCLKPPS = 0b00010101; // SCK:RC5
SSPSSPPS = 0b00010100; // SS:RC4
なぜRxyPPSと違い2進数で書いているかというと,このレジスタは使用するポートにより値が全て異なるため,間違いを避けたいからである.
3.SSP1STATレジスタの設定
このレジスタでは,主にbit6のCKEビットを操作してクロック位相(エッジ)を設定する.
1:active to idle
0:idle to active
LM1972のデータシートを参照すると,クロック位相はidle to activeとなっているため,CKEビットはクリアしておく.
SSP1STATbits.CKE = 0; // idle to active
4.SSP1CON1レジスタの設定
このレジスタでは,SSP1STATと同様にSPIのモードを設定する.
まず,必ずSSPENビットをセットしてSPIのピン設定を有効にしておく.
それから,CKPビットを操作してクロック(SCK)の極性を選ぶ.
1:idle High
0:idle Low
LM1972のデータシートを参照すると,クロック位相はidle Lowとなっているため,CKPビットはクリアしておく.
0~3bitのSSPMでは,マスター/スレーブの選択,クロック周波数(SCK)の選択を行う.
LM1972のデータシートを参照すると,基本クロック周波数は2MHzとなっているため,クロックはFOSC/4とする.また,PICマイコンはmasterの役割を担う.
SSPMビットはモードにより様々な値のパターンがあるため,詳細については使用するマイコンのデータシートを参照すること.
SSP1CON1 = 0b00100000; // Enable SerialPort / idle Low / CLK:FOSC/4
参考文献
SPI通信の使い方
http://www.picfun.com/f1/f05.html
SPIの基本を学ぶ | アナログ・デバイセズ
https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html
桐井研究室 LM1972を使った電子ボリューム。
http://kirylabo.blog.fc2.com/blog-entry-81.html
SAKURA87.net Arduino Unoで電子ボリューム(LM1972M)を動かす
https://sakura87.net/archives/4342
氾濫原 LM1972 デジタルボリューム
https://lowreal.net/2018/02/20/1
氷精工房 電子ボリュームを使ってみた
http://www.maroon.dti.ne.jp/jyaku9/koneta/koneta6/koneta.html
SPI通信の使い方
http://www.picfun.com/f1/f05.html
MICROCHIP PIC16(L)F1764/5/8/9 日本語PDFデータシート
https://akizukidenshi.com/download/ds/microchip/PIC16F1764_PIC16LF1769_j.pdf