/******************************************************************************* * skHDC - 湿度センサ(HDC1000)用関数ライブラリ * * * * HDC_Init - デバイスの初期化を行う処理 * * HDC_Read - 湿度・温度を読込む処理 * * HDC_Receive - デバイスのレジスターからデータを読込む処理 * * HDC_Send - デバイスのレジスターへデータを書込む処理 * * * * ============================================================================ * * VERSION DATE BY CHANGE/COMMENT * * ---------------------------------------------------------------------------- * * 1.00 2015-04-23 きむ茶工房 Create * * ============================================================================ * * MPLAB IDE(V8.63) MPLAB X(v2.15) * * MPLAB(R) XC8 C Compiler Version 1.00/1.32 * * ============================================================================ * * * * PIC24F用ライブラリに改修 * * 2017/1/2 N.Ishii * *******************************************************************************/ #include #include #include "skHDC_PIC24F.h" #include "skI2C_PIC24F_lib.h" #include "nokiaGlcdlib.h" // 遅延関数のみ利用するので追加:161228 static int Sensor_adrs ; // デバイスのI2Cアドレスを保存する変数 /******************************************************************************* * ans = HDC_Init(id, address) * * デバイスの初期化を行う処理 * * デバイスの動作を確かめる為にデバイスIDのチェックを行います。 * * 温度(14bit)・湿度(14bit)を個別に読出す様に設定を初期化します。 * * 設定データを変更する場合は、HDC.hのCONFIG_DT_Hを書き換え変更して下さい。 * * id : デバイスの識別IDを指定します * * address : デバイス(スレーブ)のI2Cアドレスを指定します * * ans : 0=正常  * * 1=デバイスのIDチェックエラー * * ============================================================================ * * * * PIC24F用に改修 * * 2016/12/25 N.Ishii * *******************************************************************************/ int HDC_Init(int id ,int address) { union { unsigned int i ; unsigned char c[2] ; } data ; int ans ; Sensor_adrs = address ; // 電源投入後15ms待ち delay_ms(15) ; // デバイスの識別IDをチェックする処理 HDC_Receive(DEVICE_ID_ADRS,(unsigned char *)data.c) ; if (data.i == HDC1000_ID) { // IDは一致したならデバイスを初期化する処理 ans= 0; data.c[0] = CONFIG_DT_H ; data.c[1] = CONFIG_DT_L ; HDC_Send(CONFIG_ADRS,data.c) ; } else ans = 1 ; // IDが一致しない return ans ; } /******************************************************************************* * ans = HDC_Receive(reg_adrs,*data) * * デバイスのレジスターからデータを読込む処理 * * reg_adrs : 読出すデータのレジスターアドレスを指定する * * *data : 読出したデータの格納先を指定する(2byte読込む) * * ans : 0=正常 1=異常(相手からACKが返ってこない) * * ============================================================================ * * * * PIC24F用に改修 * * 2017/1/2 N.Ishii * *******************************************************************************/ void HDC_Receive(char reg_adrs,unsigned char *data) { I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(reg_adrs) ; // レジスタアドレスを指定 if ( (reg_adrs == TEMP_ADRS) || (reg_adrs == HUMI_ADRS) ) { // 温度・湿度の読出しなら変換が完了するまで待つ // delay_ms(7) ; delay_ms(10) ; // これでやっと温湿度の計測結果が正しく表示されるようになった。 // スペック的には、6.5mStypで、max表示なし。実験では、8mSでOKだったが、マージンを加味して10mSとした。 } I2C_rStart(Sensor_adrs,RW_1) ; // リピート・スタートコンディションを発行する data++ ; *data = (char)I2C_Receive(ACK) ; // HIGHバイト読出し data-- ; *data = (char)I2C_Receive(NOACK) ; // LOWバイト読出し I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * ans = HDC_Send(reg_adrs,*data) * * デバイスのレジスターへデータを書込む処理 * * reg_adrs : 書出すデータのレジスターアドレスを指定する * * *data : 書出すデータの格納先を指定する(2byte書込む) * * ans : 0=正常 1=異常(相手からACKが返ってこない) * * ============================================================================ * * * * PIC24F用に改修 * * 2016/12/26 N.Ishii * *******************************************************************************/ void HDC_Send(char reg_adrs,unsigned char *data) { int i ; I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(reg_adrs) ; // レジスタアドレスを指定 for (i=0 ; i<2 ; i++) { I2C_Send(*data) ; // 指定個数分書き込む(送信する) data++ ; } I2C_Stop() ; // ストップコンディションを発行する }