This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2640R2F:当 MRDY 未置位时、NPI 从器件发送 SPI 数据(后续)

Guru**** 2617815 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1190742/cc2640r2f-npi-slave-sends-spi-data-when-mrdy-is-not-asserted-follow-up

器件型号:CC2640R2F

我问过相关问题已经有一段时间了、但这个问题是否有任何更新?  我使用的是 simplelink SDK 版本5.30.00.03。

我看到的是,在函数"NPIL_writeTL()"中的文件"npi_tl.c"中,代码在 SRDY_ENABLE()之前立即调用 transportWrite()。

transportWrite()函数链接到"npi_tl_spi.c"中的"npitLSPI_writeTransport ()",它设置 SPI 事务并调用 spi_transfer (),这意味着只要 NPI 主器件开始切换 CLK,从器件就会开始通过 MISO 发送 SPI 数据。  即使 MRDY 线未置位也是如此。

如果尝试使用共享 SPI 总线、这会导致问题、因为主设备将与其他 BLE 模块进行通信、但该 BLE 模块仍将发送数据。

我正在努力修改 NPI 文件、等待设置 SPI 事务、直到 MRDY 变为低电平。  有很多层和事件被称为、有时我的尝试将用于1个事务、但之后不会发送任何内容。

任何帮助或想法都很棒、谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试了一种权变措施、其中涉及等待 MRDY 事件以设置 SPI 事务。

    我在 npi_tl.h 顶部添加了一个 transportEnableWrite 函数(此处第7行:)

    #elif defined(NPI_USE_SPI)
    #define transportInit NPITLSPI_initializeTransport
    #define transportRead NPITLSPI_readTransport
    #define transportWrite NPITLSPI_writeTransport
    #define transportStopTransfer NPITLSPI_stopTransfer
    #define transportMrdyEvent NPITLSPI_handleMrdyEvent
    #define transportEnableWrite NPITLSPI_enableWriteTransport
    #endif

    并在 NPIL_handleMrdyEvent 函数中从 NPI_tl.c 中调用它:

    void NPITL_handleMrdyEvent(void)
    {
        ICall_CSState key;
        key = ICall_enterCriticalSection();
    
        // Check to make sure this event is not occurring during the next packet
        // transmission
        if ( PIN_getInputValue(MRDY_PIN) == 0 ||
            (npiTxActive && mrdyPktStamp == txPktCount ) )
        {
            transportMrdyEvent();
            SRDY_ENABLE();
    
            if(npiTxActive)
            {
                //Set SPI count to correct length
                transportEnableWrite();
            }
        }
    
        ICall_leaveCriticalSection(key);
    }

    然后在 npi_tl_spi.c 中,我注释了来自 npitlspi_writeTransport ()的 spi_Transfer,而是将其移动到我的新函数 npitlspi_enableWriteTransport ()

    // -----------------------------------------------------------------------------
    //! \brief      This routine initializes and begins a SPI transaction
    //!
    //! \param[in]  len - Number of bytes to write.
    //!
    //! \return     uint8 - number of bytes written to transport
    // -----------------------------------------------------------------------------
    uint16 NPITLSPI_writeTransport(uint16 len)
    {
        int16 i = 0;
        ICall_CSState key;
    
        key = ICall_enterCriticalSection();
    
        TransportTxBufLen = len + SPI_TX_FIELD_LEN;
    
        // Shift TX message two bytes to give room for SPI header
        for( i = ( TransportTxBufLen - 1 ) ; i >= 0 ; i-- )
        {
          TransportTxBuf[i + SPI_TX_HDR_LEN] = TransportTxBuf[i];
        }
    
        // Add header (including a zero padding byte required by the SPI driver)
        TransportTxBuf[SPI_TX_ZERO_PAD_INDEX] = 0x00;
        TransportTxBuf[SPI_TX_SOF_INDEX] = SPI_SOF;
        TransportTxBuf[SPI_TX_LEN_INDEX] = len;
    
        // Calculate and append FCS at end of Frame
        TransportTxBuf[TransportTxBufLen - 1] =
            NPITLSPI_calcFCS(&TransportTxBuf[SPI_TX_LEN_INDEX],len + 1);
    
        // Clear DMA Rx buffer and clear extra Tx buffer bytes to ensure clean buffer
        //    for next RX/TX
        memset(TransportRxBuf, 0, NPI_TL_BUF_SIZE);
        memset(&TransportTxBuf[TransportTxBufLen], 0, NPI_TL_BUF_SIZE - TransportTxBufLen);
    
        // set up the SPI Transaction
        // Count set to 0 to avoid sending data before master is ready in a shared
        // SPI bus configuration
        spiTransaction.count = NPI_TL_BUF_SIZE;
        spiTransaction.txBuf = TransportTxBuf;
        spiTransaction.rxBuf = TransportRxBuf;
    
    //    // Check to see if transport is successful. If not, reset TxBufLen to allow
    //    // another write to be processed
    //    if( ! SPI_transfer(spiHandle, &spiTransaction) )
    //    {
    //      TransportTxBufLen = 0;
    //    }
    
        ICall_leaveCriticalSection(key);
    
        return TransportTxBufLen;
    }
    
    // -----------------------------------------------------------------------------
    //! \brief      This sets SPI TX count to the full buffer size. This is only
    //!             called once the MRDY pin has gone low to prevent data TX when
    //!             master is not ready.
    //!
    //! \return     void
    // -----------------------------------------------------------------------------
    void NPITLSPI_enableWriteTransport()
    {
        ICall_CSState key;
        key = ICall_enterCriticalSection();
    
        // Check to see if transport is successful. If not, reset TxBufLen to allow
        // another write to be processed
        if( ! SPI_transfer(spiHandle, &spiTransaction) )
        {
          TransportTxBufLen = 0;
        }
    
        ICall_leaveCriticalSection(key);
    }

    当然、我们已将原型添加到 npi_tl_spi.h

    // -----------------------------------------------------------------------------
    //! \brief      This sets SPI TX count to the full buffer size. This is only
    //!             called once the MRDY pin has gone low to prevent data TX when
    //!             master is not ready.
    //!
    //! \return     void
    // -----------------------------------------------------------------------------
    void NPITLSPI_enableWriteTransport(void);

    现在,当想要发送数据 时,从站似乎会降低 SRDY 的值,但现在它将等待 NPIL_handleMrdyEvent(),以便设置 SPI_Transfer,而不是在时钟开始切换时立即在 MISO 上发送数据。  这样、主器件就可以与第二个从器件模块通信、而不会使第一个模块引起数据冲突。

    对于比我更熟悉代码的人、这似乎是对正常修改吗?  我已经运行了几个测试、现在两个模块似乎都按照正确的流量控制运行。

    谢谢、Erik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Erik、

    您所做的修改对我来说一目了然。 为了确保修改正确且稳定、我建议您对项目运行一些扩展应力测试、以确保它在所有情况下都按预期工作。 感谢您与社区分享您的权变措施!

    此致、

    1月