SH2 SH7085 (4) iic (2) ― 2009年05月13日 21時57分44秒
SH7080 グループ ハードウェアマニュアルの図18.18 マスタ送信モードのフローチャート例 を見ると次のようになっている。
[1] SCL、SDAラインの状態判定
[2] マスタ送信モードに設定
[3] 開始条件発行
[4] 第1バイト(スレーブアドレス+R/W)の送信データの設定
[5] 1バイト送信終了待ち
[6] 指定したスレーブデバイスからのアクノリッジの判定
[7] 2バイト目以降(最終バイトを除く)の送信データの設定
[8] ICDRTエンプティ待ち
[9] 最終バイトの送信データの設定
[10] 最終バイトの送信終了待ち
[11] TENDフラグクリア
[12] STOPフラグクリア
[13] 停止条件発行
[14] 停止条件生成待ち
[15] スレーブ受信モードに設定 TDREをクリア
このフローではアクノリッジは一度しか見てないがいいのだろうか?
まずはこのとおりに組んでみよう
[6] のようにそのまま返したんじゃだめなんだろうな...
これでリトライすると開始条件を連続発行することになってしまう。
とすると、戻る前に停止条件を発行するか
おっと、その前にイニシャルを済ませなくては
これでどうだ!
[1] SCL、SDAラインの状態判定
[2] マスタ送信モードに設定
[3] 開始条件発行
[4] 第1バイト(スレーブアドレス+R/W)の送信データの設定
[5] 1バイト送信終了待ち
[6] 指定したスレーブデバイスからのアクノリッジの判定
[7] 2バイト目以降(最終バイトを除く)の送信データの設定
[8] ICDRTエンプティ待ち
[9] 最終バイトの送信データの設定
[10] 最終バイトの送信終了待ち
[11] TENDフラグクリア
[12] STOPフラグクリア
[13] 停止条件発行
[14] 停止条件生成待ち
[15] スレーブ受信モードに設定 TDREをクリア
このフローではアクノリッジは一度しか見てないがいいのだろうか?
まずはこのとおりに組んでみよう
[1] while( IIC2.ICCR2.BIT.BBSY!=0 ); [2] IIC2.ICCR1.BIT.MST = 1; IIC2.ICCR1.BIT.TRS = 1; [3] IIC2.ICCR2.BIT.BBSY = 1; IIC2.ICCR2.BIT.SCP = 0; [4] IIC2.ICDRT = SlaveAddress | IIC_DATA_W; [5] while ((IIC2.ICSR.BIT.TEND) == 0) ; [6] if(IIC2.ICIER.BIT.ACKBR != 0) return (1); [7] IIC2.ICDRT = (unsigned char)((Address>>8) & 0xff); [8] while ((IIC2.ICSR.BIT.TDRE) == 0) ; IIC2.ICDRT = (unsigned char)(Address & 0xff); while ((IIC2.ICSR.BIT.TDRE) == 0) ; [9] IIC2.ICDRT = data; [10] while ((IIC2.ICSR.BIT.TEND) == 0) ; [11] IIC2.ICSR.BIT.TEND = 0; [12] IIC2.ICSR.BIT.STOP = 0; [13] IIC2.ICCR2.BIT.BBSY = 0; IIC2.ICCR2.BIT.SCP = 0; [14] while ((IIC2.ICSR.BIT.STOP)==0) ; [15] IIC2.ICCR1.BIT.MST = 0; IIC2.ICCR1.BIT.TRS = 0; IIC2.ICSR.BIT.TDRE = 0;
[6] のようにそのまま返したんじゃだめなんだろうな...
これでリトライすると開始条件を連続発行することになってしまう。
とすると、戻る前に停止条件を発行するか
[6] if(IIC2.ICIER.BIT.ACKBR != 0){ IIC2.ICSR.BIT.TEND = 0; IIC2.ICSR.BIT.STOP = 0; IIC2.ICCR2.BIT.BBSY = 0; IIC2.ICCR2.BIT.SCP = 0; while ((IIC2.ICSR.BIT.STOP)==0) ; return (1); }
おっと、その前にイニシャルを済ませなくては
01: STB.CR3.BIT._IIC2 = 0; 02: PFC.PBCRL1.BIT.PB3MD = 0x4; 03: PFC.PBCRL1.BIT.PB2MD = 0x4; 04: IIC2.ICCR1.BYTE = 0xA5; 05: IIC2.ICIER.BIT.ACKE = 1;
これでどうだ!
コメント
トラックバック
このエントリのトラックバックURL: http://syslab.asablo.jp/blog/2009/05/13/4303112/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。