スキップしてメイン コンテンツに移動

RIIC0(I2C通信設定) : RX63N

#include "iodefine.h"
int initRIIC0(void)
{
 //I2Cモジュールストップ状態の解除
 SYSTEM.PRCR.WORD = 0xA502;//モジュールストップレジスタのプロテクト解除
 SYSTEM.MSTPCRB.BIT.MSTPB21 = 0;//I2Cモジュールストップ状態の解除
 SYSTEM.PRCR.WORD = 0xA500;//モジュールストップレジスタのプロテクト
 // set port direction to input
 PORT1.PDR.BIT.B3 = 0;// SDA0
 PORT1.PDR.BIT.B2 = 0;// SCL0
 // set port mode as peripheral device
 PORT1.PMR.BIT.B3 = 1;// SDA0
 PORT1.PMR.BIT.B2 = 1;// SCL0

 // select pin function as RIIC
 MPC.PWPR.BIT.B0WI = 0;
 MPC.PWPR.BIT.PFSWE = 1;
 MPC.P13PFS.BIT.PSEL = 0x0F;// SDA0
 MPC.P12PFS.BIT.PSEL = 0x0F;// SCL0
 MPC.PWPR.BIT.PFSWE = 0;
 MPC.PWPR.BIT.B0WI = 1;

 // オープンドレイン設定 外部プルアップ抵抗で出力決めるなら必要
 PORT1.ODR0.BIT.B6 = 1;
 PORT1.ODR0.BIT.B4 = 1;
 //入力プルアップ有効
 //PORT1.PCR.BIT.B3 = 1;
 //PORT1.PCR.BIT.B2 = 1;

 /* RIIC disable for RIIC initial */
 RIIC0.ICCR1.BIT.ICE = 0;
 RIIC0.ICCR1.BIT.IICRST = 1;// リセットパルス発生
 RIIC0.ICCR1.BIT.ICE = 1;
    
 /* Set baud rate */
 RIIC0.ICMR1.BIT.CKS = 3;// IIC phi = PCLK/8 clock
 RIIC0.ICBRH.BIT.BRH = 26;// 100kbps (PCLK = 48MHz)
 RIIC0.ICBRL.BIT.BRL = 26;
 /* disable all address detection. Master mode only. */
 RIIC0.ICSER.BYTE = 0x00;
 /* ACKWP is protect bit for ACKBT */
 RIIC0.ICMR3.BIT.ACKWP = 1;// disable protect for ACKBT

 RIIC0.ICCR1.BIT.IICRST = 0;//リセット解除

 return 0;
}


//マスタからスレーブに送信
int i2cWrite(unsigned char slv_adr7b, unsigned char sub_adr, unsigned char data)
{
 int i;
 unsigned char addres8b;

 addres8b = slv_adr7b<<1 + 0;
 while(RIIC0.ICCR2.BIT.BBSY != 0);//使用中
 RIIC0.ICCR2.BIT.ST = 1;
 while(RIIC0.ICSR2.BIT.NACKF == 0)
 {
  while(RIIC0.ICSR2.BIT.TDRE == 0);
  RIIC0.ICDRT = addres8b;
 
  for(i=0; i<1000; i++);
  if(RIIC0.ICSR2.BIT.NACKF != 0)
  {
   break;
  }
  while(RIIC0.ICSR2.BIT.TDRE == 0);
  RIIC0.ICDRT = sub_adr;
 
  for(i=0; i<1000; i++);
  if(RIIC0.ICSR2.BIT.NACKF != 0)
  {
   break;
  }
  while(RIIC0.ICSR2.BIT.TDRE == 0);
  RIIC0.ICDRT = data;
 
  while(RIIC0.ICSR2.BIT.TEND == 0);
  break;
 }

 RIIC0.ICSR2.BIT.STOP = 0;
 RIIC0.ICCR2.BIT.SP = 1;

 while(RIIC0.ICSR2.BIT.STOP == 0);

 RIIC0.ICSR2.BIT.NACKF=0;
 RIIC0.ICSR2.BIT.STOP = 0;

 return 0;
}

