1950342_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1950342_zh-CN

1950342_zh-CN

S32K344 SPI + DMA LPSPI_IP_异步传输快速

这个问题可能与以下问题类似: 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 时,一切工作正常。

回复:S32K344 SPI + DMA LPSPI_IP_AsyncTransmitFast

不幸的是我无法发布该项目,因为我只使用 S32DS 来配置 RTD 和生成驱动程序配置文件。

但我能够解决这些问题,不出所料,这是 DMA 的数据缓存问题。

至于设置问题:
  • 没有正确链接散射聚集通道。(每个频道都需要链接到下一个频道,最后一个频道需要标记为最终频道)
  • 没有正确设置 tx/rx dma 通道优先级(rx 高于 tx)
  • 没有正确确定 tx/rx dma 通道完成中断的优先级。(tx 高于 rx)
数据缓存问题归结于 MemMap.h文件。
nxp 使用以下定义:

#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"
并且在 _MemMap.h它们定义了编译器应该做什么。在这种情况下 #pragma GCC 部分 bss “.mcal_bss_no_cacheable”

#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
 

对于 gcc,除非您使用 s32ds ide 附带的 gcc 版本或下载其特定版本的 gcc,否则不支持这些类型的编译指示。
所以现在我只是检查了所有使用 dma 的 rtd 文件,并手动添加了正确的部分属性,使它们不可缓存 .mcal_bss_no_cacheable 或者 .mcal_data_no_cacheableso 对于上面的代码片段我必须添加:
 
__attribute__((section(".mcal_bss_no_cacheable")))
static const Dma_Ip_InitType * Dma_Ip_pxInit;

我更换了所有 _MemMap.h 使用空的虚拟文件来使编译器满意,这意味着我必须手动添加所有__attribute__ ((section())) 编译器指令。
回复:S32K344 SPI + DMA LPSPI_IP_AsyncTransmitFast

更正:` Lpspi_Ip_LPSPI_0_IrqTxDmaHandler`实际上确实被调用了,但只调用了一次,之后就再也没有调用过了。

回复:S32K344 SPI + DMA LPSPI_IP_AsyncTransmitFast

@PetrS或@davidtosenovjan你们对我可以检查什么有什么建议吗?

我注意到的另一件事是,tx 通道的 dma 中断被重复调用。它应该调用 Lpspi_Ip_LPSPI_0_IrqTxDmaHandler 回调,但它从来没有调用过。
Screenshot 2024-09-09 at 4.11.50 PM.png Screenshot 2024-09-09 at 4.11.45 PM.png

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-21-2025 08:49 PM
更新者: