この投稿の続きです。

温湿度ともに(たぶん)正常値を取得できました。大したものではありませんがGitHubにソースを上げてあります。

前回デバッガーで何箇所ものブレイクポイントでプログラムを止めながら動きを見ていたために気が付きませんでしたが、HAL_I2C_Master_Transmit()でデータ要求を送ってからHAL_I2C_Master_Receive()で計測値を受け取る間のウェイトがうまく動いていませんでした。

このプロジェクトではHDC1000に関しての処理をするソースコードをhdc1000.c/hに分離しています。以下、問題の箇所です。

uint16_t _getdata(HDC1000_HandleTypeDef *h, uint8_t address) {
 uint32_t wait_counter = 0;
 uint8_t receivedData[2];
 uint16_t data;

 if(HAL_I2C_Master_Transmit(h->i2c, h->address, &address, 1, 100) != HAL_OK) {
   return HDC1000_ERROR_CODE;
 }

 while(wait_counter++ <= 500000) {}

 if(HAL_I2C_Master_Receive(h->i2c, h->address, receivedData, 2, 100) != HAL_OK) {
   return HDC1000_ERROR_CODE;
 }

 data = receivedData[0] << 8;
 data |= receivedData[1];

 return data;
}

wait_counterを50000回インクリメントするというウェイトです。168MHzで動作するSTM32F4はカウントアップが速いので、これくらいはやらないと十分に「待ち」が効きません。あまりスマートなやり方ではないので他に良い方法を見つけたいところです。

Screenshot from 2017-08-23 19-43-35