今回はPIC32MX250F128BをターゲットにMPLAB X v5.45+Harmony3を使用してI2C通信を行いました。その際にポイントとなる設定について紹介します。I2C接続の温湿度センサHS3001の読み込みを行いました。なお、ターゲットへの書き込みはPickit3を使用しまし、MPLAB Xには予め、MPLAB Harmony 3 Launcher(旧名称 MPLAB Harmony Configurator 3)をインストールしています。
@プロジェクトファイル作成
MPLAB XのFile→New ProjectからMPLAB Harmony 3のプロジェクトを作成します。
AHarmony 3設定
Tools→Embedded→Harmony Configurator 3を選択します。左下のAvailable ComponentsからI2C2をクリックし、I2C2を追加します。SPI1が追加されると左上(Active Components)及び中央(Project Graph)にI2C2が表示されます。
中央(Project Graph)のI2C2をクリックし、右のConfiguration Optionsの設定項目を必要に応じて変更します。通常はデフォルトで問題ありません。
また、今回はデバッグ用途にprintfを使用してuartからデバッグ情報を出力するため、UART2とSTDIOを追加しています。必要に応じてUART2のボーレートを右のConfiguration Optionsから変更してください。
Bピンアサイン設定
MHC→Tools→Pin Configurationを選択します。Pin DiagramからI2CのSDA2、SCL2を割り付けします。Pin SettingsからI2Cの外付けプルアップ抵抗を省略するためにRB2、RB3のプルアップを有効にしました。
Cコード生成
設定完了後にGenerate Codeでコードを生成します。
DI2C通信関数
I2C通信をするためのコードを追加します。I2C通信関数はSource Files/config/default/peripheral/i2c/master内のplib_i2c2_master.cで定義されています。I2C初期化関数は既にinitialization.cに追加されているため、接続するデバイスに応じてI2C読み書き関数を追加します。I2C読み書きを同時にする場合はI2C2_WriteRead関数、読み込みのみの場合はI2C2_Read、書き込みのみの場合はI2C2_Writeの関数を使用します。なお、STM32のHALライブラリでは8bitアドレス(R/Wのbitを含める)で定義しますが、Harmony3のI2Cアドレスは7bitアドレスを定義します。
#define HS300X_ADDR (0x88>>1)
void Get_HS300X_Data(volatile int16_t *tmp, volatile int16_t *hmd)
{
uint8_t dat[4];
int16_t tmp_dat,hmd_dat;
{
uint8_t dat[4];
int16_t tmp_dat,hmd_dat;
float tempf;
float humdf;
float humdf;
I2C2_Read(HS300X_ADDR,dat,4);
while(I2C2_IsBusy()==true);
I2C2_Write(HS300X_ADDR,NULL,0);
while(I2C2_IsBusy()==true);
while(I2C2_IsBusy()==true);
I2C2_Write(HS300X_ADDR,NULL,0);
while(I2C2_IsBusy()==true);
tmp_dat = (dat[2]<<8)+dat[3];
tmp_dat = tmp_dat>>2;
hmd_dat = ((dat[0]&0x3F)<<8)+dat[1];
tmp_dat = tmp_dat>>2;
hmd_dat = ((dat[0]&0x3F)<<8)+dat[1];
humdf=(float)hmd_dat/(16383.0f)*100.0f;
tempf=((float)tmp_dat)/(16383.0f)*165.0f-40.0f;
tempf=((float)tmp_dat)/(16383.0f)*165.0f-40.0f;
*hmd = (int16_t)(humdf*100.0f);
*tmp = (int16_t)(tempf*100.0f);
*tmp = (int16_t)(tempf*100.0f);
return;
}
}
温湿度センサHS3001は温湿度を読み出しする際、アドレスのみ書き込みすると測定開始される少し特殊な仕様です。そのため、 I2C2_Write ( HS300X_ADDR, NULL, 0)という空データを書き込む処理が入っています。