title

◎温度湿度計 センサー変更

センサーを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;
    

最後にタイミングを示してこの章を終わります。