hello,我最近使用mcxa154芯片的spi寄存器编程,想简化LPSPI_MasterTransferBlocking函数,这个函数执行起来太慢了。我参考他的实现删了一些代码,然后发现没法跑起来,读到的数据全是0xff,发送没测。可以帮忙看看是什么问题吗?
static void spi_send_recv(uint8_t *tx_buf, uint8_t *rx_buf, uint8_t len)
{
// lpspi_transfer_t masterXfer;
//
// masterXfer.txData = tx_buf;
// masterXfer.rxData = rx_buf;
// masterXfer.dataSize = len;
// masterXfer.configFlags = kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap;
// LPSPI_MasterTransferBlocking(LPSPI0, &masterXfer);
if (len == 0) return;
uint8_t *txData = tx_buf;
uint8_t *rxData = rx_buf;
uint32_t rxRemaining = len;
uint32_t txRemaining = len;
uint32_t bytesPerFrame = 1; /* 可配置为1/2/4 */
uint32_t fifoSize = LPSPI_GetRxFifoSize(LPSPI0);
/* 1. 检查模块空闲 */
uint32_t retry = 1000;
while (LPSPI_GetStatusFlags(LPSPI0) & kLPSPI_ModuleBusyFlag) {
if (--retry == 0) return; /* 超时返回 */
}
retry = 1000;
while (LPSPI_GetStatusFlags(LPSPI0) & kLPSPI_ModuleBusyFlag) {
if (--retry == 0) return; /* 超时返回 */
}
/* 2. 清空FIFO和状态 */
LPSPI_FlushFifo(LPSPI0, true, true);
LPSPI_ClearStatusFlags(LPSPI0, kLPSPI_AllStatusFlag);
/* 3. 清除NOSTALL,允许连续传输 */
LPSPI0->CFGR1 &= ~LPSPI_CFGR1_NOSTALL_MASK;
/* 4. 等待TX FIFO有足够空间 */
retry = 1000;
while (LPSPI_GetTxFifoCount(LPSPI0) >= fifoSize) {
if (--retry == 0) return;
}
/* 5. 主循环:交替收发防止溢出 */
while (txRemaining > 0 || rxRemaining > 0)
{
/* 发送阶段:有数据且FIFO有空间 */
if (txRemaining > 0 && LPSPI_GetTxFifoCount(LPSPI0) < fifoSize)
{
uint32_t txWord = *txData;
/* 根据实际帧大小打包(示例假设8位) */
LPSPI_WriteData(LPSPI0, txWord);
txRemaining -= bytesPerFrame;
txData += bytesPerFrame;
}
/* 接收阶段:有空间且FIFO有数据 */
if (rxRemaining > 0 && LPSPI_GetRxFifoCount(LPSPI0) > 0)
{
uint32_t rxWord = LPSPI_ReadData(LPSPI0);
*rxData = (uint8_t)(rxWord & 0xFF);
rxData += bytesPerFrame;
rxRemaining -= bytesPerFrame;
}
}
/* 6. 清除连续传输标志 */
LPSPI0->TCR = (LPSPI_GetTcr(LPSPI0) & ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK));
}