STM32F7 HALにおいて、Slave RxがNACKを生成しない

表題の問題を発見しました。

I2Cバスのスペックによれば、受信側は内部に「これ以上受信データを受信できない」場合には、NACKを返すことになっています(3.1.6節)。しかしながら、STM32F7 HALのHAL_I2C_Slave_Rx_IT()は、このNACKを生成しません。これは「STM32のHAL_I2C_Slave_Receive_IT()の挙動がおかしい」で説明したものとは違う問題です(先の件はL152だった。今回はF722)。NACKを送らない結果、受信バッファがいっぱいであるにもかかわらずマスターTXはデータを送り続けます。1バイト余計に送られてきた場合はスレーブは何事もなかったように正常終了し、2バイト余計に送られてきたと着た場合は、スレーブはクロックをストレッチします。

実装がでたらめですね。

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

コメントする

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