/******************************************************************************* * skLPS25H - 大気圧センサLPS25H(I2C接続)用関数ライブラリ * * * * PressureInit - デバイスの初期化を行う処理 * * PressureReceive - デバイスから指定個数のデータを受信する処理 * * PressureSend - デバイスに指定個数のデータを送信する処理 * * PressurePD - デバイスの"パワーダウン"と"動作中"を切り替える処理 * * PressureRead - 圧力・温度を読込み気圧値を計算する処理 * * AltitudeCalc - 気圧値(hPa)から高度を計算する処理 * * * * ============================================================================ * * VERSION DATE BY CHANGE/COMMENT * * ---------------------------------------------------------------------------- * * 1.00 2015-01-21 きむ茶工房 Create * * ============================================================================ * * MPLAB IDE(V8.63) MPLAB X(v2.15) * * MPLAB(R) XC8 C Compiler Version 1.00/1.32 * * ============================================================================ * * * * PIC24F用ライブラリに改修 * * 2016/12/27 N.Ishii * *******************************************************************************/ #include #include #include "skLPS25H_PIC24F.h" #include "skI2C_PIC24F_lib.h" #include "nokiaGlcdlib.h" static int Sensor_adrs ; // デバイスのI2Cアドレスを保存する変数 /******************************************************************************* * ans = PressureInit() * * デバイスの初期化を行う処理 * * デバイスの動作を確かめる為にデバイスIDのチェックを行います。 * * 分解能のモード(内部平均の数)設定は、デフォルトで動作させます。 * * 制御レジスタ1は"動作中モード","1Hzの更新速度",Bit0-3=0 で初期化しています * * 初期化データを変更する場合は、skLPSxx.hのRES_CONF_DATA/CTRL_REG1_DATAを * * 書き換え変更して下さい。 * * ans : 0=正常  * * 1=デバイスのIDチェックエラー * * ============================================================================ * * * * PIC24F用に改修 * * 2016/12/25 N.Ishii * *******************************************************************************/ int PressureInit(int id ,int address) { int ans ; unsigned char data[2] ; Sensor_adrs = address ; // デバイスの識別IDをチェックする処理 PressureReceive(WHO_AM_I_ADRS,&data[0],1) ; // WHO_AM_Iの内容をチェック if (data[0] == id) ans = 0 ; // IDは一致した else ans = 1 ; // IDが一致しない // デバイスを初期化する処理 if (ans == 0) { // 圧力分解能のモード設定(圧力=384回 温度=64回 で平均を行う) //data[0] = RES_CONF_DATA ; //ans = PressureSend(RES_CONF_ADRS,&data[0],1) ; // 制御レジスタ1の設定(動作中モード,出力データ速度は1Hz) data[0] = CTRL_REG1_DATA ; PressureSend(CTRL_REG1_ADRS,&data[0],1) ; delay_ms(1) ; // 確実に設定が終了するのを待つ // FIFOの設定を行う(移動平均を行う) data[0] = CTRL_REG2_DATA ; // FIFO ON PressureSend(CTRL_REG2_ADRS,&data[0],1) ; data[0] = FIFO_CTRL_DATA ; // FIFO_MEAN MODE・8 samples PressureSend(FIFO_CTRL_ADRS,&data[0],1) ; } return ans ; } /******************************************************************************* * ans = PressureReceive(reg_adrs,*data,kosu) * * デバイスから指定個数のデータを受信する処理 * * reg_adrs : 読出すデータのレジスターアドレスを指定する * * 連続的に読出す場合は、読出すレジスターの先頭アドレスを指定 * * *data : 読出したデータの格納先を指定する * * kosu : 読出すデータのバイト数を指定する * * ans : 0=正常 1=異常(相手からACKが返ってこない) * * ============================================================================ * * * * PIC24F用に改修 * * 2016/12/25 N.Ishii * *******************************************************************************/ void PressureReceive(char reg_adrs,unsigned char *data,char kosu) { int i , ack ; char sub ; if (kosu == 1) sub = reg_adrs ; // 単発読み出しモード else sub = reg_adrs | 0x80 ; // 連続読み出しモード I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(sub) ; // レジスタアドレスを指定 I2C_rStart(Sensor_adrs,RW_1) ; // リピート・スタートコンディションを発行する /// デバッグ用:測定開始点トリガ 170103 // LATAbits.LATA4 = 0; // 緑LED点灯→ コメントアウト:170120 for (i=1 ; i<=kosu ; i++) { if (i==kosu) ack = NOACK ; else ack = ACK ; // *data = I2C_Receive(Sensor_adrs,ack); // 指定個数分読み出す(受信する) *data = I2C_Receive(ack); // 指定個数分読み出す(受信する) data++ ; } /// デバッグ用:読出し完了トリガ 170103 // LATAbits.LATA4 = 1; // コメントアウト:170120 I2C_Stop() ; // ストップコンディションを発行する } /******************************************************************************* * ans = PressureSend(reg_adrs,*data,kosu) * * デバイスに指定個数のデータを送信する処理 * * reg_adrs : 書出すデータのレジスターアドレスを指定する * * 連続的に書出す場合は、書出すレジスターの先頭アドレスを指定 * * *data : 書出すデータの格納先を指定する * * kosu : 書出すデータのバイト数を指定する * * ans : 0=正常 1=異常(相手からACKが返ってこない) * * ============================================================================ * * * * PIC24F用に改修 * * 2016/12/27 N.Ishii * *******************************************************************************/ void PressureSend(char reg_adrs,unsigned char *data,char kosu) { int i ; char sub ; if (kosu == 1) sub = reg_adrs ; // 単発書き込みモード else sub = reg_adrs | 0x80 ; // 連続書き込みモード I2C_Start(Sensor_adrs,RW_0); // スタートコンディションを発行する I2C_Send(sub) ; // レジスタアドレスを指定 for (i=0 ; i