7-1.SPI通信システムの構成
シリアルペリフェラルインタフェース(SPI)は、複数のプロセッサ/デバイス間で高速の全二重シリアル通信を行うことができるインタフェースです。仕様の詳細は他の文献を参照していただくとして、ここでは、マイコンRX621/RX62NのSPIインタフェースの使用例を説明します。
RX621/RX62Nはシリアルペリフェラルインタフェースを2チャンネル内蔵(RSPI0,RSPI1)しています。その内の1チャンネル(RSPI1)を使い、RX621/RX62Nをマスターデバイスにして通信する例を説明します。ちなみに、スレーブデバイスにはメモリやI/Oデバイスなどを想定しています。
下図は、RX621/RX62NをマスターデバイスにしたSPI通信システムの構成例です。
7-2.通信フォーマット
下表のように、SPIにはクロック(SCLK)の極性とデータ(MOSI,MISO)の位相の違いから、モード0~3の4種類が存在します。
備考:SCLKとはRSPCKのこと、CPOL,CPHAはRSPIコマンドレジスタ0~7にある設定ビットです。
CPOL | CPHA | アイドル時のSCLK | データ(MOSI)変化 | データ(MISO)読み込み | |
モード0 | "0" | "0" | "L" | SCLKの偶数エッジ | SCLKの奇数エッジ |
モード1 | "0" | "1" | "L" | SCLKの奇数エッジ | SCLKの偶数エッジ |
モード2 | "1" | "0" | "H" | SCLKの偶数エッジ | SCLKの奇数エッジ |
モード3 | "1" | "1" | "H" | SCLKの奇数エッジ | SCLKの偶数エッジ |
7-3.SPI通信プログラム例
下記にRSPI1を使ったモード3のSPI通信プログラムの例を示します。
このプログラム例では下記の制限があります。
(1)マイコンをマスターとした(RSPI1を使用)、シングルマスター・マルチスレーブの構成です。
(2)前記通信フォーマットのモード3で通信します。
(3)通信データは8ビット単位に限定されます(フラッシュメモリやI/Oデバイスを想定)。
(4)スレーブデバイスの選択にSSL0~SSL3の端子を使い、4つまでのデバイスを接続できます。
(5)各スレーブデバイスの通信フォーマットは同じものとします。
(6)半二重通信動作になっており送信中に受信したデータは破棄しています。
この例では送受信に割り込みを使っていてDTCやDMAは使っていません。なお、転送速度(RSPCK)は8Mbpsとしています。
・RSPI1通信プログラム例
RX621_RSPI1_DrvSampleHeader.pdf
RX621_RSPI1_DrvSampleSource.pdf
このプログラム例では、SPI動作を初期化する方法でSSL信号をネゲート(無効状態)しています。従って、ネゲートに若干時間を要しています。
7-4.SPI通信プログラム例の使い方
プログラム例の使用手順は次のようになります。ただし、最初に関数Init_SPI1を一度呼んで初期化をしておく必要があります。
(1)関数Enable_SPI1でSPI通信を開始(スレーブの指定)
(2)関数Tranceive_SPI1でコマンド送信と応答を受信
(3)関数Enable_SPI1でSPI通信を停止
複数のコマンドを送信する場合は(1)~(3)を繰り返します。(1)→(2)→(2)→(3)のように、(2)のコマンド送信だけを繰り返しても正常に動作しません。
このプログラム例を使用して、SPI接続のフラッシュメモリでページ読み込みを行う例を示します。
前記プログラム例以外の関数を呼んでいる部分がありますが、その説明は省かせていただきます。
7-5.RXマイコンのRSPI使用上の注意
(1)RSPIの送受信レジスタ(SPDR)は、8ビット単位の通信であっても16ビットまたは32ビットでリード/ライトする必要があります。もしDTCやDMAで送受信する場合は、データポインタが2または4ずつのインクリメント(またはデクリメント)になるので注意が必要です。
(2)スレーブセレクト(SSL)信号は、初期設定でレベル保持(SPCMD0.SSLKP=1)つまりバースト転送を指定しておかないと、一度の送信または受信(例えば8ビット)ごとにネゲート(無効状態)されてしまいます。通常は、一つのコマンドシーケンスの最後までSSL信号をLOWレベルつまりアサート(有効状態)しておく必要があるので、必ずバースト転送を指定します。
(3)バースト転送を指定してSSL信号のアサートを保持させた後どのようにネゲートするかですが、ハードウェアマニュアルにはシーケンス制御を使い2つのコマンドレジスタ(SPCMD0,SPCMD1)によって制御する例が記載されています。
しかしプログラム例では、シーケンス制御によらず任意の期間アサートさせるために、送受信終了後にSPCR.SPE=0にしてSPI動作を初期化することでSSL信号をネゲートしています。そのため、タイミングが若干遅くなります。
8.I2Cバスインタフェースを使う
8-1.I2Cバスインタフェースの構成
「マイコン・メモ-H8/3694FのI2CとA/Dの使い方」でも解説していますが、I2Cはクロック同期シリアル通信の一種で、下図のように2本の信号線(SCL, SDA)を使い、マスタデバイスと複数のスレーブデバイスを接続して通信できることが特徴です。
RX621/RX62NはI2Cバスインタフェースを2チャンネル内蔵(RIIC0,RIIC1)しています。その内の1チャンネル(RIIC0)を使い、RX621/RX62Nをマスターデバイスにして通信する例を説明します。ちなみに、スレーブデバイスにはEEPROMやRTCなどを想定しています。
備考:ここでは、IICバス(Inter IC Bus)をI2Cバスと表記します。
8-2.I2Cバス通信プログラム例
下記に、RX621/RX62Nをマスタとした、I2Cバスインタフェースのプログラム例を示します。この例は、H8/3694Fで示したプログラム例と異なり、割り込みを使って通信しています。
スレーブデバイスとしてRTC-8564NBやI2C接続のEEPROMなどを想定し、ACK(アクノリッジ)を含めて9ビット単位の通信としています。また、8ビットまたは16ビットアドレスでスレーブデバイスにアクセスする関数もそれぞれ用意してあります。
なお、ヘッダファイルにあるマクロ、IIC0_SPEEDをIIC0_100kbpsまたはIIC0_400kbpsに変えることによって、通信速度を100Kbpsか400Kbpsを選択できます(実測では約96Kbps,328Kbpsでした)。ただし、選択できる速度は2種類のみで、任意の速度が選べるようには作られていません。
注意:このプログラム例を動作させるには、PCK=48MHzである必要があります。
・I2C通信プログラム例
RX621_RIIC0_DrvSampleHeader.pdf
RX621_RIIC0_DrvSampleSource.pdf
このプログラム例では、最初に関数Init_RIIC0を一度呼んで初期化をしておく必要があります。さらに、スレーブデバイスと通信する前に関数SetSlaveAddr_RIIC0を呼ぶ必要があります。それによりスレーブアドレスが設定され、以降の通信はそのデバイスと行われます。複数のスレーブデバイスがある場合は、通信相手が変わる都度に関数SetSlaveAddr_RIIC0でスレーブアドレスを切り換えます。
関数名がReadByte_A8_IICのように、~_A8_IICとなっているのは、小容量のEEPROMやRTCなどのための、デバイス内アドレス(またはレジスタ番号)が8ビットのリード/ライト関数です。
関数名がReadByte_A16_IICのように、~_A16_IICとなっているのは、より大容量のEEPROMなどのための、デバイス内アドレスが16ビットのリード/ライト関数です。
関数名がReadByte_~,WriteByte_~というのは1バイトデータのリード/ライト関数、関数名がReadPage_~,WritePage_~はバイト数を指定できるリード/ライト関数です。ただし、一度にライトできる最大バイト数(ページサイズ)はデバイスによって制限があるため、その範囲内で指定します、プログラム上は最大65535バイトまで指定可能ですが妥当性はチェックしていません。
下表は、参考までにアトメル製のI2C接続EEPROMのページサイズを示したものです。
■アトメル製EEPROMのサイズデータ(参考)
型名 | メモリ容量(byte) | ページサイズ(byte) | アドレスビット幅(有効ビット幅)※ |
AT24C02A | 256 | 8 | 8(8) |
AT24C04A | 512 | 16 | 8(9) |
AT24C08A | 1,024 | 16 | 8(10) |
AT24C16A | 2,048 | 16 | 8(11) |
AT24C32A | 4,096 | 32 | 16(12) |
AT24C64A | 8,192 | 32 | 16(13) |
AT24C128 | 16,384 | 64 | 16(14) |
AT24C256 | 32,768 | 64 | 16(15) |
AT24C128B | 16,384 | 64 | 16(14) |
AT24C256B | 32,768 | 64 | 16(15) |
※アドレスビット幅より有効ビット幅が多いものは、アドレスの上位ビットがスレーブアドレスに混合される。 |
8-3.EEPROMアクセスプログラム例
前記のI2C通信プログラム例を使用し、EEPROMのページ書き込みを行う例を示します。
この例では、EEPROMのスレーブアドレスがマクロ“IICADDR_EEPROM0”に定義されたものに固定されており、1つのEEPROMにしか対応できません。
そのほか、マクロ“EEPROM_~”にEEPROMのサイズ情報を定義しておく必要があります(下記のコメント参照)。