2017年1月28日土曜日

RX621で遊ぶ SPI通信でジャイロセンサを使う

RX621でSPIで使用するメモ

使用したジャイロセンサはこれ

L3G4200D



Amazonで購入しました.秋月にデータシートと詳しい説明書がありました.
http://akizukidenshi.com/catalog/g/gM-06433/

今回はピンの関係からRSPI1のポートBを使用.
配線は以下のとおり

PE5(RSPCKB) -> SCL
PE6(MOSIB)    -> SDA
PE7(MISOB)    -> SDO
PE4(SSL0B)    -> CS

説明書によると,クロックはデフォルトでHIGH奇数エッジでデータ変化
偶数エッジでデータサンプルです.(データシート24ページ目)
16ビットで通信し,上位8ビットでデータレジスタ送信,下位8ビットでデータ受信します.

以下イニシャライズと16ビット送受信のサンプル


//SPI設定
SYSTEM.MSTPCRB.BIT.MSTPB16 = 0; //SPIストップ解除

RSPI1.SPCR.BIT.SPE = 0; //SPI機能停止

RSPI1.SPBR = 23; //100kHz

RSPI1.SPDCR.BIT.SLSEL = 0x01b; //SSL0,SSL1許可
RSPI1.SPDCR.BIT.SPLW = 0; //ワードアクセス

RSPI1.SPCMD0.BIT.CPHA = 1; //奇数エッジでデータ変化偶数でサンプル
RSPI1.SPCMD0.BIT.CPOL = 1; //アイドル時RSPCK=1
RSPI1.SPCMD0.BIT.SSLA = 0; //SSL0でアサート
RSPI1.SPCMD0.BIT.SSLKP = 1; //SSL信号を保持
RSPI1.SPCMD0.BIT.SPB = 15; //データ長16bit

PORTE.ICR.BIT.B7=1; //入力バッファ有効
IOPORT.PFHSPI.BIT.RSPIS = 1; //SPI端子portEに変更
IOPORT.PFHSPI.BIT.RSPCKE = 1; //RSPCKB有効
IOPORT.PFHSPI.BIT.MOSIE = 1; //MOSIB有効
IOPORT.PFHSPI.BIT.MISOE = 1; //MISOB有効
IOPORT.PFHSPI.BIT.SSL0E = 1; //SSL0B有効

RSPI1.SPCR.BIT.MSTR = 1;     //マスタモード

RSPI1.SPSR.BYTE = 0xA0; //ステータスクリア
RSPI1.SPCR.BYTE;     // SPCR空読み


//センサレジスタから1バイト読み出し
unsigned char rspi_read( unsigned char reg,unsigned char x ){
unsigned short  recv;
RSPI1.SPCR.BIT.SPE = 1; // enable
RSPI1.SPDR.WORD.H = reg<<8+x; // 送信
while( 0 == RSPI1.SPSR.BIT.SPRF ); // 受信完了待ち
recv = RSPI1.SPDR.WORD.H; // 受信バッファ読出し
RSPI1.SPCR.BIT.SPE = 0; // disable
recv = recv&0x00ff; //マスク
return(recv);
}


とりあえずWho_am_iレジスタから読み取る.
具体的には0x8fを送り,0xd3(211)が帰ってくればOK.






1 件のコメント:

  1. RSPIの使い方で参考にさせていただいてます.
    質問なんですが「RSPI1.SPCR.BYTE; 」でSPCRレジスタを空読みする理由は何ですか?

    返信削除