STM32のHAL_I2C_Slave_Receive_IT()の挙動がおかしい

表記の問題にぶち当たっています。

HAL_I2C_Slave_Recevie_ITは、I2Cスレーブ動作を行うHAL APIです。ポーリングではなく割り込みを使い、転送が終わるとHAL_I2C_SlaveRxCpltCallback()を呼び出します。RTOSで使うのに便利なAPIです。

ところが、このAPIを使うと、正常転送であるにもかかわらずHAL_I2C_ErrorCallback()が呼ばれます。ステータスを確認するとHAL_I2C_ERROR_AF (NAK受信)となっています。

実際の転送をロジアナで見ると、このとおりACKで終了しています。ソフトウェアがNAKと考える理由がありません。

転送は正常終了している

はじめは「紫」ライブラリの開発中にぶち当たったのですが、syslogを表示するとHAL_I2C_SlaveRxCpltCallbackではなくHAL_I2C_ErrorCallbackが呼ばれており、試しに紫もFreeRTOSも使わないベアメタルのプログラムで検証したところ、やはり同じ結果となりました。

マスターはCpltCallbackが呼ばれているが、スレーブはErrorCallbackが呼ばれている

発生及び試験環境は以下の通り

  • CubeMX version 5.0.0 for Linux
  • SW4STM32 version 1.15.0.201708311556 for Linux 64bit
  • STM32CubeFW_L1 version 1.8.1
  • Platform : Nucleo L152

この問題は、コミュニティに報告済みです。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください