2392897_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2392897_ja-JP

2392897_ja-JP

DMAモードでのSPI通信が失敗しました(S32k328)

Rm_Init(&Rm_Config); 関数を呼び出した後、シリアルポート出力を試みるとハードウェアエラーが発生します。

Rm_Init(&Rm_Config) をコメントアウトして呼び出します。  ステータスは「ビジー」のままです。主要な初期化関数のみをリストアップしました。

        if (Lpspi5_ready_flag == 0u)
        {
            spi_status = Lpspi_Ip_AsyncTransmit(&LPSPI5_EXTERNAL_DEVICE,
                                                &Spi5TxBuffer[0],
                                                &Spi5RxBuffer[0],
                                                NUMBER_OF_BYTES,
                                                Spi5_EndCallback);
            if (spi_status != LPSPI_IP_STATUS_SUCCESS)
            {
                printf("SpiTp: AsyncTransmit FAIL\r\n");
                return;
            }
        }
static void system_init(void)
{
    /* Initialize Clock */
    Clock_Ip_StatusType Status_Init_Clock = CLOCK_IP_ERROR;
    Status_Init_Clock = Clock_Ip_Init(Clock_Ip_aClockConfig);
 
    /* Initialize all pins using the Port driver */
    Siul2_Port_Ip_PortStatusType Status_Init_Port = SIUL2_PORT_ERROR;
    Status_Init_Port = Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals,
    		g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);

    /* Initialize interrupt */
    IntCtrl_Ip_Init(&IntCtrlConfig_0);
        /* Initialize Dma */
    IntCtrl_Ip_EnableIrq(DMATCD0_IRQn);
    IntCtrl_Ip_EnableIrq(DMATCD1_IRQn);
    Dma_Ip_Init(&Dma_Ip_xDmaInitPB);
    Dma_Mux_Ip_Init(&Dma_Mux_Config);
    //Rm_Init(&Rm_Config);

}
    /* Initialize each Spi hardware units using*/
    Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_0_Instance_4);
    Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_1_Instance_5);
    Lpspi_Ip_Init(&Lpspi_Ip_PhyUnitConfig_SpiPhyUnit_2_Instance_3);

    /* Update Framesize */
    Lpspi_Ip_UpdateFrameSize(&LPSPI4_EXTERNAL_DEVICE, 8U);
    Lpspi_Ip_UpdateFrameSize(&LPSPI5_EXTERNAL_DEVICE, 8U);
    Lpspi_Ip_UpdateFrameSize(&LPSPI3_EXTERNAL_DEVICE, 8U);

    /* Update Transfered Bit order */
    Lpspi_Ip_UpdateLsb(&LPSPI4_EXTERNAL_DEVICE, TRUE);
    Lpspi_Ip_UpdateLsb(&LPSPI5_EXTERNAL_DEVICE, TRUE);
    Lpspi_Ip_UpdateLsb(&LPSPI3_EXTERNAL_DEVICE, TRUE);

    /* Update Transfer Mode */
    Lpspi_Ip_UpdateTransferMode(LPSPI4_EXTERNAL_DEVICE.Instance, LPSPI_IP_INTERRUPT);
    Lpspi_Ip_UpdateTransferMode(LPSPI5_EXTERNAL_DEVICE.Instance, LPSPI_IP_INTERRUPT);
    Lpspi_Ip_UpdateTransferMode(LPSPI3_EXTERNAL_DEVICE.Instance, LPSPI_IP_INTERRUPT);
/* SPI5 AsyncTransmit 完成回调 */
static void Spi5_EndCallback(uint8 Instance, Lpspi_Ip_EventType Event)
{
    (void)Instance;

    if (Event == LPSPI_IP_EVENT_END_TRANSFER)
    {
        Spi5TransferOk    = TRUE;
        Spi5TransferFault = FALSE;
    }
    else /* LPSPI_IP_EVENT_FAULT */
    {
        Spi5TransferFault = TRUE;
        Spi5TransferOk    = FALSE;
    }

    Spi5TransferDone = TRUE;
}

Re: SPI communication failed in DMA mode(S32k328)

こんにちは、 @VaneB

ご回答に基づき、 RM構成のDMAMUXソースをチャンネル16とチャンネル17に変更し、DMAも対応するチャンネル16とチャンネル17に設定しました。

1. コメントアウトしました

Rm_Init(&Rm_Config);

予約する

Dma_Mux_Ip_Init(&Dma_Mux_Config);

割り込みは正常に発生しました。

2. コメントアウトしました

Dma_Mux_Ip_Init(&Dma_Mux_Config);

予約する

Rm_Init(&Rm_Config);

それでもハードウェアエラーが発生します。


今は正常に動作しています。この問題が解決すれば完璧です。本当にありがとうございました!

BR、zyzzzz

Re: SPI communication failed in DMA mode(S32k328)

こんにちは@zyzzzz

あなたの設定に関して、一つ気づいた点があります。LPSPI5をDMAを使用するように設定していますが、しかし、RM構成では、チャネル0とチャネル1に割り当てられたDMAのMUXソースはLPSPI_1に対応し、LPSPI_5に対応していません。

また、既に電話をかけている場合は、

Dma_Mux_Ip_Init(&Dma_Mux_Config);

また、以下の番号に電話する必要はありません。

Rm_Init(&Rm_Config);

あるいはその逆も然り。これは、Rm_Init() が内部的に以下の初期化シーケンスを実行するためです。

Rm_Init()
└─ Rm_InitGroup1()
   └─ Rm_Ipw_Dma_Mux_Init()
      └─ Dma_Mux_Ip_Init()

その結果、DMAマルチプレクサが2回初期化されることになる。初期化関数は1つだけにしておくことをお勧めします。


BR、VaneB

Re: SPI communication failed in DMA mode(S32k328)

こんにちは@zyzzzz

DMAチャネルの設定はDMAMUX0を使っているのに気づきました。ただし、リファレンスマニュアルに付属するS32K3xx_DMAMUX_map.xlsxファイルを参照すれば、LPSPI_5 DMA要求がDMAMUX0ではなくDMAMUX1にマッピングされていることを確認できます。

DMAMUXインスタンス0ではなくインスタンス1を使用するように設定を更新してください。

Re: SPI communication failed in DMA mode(S32k328)

こんにちは、 @VaneB

ご返信ありがとうございます。おっしゃることは理解できますが、現時点ではDMAMUXインスタンス1を選択することはできません。

DMA_INSTANCE_0を選択してからDMAハードウェアチャネル16を選択すると、DMA MuxソースとしてDMA_MUX_1_LPSPI_5_TX_REQUESTを選択できます。

Tags (1)
No ratings
Version history
Last update:
11 hours ago
Updated by: