はじめまして。hiroroと申します。
RX72Nで簡易I2Cを動作させたい(7segLED点灯)と思っています。現在以下の使用環境でテストをしています。
使用環境テストボード:AP-RX72N-0Ae2studioコンパイラ:CCRX
P50、P52を使って簡易I2C通信を使用としています。DATAは思うように出力しています。CLKがなぜか中途半端に出力されています。諸事情によりFITモジュールは使っておりません。なぜCLKが正しく出ないのかアドバイス等いただけると助かります。
よろしくお願いいたします。
以下ソースです。
マクロ↓
#define sfr_set(n,c) (n)|= (c))#define sfr_clr(n,c) (n)&=~(c))
#define sfr_outw(n,c) (n) = (c))
ER i2c_ini(){ sfr_set(I2C_PDR, I2C_DATA_BIT); /* P50 output port */ sfr_set(I2C_PDR, I2C_CLK_BIT); /* P52 output port */
sfr_set(I2C_P5_ODR0, 0x01); //オープンドレインP50 sfr_set(I2C_P5_ODR0, 0x04); //オープンドレインP52 sfr_set(I2C_PMR, SSDA_BIT); //P50 周辺モジュールとして使用 sfr_set(I2C_PMR, SSCL_BIT); //P52 周辺モジュールとして使用 /* set I/O port functions */ sfr_out(MPC_PWPR, 0x00); /* B0WI=0 (enable writing to PFSWE bit) */ sfr_out(MPC_PWPR, PWPR_PFSWE); /* PFSWE=1 (PFSレジスタへの書き込みを許可) */ sfr_out(MPC_SSDAPFS, PSEL_SSDA); // P50 端子機能制御レジスタ use P50 as SSDA sfr_out(MPC_SSCLPFS, PSEL_SSCL); // P52 端子機能制御レジスタ use P52 as SSCL sfr_out(MPC_PWPR, PWPR_B0WI); /* B0WI=1 (PFSWEビットへの書き込みを禁止) */ sfr_clr(MPC_PWPR, 0x40); // PFSWE=0 PFSレジスタへの書き込みを禁止 sfr_outw(RWP_PRCR, 0xA503); /* enable writing to low-power consumption register */ sfr_clrl(I2C_LPC_MSTPCR, I2C_MSTP_BIT); // SCI2 module停止解除 sfr_outw(RWP_PRCR, 0xA500); /* protect writing */ sfr_set(I2C_SCI_SIMR3, IICSDAS_HIZ); //SSDA端子はハイインピーダンス状態 sfr_set(I2C_SCI_SIMR3, IICSCLS_HIZ); //SSCL端子はハイインピーダンス状態 /* set up baud rate generator */ sfr_out(I2C_SCI_SCR, 0x00); // SCR.TIE、RIE、TE、RE、TEIE、CKE[1:0]ビットを“0”に設定 CKE=00 (on-chip baud rate generator) sfr_out(I2C_SCI_SMR, 0x01); // SMRレジスタはCKS[1:0]ビットを設定(PCLK (n = 1) )し、それ以外のビットを0 sfr_set(I2C_SCI_SCMR, (SMIF | SINV| SDIR)); // SM:OFF,INV:OFF sfr_out(I2C_SCI_BRR, I2C_BRR); sfr_out(I2C_SC2I_SNFR, NFCS ); //ノイズフィルタ設定 sfr_set(I2C_SCI2_SIMR1, IICM); //簡易I2Cモード sfr_set(I2C_SCI2_SIMR1, IICDL ); //3~4サイクル遅延 sfr_set(I2C_SCI2_SIMR2, (IICACKT| IICCSC |IICINTM)); //NACK送信またはACK/NACK受信,クロック同期, ACK/NACK割り込みを使用 sfr_out(I2C_SCI2_SPMR, 0x00 ); //SPI モードレジスタ 無効 //グループ割込みBL0許可 sfr_set(I2C_SCI_SCR, SCR_TE | SCR_RE); //送受信許可 return E_OK;}
ER Send_i2c(void){ int i;
while(1){ //スタートコンディションの発行 sfr_clr(I2C_SCI_SIMR3, IICSTIF_HI); //フラグクリア sfr_set(I2C_SCI_SIMR3, IICSTAREQ_HI); //開始条件を生成 sfr_set(I2C_SCI_SIMR3, IICSDAS_01); //SSDAn端子は開始条件、再開始条件、停止条件 sfr_set(I2C_SCI_SIMR3, IICSCLS_01); //SSCLn端子は開始条件、再開始条件、停止条件 while((sfr_in(I2C_SCI_SIMR3) & 0x08)==0x00); //IICSTIFが1になるまで待つ。(各条件生成が完了) sfr_clr(I2C_SCI_SIMR3, IICSTIF_HI); //フラグクリア sfr_clr(I2C_SCI_SIMR3, 0x30); //SSDA端子はシリアルデータ出力 sfr_clr(I2C_SCI_SIMR3, 0xC0); //SSCL端子はシリアルクロック出力 //アドレス送信 sfr_out(I2C_SCI_TDR, I2C_DATA); //宛先アドレス for(i=0;i<500;i++); //ちょっとだけ空ループ while((sfr_in(I2C_SCI2_SSR) & 0x04)==0x00); //TENDが1(キャラクタを送信終了)になるまで待つ。 //COMMND送信
sfr_out(I2C_SCI_TDR, I2C_DATA); //宛先アドレス for(i=0;i<500;i++); //ちょっとだけ空ループ while((sfr_in(I2C_SCI2_SSR) & 0x04)==0x00); //TENDが1(キャラクタを送信終了)になるまで待つ。
//データ(電圧設定)送信
//ストップコンディションの発行 sfr_set(I2C_SCI_SIMR3, IICSTPREQ_HI); //停止条件を生成 sfr_set(I2C_SCI_SIMR3, IICSDAS_01); //SSDAn端子は開始条件、再開始条件、停止条件 sfr_set(I2C_SCI_SIMR3, IICSCLS_01); //SSCLn端子は開始条件、再開始条件、停止条件 while((sfr_in(I2C_SCI_SIMR3) & 0x08)==0x00); //IICSTIFが1になるまで待つ。(各条件生成が完了) } //送信終了の後処理 sfr_clr(I2C_SCI_SIMR3, IICSTIF_HI); //フラグクリア sfr_set(I2C_SCI_SIMR3, IICSDAS_HIZ); //SSDA端子はハイインピーダンス状態 sfr_set(I2C_SCI_SIMR3, IICSCLS_HIZ); //SSCL端子はハイインピーダンス状態
return E_OK;}
続きです。
#define ICU_GENSCI ICU_GENBL0#define ICU_IPRERI ICU_IPR110#define INT_ERI INT_GRPBL0#define I2C_IP 5#define I2C_PDR P5_PDR //0x0008C005#define I2C_DATA_BIT 0x00#define I2C_CLK_BIT 0x04
#define I2C_SHIFT 4
#define PSEL_SSDA 0x0A#define PSEL_SSCL 0x0A#define MPC_SSDAPFS MPC_P50PFS //0x0008C168#define MPC_SSCLPFS MPC_P52PFS //0x0008C16A#define I2C_P5_ODR0 P5_ODR0 //0x0008C08A#define I2C_PMR P5_PMR //0x0008C065#define SSDA_BIT 0x01 //P50#define SSCL_BIT 0x04 //P52#define I2C_LPC_MSTPCR LPC_MSTPCRB // Module Stop Control Register B 0x00080014#define I2C_MSTP_BIT 0x20000000 //SCI2 1:モジュールストップ状態へ遷移#define I2C_SCI_SCR SCI2_SCR //0x0008A042#define I2C_SCI_SMR SCI2_SMR //0x0008A040#define I2C_SCI_SIMR3 SCI2_SIMR3 //0x0008A04B#define IICSDAS_HIZ 0x30#define IICSCLS_HIZ 0xC0#define IICSTIF_HI 0x08#define IICSTAREQ_HI 0x01#define IICSDAS_01 0x10 //開始条件、再開始条件、停止条件の生成#define IICSCLS_01 0x40 //開始条件、再開始条件、停止条件の生成#define IICSTPREQ_HI 0x04 //停止条件の生成
#define I2C_SCI_TDR SCI2_TDR //0x0008A043#define I2C_ADDS 0x40#define I2C_SCI2_SSR SCI2_SSR //0x0008A044#define I2C_COMD 0x02#define I2C_DATA 0xFF
#define I2C_SCI_SCMR SCI2_SCMR //0x0008A046#define SMIF 0x00 //非スマートカードインタフェースモード#define SINV 0x04 //TDRレジスタの内容をそのまま送信、受信データをそのままRDRレジスタに格納#define SDIR 0x08 //簡易I2Cモード MSBファーストで送受信#define I2C_SCI_BRR SCI2_BRR // 0x0008A041#define I2C_BRR 0x2E //BRR(N) 10kbps#define I2C_SCI_SEMR SCI2_SEMR //0x0008A047#define NFEN 1#define BRME 1#define I2C_SC2I_SNFR SCI2_SNFR //0x0008A048#define NFCS 0x01 //1分周のクロックをノイズフィルタに使用#define I2C_SCI2_SIMR1 SCI2_SIMR1 //0x0008A049#define IICM 0x01 //簡易I2Cモード#define IICDL 0x40 //3~4サイクル遅延(簡易I2C モード時0~1以上遅延)
#define I2C_SCI2_SIMR2 SCI2_SIMR2 //0x0008A04A#define IICACKT 0x20 //NACK送信またはACK/NACK受信#define IICCSC 0x02 //クロック同期を行う#define IICINTM 0x00 //ACK/NACK割り込みを使用
#define I2C_SCI2_SPMR SCI2_SPMR //0x0008A04D