SHT21 のサンプルコードの中で,参照されていると思われる部分を

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 オープンドレイン出力制御)