●SPI通信で 動かしてみよう
はじめに・・・ PICとPICを、デバイス接続することができそうなので・・・ PIC内に搭載されている【MSSP】モジュール(Master Synchronous Serial Port)の 「SPI」動作モードを使用して、PIC間の通信を試すことにしました。
・ ・ ・ ・ ・
●SPIモードで取り扱うPICのピンは (^^? 例えば・・・「16F819」の場合

 → SPIモードのピン配置が、決められているようです。
・ ・ ・ ・ ・
●PIC間の通信は、同期式シリアル通信規格のSPI通信で行います。 【 SPI(Serial Peripheral Interface) シリアル・ペリフェラル・インタフェース 】

シフトレジスタ(8ビット)を使ってのクロス接続による入出力同時同期通信で、同じ基板 内で相手のデバイスと通信する方式ですが、SPIマスタとSPIスレーブ間を、単方向の クロス接続信号線2本(SDO・SDI)とマスタが生成出力する単方向の同期クロック信号線1 本(SCK)を使用して、1ビット単位のデータをクロックに合わせて送受信します。
●SPI通信(4線式)   @SDI( SSP DATA INPUT )・・・ シリアルデータ・イン    ・シリアルデータ信号の入力(単方向)です。    ・送信側からのシリアルデータ信号を、受信する入力部分であり、マスタが生成する     シフトクロックに合わせて、受信側がパラレル・データに変換して取り込む。   ASDO( SSP DATA OUTPUT )・・・ シリアルデータ・アウト    ・シリアルデータ信号の出力(単方向)です。    ・受信側に向けてのシリアルデータ信号を、送信する出力部分であり、マスタが生成     するシフトクロックに合わせて、送信側がパラレル・データをシリアルデータに変     換した信号を出力する。   BSCK( SSP CLOCK )・・・ シリアルクロック    ・クロックの信号(単方向)です。    ・マスタがシフト・クロックを生成しており、このクロックをSCK信号としてスレ     ーブと共用化されている。シリアルデータの送受信は、このクロックにより同時     に実行される。1クロックで、1ビット分の信号を送受信する。     ・マスタ : SCK信号を出力する。     ・スレーブ: SCK信号を入力する。   CSS(SLAVE SELECT)・・・ スレーブセレクト *省略可    ・複数スレーブの制御時に使用する信号(単方向)です。    ・1(マスタ)対 N(スレーブ)の通信する場合は      複数スレープを制御するSS(スレーブセレクト)信号を使用します。    ・1(マスタ)対 1(スレーブ)の通信する場合は      必要でなければ、SS(スレーブセレクト)信号が省略できます。
●マスタとスレーブ間は、リングバッファ形式での通信です。 ・マスタとスレーブの各シフトレジスター間はリング状に接続されており、マスタが1ビッ  ト出力(シフト)すると、スレーブに1ビットが入力される。これの逆方向のスレーブ出  力からマスタへの入力も同時に処理され、それぞれのデータが入れ替わるリングバッファ  形式で、1ビット単位のデータで通信が実行されます。 ■プログラム処理・・・1バイト単位で、データ処理します。 ・プログラムでの送受信は、1バイト単位のデータでプログラム処理が実行されますが、  信号レベルは、1ビット単位で通信処理されます。 ■通信処理・・・1バイト分を、ビット単位で繰返し処理します。 ・マスターはシフトレジスターの最上位1ビット(MSB:7)をシフトして、これを送信します。 ・スレーブはその1ビットを受信して、シフトレジスターの最下位1ビット(LSB:0)に入れ  ると、上位(MSB:7)がシフトされ、これがマスター側に送信されます。
【SPIマスタ】  ・マスタ側が主導権を持っている・・・   ・信号出力のタイミングは、クロックを出力するマスタ側が実行する。   ・マスタは自分自身でクロックを出力しながら、そのクロックに同期してデータ・ビッ    トを送受信する。 【SPIスレーブ】  ・クロックを受信したタミングに合わせて、データが送受信される。
・ ・ ・ ・ ・
●SS(スレーブセレクト)信号ありの配線図です。 *当該試行ケースでは、1(マスタ)対 1(スレーブ)の通信を実施します。


・ ・ ・ ・ ・
●SPI通信の動作確認用(Aパターン)プログラムの基本仕様です。 ;******************************************************************************* ;* ●プログラム : 16F819SPITESAMST1 ( VER AA.01 )      ●言語:M ;* ●SPI通信テスト(マスタモード) −Aパターン−      ;******************************************************************************* ; ;1.スレーブ側のLED点灯の順番データ(1〜8)を、繰り返して電文送信する ; ;  ・LED点灯の順番( RB6→ RB7→ RA0→ RA1→ RA2→ RA3→ RA4→ RB0 ) ; ;2.スレーブから受信した順番データ(1〜8)で、当該LED点灯する ; ;  ・LED点灯の順番( RB6→ RB7→ RA0→ RA1→ RA2→ RA3→ RA4→ RB0 )を想 ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(マスタモード)  ●:SPI通信 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; DAT-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; CMD<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●RB5 11 +--> スレーブセ ; --+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--> シリアルクロ ; | | ; +------------------------------------------+ ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;-------------------------------------------------------------------------------
;******************************************************************************* ;* ●プログラム : 16F819SPITESASLV1 ( VER AA.99 )     ●言語:M ;* ●SPI通信テスト(スレーブモード)−Aパターン−      ;******************************************************************************* ; ;1.マスタ側のLED点灯の順番データ(1〜8)を、繰り返して電文送信する ; ;  ・LED点灯の順番( RB6→ RB7→ RA0→ RA1→ RA2→ RA3→ RA4→ RB0 ) ; ;2.マスタから受信した順番データ(1〜8)で、当該LED点灯する ; ;  ・LED点灯の順番( RB6→ RB7→ RA0→ RA1→ RA2→ RA3→ RA4→ RB0 )を想 ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(スレーブモード)  ●:SPI通 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; CMD-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; DAT<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●SS 11 +--< スレーブセ ; <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--< シリアルクロ ; | | ; +------------------------------------------+ ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;-------------------------------------------------------------------------------
・ ・ ・ ・ ・
●SPI通信の動作確認用(Bパターン)プログラムの基本仕様です。 ;******************************************************************************* ;* ●プログラム : 16F819SPITESBMST1 ( VER BB.01 )      ●言語:M ;* ●SPI通信テスト(マスタモード) −Bパターン−      ;******************************************************************************* ; ; 1.スレーブ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信す ; ; 2.スレーブから受信した順番データ(1〜128)で、当該LED点灯する ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(マスタモード)  ●:SPI通信 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; DAT-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; CMD<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●RB5 11 +--> スレーブセ ; --+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--> シリアルクロ ; | | ; +------------------------------------------+ ; ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)を、ビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
;------------------------------------------------------------------------------- ;******************************************************************************* ;* ●プログラム : 16F819SPITESBSLV1 ( VER BB.99 )     ●言語:M ;* ●SPI通信テスト(スレーブモード)−Bパターン−      ;******************************************************************************* ; ; 1.マスタ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信する ; ; 2.マスタから受信した順番データ(1〜128)で、当該LED点灯する ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(スレーブモード)  ●:SPI通 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; CMD-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; DAT<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●SS 11 +--< スレーブセ ; <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--< シリアルクロ ; | | ; +------------------------------------------+ ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)を、ビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
・ ・ ・ ・ ・
●SS(スレーブセレクト)信号なしの配線図です。 *当該試行ケースでは、1(マスタ)対 1(スレーブ)の通信を実施します。


・ ・ ・ ・ ・
●SPI通信の動作確認用(Cパターン)プログラムの基本仕様です。 ;******************************************************************************* ;* ●プログラム : 16F819SPITESCMST1 ( VER CC.01 )      ●言語:M ;* ●SPI通信テスト(マスタモード) −Cパターン− SS使用しない ;******************************************************************************* ; ; 1.スレーブ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信す ; ; 2.スレーブから受信した順番データ(1〜128)で、当該LED点灯する ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(マスタモード)  ●:SPI通信 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; DAT-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; CMD<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5) RB5 11 +-- ; --+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--> シリアルクロ ; | | ; +------------------------------------------+ ; ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)をビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
;******************************************************************************* ;* ●プログラム : 16F819SPITESCSLV1 ( VER CC.99 )     ●言語:M ;* ●SPI通信テスト(スレーブモード)−Cパターン− SS使用しない ;******************************************************************************* ; ; 1.マスタ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信する ; ; 2.マスタから受信した順番データ(1〜128)で、当該LED点灯する ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(スレーブモード)  ●:SPI通 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; CMD-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; DAT<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5) RB5 11 +-- ; <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--< シリアルクロ ; | | ; +------------------------------------------+ ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)をビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
・ ・ ・ ・ ・
●SPI通信で、動かしました。 LEDの発光状態で動作確認しますので、約1秒間隔でLED出力しています。 この為、マスタ側のプログラムで、データ送信の開始を遅延させています。

 → なんとなく動きましたが・・・ こんなものかしら (^^?
・ ・ ・ ・ ・
●「クロック」が気になるので・・・ マスタがシフト・クロックを生成して、このクロックをSCK信号としてスレーブと共用化 されており、シリアルデータの送受信は、このクロックにより同時に実行するようです。 ちょっと、クロックの取り扱いが気になるので試すことにしました。 ・使用プログラム・・・ SS(スレーブセレクト)信号ありです。   ------------------------------------------------------------------------------   ・16F819SPITESAMST1 ( VER AA.01 )      SPI通信テスト(マスタモード) −Aパターン−   ------------------------------------------------------------------------------   ・16F819SPITESASLV1 ( VER AA.99 )     SPI通信テスト(スレーブモード)−Aパターン−   ------------------------------------------------------------------------------
■セラロックを使用しているが、(クロック周波数)を変更したら?  現在は・・・  マスタ(10MHz):スレーブ(10MHz) である。
@PIC両方のクロック周波数を、大きくしたら?  マスタ(20MHz):スレーブ(20MHz)  → 動きました・・・ 処理動作が「速く」なりました。
APIC両方のクロック周波数を、小さくしたら?  マスタ(4MHz):スレーブ(4MHz)  → 動きました・・・ 処理動作が「遅く」なりました。
【感想】 クロック周波数の大きさに比例して、処理動作の速度変動が確認できました。
・ ・ ・ ・ ・
BPIC<スレーブのみ>のクロック周波数を、大きくしたら?  マスタ(10MHz):スレーブ(20MHz)  → 動きました・・・ 処理速度は「変わらない」感じです。
CPIC<スレーブのみ>のクロック周波数を、小さくしたら?  マスタ(10MHz):スレーブ(4MHz)  → 動きました・・・ 処理速度は「変わらない」感じです。
【感想】 リングバッファ形式での通信で、マスタ側のクロック周波数を変更しなければ・・・  ・処理速度が「変わらない」ことが確認できました。(目視レベルで)  ・マスタ側が主導権を持っていることを感じました。
・ ・ ・ ・ ・
DPIC<マスタのみ>のクロック周波数を、大きくしたら?  マスタ(20MHz):スレーブ(10MHz)  → 動きました・・・ 処理動作が「速く」なりました。
EPIC<マスタのみ>のクロック周波数を、小さくしたら?  マスタ(4MHz):スレーブ(10MHz)  → 動きました・・・ 処理動作が「遅く」なりました。
【感想】 主導権を持っているマスタ側のクロック周波数を変更したら・・・  ・クロック周波数の大きさに比例して、処理動作の速度変動が確認できました。  ・マスタ側が主導権を持っていることを感じました。
・ ・ ・ ・ ・
■セラロック(外付け)を、PIC内部クロックの使用に変更したら?  現在は・・・  マスタ(セラロック・10MHz):スレーブ(セラロック・10MHz) である。 ・使用プログラム・・・ SS(スレーブセレクト)信号ありです。   ------------------------------------------------------------------------------   ・16F819SPITESAMST21 ( VER AA.21 )      SPI通信テスト(マスタモード) −Aパターン− (PIC内部クロック・2MHz)   ・16F819SPITESAMST22 ( VER AA.22 )      SPI通信テスト(マスタモード) −Aパターン− (PIC内部クロック・4MHz)   ・16F819SPITESAMST23 ( VER AA.23 )      SPI通信テスト(マスタモード) −Aパターン− (PIC内部クロック・8MHz)   ------------------------------------------------------------------------------   ・16F819SPITESASLV21 ( VER AA.91 )     SPI通信テスト(スレーブモード)−Aパターン− (PIC内部クロック・2MHz)   ・16F819SPITESASLV22 ( VER AA.92 )     SPI通信テスト(スレーブモード)−Aパターン− (PIC内部クロック・4MHz)   ・16F819SPITESASLV23 ( VER AA.93 )     SPI通信テスト(スレーブモード)−Aパターン− (PIC内部クロック・8MHz)   ------------------------------------------------------------------------------
@PIC両方を、PIC内部クロック(2MHz)の使用に変更したら?  マスタ(PIC内部クロック・2MHz):スレーブ(PIC内部クロック・2MHz)  → 動きました・・・ 処理速度は「かなり遅く」なりました。
APIC両方を、PIC内部クロック(4MHz)の使用に変更したら?  マスタ(PIC内部クロック・4MHz):スレーブ(PIC内部クロック・4MHz)  → 動きました・・・ 処理速度は「セラロックと同じ」感じです。
BPIC両方を、PIC内部クロック(8MHz)の使用に変更したら?  マスタ(PIC内部クロック・8MHz):スレーブ(PIC内部クロック・8MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
【感想】 PIC内部クロックを使用しても、OKです。
・ ・ ・ ・ ・
■セラロック(外付け)とPIC内部クロックの混合で使用したら?
@マスタ(PIC内部クロック・4MHz):スレーブ(外付け・4MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Aマスタ(外付け・4MHz):スレーブ(PIC内部クロック・4MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Bマスタ(PIC内部クロック・2MHz):スレーブ(外付け・20MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
【感想】 PIC内部クロックと外付けの混合で使用しても、OKです。
・ ・ ・ ・ ・
■電源電圧の低い状態(約3V)で、使用したら? DCDCコンバータ(3.3V・0.5A)経由で、PIC両方に電力供給です。
@マスタ(PIC内部クロック・2MHz):スレーブ(PIC内部クロック・2MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Aマスタ(PIC内部クロック・4MHz):スレーブ(PIC内部クロック・4MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Bマスタ(PIC内部クロック・8MHz):スレーブ(PIC内部クロック・8MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Cマスタ(外付け・4MHz):スレーブ(外付け・4MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Dマスタ(外付け・10MHz):スレーブ(外付け・10MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Cマスタ(外付け・20MHz):スレーブ(外付け・20MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
【感想】 PIC内部クロック(最大8MHz)や外付け(最大20MHz)に関係なく、 約3Vの電源電圧(3.3V)で、動くことが確認できました。
・ ・ ・ ・ ・
■電源電圧の違う構成で、使用したら?
@マスタ・5V(外付け・4MHz):スレーブ・3.3V(外付け・4MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Aマスタ・5V(外付け・10MHz):スレーブ・3.3V(外付け・10MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
Bマスタ・5V(外付け・20MHz):スレーブ・3.3V(外付け・20MHz)  → 動きました・・・ 処理速度は「それなり」の感じです。
【感想】 電源電圧の違う(3.3V・5.0V)構成では、 SPI通信4線(@SDI、ASDO、BSCK、CSS)が、 不安定になると想定していましたが、安定して動くことが確認できました。
・ ・ ・ ・ ・
●最下位ビット(LSB:0)から順番に、送信してみたら? 使用するPICでは、MSBファーストでの送信となるので・・・ ・(マスタ側)プログラム    送信データを、強制的にビット変換する処理を組み込む必要がある。 ・(スレーブ側)プログラム    現状のMSBファーストでの送信とする。 現在は・・・  マスタ→スレーブへ送信する時、  シフトレジスタ(マスタ側)の最上位ビット(MSB:7)から順番に、送信している。 ・使用プログラム・・・ SS(スレーブセレクト)信号ありです。
・ ・ ・ ・ ・
●SPI通信の動作確認用(Dパターン)プログラムの基本仕様です。 ;******************************************************************************* ;* ●プログラム : 16F819SPITESDMST1 ( VER DD.01 )      ●言語:M ;* ●SPI通信テスト(マスタモード) −Dパターン−      ;******************************************************************************* ; ;*Bパターンのプログラム(16F819SPITESBMST1)を、ベースに作成・・・機能修正あり ; ; 1.スレーブ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信す ; ; 2.スレーブから受信した順番データ(1〜128)で、当該LED点灯する ; ;(機能修正) ; ; ・送信データ(1バイト)を、最下位ビット(LSB:0)から順番に、送信するように変更 ; ;     ----送信電文変換----    MSBファースト → LSBファース ;     DENHEN1 DENHEN2 ;      【前】 【後】 ; ;    @( 0ビット目 −→ 7ビット目)COPY ;    A( 1ビット目 −→ 6ビット目)COPY ;    B( 2ビット目 −→ 5ビット目)COPY ;    C( 3ビット目 −→ 4ビット目)COPY ;    D( 4ビット目 −→ 3ビット目)COPY ;    E( 5ビット目 −→ 2ビット目)COPY ;    F( 6ビット目 −→ 1ビット目)COPY ;    G( 7ビット目 −→ 0ビット目)COPY ; ; 現在は・・・ ; ;  シフトレジスタ(マスタ側)の最上位ビット(MSB:7)から順番に、送信している。 ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(マスタモード)  ●:SPI通信 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; DAT-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; CMD<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●RB5 11 +--> スレーブセ ; --+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--> シリアルクロ ; | | ; +------------------------------------------+ ; ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)を、ビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
;******************************************************************************* ;* ●プログラム : 16F819SPITESDSLV1 ( VER DD.99 )     ●言語:M ;* ●SPI通信テスト(スレーブモード) −Dパターン−      ;******************************************************************************* ; ;*Bパターンのプログラム(16F819SPITESBSLV1)を、ベースに作成・・・機能修正なし ; ; 1.マスタ側のLED点灯の順番データ(1〜128)を、繰り返して電文送信する ; ; 2.マスタから受信した順番データ(1〜128)で、当該LED点灯する ; ;------------------------------------------------------------------------------- ; ; 【 PIC16F819 】(スレーブモード)  ●:SPI通 ; ___________________ ______________________ ; | V | ; | | ; LED(5) <--+ 1 RA2 PORTA(BIT2) | PORTA(BIT1) RA1 18 +--> LED(4) ; LED(6) <--+ 2 RA3 PORTA(BIT3) | PORTA(BIT0) RA0 17 +--> LED(3) ; LED(7) <--+ 3 RA4 PORTA(BIT4) | PORTA(BIT7) OSC 16 +--< オシレータ ; --+ 4 RA5 PORTA(BIT5) | PORTA(BIT6) OSC 15 +--< オシレータ ; 0V --+ 5 Vss (-) | (+) Vdd 14 +-- 3〜5V+ ; LED(8) <--+ 6 RB0 PORTB(BIT0) | PORTB(BIT7) RB7 13 +--> LED(2) ; CMD-->シリアルデータ・イン >--+ 7 SDI●PORTB(BIT1) | PORTB(BIT6) RB6 12 +--> LED(1) ; DAT<--シリアルデータ・アウト <--+ 8 SDO●PORTB(BIT2) | PORTB(BIT5)●SS 11 +--< スレーブセ ; <--+ 9 RB3 PORTB(BIT3) | PORTB(BIT4)●SCK 10 +--< シリアルクロ ; | | ; +------------------------------------------+ ;          (・クロック周波数:10MHz ・電源電圧:5.0V) ;------------------------------------------------------------------------------- ; ; ・電文(1バイト)を、ビット単位でLED(2進数)表示する ; ;  @ビット0 : LED(1) PORTB(RB6ピン) ;  Aビット1 : LED(2) PORTB(RB7ピン) ;  Bビット2 : LED(3) PORTA(RA0ピン) ;  Cビット3 : LED(4) PORTA(RA1ピン) ;  Dビット4 : LED(5) PORTA(RA2ピン) ;  Eビット5 : LED(6) PORTA(RA3ピン) ;  Fビット6 : LED(7) PORTA(RA4ピン) ;  Gビット7 : LED(8) PORTB(RB0ピン) ; ;-------------------------------------------------------------------------------
【感想】 動きました。 【スレーブモードPIC】側  ・逆方向のLED(8)から、点灯消灯している・・・OK 【マスタモードPIC】側  ・順方向のLED(1)から、点灯消灯している・・・OK
・ ・ ・ ・ ・
●気になるところを・・・ −Gパターン− マスタプログラムのみ、PIC内部クロック(4MHz)で ・3端子レギュレータ(3.3V 150mA)にしました。  → 安定して動くことが確認できました。 ・すべての信号線に、プルアップ(抵抗430Ω)しました。  → これで、SPI通信の信号が、より安定すると思います。 ・SS(RB5ピン)の初期値「1」をセットして通信不可状態にすることにした。  → まだ、テストしていない。
・ ・ ・ クロックの極性と位相が、気になるので・・・ ・ ・
●SSありで、マスタモードの4パターンを中心にして、スレーブモードとの相性は? −Gパターン−
■相性確認1‥(SSあり)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESGMST11 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESGSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ OK  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ NG  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG
■相性確認2‥(SSあり)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESGMST12 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン2 : 0 (LOW) 1 (1→0) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESGSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ NG  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ △ *1  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ NG  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG ---------------------------------------------------------------------------------- *M2【マスタ側】LED点灯順番が不規則である *1 正常な時がある 
■相性確認3‥(SSあり)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESGMST13 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン3 : 1 (HIGH) 0 (0→1) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESGSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ NG  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ OK  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ △ *M1、*S2 ---------------------------------------------------------------------------------- *M1【マスタ側】途中からLED点灯順番が正常になる *S2【スレーブ側】LED8が点灯しない
■相性確認4‥(SSあり)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESGMST14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン4 : 1 (HIGH) 1 (1→0) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESGSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ NG  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ △ *M2  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ △ *M1、*S3 ---------------------------------------------------------------------------------- *M1【マスタ側】途中からLED点灯順番が正常になる *M2【マスタ側】LED点灯順番が不規則である *S3【スレーブ側】途中からLED点灯順番が正常になる
【感想】 同じパターン(マスタ・スレーブ)で、実行した相性結果は、以下がOKでした。 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1)  ・パターン3 : 1 (HIGH) 0 (0→1)
・ ・ ・ ・ ・
●SSなしで、マスタモードの4パターンを中心にして、スレーブモードとの相性は? −Hパターン−
■相性確認1‥(SSなし)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESHMST11 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESHSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ OK  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ NG  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG ----------------------------------------------------------------------------------
■相性確認2‥(SSなし)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESHMST12 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン2 : 0 (LOW) 1 (1→0) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESHSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ △ *M2  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ △ *M2、*S3  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG ---------------------------------------------------------------------------------- *M2【マスタ側】LED点灯順番が不規則である *S3【スレーブ側】途中からLED点灯順番が正常になる *1 正常な時がある
■相性確認3‥(SSなし)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESHMST13 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン3 : 1 (HIGH) 0 (0→1) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESHSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ △ *M2、*S3  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ OK  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG ---------------------------------------------------------------------------------- *M2【マスタ側】LED点灯順番が不規則である *S3【スレーブ側】途中からLED点灯順番が正常になる
■相性確認4‥(SSなし)クロックの極性と位相 ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESHMST14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン4 : 1 (HIGH) 1 (1→0) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESHSLV11,12,13,14 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1) ・・・ NG  ・パターン2 : 0 (LOW) 1 (1→0) ・・・ NG  ・パターン3 : 1 (HIGH) 0 (0→1) ・・・ △ *M2  ・パターン4 : 1 (HIGH) 1 (1→0) ・・・ NG ---------------------------------------------------------------------------------- *M2【マスタ側】LED点灯順番が不規則である
【感想】 同じパターン(マスタ・スレーブ)で、実行した相性結果は、以下がOKでした。 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン1 : 0 (LOW) 0 (0→1)  ・パターン3 : 1 (HIGH) 0 (0→1)
・ ・ ・ ・ ・
●SSあり、マスタモードのSPIモード3で・・・  SS送信開始を初期処理でして、継続中の状態にしたら? −Iパターン− ---------------------------------------------------------------------------------- 【マスタモードPIC】側… 16F819SPITESIMST13 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン3 : 1 (HIGH) 0 (0→1) ---------------------------------------------------------------------------------- 【スレーブモードPIC】側… 16F819SPITESISLV13 -------クロック------- 極性@ 位相A 【CKP】 【CKE】  ・パターン3 : 1 (HIGH) 0 (0→1)
【感想】 動きました。
・ ・ ・ ・ ・
PIC間のSPI通信を、なんとなく、動かすことができました。(^^)
・ ・ ・ ・ ・