はじめまして。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;}
hiroroさん、こんにちは。NoMaYと申します。> P50、P52を使って簡易I2C通信を使用としています。> DATAは思うように出力しています。CLKがなぜか中途半端に出力されています。この波形は、I2Cとしては、そういった状況ですら無いと思うのです。I2Cの波形は以下のような感じですよ。(以下は以前に別スレッドにて引用したことがあるものです。) 定常状態はHighでないと変ですよ、、、I2Cバスの波形なまりによる通信エラー対策 - RYOSANwww.ryosan.co.jp/technology/development/freshers/development_345/
ご回答ありがとうございます。
回路のプルアップ抵抗の取り付け位置が間違っていることに気づきました。
修正してみます。
hiroroさん、こんにちは。NoMaYです。> 回路のプルアップ抵抗の取り付け位置が間違っていることに気づきました。それ以外にも、オープンドレイン出力設定になっていなくて、通常出力設定のままなのではないでしょうか。ですので、PORT設定周り/MPC設定周りも何かおかしいのではないか、と疑われます。昔から良くあるアドバイスとして、マイコンベンダから提供されているサンプルプログラムと自身で書かれたプログラムを比較されてはどうでしょうか、というのがあるのですが、昨今のRXマイコンであればRXスマートコンフィグレータで試しにコード生成させて、生成されたコードと自身で書かれたプログラムを比較されてはどうでしょうか。iodefine.hすら使われていないようですが、内蔵周辺機能レジスタのアドレスも再確認した方が良いかも知れません。
なぜかログインできなくなり、返信が遅くなりました。
他のRXのI2Cソースがネットにあったので参照して作り無事に動作しました。
ご指摘ありがとうございました。
FITモジュールのソースを読んだのですが、私には難しくて解読できませんでした。
モジュールをそのまま使えれば楽に進むのですが、、
hiroroさん、こんにちは。NoMaYです。ちなみに、なぜモジュールをそのまま使えなかったのですか?ひょっとして、RI600の関係ですか?(RI600と一緒にFITを使うことは出来ない、という制約があったりするのでしょうか?)
NoMaYさん、こんにちは
NORTiというRTOSを移植しています。(過去に他のCPUで開発実績があったので使用)これにFITモジュールを移植するとエラーが数百出てきて解決が困難でした。NORTiはコスト的にもかなり良かったのでが、FITの移植が私の実力からしてこんなに難しかったことが誤算でした。選定ミスです。
hiroroさん、こんにちは。NoMaYです。> NORTiというRTOSを移植しています。(過去に他のCPUで開発実績があったので使用)> これにFITモジュールを移植するとエラーが数百出てきて解決が困難でした。そういうことでしたか。ただ、別スレッドの(そのスレッドのみからの)印象ですが、ミスポさんは結構親切な会社なのではないかなぁ、という印象があります。例えば、NORTiとFITの組み合わせのサンプルプログラムも(RX231ですけど)、お願いすれば貰えるようですし、うまく動かないという相談にも(きっとある程度の限度はあるでしょうけど)乗って頂けるようでしたよ。FITでのSCI使用時に、PCから文字を1文字受信すると、プログラムが固まります。japan.renesasrulz.com/cafe_rene/f/forum5/7071/fit-sci-1
NoMaYさん、こんにちは。
>NORTiとFITの組み合わせのサンプルプログラムも(RX231ですけど)、お願いすれば貰えるようですし確かにそのようですね。FITの使用を諦めずに進めてみようと思います。
アドバイスありがとうございました。
こんにちは。
NoMaYさんが貼られたリンク先で質問した者です。
RX231のFIT+NORTiはミスポさんのサポートに言えば貰えますが、多分RX72Nではかなりの改造が必要です。
私は65Nで利用を諦めました。
理由は、グループ割込みに対応していないからです。
RX231まではペリフェラルの量が少ないので1対1の割込み要因でしたが、65Nはグループ割込みですのでNORTiではそのままでは使えません。
OSを修正できる能力の無い私はNORTiを無駄にしました(笑)
さすがに勿体ないので、ルネサスのサポートやミスポのサポートの方達にも相談に乗って頂きましたが
①べた書き+NORTi
②FIT+FreeRTOS
の選択しかないので、②を選びました。
(誰かを悪く言うつもりは全くございません)
私の能力的に、USBやE2フラッシュ、TCP-IPの利用をべた書きするのは不可能なので、FITの利用一択です。
仕方がってNORTiは諦めました。NORTiのTCP-IPだけで別冊マニュアルもあるので・・・
ミスポさんからも、SCIのグループ割込みに対応した、べた書き用の修正ファイルは頂いたのですが・・・
SCI以外の割込みをどうするのか?等々を考えて、FreeRTOSを使いました。
最悪シリアル通信はべた書きで以前に経験があった(+ルネサスのセミナーでも教えて頂いた)ので、べた書きが可能ですが、USBのマスストレージクラスを使おうとするとファイルシステムから云々となったので。
ポリテクセンターの4日のセミナーは行ったのですが、プログラム量が膨大で自分で実装できる気がしませんでした。
しんちょろすさん
今更の返信で申し訳ございません。コメントありがとうございました。
都合により、RX72Nを半年以上封印しておりました。最近、時間ができたので、また開発を始めました。
今、FITを使っていませんが、グループ割込みに関しては、ミスポさんからいただいたサンプルプログラムに記載されていましたので、それを参考にしてグループ割込みを動かしております。