PIC16F18857でMSSPモジュールを利用したSPI通信を設定したにもかかわらず、SCKやSDOから全く信号が出力されないケースは珍しくありません。特にPPS設定やクロック設定、MSSPレジスタの構成に問題があると、プログラム自体は動作していてもオシロスコープ上では無信号に見えることがあります。本記事ではSPI信号が出力されない場合の代表的な原因と確認方法を整理します。
まず確認したいSPIクロック設定
PIC16F18857のMSSPをSPIマスターモードで使用する場合、SSP1CON1の設定値が非常に重要です。
掲載されているプログラムではSSP1CON1=0x0Aとなっていますが、この値が想定したSPIマスターモードになっているかをデータシートで確認する必要があります。
SPIモード設定が誤っているとSCKが生成されない場合があります。
PPS設定の確認
PIC16F1シリーズではPeripheral Pin Select(PPS)の設定ミスが最も多い原因の一つです。
今回のコードでは以下の設定が行われています。
| 信号 | 設定 |
|---|---|
| SCK1 | RC3PPS = 0x10 |
| SDO1 | RC5PPS = 0x11 |
| SDI1 | SSP1DATPPS = 0x14 |
ただし使用しているXC8のバージョンやヘッダファイルによっては、定義値がデータシートと一致しているか確認する必要があります。
特にRC4をSDIとして使う場合は、入力側PPSも正しく設定されているかチェックしましょう。
SSP1IFフラグ待ちで停止している可能性
SPI_Send関数では以下の処理があります。
while(!PIR3bits.SSP1IF);
もしSPI転送が開始されていなければ、このループから抜けられません。
デバッガで確認すると、実際にはここで停止しているケースがあります。
まずは送信前後でLEDを点滅させたり、ブレークポイントを設置して処理が進んでいるか確認することが重要です。
RC3とRC5をGPIOとして動作確認する
SPI以前にピン自体が正常動作しているか確認することも大切です。
例えば以下のような単純なトグル出力でRC3やRC5の信号を確認します。
TRISCbits.TRISC3=0;
while(1){
LATCbits.LATC3=1;
__delay_ms(100);
LATCbits.LATC3=0;
__delay_ms(100);
}
このテストで信号が出なければ、PPS以前にクロック設定やLVP設定、ハードウェア接続に問題がある可能性があります。
LVP設定にも注意
コードではLVP=ONとなっています。
PIC16F18857ではLVP有効時に一部のピン動作へ影響が出ることがあります。
開発環境や書き込み方法によっては、LVPをOFFにして動作確認すると問題が解消する場合があります。
2MHz出力を得るためのクロック計算
HFINTOSCを32MHzで動作させている場合、SPIクロックはMSSP設定により決定されます。
例えばFOSC/16設定なら2MHzが得られます。
目標がRC3に2MHzのSCKを出力することであれば、まずSCKのみをオシロスコープで観測し、クロックが出ているかを確認するのがトラブルシューティングの近道です。
まとめ
PIC16F18857でSPI信号が全く出ない場合は、PPS設定、MSSPモード設定、SSP1IF待ちによる停止、GPIO単体動作確認の順で切り分けると効率的です。
特にPPS設定の正当性確認と、RC3を単純なGPIOとしてトグル出力できるかの確認は重要です。SPI設定の問題なのか、ピン設定やクロック設定の問題なのかを切り分けることで、原因特定が大幅に容易になります。


コメント