RX72Nで簡易I2C通信をしたい。DATAは出力されているがCLKが何故か正しく出力されない。。

はじめまして。hiroroと申します。

RX72Nで簡易I2Cを動作させたい(7segLED点灯)と思っています。
現在以下の使用環境でテストをしています。

使用環境
テストボード:AP-RX72N-0A
e2studio
コンパイラ: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_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;
}

Parents
  • 続きです。

    #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

Reply
  • 続きです。

    #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

Children
No Data