2387348_ja-JP

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

2387348_ja-JP

2387348_ja-JP

MCXA153:LPSPIデータバースト転送。

こんにちは、

リファレンス・マニュアルMCXA153 TDBRnおよびRDBRn LPSPIレジスタの説明が含まれています。
「TDBRnおよびRDBRnレジスタは、DMAコントローラで使用するための送信FIFOへのバースト転送をサポートします」。
これらのレジスタを使ったバースト転送のサンプルコードを誰か共有してもらえますか?

よろしくお願いします
ボグダン

通信・制御(I3C |I2C |SPI |FlexCAN |イーサネット |FlexIO)MCXARe: MCXA153: LPSPI data burst transfer.

こんにちは、 @bogdan_u

申し訳ありませんが、現在、関連する事例はございません。

私が見つけた最も近い例はMCXA153 LPSPI_MasterTransferEDMALite()とeDMAを使っていますが、ドライバーはTDR/RDRをLPSPI_GetTxRegisterAddress() / LPSPI_GetRxRegisterAddress()経由でターゲットにしており、バーストエイリアスウィンドウではありません。

でも、試してみることはできると思います。

typedef struct
{
    uint32_t cmd;          
    uint32_t data[128];    
} lpspi_burst_tx_t;
static inline uint32_t LPSPI_TCBR_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_TCBR_OFFSET);
}

static inline uint32_t LPSPI_TDBR0_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_TDBR0_OFFSET);
}

static inline uint32_t LPSPI_RDBR0_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_RDBR0_OFFSET);
}

void LPSPI_StartTxBurstDMA(LPSPI_Type *base,
                           edma_handle_t *txDmaHandle,
                           uint32_t *cmd_plus_data,
                           uint32_t nwords)
{
    edma_transfer_config_t cfg = {0};

    cfg.srcAddr           = (uint32_t)&cmd_plus_data[0];
    cfg.destAddr          = LPSPI_TCBR_Address(base);
    cfg.srcOffset         = 4;
    cfg.destOffset        = 4;
    cfg.srcTransferSize   = kEDMA_TransferSize4Bytes;
    cfg.destTransferSize  = kEDMA_TransferSize4Bytes;
    cfg.minorLoopBytes    = 4;
    cfg.majorLoopCounts   = nwords + 1u;

    EDMA_ResetChannel(txDmaHandle->base, txDmaHandle->channel);
    EDMA_SetTransferConfig(txDmaHandle->base, txDmaHandle->channel, &cfg, NULL);

    EDMA_StartTransfer(txDmaHandle);
    LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable);
}


void LPSPI_StartRxBurstDMA(LPSPI_Type *base,
                           edma_handle_t *rxDmaHandle,
                           uint32_t *rx_words,
                           uint32_t nwords)
{
    edma_transfer_config_t cfg = {0};

    cfg.srcAddr           = LPSPI_RDBR0_Address(base);
    cfg.destAddr          = (uint32_t)&rx_words[0];
    cfg.srcOffset         = 4;
    cfg.destOffset        = 4;
    cfg.srcTransferSize   = kEDMA_TransferSize4Bytes;
    cfg.destTransferSize  = kEDMA_TransferSize4Bytes;
    cfg.minorLoopBytes    = 4;
    cfg.majorLoopCounts   = nwords;

    EDMA_ResetChannel(rxDmaHandle->base, rxDmaHandle->channel);
    EDMA_SetTransferConfig(rxDmaHandle->base, rxDmaHandle->channel, &cfg, NULL);

    EDMA_StartTransfer(rxDmaHandle);
    LPSPI_EnableDMA(base, kLPSPI_RxDmaEnable);
}

BR

ハリー


タグ(1)
評価なし
バージョン履歴
最終更新日:
2 週間前
更新者: