●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通信を、なんとなく、動かすことができました。(^^)
・
・
・
・
・