2392897_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2392897_zh-CN

2392897_zh-CN

SPI communication failed in DMA mode(S32k328)

在调用Rm_Init(&Rm_Config);函数后再串口输出就会出现硬件错误错误。

注释掉Rm_Init(&Rm_Config),调用  显示状态一直为busy,我只列出了关键的初始化函数。

        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)

hi,@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 MUX 被初始化了两次。我建议只保留一个初始化函数。


BR,VaneB

Re: SPI communication failed in DMA mode(S32k328)

@zyzzzz

我注意到您正在使用 DMAMUX0 配置 DMA 通道。但是,如果您参考参考手册中包含的 S32K3xx_DMAMUX_map.xlsx 文件,您可以验证 LPSPI_5 DMA 请求映射到 DMAMUX1,而不是 DMAMUX0。

请更新配置,使用 DMAMUX 实例 1 而不是实例 0。

Re: SPI communication failed in DMA mode(S32k328)

Hi, @VaneB 

很高兴收到你的回复,我明白了你的意思,但是现在不能选择DMAMUX instance 1。

在选择DMA_INSTANCE_0的前提下,选择Dma Hardware Channel 16,就能选择Dma Mux Source为DMA_MUX_1_LPSPI_5_TX_REQUEST。

标记 (1)
无评分
版本历史
最后更新:
2 周之前
更新人: