Duplex I2Sの信号を入れ替える

先ほど投稿したように、STM32H7のDuplex I2Sはマスター・スレーブの切り替えによってSDI/SDOの役割が入れ替わるという頭の痛い問題が有ります。この問題はSPIの設定で解決できるのですが、CubeIDEからこれを変更する手立てがありません。

そこで、この問題を一時的に回避するためのワークアラウンドを検討してみました。結論から言えば、2行追加で信号を入れ替えることが出来ます。

下のコードは、CubeIDEが生成したmain関数に手を入れた部分。設定として、I2S1をDuplex Masterにしています。

int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */
#if 1
    // Swapping SDI and SDO
    __HAL_RCC_SPI1_CLK_ENABLE();
    SET_BIT(SPI1->CFG2, SPI_CFG2_IOSWP);
#endif
    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_USART3_UART_Init();
    MX_I2S1_Init();
    MX_SPI2_Init();
    /* USER CODE BEGIN 2 */

条件コンパイルで囲まれた2行が今回追加した部分です。1行目でSPI1のクロックをイネーブルにし、2行目でSDI/SDOを入れ替えます。1行目を省くと動作しません。

波形を見てみましょう。以下の図では、上のチャンネルがSDI、下のチャンネルがSDOです。デフォルト( #if 0 )では、マスター設定時にSDOが出力になっています。CODECはつながっていませんので、SDIに信号はありません。

次に、上記プログラムを#if 1として信号線を入れ替えます。すると下の図のようにSDIから信号が出力され、SDOは入力になります。

STがHAL/CubeIDEを修正するまでは、このワークアラウンドで切り抜けることが出来そうです。

コメントする

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