1950342_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1950342_ja-JP

1950342_ja-JP

S32K344 SPI + DMA Lpspi_Ip_AsyncTransmitFast

この質問は、次の質問と似ているかもしれません 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とき、すべてが正常に動作します。

日時: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.pngScreenshot 2024-09-09 at 4.11.45 PM.png

Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 08:48 PM
Updated by: