如何在SPI进行DMA传输的过程中改变framesize?

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

如何在SPI进行DMA传输的过程中改变framesize?

跳至解决方案
207 次查看
5angxr
Contributor II

我有一个RT1042开发板, 我想做的SPI DMA传输是这样的:

1. 有a, b两种传输模式, 进入a模式前拉低一个特定GPIO, 进入b模式前拉低一个特定GPIO. a: 发送命令(大小为 1 byte); b: 发送数据(大小为 1~N bytes).

2. 发送命令时, spi的framesize为8bit; 发送数据时, spi的framesize为64或者更多, 为了达到更高的传输效率.

我试着在spi发送时判断传输模式来改变spi的framesize, 但发现行不通, 可以帮助一下吗?

uint32_t spi_send(const uint8_t *buf, uint32_t len, uint8_t cmd_or_data)
{
    uint32_t res;
    lpspi_transfer_t masterXfer;
    uint32_t bitsPerFrame  = ((EXAMPLE_LPSPI_MASTER_BASEADDR->TCR & LPSPI_TCR_FRAMESZ_MASK) >> LPSPI_TCR_FRAMESZ_SHIFT) + 1U;
    
    if (cmd_or_data == DATA)
    {
        EDMA_StopTransfer(&lpspiEdmaMasterTxDataToTxRegHandle);
        if (bitsPerFrame != 64)
            LPSPI_SetFrameSize(EXAMPLE_LPSPI_MASTER_BASEADDR, 64);
        EDMA_StartTransfer(&lpspiEdmaMasterTxDataToTxRegHandle);
    }
    else if (cmd_or_data == CMD)
    {
        EDMA_StopTransfer(&lpspiEdmaMasterTxDataToTxRegHandle);
        if (bitsPerFrame != 8)
            LPSPI_SetFrameSize(EXAMPLE_LPSPI_MASTER_BASEADDR, 8);
        EDMA_StartTransfer(&lpspiEdmaMasterTxDataToTxRegHandle);
    }
    
    masterXfer.txData   = (uint8_t *)buf;
    masterXfer.rxData   = NULL;
    masterXfer.dataSize = len;
    isTransferCompleted = false;
    res = LPSPI_MasterTransferEDMALite(EXAMPLE_LPSPI_MASTER_BASEADDR, &g_m_edma_handle,&masterXfer);
    while (!isTransferCompleted)
    {
    }
    
    return res;
}

 

0 项奖励
回复
1 解答
177 次查看
HangZhang
NXP Employee
NXP Employee

Hi @5angxr 

你可以尝试下在不同模式下停止当前传输,改变 framesize 后再重新启动传输。以下是一个改进的实现思路,确保在更改 framesize 时正确停止和重启传输:
1. 确保传输完成后再更改 framesize。你需要确保当前的 DMA 传输已经完全停止,然后再更改 framesize,以防止在更改 framesize 过程中出现冲突。
2. 在重新设置 framesize 后,重新初始化传输设置。

希望可以帮助到您

BR

Hang

在原帖中查看解决方案

0 项奖励
回复
2 回复数
178 次查看
HangZhang
NXP Employee
NXP Employee

Hi @5angxr 

你可以尝试下在不同模式下停止当前传输,改变 framesize 后再重新启动传输。以下是一个改进的实现思路,确保在更改 framesize 时正确停止和重启传输:
1. 确保传输完成后再更改 framesize。你需要确保当前的 DMA 传输已经完全停止,然后再更改 framesize,以防止在更改 framesize 过程中出现冲突。
2. 在重新设置 framesize 后,重新初始化传输设置。

希望可以帮助到您

BR

Hang

0 项奖励
回复
164 次查看
5angxr
Contributor II
谢谢, 看起来是可行的
0 项奖励
回复