初めて投稿します。水上と申します。マイコン、ネット共に初心者 ですが宜しくお願いします。 現在、H8/3664Fを用いて、I2Cバス通信にてビデオデコーダIC他を 制御するシステムの検討をしているのですが、上手く動きません。 お知恵をお借りしたく、お願い申し上げます。 SCI3にてPCからの4バイト(1パケット)のデータを受信し、それを グローバル配列に格納後、I2Cにてその受信データをデコーダに 送信することを考えています。 SCI3は1バイト受信毎に割り込み処理でデータを格納します。I2Cは マスター受信モードのみの使用で、割り込み処理は行なっていません。 SCI3のデータは、先頭の1バイトがSCI3送信バイト数、2バイト目が スレーブアドレス、3バイト目がサブ(レジスタ)アドレス、 4バイト目がデータ、という形です。I2Cでは2バイト目からを使用 しています。 起動時は初期パラメータを直接3664FよりI2Cでデコーダに出力 します。(これは波形で動作している事を確認しました) 次に、1パケットのデータをSCI3受信後、最初の1回だけはI2Cへ 書き出せる(波形で確認)のですが、次の1パケットが出力され ません。 E10Tで見る限り、2回目以降はICDRへデータが書き込まれず、0x54 というデータのままで、不変に見受けられるのです。 (受信データではないようです) 以下、下手ですがソースの抜粋です。2回目以降では開始条件にも なっていない(波形が観測できない)ようにも見受けられます。 関数 SIO_data_check() で受信データを見て、4バイト受信していれば 関数 SCI2IIC() でデータを書き出す、という流れです。 /***********************************************************************/ /* void main(void) */ /***********************************************************************/ void main(void) { IIC_setup(); // I2Cバス接続 SAA7111A_setup(); // SAA7111Aへ初期化データ書き込み IIC_close(); // I2Cバス切断 while(1) // 無限ループ { SIO_data_check(); } } /***********************************************************************/ /* void SIO_data_check(void) */ /***********************************************************************/ void SIO_data_check(void) { if((buffer[0] == rx_byte) && (int_counter == rx_byte)) { // 先頭データが0x04ならば // かつ、カウンタ値が0x04ならば SCI2IIC(); // IIC書き出し } } /***********************************************************************/ /* function IIC_setup() */ /***********************************************************************/ void IIC_setup(void) { IIC.ICCR.BYTE = 0x89; // 0x89:10001001 IIC.EQU.ICE1.UN_ICMR.BYTE = 0x28; // 0x28:00011000 TSCR.BYTE = 0x01; // 転送レート指定 } /***********************************************************************/ /* function void IIC_start(void) */ /***********************************************************************/ void IIC_start(void) { IIC.ICCR.BIT.IRIC = 0; while(IIC.ICCR.BIT.BBSY != 0) { // バスビジーフラグがクリアされるまでウェイ ト } IIC.ICCR.BYTE = IIC.ICCR.BYTE | 0x30;// マスター送信モードに設定 IIC.ICCR.BYTE = (IIC.ICCR.BYTE & 0xFE) | 0x04; // 開始条件を生成 while(IIC.ICCR.BIT.IRIC == 0) { // IRICフラグに1が立つまでウェイト } while((IO.PDR5.BIT.B6 != 0) & (IO.PDR5.BIT.B7 != 0)) { // SDA、SCL共にLowになるまでウェイト } } /***********************************************************************/ /* function void IIC_write(unsigned char) */ /***********************************************************************/ void IIC_write(unsigned char IIC_data) { set_imask_ccr(1); // 割り込み禁止 IIC.EQU.ICE1.UN_ICDR = IIC_data; // ICDRレジスタにデータ書き 込み IIC.ICCR.BIT.IRIC = 0; // 転送終了確認のためにIRICクリア set_imask_ccr(0); // 割り込み許可 while(IIC.ICCR.BIT.IRIC == 0) // IRICフラグに1が立つまでウェイト { } } /***********************************************************************/ /* function IIC_close() */ /***********************************************************************/ void IIC_close(void) { IIC.ICCR.BIT.IRIC = 0; // 転送終了確認のためにIRICフラグクリア IIC.ICCR.BYTE = IIC.ICCR.BYTE & 0xFA; // 停止条件の発行 while((IO.PDR5.BIT.B6 != 0) & (IO.PDR5.BIT.B7 != 0)) { // SDA、SCL共にHighになるまでウェイト } } /***********************************************************************/ /* void void SAA7111A_setup() */ /***********************************************************************/ void SAA7111A_setup(void) { unsigned char counter = 0; for(counter = 0; counter < SAA_data_size; counter++) { // SAA7111Aへ20バイトのデータ書き込み IIC_start(); IIC_write(SAA_slave_address | write_flag); IIC_write(SAA_sub_address[counter]); IIC_write(SAA_data[counter]); IIC_close(); } } /***********************************************************************/ /* void SCI2IIC(void) */ /***********************************************************************/ void SCI2IIC(void) { unsigned char *data_address; data_address = &buffer[0]; // 受信バッファ配列のアドレスを代入 IIC_start(); IIC_write(*(data_address + 1) | write_flag)); // 2バイト目 IIC_write(*(data_address + 2)); // 3バイト目 IIC_write(*(data_address + 3)); // 4バイト目 IIC_close(); } エラーチェックなどは省略しています。初回だけは動作するというのも どうしてか解らない状況です。 何分初心者でして、このようにソースを掲示することも始めてなのです。 マナーの面でも不備がありましたらお教え下さい。 よろしくお願いします。 ++++++++++++++++++++++ 〒467-8567 愛知県名古屋市瑞穂区明前町6-14 (株)エルモ社 技術部 水上克也 Tel:052-811-5136 Fax:052-811-5179 e-mail:mizukami_katsu@xxxxxxxxxx