在调用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;
}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
关于您的配置,我有一些意见。您已将 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
我注意到您正在使用 DMAMUX0 配置 DMA 通道。但是,如果您参考参考手册中包含的 S32K3xx_DMAMUX_map.xlsx 文件,您可以验证 LPSPI_5 DMA 请求映射到 DMAMUX1,而不是 DMAMUX0。
请更新配置,使用 DMAMUX 实例 1 而不是实例 0。
Hi, @VaneB
很高兴收到你的回复,我明白了你的意思,但是现在不能选择DMAMUX instance 1。
在选择DMA_INSTANCE_0的前提下,选择Dma Hardware Channel 16,就能选择Dma Mux Source为DMA_MUX_1_LPSPI_5_TX_REQUEST。