<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic mcxa154 spi 寄存器编程，无法通信。 in MCX Microcontrollers</title>
    <link>https://community.nxp.com/t5/MCX-Microcontrollers/mcxa154-spi-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B-%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1/m-p/2353271#M5257</link>
    <description>&lt;P&gt;hello，我最近使用mcxa154芯片的spi寄存器编程，想简化&lt;SPAN&gt;LPSPI_MasterTransferBlocking函数，这个函数执行起来太慢了。我参考他的实现删了一些代码，然后发现没法跑起来，读到的数据全是0xff，发送没测。可以帮忙看看是什么问题吗？&lt;/SPAN&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;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, &amp;amp;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) &amp;amp; kLPSPI_ModuleBusyFlag) {
        if (--retry == 0) return;  /* 超时返回 */
    }
    
    retry = 1000;
    while (LPSPI_GetStatusFlags(LPSPI0) &amp;amp; kLPSPI_ModuleBusyFlag) {
        if (--retry == 0) return;  /* 超时返回 */
    }
    
    /* 2. 清空FIFO和状态 */
    LPSPI_FlushFifo(LPSPI0, true, true);
    LPSPI_ClearStatusFlags(LPSPI0, kLPSPI_AllStatusFlag);
    
    /* 3. 清除NOSTALL，允许连续传输 */
    LPSPI0-&amp;gt;CFGR1 &amp;amp;= ~LPSPI_CFGR1_NOSTALL_MASK;
    
    /* 4. 等待TX FIFO有足够空间 */
    retry = 1000;
    while (LPSPI_GetTxFifoCount(LPSPI0) &amp;gt;= fifoSize) {
        if (--retry == 0) return;
    }
    
    /* 5. 主循环：交替收发防止溢出 */
    while (txRemaining &amp;gt; 0 || rxRemaining &amp;gt; 0)
    {
        /* 发送阶段：有数据且FIFO有空间 */
        if (txRemaining &amp;gt; 0 &amp;amp;&amp;amp; LPSPI_GetTxFifoCount(LPSPI0) &amp;lt; fifoSize)
        {
            uint32_t txWord = *txData;
            /* 根据实际帧大小打包（示例假设8位） */
            LPSPI_WriteData(LPSPI0, txWord);
            txRemaining -= bytesPerFrame;
            txData += bytesPerFrame;
        }
        
        /* 接收阶段：有空间且FIFO有数据 */
        if (rxRemaining &amp;gt; 0 &amp;amp;&amp;amp; LPSPI_GetRxFifoCount(LPSPI0) &amp;gt; 0)
        {
            uint32_t rxWord = LPSPI_ReadData(LPSPI0);
            *rxData = (uint8_t)(rxWord &amp;amp; 0xFF);
            rxData += bytesPerFrame;
            rxRemaining -= bytesPerFrame;
        }
    }
    
    /* 6. 清除连续传输标志 */
    LPSPI0-&amp;gt;TCR = (LPSPI_GetTcr(LPSPI0) &amp;amp; ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK));
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sat, 18 Apr 2026 10:08:07 GMT</pubDate>
    <dc:creator>1668834026</dc:creator>
    <dc:date>2026-04-18T10:08:07Z</dc:date>
    <item>
      <title>mcxa154 spi 寄存器编程，无法通信。</title>
      <link>https://community.nxp.com/t5/MCX-Microcontrollers/mcxa154-spi-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B-%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1/m-p/2353271#M5257</link>
      <description>&lt;P&gt;hello，我最近使用mcxa154芯片的spi寄存器编程，想简化&lt;SPAN&gt;LPSPI_MasterTransferBlocking函数，这个函数执行起来太慢了。我参考他的实现删了一些代码，然后发现没法跑起来，读到的数据全是0xff，发送没测。可以帮忙看看是什么问题吗？&lt;/SPAN&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;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, &amp;amp;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) &amp;amp; kLPSPI_ModuleBusyFlag) {
        if (--retry == 0) return;  /* 超时返回 */
    }
    
    retry = 1000;
    while (LPSPI_GetStatusFlags(LPSPI0) &amp;amp; kLPSPI_ModuleBusyFlag) {
        if (--retry == 0) return;  /* 超时返回 */
    }
    
    /* 2. 清空FIFO和状态 */
    LPSPI_FlushFifo(LPSPI0, true, true);
    LPSPI_ClearStatusFlags(LPSPI0, kLPSPI_AllStatusFlag);
    
    /* 3. 清除NOSTALL，允许连续传输 */
    LPSPI0-&amp;gt;CFGR1 &amp;amp;= ~LPSPI_CFGR1_NOSTALL_MASK;
    
    /* 4. 等待TX FIFO有足够空间 */
    retry = 1000;
    while (LPSPI_GetTxFifoCount(LPSPI0) &amp;gt;= fifoSize) {
        if (--retry == 0) return;
    }
    
    /* 5. 主循环：交替收发防止溢出 */
    while (txRemaining &amp;gt; 0 || rxRemaining &amp;gt; 0)
    {
        /* 发送阶段：有数据且FIFO有空间 */
        if (txRemaining &amp;gt; 0 &amp;amp;&amp;amp; LPSPI_GetTxFifoCount(LPSPI0) &amp;lt; fifoSize)
        {
            uint32_t txWord = *txData;
            /* 根据实际帧大小打包（示例假设8位） */
            LPSPI_WriteData(LPSPI0, txWord);
            txRemaining -= bytesPerFrame;
            txData += bytesPerFrame;
        }
        
        /* 接收阶段：有空间且FIFO有数据 */
        if (rxRemaining &amp;gt; 0 &amp;amp;&amp;amp; LPSPI_GetRxFifoCount(LPSPI0) &amp;gt; 0)
        {
            uint32_t rxWord = LPSPI_ReadData(LPSPI0);
            *rxData = (uint8_t)(rxWord &amp;amp; 0xFF);
            rxData += bytesPerFrame;
            rxRemaining -= bytesPerFrame;
        }
    }
    
    /* 6. 清除连续传输标志 */
    LPSPI0-&amp;gt;TCR = (LPSPI_GetTcr(LPSPI0) &amp;amp; ~(LPSPI_TCR_CONTC_MASK | LPSPI_TCR_CONT_MASK));
}&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 18 Apr 2026 10:08:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCX-Microcontrollers/mcxa154-spi-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B-%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1/m-p/2353271#M5257</guid>
      <dc:creator>1668834026</dc:creator>
      <dc:date>2026-04-18T10:08:07Z</dc:date>
    </item>
    <item>
      <title>Re: mcxa154 spi 寄存器编程，无法通信。</title>
      <link>https://community.nxp.com/t5/MCX-Microcontrollers/mcxa154-spi-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B-%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1/m-p/2354924#M5273</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/82805"&gt;@1668834026&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;简单看了一下，问题核心不在 FIFO 读写逻辑，而在 关键的 LPSPI 硬件流程被删掉了，导致实际没有产生有效的 SPI 传输，所以 RX 全是 0xFF&lt;/P&gt;
&lt;P&gt;主要发现两个点：&lt;/P&gt;
&lt;P&gt;没有重新配置 TCR（PCS / FRAMESZ / WIDTH / CONT），而 TCR 又和 TX FIFO 共享，Flush FIFO 之后原有配置不一定还生效。&lt;BR /&gt;PCS 可能没有正确 assert，slave 实际上没被选中。&lt;/P&gt;
&lt;P&gt;建议：先保留 SDK 里对 TCR 配置、PCS、FRAMESZ 计算、TX 触发 RX 这些关键步骤，再精简循环逻辑。&lt;/P&gt;
&lt;P&gt;BR&lt;/P&gt;
&lt;P&gt;Harry&lt;/P&gt;</description>
      <pubDate>Thu, 23 Apr 2026 03:05:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MCX-Microcontrollers/mcxa154-spi-%E5%AF%84%E5%AD%98%E5%99%A8%E7%BC%96%E7%A8%8B-%E6%97%A0%E6%B3%95%E9%80%9A%E4%BF%A1/m-p/2354924#M5273</guid>
      <dc:creator>Harry_Zhang</dc:creator>
      <dc:date>2026-04-23T03:05:49Z</dc:date>
    </item>
  </channel>
</rss>

