mcxa154 spi 寄存器编程,无法通信。

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

mcxa154 spi 寄存器编程,无法通信。

635 Views
1668834026
Contributor I

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));
}

 

Labels (1)
0 Kudos
Reply
1 Reply

530 Views
Harry_Zhang
NXP Employee
NXP Employee

Hi @1668834026 

简单看了一下,问题核心不在 FIFO 读写逻辑,而在 关键的 LPSPI 硬件流程被删掉了,导致实际没有产生有效的 SPI 传输,所以 RX 全是 0xFF

主要发现两个点:

没有重新配置 TCR(PCS / FRAMESZ / WIDTH / CONT),而 TCR 又和 TX FIFO 共享,Flush FIFO 之后原有配置不一定还生效。
PCS 可能没有正确 assert,slave 实际上没被选中。

建议:先保留 SDK 里对 TCR 配置、PCS、FRAMESZ 计算、TX 触发 RX 这些关键步骤,再精简循环逻辑。

BR

Harry

0 Kudos
Reply