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

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

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

Jump to solution
3,200 Views
5angxr
Contributor III

我有一个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 Kudos
Reply
1 Solution
3,170 Views
Harry_Zhang
NXP Employee
NXP Employee

Hi @5angxr 

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

希望可以帮助到您

BR

Hang

View solution in original post

0 Kudos
Reply
2 Replies
3,171 Views
Harry_Zhang
NXP Employee
NXP Employee

Hi @5angxr 

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

希望可以帮助到您

BR

Hang

0 Kudos
Reply
3,157 Views
5angxr
Contributor III
谢谢, 看起来是可行的
0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-1910970%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3EHow%20to%20change%20framesize%20during%20SPI%20DMA%20transfer%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1910970%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3E%3CP%3EI%20have%20a%20RT1042%20development%20board%2C%20and%20I%20want%20to%20do%20SPI%20DMA%20transfer%20like%20this%3A%3C%2FP%3E%3CP%3E1.%20There%20are%20two%20transmission%20modes%2C%20a%20and%20b.%20Pull%20down%20a%20specific%20GPIO%20before%20entering%20a%20mode%2C%20and%20pull%20down%20a%20specific%20GPIO%20before%20entering%20b%20mode.%20a%3A%20Send%20command%20(size%20is%201%20byte)%3B%20b%3A%20Send%20data%20(size%20is%201~N%20bytes).%3C%2FP%3E%3CP%3E2.%20When%20sending%20commands%2C%20the%20framesize%20of%20spi%20is%208%20bits%3B%20when%20sending%20data%2C%20the%20framesize%20of%20spi%20is%2064%20or%20more%2C%20in%20order%20to%20achieve%20higher%20transmission%20efficiency.%3C%2FP%3E%3CP%3EI%20tried%20to%20determine%20the%20transmission%20mode%20when%20spi%20is%20sending%20to%20change%20the%20framesize%20of%20spi%2C%20but%20it%20didn't%20work.%20Can%20you%20help%20me%3F%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%20translate%3D%22no%22%3Euint32_t%20spi_send(const%20uint8_t%20*buf%2C%20uint32_t%20len%2C%20uint8_t%20cmd_or_data)%0A%7B%0A%20%20%20%20uint32_t%20res%3B%0A%20%20%20%20lpspi_transfer_t%20masterXfer%3B%0A%20%20%20%20uint32_t%20bitsPerFrame%20%20%3D%20((EXAMPLE_LPSPI_MASTER_BASEADDR-%26gt%3BTCR%20%26amp%3B%20LPSPI_TCR_FRAMESZ_MASK)%20%26gt%3B%26gt%3B%20LPSPI_TCR_FRAMESZ_SHIFT)%20%2B%201U%3B%0A%20%20%20%20%0A%20%20%20%20if%20(cmd_or_data%20%3D%3D%20DATA)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20EDMA_StopTransfer(%26amp%3BlpspiEdmaMasterTxDataToTxRegHandle)%3B%0A%20%20%20%20%20%20%20%20if%20(bitsPerFrame%20!%3D%2064)%0A%20%20%20%20%20%20%20%20%20%20%20%20LPSPI_SetFrameSize(EXAMPLE_LPSPI_MASTER_BASEADDR%2C%2064)%3B%0A%20%20%20%20%20%20%20%20EDMA_StartTransfer(%26amp%3BlpspiEdmaMasterTxDataToTxRegHandle)%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%20if%20(cmd_or_data%20%3D%3D%20CMD)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20EDMA_StopTransfer(%26amp%3BlpspiEdmaMasterTxDataToTxRegHandle)%3B%0A%20%20%20%20%20%20%20%20if%20(bitsPerFrame%20!%3D%208)%0A%20%20%20%20%20%20%20%20%20%20%20%20LPSPI_SetFrameSize(EXAMPLE_LPSPI_MASTER_BASEADDR%2C%208)%3B%0A%20%20%20%20%20%20%20%20EDMA_StartTransfer(%26amp%3BlpspiEdmaMasterTxDataToTxRegHandle)%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20masterXfer.txData%20%20%20%3D%20(uint8_t%20*)buf%3B%0A%20%20%20%20masterXfer.rxData%20%20%20%3D%20NULL%3B%0A%20%20%20%20masterXfer.dataSize%20%3D%20len%3B%0A%20%20%20%20isTransferCompleted%20%3D%20false%3B%0A%20%20%20%20res%20%3D%20LPSPI_MasterTransferEDMALite(EXAMPLE_LPSPI_MASTER_BASEADDR%2C%20%26amp%3Bg_m_edma_handle%2C%26amp%3BmasterXfer)%3B%0A%20%20%20%20while%20(!isTransferCompleted)%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20return%20res%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1915765%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3ERe%3A%20How%20to%20change%20framesize%20during%20SPI%20DMA%20transfer%3F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1915765%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3EThanks%2C%20that%20seems%20to%20work%3C%2FLINGO-BODY%3E