我有一个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;
}