ADC 2 種 (PCM1808、TM7705N) の評価 (2)

STM32 シリーズの SPI/I2S モジュールを I2S モードで使用する場合、基本的には送信/受信いずれか一方だけの動作をする「半2重」モードに限られます。
送信/受信を同時に行う「全2重」モードで使用したい場合には、I2S モード専用、スレーブ・モード専用の「別インスタンス」(「I2S2」なら「I2S2_ext」、「I2S3」なら「I2S3_ext」) を併用する必要があります。
STM32F411 では SPI は全部で 5 本に増え、5 本すべての SPI モジュールに I2S 機能が搭載されましたが、フル・デュプレクス、およびマスター・クロック出力が可能なのは F401 と同じ SPI2/I2S2、SPI3/I2S3 の 2 本だけです。
ext モジュールはスレーブ・モード専用なのでクロック生成機能はなく、CK/WS は本体の I2S モジュールの CK 入出力 / WS 入出力と接続されています。
そのため、1 サンプル・フレーム当たりのクロック数を本体の I2S モジュールと異なる設定にはできませんが、「別インスタンス」であるため、その他の入出力フォーマット、データ・ワード長、さらには TX/RX の設定を本体の I2S モジュールの設定とは独立に選べます。
つまり、本体と ext 側で送信/受信を分け合って「全2重」とするほかに、両方とも送信、あるいは両方とも受信となる設定も可能です。
ただし、STM32Cube ライブラリでサポートされているのは、Ext 側のフォーマット設定は本体と同じで、通信方向だけが異なる「全2重」となる設定のみです。
PCM1808 の評価では STM32CubeMX を利用してプログラムを作成したので、DAC として使用した AK4321 と PCM1808 ともに同じ MSB justified (左詰め) フォーマットを使用しました。
ここで、プログラム作成の過程で遭遇した「バグ」と思われる 2 点について触れておきます。
まず、STM32CubeMX v4.3.1 および v4.4.0 で I2S3ext 側のデータ入出力端子「I2S3ext_SD」を PB4 に割り付けるコードが正しく出力されません。
STM32CubeMX で生成される「stm32f4xx_hal_msp.c」の中の PB4 設定部分のコードの断片を下に示します。

    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

下から 2 行目の

    GPIO_InitStruct.Alternate = GPIO_AF5_SPI3;

は、正しくは

    GPIO_InitStruct.Alternate = GPIO_AF7_SPI3;

でなければなりません。
「AF5」だと「SPI1_MISO」に割り当てられてしまいます。
また、STM32CubeF4 v1.3.0 の I2S モジュールの初期化を行う「HAL_I2S_Init()」関数では、F411 で新設された I2S 用 PLL 専用の PLLI2SM の値を全く考慮せず、従来の PLLM の値を参照しているので、PLLI2SM != PLLM の場合に I2S 用のクロックが正しくない値に設定されてしまいます。
F401 でも動作するように PLLI2SM == PLLM の設定にしてあるのなら問題はありません。