コメント

このブログの人気の投稿

SCI の初期化(調歩同期式モード):RX63N

SCI の初期化(調歩同期式モード) 参照:RX63Nハードウェアマニュアル http://resource.renesas.com/lib/jpn/online_docs/um/RX/RX63N_RX631_ja/?SCI#TOC_35_3_5 int initSCI0(void){ SYSTEM.PRCR.WORD = 0xA502;//プロテクト解除 SYSTEM.MSTPCRB.BIT.MSTPB31 = 0;//SCI0のモジュールストップ解除 SYSTEM.PRCR.WORD = 0xA500;//プロテクト設定 //トランスミットイネーブルビット(0:シリアル送信動作を禁止、1:許可)  SCI0.SCR.BIT.TE = 0; //レシーブイネーブルビット(0:シリアル受信動作を禁止、1:許可)  SCI0.SCR.BIT.RE = 0; //トランスミットインタラプトイネーブルビット(0:TXI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.TIE = 0; //レシーブインタラプトイネーブルビット(0:RXI及びERI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.RIE = 0; //トランスミットエンドインタラプトイネーブルビット  //(0:TEI割込み要求を禁止、1:許可)  SCI0.SCR.BIT.TEIE = 0;  //P20端子を周辺機能として利用(TXD0) PORT2.PMR.BIT.B0 = 1;  //P20端子を周辺機能として利用(RXD0) PORT2.PMR.BIT.B1 = 1;  //PFSWEビット書き込み禁止ビット(0:PFSWEビットへの書き込みを 許可 ) MPC.PWPR.BIT.B0WI = 0;  //PFSレジスタ書き込み許可ビット(1:PFSレジスタへの書き込みを 許可 ) MPC.PWPR.BIT.PFSWE = 1;  //端子機能制御レジスタの設定 MPC.P20PFS.BYTE = 0x0A;//TXD0を選択 MPC.P21PFS.BYTE = 0x0A;/...

IRQ 外部割込みサンプル : RX63N

#include "iodefine.h" #include "global.h" #include "vect.h" extern MAIN_STATE main_state; extern MODE_STATE mode_state; extern unsigned char volume; void initIRQ(void); void initIRQ(void){  int i;  ICU.IER[8].BYTE = 0x00;  //デジタルフィルタ 許可ビット  ICU.IRQFLTE0.BYTE = 0x00;  ICU.IRQFLTC0.WORD = 0xFFFF;//64clockに1回  //デジタルフィルタ 許可ビット IRQ0-7  ICU.IRQFLTE0.BYTE = 0xFF;  PORTD.PDR.BYTE = 0;  PORTD.PMR.BYTE = 0x00;//ポートモードレジスタ(0:汎用入出力ポート, 1:周辺機能)  //マルチファンクションピンコントローラ  MPC.PWPR.BYTE &= ~0x80;//PFSプロテクト解除  MPC.PWPR.BYTE |= 0x40;  MPC.PD0PFS.BYTE = 0x40;  MPC.PD1PFS.BYTE = 0x40;  MPC.PD2PFS.BYTE = 0x40;  MPC.PD3PFS.BYTE = 0x40;  MPC.PD4PFS.BYTE = 0x40;  MPC.PD5PFS.BYTE = 0x40;  MPC.PD6PFS.BYTE = 0x40;  MPC.PD7PFS.BYTE = 0x40;  MPC.PWPR.BYTE &= ~0x40;  MPC.PWPR.BYTE |= 0x80;//PFSプロテクト設定  ICU.IRQCR[0].BIT.IRQMD = 1;  ICU.IRQCR[1].BIT.IRQMD = 1;  ICU.IRQCR[2].BIT.IRQMD =...