Posted at

HAL_Driver + STM(Nucleo)系マイコンでI2C通信をする

More than 1 year has passed since last update.


概要


  • HAL_Driverを使用してセンサーとI2C通信を行います。


環境


  • Nucleo

  • CubeMX

  • System Workbench for STM AC6


実装


  • ピンの設定等はCubeMXでマイコンボードに合わせたものとします。

  • 基本的にはCubeMXでI2Cの設定を適切にしていれば自動生成されるコードのハンドルを使用すれば通信ができるはずです。

  • 自動生成されたコードのmain.cにグローバル変数としてi2cのハンドルが宣言されているのでHAL_Initなどの初期化コードのあとに通信部分の実装を記述すればI2Cの通信が行えます。

  • 実際にI2C通信を行う場合は下記APIを使用します。


#define I2C_ADDRESS 0x82
#define I2C_BUF_SIZE 8
#define I2C_TIMEOUT 100

uint8_T tx_buf[I2C_BUF_SIZE] = { 0x00 }, rx_buf[I2C_BUF_SIZE] = { 0x00 };

/**
* I2C 送信
*/

HAL_I2C_Master_Transmit(&hi2c1, I2C_ADDRESS, tx_buf, I2C_BUF_SIZE, 100);

/**
* I2C 受信
*/

HAL_I2C_Master_Receive(&hi2c1, I2C_ADDRESS|0x01 , rx_buf, I2C_BUF_SIZE, 100);


  • 上記2つのAPIからはHAL_StatusTypeDef型の実行結果が返ってくるので戻り値の値でハンドリングを行います。

  • うまくいかない場合でもHAL_Driverを使用している場合はソースコードが内包されているのでステップ実行などで原因を探ります。

デフォルトでは最適化オプションがO2に設定されているのでデバッグ実行がし辛くなっています。

最適化されてもうまく動くコードを記述することが理想ではありますが、

開発段階では、プロジェクトエクスプローラでプロジェクトを右クリックしてPropertyから

C/C++ Build > SettingsからOptimizationをNoneに設定しておけば、

デバッグビルド時にデバッガがいい感じに動いてくれます。

Flashに余裕がない場合は気合でカバーします!