こんにちは。
先日「H8/3687FのIIC2通信の手順( https://teratail.com/questions/31067)」でも似たような質問させていただいた者です。
RenesasのマイコンH8/3687Fを使用して、温度測定をするC言語のプログラムをコーディングしています。
その温度測定でIIC2通信を使用するのですが、マスタ受信動作時の挙動がおかしく、正しい値を得ることができません。
(変更)具体的には、通信自体はできるものの、得られた値を格納するICDRRが初期値0xFFのまま変わらず得られる温度が255℃になってしまいます。
(変更前)その挙動は、マスタ送信からマスタ受信に切り替えるためにICCR1のTRSビットを切り替えた後にクリアするICSRのTDREビットをクリアした際に、何故かICSRのTENDとRDRFが立ち上がってしまう、というものです。
その際、SDAOが1から0に切り替わっています。
(追記)通信中のレジスタの確認はステップモードとブレークポイントを利用して行なっていましたが、ブレークの位置でレジスタの値が変わってしまったため、質問内容を変えさせていただきます。
大変申し訳ありません
このような挙動が発生してしまう原因と対策を教えてください。
また、その他におかしな点があればご指摘願います。
宜しくお願い致します。
以下、プログラムのIIC2通信部分の関数です。
void reception_t(void)
{
unsigned int dmy;
IIC2.ICCR1.BYTE = 0x85; //////////////// ICE=1,CKS3~0=0101 IIC2.ICMR.BIT.MLS = 0; //初期設定 (1)// MLS IIC2.ICMR.BIT.WAIT = 1; //////////////// WAIT IIC2.SAR.BYTE = 0x90; //スレーブアドレス:(1001000)+ I2C: (0) while(IIC2.ICCR2.BIT.BBSY == 1){;} IIC2.ICCR1.BIT.MST = 1; //マスタ IIC2.ICCR1.BIT.TRS = 1; //送信モード IIC2.ICCR2.BYTE = (IIC2.ICCR2.BYTE & 0x3F) | 0x80; //開始条件発行 IIC2.ICDRT = 0x90; //スレーブアドレス(1001000)とR/W(0)を指定 while(IIC2.ICSR.BIT.TDRE == 0){;} //TDRE=1まで待機
// while(IIC2.ICSR.BIT.TEND == 0){;} // TEND=1
while(IIC2.ICIER.BIT.ACKBR == 1){;} //アクノリッジ
IIC2.ICDRT = 0x00; while(IIC2.ICSR.BIT.TDRE == 0){;} //TDRE=1まで待機
// while(IIC2.ICSR.BIT.TEND == 0){;} // TEND=1
while(IIC2.ICIER.BIT.ACKBR == 1){;} //アクノリッジ
IIC2.ICDRT = 0x91; //スレーブアドレス(1001000)とR/W(1)を指定 while(IIC2.ICSR.BIT.TDRE == 0){;} //TDRE=1まで待機
// while(IIC2.ICSR.BIT.TEND == 0){;} // TEND=1
while(IIC2.ICIER.BIT.ACKBR == 1){;} //アクノリッジ (この時点でICSR:0xC0)
/* マスタ受信モード */ IIC2.ICSR.BIT.TEND = 0; /* TENDクリア */ IIC2.ICCR1.BIT.TRS = 0; /* マスタ受信モード切替 */ IIC2.ICSR.BIT.TDRE = 0; /* TDREクリア */ IIC2.ICIER.BIT.ACKBT = 0; /* ACKBT=0を設定 */ dmy = IIC2.ICDRR; /* ダミーリード 受信開始 */ while(IIC2.ICSR.BIT.RDRF == 0){;} /* データの受信完了待ち(受信データ転送時、RDRF=1) */ IIC2.ICIER.BIT.ACKBT = 1; /* 次の受信動作を禁止 */ IIC2.ICCR1.BIT.RCVD = 1; temp_1 = IIC2.ICDRR; /* データリード(上位ビット、整数値) */ while(IIC2.ICSR.BIT.RDRF == 0){ /* データの受信完了待ち */ } IIC2.ICSR.BIT.STOP = 0; /* STOPフラグクリア */ IIC2.ICCR2.BYTE = IIC2.ICCR2.BYTE & 0x3F; //停止条件発行 while(IIC2.ICSR.BIT.STOP == 0){;} /* 停止条件生成待ち */ temp_2 = IIC2.ICDRR; /* データリード(下位ビット、小数値) */ IIC2.ICCR1.BIT.RCVD = 0; /* RCVDクリア */ IIC2.ICCR1.BYTE = 0x85; /* スレーブ受信モード切替 */
}
使用しているマイコンのマニュアルと学習用I/Oボードの説明書は以下のURL先です。
マイコン:http://japan.renesas.com/products/mpumcu/h8/h8300h_tiny/h83687_h83687n/Documentation.jsp
学習キット:http://www.hokutodenshi.co.jp/80/TinyEVA_s.pdf
回答3件
あなたの回答
tips
プレビュー