STM32H7のI2S

STM32H7のI2SがSTM32F7のそれから仕様変更されていることに気が付きました。

STM32F7のI2Sは、SPIペリフェラルに間借りする形で実装されています。このペリフェラルはSimplexでしか動作させることができません。つまり、送信(DAC)、か受信(ADC)のいずれかを排他的に使用できます。なお、クロックはマスター・スレーブいずれにも対応可能です。また、I2SデータFIFOはありません。

STM32H7のI2Sも、SPIペリフェラルに間借りしています。しかしながら、STM32H7のそれはDuplex動作が可能になっています。この場合、SDI/SDO端子からADC/DACと同時に通信できます。また、STM32F7になかったI2S FIFOが搭載されています。

さて、アップグレードされているのはいいのですが、HALはどうなっているのでしょう。

調べてみたところ、HALのAPIも同じです。ということは、送受別々のAPIが存在し、送受別々の割込みが可能になるということです。SAIやSTM32F7のSimplex I2Sはこれを利用して送受非同期のFsに対応できるようになっています。このため、SAIもSimplex I2Sも送受でHALの制御変数を別々に持っています。

一方、STM32H7のDuplex I2Sは送受のクロックが互いに同期しています。そのため、非同期動作可能のインターフェースを使うメリットはありません。むしろ、STM32 CubeHALのI2Sは、Duplex I2Sの場合は送受でペリフェラル制御変数を共用していることから、送受の割込みを識別できないという問題が発生します。

これは、紫のようなラッパー・ライブラリを設計するときには頭の痛い問題です。どうするか考えているところです。

コメントする

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