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;
}こんにちは、 @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
こんにちは@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
こんにちは@zyzzzz
DMAチャネルの設定はDMAMUX0を使っているのに気づきました。ただし、リファレンスマニュアルに付属するS32K3xx_DMAMUX_map.xlsxファイルを参照すれば、LPSPI_5 DMA要求がDMAMUX0ではなくDMAMUX1にマッピングされていることを確認できます。
DMAMUXインスタンス0ではなくインスタンス1を使用するように設定を更新してください。
こんにちは、 @VaneB
ご返信ありがとうございます。おっしゃることは理解できますが、現時点ではDMAMUXインスタンス1を選択することはできません。
DMA_INSTANCE_0を選択してからDMAハードウェアチャネル16を選択すると、DMA MuxソースとしてDMA_MUX_1_LPSPI_5_TX_REQUESTを選択できます。