SHT21 のサンプルコードの中で,参照されていると思われる部分を抜き出してみました。 これはホールドマスターモードで使っているようです。 最初に SHT21 に I2C バス経由でコマンドを書き込むためにスタートコンディションを発行し,SHT21 のアドレスを書き込みモードで送信して,SHT21 を選択しています。次に,eSHT2xMeasureType で指 定されたコマンド(ホールドマスターモードでの RH 測定コマンドか T 測定コマンド)を送信していま す。これで,SHT21 は測定を開始するかと思います。 引き続いて,測定結果を読み出すために,スタートコンディションを発行し,I2C バスの方向を読み出 しに変更して SHT21 のアドレスを送信します。すると,SHT21 は ACK の応答後に測定結果が準備でき るで,SCL ラインをロウに引くことで,バスを止めます。測定の結果が準備できたら,SHT21 は測定結 果の最初のビットを SDA に出力し,SCL を引くのをやめます。SHT21 が SCL をロウに引くのをやめた こと(SCL が立ち上がる)を確認したら,結果の読み出しを行います。結果は 2 回に分けて読み出し, 最後にチェックサムを読み出しています。 //=========================================================================== u8t SHT2x_MeasureHM(etSHT2xMeasureType eSHT2xMeasureType, nt16 *pMeasurand) //=========================================================================== { u8t checksum; //checksum u8t data[2]; //data array for checksum verification u8t error=0; //error variable I2C バスを使用するためにスタートコンディ u16t i; //counting variable ションを発行しています。 SHT21 にコマンドを書くためにスレーブとし //-- write I2C sensor address and command -て,書き込みで選択しています。 I2c_StartCondition(); ホールドマスタモードでの湿度測定コマンド error |= I2c_WriteByte (I2C_ADR_W); // I2C Adr switch(eSHT2xMeasureType) { case HUMIDITY: error |= I2c_WriteByte (TRIG_RH_MEASUREMENT_HM); break; case TEMP : error |= I2c_WriteByte (TRIG_T_MEASUREMENT_HM); break; default: assert(0); ホールドマスタモードでの温度測定コマンド } 測定結果読み出しのためにスタートコンディ //-- wait until hold master is released -I2c_StartCondition(); ションを発行しています。 error |= I2c_WriteByte (I2C_ADR_R); 結果読み出しのためにスレーブとして,読み SCL=HIGH; // set SCL I/O port as input 出しで選択しています。 for(i=0; i<1000; i++) // wait until master hold is released or ホールド解除確認のために SCL を入力に変更 { DelayMicroSeconds(1000); // a timeout (~1s) is reached if (SCL_CONF==1) break; } タイムアウトの計測 //-- check for timeout -if(SCL_CONF==0) error |= TIME_OUT_ERROR; 測定結果の読み出し //-- read two data bytes and one checksum byte -pMeasurand->s16.u8H = data[0] = I2c_ReadByte(ACK); pMeasurand->s16.u8L = data[1] = I2c_ReadByte(ACK); checksum=I2c_ReadByte(NO_ACK); //-- verify checksum -error |= SHT2x_CheckCrc (data,2,checksum); I2c_StopCondition(); return error; 測定結果のチェックサムの読み出し ストップコンディションを発行し,I2C バス を解放 } ちなみに,データ受信の I2c_ReadByte やデータ送信の I2c_WriteByte 関数では,SCL 信号や SDA 信号 ポートの出力ラッチ(SCL_CONF や SDA_CONF)は LOW(0)にした状態で,ポートモードレジスタ (SCL や SDA)を出力(0)にすると LOW 出力,入力(1)にすると HIGH 出力することで制御してい ます。(疑似的な N-ch オープンドレイン出力制御)
© Copyright 2024 ExpyDoc