RX62NのSPIでMCP23S08を制御

インターフェース誌2011年5月号付録のRX62NのSPIでMCP23S08を制御しました。
 
 RX62NのSPIを使うのに手間取りました。R8CやH8の場合、詳しい解説書やサンプルソフトが豊富なのですが、RX62Nではルネサス社の資料に頼るしかありません。
 ルネサス社の資料は、規模や大きかったり、核心的な説明がアッチコッチに分散しているので使い勝手が悪いです。

●実験の構成と動作結果

 インターフェース誌2011年5月号の上に実験した構成を配置しました。
 RX62NとMCP23S08をSPIで接続しました。MCP23S08は、マイクロチップ社のボードを使いました。

 実験は、RX62NのPORT1に接続したLEDと、SPIで接続したMCP23S08を周期的にON/OFFする簡単なものです。

 RX62NとMCP23S08間のSPI信号の波形を下に示します。
 SPIのクロックは、8MHzです。MCP23S08は、コマンド、アドレス、データの3バイトで制御します。
 RX62NのSPIは、機能が豊富で、ここでは24ビット転送を使いました。
 24ビット転送を使うと、1命令で3バイトのSPI転送が実現できました。

 問題無く動作しました。



 



 


●実験のプログラム

 HEWで作成したプログラムを下に置きます。

 RX62Nのハードウエアは強力で、パラメータの設定でかなりの事が実現できる。 しかし、設定方法が判りにくい。
 是非、単純で判り易い説明書を発行してほしい。



 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//#include "typedefine.h"
#ifdef __cplusplus
//#include <ios> // Remove the comment when you use ios
//_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios
#endif

void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

#include "iodefine.h" // Include iodefine.h



// **********************************************
// ********** システムクロック,SPIレジスタ初期設定
void HardwareSetup(void)
{

SYSTEM.SCKCR.LONG = 0x00010100; // システムクロック設定 ICLK=96MHz, BCLK=48MHz, PCLK=48MHz
MSTP(RSPI0) = 0; // RSPI_Ch-A モジュールストップ解除

RSPI0.SPPCR.BIT.SPOM = 0; // RSPI端子制御レジスタ:CMOS出力
// RSPI0.SPBR.BYTE = 1; // RSPIビットレート12Mbps(48MHz/4)
RSPI0.SPBR.BYTE = 2; // RSPIビットレート 8Mbps(48MHz/6)

/* RSPIデータコントロールレジスタ */
RSPI0.SPDCR.BIT.SPFC = 0; // SPDCR:フレーム数=1
RSPI0.SPDCR.BIT.SPLW = 1; // SPDCR:SPDRレジスタへはロングワードアクセス

RSPI0.SPCKD.BIT.SCKDL = 0; // クロック遅延レジ:SSL信号アサート開始からRSPCK発振までの期間=1RSPCK
RSPI0.SSLND.BIT.SLNDL = 0; // RSPIスレーブセレクトネゲート遅延レジスタ
// シリアル転送の最終RSPCKエッジを送出してからSSL信号をネゲートするまでの期間 = 1RSPCK
RSPI0.SPND.BIT.SPNDL = 0; // RSPI次アクセス遅延レジスタ
// シリアル転送終了後のSSL 信号の非アクティブ期間=1RSPCK+2PCLK

// ********** RSPIコマンドレジスタ0
// RSPCK位相設定ビット : 奇数エッジでデータ変化、偶数エッジでデータサンプル
// RSPCK極性設定ビット : アイドル時のRSPCKが“1"
// ビットレート分周設定ビット : ベースのビットレートを選択
// SSL信号アサート設定ビット : SSL0
// SSL信号レベル保持ビット : 転送終了後から次アクセス開始までSSL信号レベルを保持
// RSPIデータ長設定ビット : 8ビット
// RSPI LSBファーストビット : MSBファースト
// RSPI次アクセス遅延設定許可ビット: 次アクセス遅延はRSPI次アクセス遅延レジスタの設定値
// SSLネゲート遅延設定許可ビット : SSLネゲート遅延はRSPIスレーブセレクトネゲート遅延レジスタの設定値
// RSPCK遅延設定許可ビット : RSPCK遅延はRSPIクロック遅延レジスタの設定値
// RSPI0.SPCMD0.WORD = 0xE783;
// RSPI0.SPCMD0.WORD = 0xE783;

RSPI0.SPCMD0.WORD = 0xE103; //SSL0: 24ビット

PORTC.ICR.BIT.B7 = 1; // MISOA-A端子を入力に設定

/* ポートファンクションレジスタG(PFGSPI) */
IOPORT.PFGSPI.BIT.RSPIS = 0; // RSPI1関連の端子について、XXX-A端子を仕様
IOPORT.PFGSPI.BIT.RSPCKE = 1; // RSPCKB-A端子有効
IOPORT.PFGSPI.BIT.MOSIE = 1; // MOSIB-A端子有効
IOPORT.PFGSPI.BIT.MISOE = 1; // MISOB-A端子有効
IOPORT.PFGSPI.BIT.SSL0E = 1; // SSLA0-A端子有効

/* RSPI制御レジスタ */
RSPI0.SPCR.BIT.SPMS = 0; // SPI動作(4線式)
RSPI0.SPCR.BIT.MSTR = 1; // マスタモード
RSPI0.SPCR.BYTE; // 空読み
}


// **********************************************
// ******************** main ********************
void main(void)
{
unsigned long n; //
unsigned long SpiRxDat; //

PORT1.DDR.BIT.B5 = 1; // Reverse P15(LED)

HardwareSetup(); //システムクロック,SPIレジスタ初期設定

// RSPI0.SPCMD0.BIT.SPB = 0x7; // コマンドレジスタにSPIデータ長設定:8ビット設定

while( 0 == RSPI0.SPSR.BIT.SPTEF ); // 送信バッファ空き待ち

// ********** MCP23S08のIODIRに出力方向を設定
RSPI0.SPCR.BIT.SPE = 1; // enable
RSPI0.SPDR.LONG = 0x400000; // 送信
while( 0 == RSPI0.SPSR.BIT.SPRF ); // 送信完了待ち
SpiRxDat = RSPI1.SPDR.LONG; // 受信バッファ読出し

for(n=0; n<1000; n++){} //時間待ち


while( 1 )
{
PORT1.DR.BIT.B5 = 0; // Reverse P15(LED)

// ********** MCP23S08のOLATに出力データを設定
RSPI0.SPCR.BIT.SPE = 1; // enable
RSPI0.SPDR.LONG = 0x400A55; // 送信
while( 0 == RSPI0.SPSR.BIT.SPRF ); // 送信完了待ち
SpiRxDat = RSPI1.SPDR.LONG; // 受信バッファ読出し

for(n=0; n<20000000; n++){} //時間待ち


PORT1.DR.BIT.B5 = 1; // Reverse P15(LED)

// ********** MCP23S08のOLATに出力データを設定
RSPI0.SPCR.BIT.SPE = 1; // enable
RSPI0.SPDR.LONG = 0x400AAA; // 送信
while( 0 == RSPI0.SPSR.BIT.SPRF ); // 送信完了待ち
SpiRxDat = RSPI1.SPDR.LONG; // 受信バッファ読出し

for(n=0; n<20000000; n++){} //時間待ち


}

}



ホームへ戻る