初めて投稿します。水上と申します。マイコン、ネット共に初心者
ですが宜しくお願いします。
現在、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