[H8-ML(1806)] H8/3664FのI2Cについて(質問)
From: 水上 克也 <mizukami_katsu@xxxxxxxxxx>
Date: 2002年04月30日(火)17時26分49秒
初めて投稿します。水上と申します。マイコン、ネット共に初心者
ですが宜しくお願いします。

現在、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

スレッド概略
[表示中](起点)
 └[1807(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]