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

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

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

848 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

743 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
%3CLINGO-SUB%20id%3D%22lingo-sub-2353271%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3EThe%20mcxa154%20spi%20register%20is%20programmed%20and%20cannot%20communicate.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2353271%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3E%3CP%3EHello%2C%20I%20recently%20used%20the%20mcxa154%20chip's%20spi%20registers%20to%20program%2C%20and%20wanted%20to%20simplify%20%3CSPAN%3Ethe%20LPSPI_MasterTransferBlocking%20function%2C%20which%20is%20too%20slow%20to%20execute.%20I%20refer%20to%20his%20implementation%20to%20delete%20some%20code%2C%20and%20then%20found%20that%20I%20can't%20run%20it%2C%20the%20data%20read%20is%20all%200xff%2C%20and%20the%20send%20is%20not%20measured.%20Can%20you%20help%20me%20to%20see%20what%20is%20the%20problem%3F%3C%2FSPAN%3E%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%20translate%3D%22no%22%3Estatic%20void%20spi_send_recv(uint8_t%20*tx_buf%2C%20uint8_t%20*rx_buf%2C%20uint8_t%20len)%0A%7B%0A%2F%2F%20%20%20%20lpspi_transfer_t%20masterXfer%3B%0A%2F%2F%0A%2F%2F%20%20%20%20masterXfer.txData%20%20%20%20%20%20%3D%20tx_buf%3B%0A%2F%2F%20%20%20%20masterXfer.rxData%20%20%20%20%20%20%3D%20rx_buf%3B%0A%2F%2F%20%20%20%20masterXfer.dataSize%20%20%20%20%3D%20len%3B%0A%2F%2F%20%20%20%20masterXfer.configFlags%20%3D%20kLPSPI_MasterPcs0%20%7C%20kLPSPI_MasterPcsContinuous%20%7C%20kLPSPI_MasterByteSwap%3B%0A%2F%2F%20%20%20%20LPSPI_MasterTransferBlocking(LPSPI0%2C%20%26amp%3BmasterXfer)%3B%0A%20%20%20%20%0A%20%20%20%20if%20(len%20%3D%3D%200)%20return%3B%0A%20%20%20%20%0A%20%20%20%20uint8_t%20*txData%20%3D%20tx_buf%3B%0A%20%20%20%20uint8_t%20*rxData%20%3D%20rx_buf%3B%0A%20%20%20%20uint32_t%20rxRemaining%20%3D%20len%3B%0A%20%20%20%20uint32_t%20txRemaining%20%3D%20len%3B%0A%20%20%20%20uint32_t%20bytesPerFrame%20%3D%201%3B%20%20%2F*%20%E5%8F%AF%E9%85%8D%E7%BD%AE%E4%B8%BA1%2F2%2F4%20*%2F%0A%20%20%20%20uint32_t%20fifoSize%20%3D%20LPSPI_GetRxFifoSize(LPSPI0)%3B%0A%20%20%20%20%0A%20%20%20%20%2F*%201.%20%E6%A3%80%E6%9F%A5%E6%A8%A1%E5%9D%97%E7%A9%BA%E9%97%B2%20*%2F%0A%20%20%20%20uint32_t%20retry%20%3D%201000%3B%0A%20%20%20%20while%20(LPSPI_GetStatusFlags(LPSPI0)%20%26amp%3B%20kLPSPI_ModuleBusyFlag)%20%7B%0A%20%20%20%20%20%20%20%20if%20(--retry%20%3D%3D%200)%20return%3B%20%20%2F*%20%E8%B6%85%E6%97%B6%E8%BF%94%E5%9B%9E%20*%2F%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20retry%20%3D%201000%3B%0A%20%20%20%20while%20(LPSPI_GetStatusFlags(LPSPI0)%20%26amp%3B%20kLPSPI_ModuleBusyFlag)%20%7B%0A%20%20%20%20%20%20%20%20if%20(--retry%20%3D%3D%200)%20return%3B%20%20%2F*%20%E8%B6%85%E6%97%B6%E8%BF%94%E5%9B%9E%20*%2F%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F*%202.%20%E6%B8%85%E7%A9%BAFIFO%E5%92%8C%E7%8A%B6%E6%80%81%20*%2F%0A%20%20%20%20LPSPI_FlushFifo(LPSPI0%2C%20true%2C%20true)%3B%0A%20%20%20%20LPSPI_ClearStatusFlags(LPSPI0%2C%20kLPSPI_AllStatusFlag)%3B%0A%20%20%20%20%0A%20%20%20%20%2F*%203.%20%E6%B8%85%E9%99%A4NOSTALL%EF%BC%8C%E5%85%81%E8%AE%B8%E8%BF%9E%E7%BB%AD%E4%BC%A0%E8%BE%93%20*%2F%0A%20%20%20%20LPSPI0-%26gt%3BCFGR1%20%26amp%3B%3D%20~LPSPI_CFGR1_NOSTALL_MASK%3B%0A%20%20%20%20%0A%20%20%20%20%2F*%204.%20%E7%AD%89%E5%BE%85TX%20FIFO%E6%9C%89%E8%B6%B3%E5%A4%9F%E7%A9%BA%E9%97%B4%20*%2F%0A%20%20%20%20retry%20%3D%201000%3B%0A%20%20%20%20while%20(LPSPI_GetTxFifoCount(LPSPI0)%20%26gt%3B%3D%20fifoSize)%20%7B%0A%20%20%20%20%20%20%20%20if%20(--retry%20%3D%3D%200)%20return%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F*%205.%20%E4%B8%BB%E5%BE%AA%E7%8E%AF%EF%BC%9A%E4%BA%A4%E6%9B%BF%E6%94%B6%E5%8F%91%E9%98%B2%E6%AD%A2%E6%BA%A2%E5%87%BA%20*%2F%0A%20%20%20%20while%20(txRemaining%20%26gt%3B%200%20%7C%7C%20rxRemaining%20%26gt%3B%200)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%2F*%20%E5%8F%91%E9%80%81%E9%98%B6%E6%AE%B5%EF%BC%9A%E6%9C%89%E6%95%B0%E6%8D%AE%E4%B8%94FIFO%E6%9C%89%E7%A9%BA%E9%97%B4%20*%2F%0A%20%20%20%20%20%20%20%20if%20(txRemaining%20%26gt%3B%200%20%26amp%3B%26amp%3B%20LPSPI_GetTxFifoCount(LPSPI0)%20%26lt%3B%20fifoSize)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20txWord%20%3D%20*txData%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F*%20%E6%A0%B9%E6%8D%AE%E5%AE%9E%E9%99%85%E5%B8%A7%E5%A4%A7%E5%B0%8F%E6%89%93%E5%8C%85%EF%BC%88%E7%A4%BA%E4%BE%8B%E5%81%87%E8%AE%BE8%E4%BD%8D%EF%BC%89%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20LPSPI_WriteData(LPSPI0%2C%20txWord)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20txRemaining%20-%3D%20bytesPerFrame%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20txData%20%2B%3D%20bytesPerFrame%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%2F*%20%E6%8E%A5%E6%94%B6%E9%98%B6%E6%AE%B5%EF%BC%9A%E6%9C%89%E7%A9%BA%E9%97%B4%E4%B8%94FIFO%E6%9C%89%E6%95%B0%E6%8D%AE%20*%2F%0A%20%20%20%20%20%20%20%20if%20(rxRemaining%20%26gt%3B%200%20%26amp%3B%26amp%3B%20LPSPI_GetRxFifoCount(LPSPI0)%20%26gt%3B%200)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20rxWord%20%3D%20LPSPI_ReadData(LPSPI0)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20*rxData%20%3D%20(uint8_t)(rxWord%20%26amp%3B%200xFF)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20rxData%20%2B%3D%20bytesPerFrame%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20rxRemaining%20-%3D%20bytesPerFrame%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%2F*%206.%20%E6%B8%85%E9%99%A4%E8%BF%9E%E7%BB%AD%E4%BC%A0%E8%BE%93%E6%A0%87%E5%BF%97%20*%2F%0A%20%20%20%20LPSPI0-%26gt%3BTCR%20%3D%20(LPSPI_GetTcr(LPSPI0)%20%26amp%3B%20~(LPSPI_TCR_CONTC_MASK%20%7C%20LPSPI_TCR_CONT_MASK))%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2353271%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3EMCXA%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2354924%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20mcxa154%20spi%20%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B%EF%BC%8C%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1%E3%80%82%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2354924%22%20slang%3D%22zh-CN%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%20%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F82805%22%20target%3D%22_blank%22%3E%401668834026%3C%2FA%3E%20%3C%2FP%3E%0A%3CP%3EAfter%20a%20brief%20look%2C%20the%20core%20of%20the%20problem%20is%20not%20in%20the%20FIFO%20read%2Fwrite%20logic%2C%20but%20in%20the%20key%20LPSPI%20hardware%20process%20has%20been%20deleted%2C%20resulting%20in%20no%20effective%20SPI%20transmission%2C%20so%20the%20RX%20is%20all%200xFF.%3C%2FP%3E%0A%3CP%3ETwo%20main%20points%20were%20found%3A%3C%2FP%3E%0A%3CP%3EThe%20TCR%20(PCS%20%2F%20FRAMESZ%20%2F%20WIDTH%20%2F%20CONT)%20has%20not%20been%20reconfigured%2C%20and%20the%20TCR%20is%20shared%20with%20the%20TX%20FIFO%2C%20so%20the%20original%20configuration%20may%20not%20still%20be%20valid%20after%20flushing%20the%20FIFO.%20%3CBR%20%2F%3EPCS%20may%20not%20have%20been%20asserted%20correctly%2C%20and%20the%20slave%20is%20not%20actually%20selected.%3C%2FP%3E%0A%3CP%3ESuggestion%3A%20Keep%20the%20key%20steps%20in%20the%20SDK%20for%20TCR%20configuration%2C%20PCS%2C%20FRAMESZ%20calculation%2C%20TX%20triggering%20RX%2C%20and%20then%20streamline%20the%20looping%20logic.%3C%2FP%3E%0A%3CP%3EBR%3C%2FP%3E%0A%3CP%3EHarry.%3C%2FP%3E%3C%2FLINGO-BODY%3E