センサーをAM2320に変更する場合。
通常スリープ状態に入っているので読み出す前に起動させます。起動させるにはスレーブアドレス7bit:0x5c(0xb8)にアクセスするのですがまだ起動してませんので アクノーリッジは戻りません。(エラー処理が必要になります。)「800μ~3m秒待ってからストップコンディションを発行しろ、ハードウェアIICなら自動 でやってくれる」とデータシートにありますが自動発行されるタイミングは80μ秒程度でした。(80μ秒でも動作しましたがコールバックルーチンにwaitを入れることにします。)
起動タイミングのノーアクノリッジ(呼びだした0x5c(0xb8)にはデバイスが存在しない)はエラーにせずにストップコンディションを発行します。static void r_iica0_callback_master_error(MD_STATUS flag) { /* Start user code. Do not edit comment generated here */ if(flag == MD_SPT) P7_bit.no6 = 1; if(flag == MD_NACK){ if(Am2320_wakeup_flag==1){ //mainプログラムで立てる。立っていれば起動タイミングと判断する。 wait(1000); //ここにwaitを入れる。 Am2320_wakeup_flag =0; //起動タイミングと承知したので下げる。 SPT0 = 1U; return; } } else P7_bit.no7 = 1; while(1); /* End user code. Do not edit comment generated here */ }main関数内では
if( five_sec_flag == 1){ five_sec_flag = 0; wait(60000); //60000+30000で実測 90mSec > 80mSec(必要待機時間) wait(30000); // EI(); P5_bit.no0 = 1; Am2320_wakeup_flag = 1; //ここで立てて起動タイミングであることを周知する。 iic_Tx_Buf[0] = 0xac; R_IICA0_Master_Send(0xb8,iic_Tx_Buf, 0,1); * * *
その後0x5c(0xb8)に 0x03 (function code) +0x00 (starting address) +0x04 (register length)を送ります。
最低1.5m秒待ってから読み出せば 例として0x03(Function Code)+0x04(data length)+0x03(high humidity)+0x39(low humidity) + 0x01 (high temperature) +0x15(low temperature)+0xE1(CRC checksum low byte) + 0xFE(CRC checksum high byte);が取り出せる。 ということですがはじめの2バイト0x03(Function Code)+0x04(data length)は要求した値のエコー(ようなもの)です。CRCは使いません。
データは 0339H = 3×256 +3×16 +9 = 825 => humidity = 825÷10 = 82.5% RH; 0115H = 1×256 +1×16 +5 = 277 => temperature = 277÷10 = 27.7 ℃ となりDHT20に比べると計算は簡単です。
Am2320_wakeup_flag = 1; iic_Tx_Buf[0] = 0xac; R_IICA0_Master_Send(0xb8,iic_Tx_Buf, 0,1); // 起動 P5_bit.no0 = 0; wait(100); iic_Tx_Buf[0] = 0x03; iic_Tx_Buf[1] = 0x00; iic_Tx_Buf[2] = 0x04; R_IICA0_Master_Send(0xb8,iic_Tx_Buf, 3,1); //データー要求 wait(3000); R_IICA0_Master_Receive(0xb8,iic_Rx_Buf, 6,16); //データー読み出し wait(6000); //60000+30000で実測 90mSec > 80mSec(必要待機時間) Humi = (uint32_t)(iic_Rx_Buf[2]*256+iic_Rx_Buf[3])/10; //2バイトデータを16bitに変換 itoa(Humi_str,Humi); Temp = (uint32_t)(iic_Rx_Buf[4]*256+iic_Rx_Buf[5])/10; //2バイトデータを16bitに変換 itoa(Temp_str,Temp); P5_bit.no1 = 1; disp_data(); P5_bit.no1 = 0;
最後にタイミングを示してこの章を終わります。
Copyright © 面白半分