这个问题可能与以下问题类似: https://community.nxp.com/t5/S32K/S32K312-LPSPI-DMA-AsyncTransmitFast/mp/1923811
我必须向一个设备发送两个 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 发送单个事务,然后从完成回调发送另一个事务,但这显然不是理想的,所以希望能够使用传输列表。
问题是没有数据被发送。第一次调用 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 回调,但它从来没有调用过。