我有一个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;
}
解決済! 解決策の投稿を見る。
Hi @5angxr
你可以尝试下在不同模式下停止当前传输,改变 framesize 后再重新启动传输。以下是一个改进的实现思路,确保在更改 framesize 时正确停止和重启传输:
1. 确保传输完成后再更改 framesize。你需要确保当前的 DMA 传输已经完全停止,然后再更改 framesize,以防止在更改 framesize 过程中出现冲突。
2. 在重新设置 framesize 后,重新初始化传输设置。
希望可以帮助到您
BR
Hang
Hi @5angxr
你可以尝试下在不同模式下停止当前传输,改变 framesize 后再重新启动传输。以下是一个改进的实现思路,确保在更改 framesize 时正确停止和重启传输:
1. 确保传输完成后再更改 framesize。你需要确保当前的 DMA 传输已经完全停止,然后再更改 framesize,以防止在更改 framesize 过程中出现冲突。
2. 在重新设置 framesize 后,重新初始化传输设置。
希望可以帮助到您
BR
Hang