この質問は、次の質問と似ているかもしれません https://community.nxp.com/t5/S32K/S32K312-LPSPI-DMA-AsyncTransmitFast/m-p/1923811
私はデバイスに2つのspiトランザクションを送信する必要があります。Lpspi_Ip_AsyncTransmitFastを使おうとしています。
const Lpspi_Ip_FastTransferType ft[] = {
{
.ExternalDevice = &Lpspi_Ip_DeviceAttributes_SpiExternalDevice_0_Instance_0,
.TxBuffer = txbuf_wren,
.RxBuffer = rxbuf_wren,
.DefaultData = 0,
.Length = 1,
.KeepCs = false,
},
{
.ExternalDevice = &Lpspi_Ip_DeviceAttributes_SpiExternalDevice_0_Instance_0,
.TxBuffer = txbuf,
.RxBuffer = rxbuf,
.DefaultData = 0,
.Length = 10,
.KeepCs = false,
}
};
void send_spi_txn(void)
{
Lpspi_Ip_StatusType status = Lpspi_Ip_AsyncTransmitFast( ft, 2, Lpspi_Ip_Callback_lpspi_0_dma );
if (status != LPSPI_IP_STATUS_SUCCESS)
{
failed_spi_dma = true;
}
}
私はすでにLpspi_Ip_AsyncTransmitを使用して単一のトランザクションを送信し、次に完了コールバックから別のトランザクションを送信することをテストしましたが、これは明らかに理想的ではないので、代わりにtransferlistを使用できるようにしたいと思います。
問題は、データが送信されていないことです。初めて Lpspi_Ip_AsyncTransmitFast が呼び出されたときは成功が報告されますが、その後のすべての呼び出しは失敗します。また、SPI転送がないことも確認できます。ロジックアナライザーでは、しかし私がただLpspi_Ip_AsyncTransmitとき、すべてが正常に動作します。
残念ながら、S32DSを使用してRTDを構成し、ドライバー構成ファイルを生成しているだけなので、プロジェクトを投稿することはできません。
しかし、私は問題を解決することができました、そして当然のことながら、それはDMAのデータキャッシュの問題でした。
#define MCL_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
#include "Mcl_MemMap.h"
/* Pointer to the DMA Initialization Configuration. Based on this configuration pointer, the DMA Driver obtains all information for the Logic Channels and corresponding Channel Configurations. The Pointer is loaded when Dma_Ip_Init() is called. */
static const Dma_Ip_InitType * Dma_Ip_pxInit;
#define MCL_STOP_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
#include "Mcl_MemMap.h"
#ifdef MCL_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
/**
* @file Mcl_MemMap.h
*/
#undef MCL_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
#define ENTERED_MCL_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
#ifndef MEMMAP_MATCH_ERROR
#define MEMMAP_MATCH_ERROR
#else
#ifndef MCL_STOP_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
#error "MemMap.h, no valid matching start-stop section defined."
#endif
#endif
/**
* @file Mcl_MemMap.h
*/
#undef MEMMAP_ERROR
#pragma GCC section bss ".mcal_bss_no_cacheable"
#endif
__attribute__((section(".mcal_bss_no_cacheable")))
static const Dma_Ip_InitType * Dma_Ip_pxInit;訂正: 'Lpspi_Ip_LPSPI_0_IrqTxDmaHandler' は実際には呼び出されますが、一度だけ呼び出されます。その後は二度と呼び出されません
@PetrSまたは@davidtosenovjan、どちらかが私が確認できるものについて何か提案がありますか?
さらに、TX チャネルの DMA 割り込みが繰り返し呼び出されていることに気付きました。コールバックを呼び出すことになっていますがLpspi_Ip_LPSPI_0_IrqTxDmaHandler決して呼び出しません。