センサーを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 © 面白半分