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.

[参考译文] CC1310:SPI 从器件不工作

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1487168/cc1310-spi-slave-not-working

器件型号:CC1310

工具与软件:

我正在尝试将 ESP32设为主器件、将 CC1310设为从器件。 我已尝试相反的操作(ESP 作为从设备)、通信正常工作、但是当我反向操作(CC1310从设备)时、ESP32发送正确的数据、但是 CC1310不接收字节。 在逻辑分析仪上、通信似乎良好。

模式为 POL 0、PHA 0、频率为1MHz

我是不是做错了什么? 使用的工程是 TI 15.4传感器 OAD 示例。

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

    你(们)好

    我只有 CC1310可供选择、因此需要将其用于主设备和从设备。

    我从 SDK 中简化了 SPI 示例、如下所示:

    主器件:

    #define SPI_MSG_LENGTH  (32)
    
    unsigned char masterRxBuffer[SPI_MSG_LENGTH];
    unsigned char masterTxBuffer[SPI_MSG_LENGTH];
    
    void *masterThread(void *arg0)
    {
        SPI_Handle      masterSpi;
        SPI_Params      spiParams;
        SPI_Transaction transaction;
        uint8_t         i;
    
        SPI_Params_init(&spiParams);
        spiParams.frameFormat = SPI_POL0_PHA0;
        spiParams.bitRate = 1000000;
        masterSpi = SPI_open(Board_SPI_MASTER, &spiParams);
        if (masterSpi == NULL)
        {
            while (1);
        }
    
        for (i = 0; i < SPI_MSG_LENGTH; i++)
        {
            masterTxBuffer[i] = i;
        }
    
        memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);
    
        transaction.count = SPI_MSG_LENGTH;
        transaction.txBuf = (void *) masterTxBuffer;
        transaction.rxBuf = (void *) masterRxBuffer;
    
        while(1)
        {
            SPI_transfer(masterSpi, &transaction);
    
            sleep(2);
        }
    }
    

    从机:

    #define SPI_MSG_LENGTH  (32)
    
    unsigned char slaveRxBuffer[SPI_MSG_LENGTH];
    unsigned char slaveTxBuffer[SPI_MSG_LENGTH];
    
    void *slaveThread(void *arg0)
    {
        SPI_Handle      slaveSpi;
        SPI_Params      spiParams;
        SPI_Transaction transaction;
        uint32_t        i;
    
        SPI_Params_init(&spiParams);
        spiParams.bitRate = 1000000;
        spiParams.frameFormat = SPI_POL0_PHA0;
        spiParams.mode = SPI_SLAVE;
        spiParams.transferCallbackFxn = NULL;//transferCompleteFxn;
        spiParams.transferMode = SPI_MODE_BLOCKING;
        
        slaveSpi = SPI_open(Board_SPI_SLAVE, &spiParams);
        if (slaveSpi == NULL)
        {
            while (1);
        }
    
        for (i = 0; i < SPI_MSG_LENGTH; i++)
        {
            slaveTxBuffer[i] = i + 50;
        }
    
        memset((void *) slaveRxBuffer, 0, SPI_MSG_LENGTH);
        transaction.count = SPI_MSG_LENGTH;
        transaction.txBuf = (void *) slaveTxBuffer;
        transaction.rxBuf = (void *) slaveRxBuffer;
    
        while(1)
        {
            SPI_transfer(slaveSpi, &transaction);
        }
    }
    

    此代码按预期工作、我收到、在 masterRxBuffer 中、50、51、 52、53、 每次我从主设备传输0、1、2、3、...时

    现在我还没有工具、因此可以在主器件和从器件连接在一起时监控 SPI 流量、因此我知道从器件代码是正常的、只需观察我在主器件侧接收数据即可。

    在从器件未连接时监控主器件上的 SPI 如下所示:

    您可以看到、使用我们的驱动器、在传输每个字节之间、CSn 被拉高。

    如何完成此操作取决于选择的帧格式。

    如果我在主器件上将我的格式从 SPI_POL0_PHA0更改为 SPI_POL0_PHA1、它看起来像这样:

    我假设使用 CC1310作为从器件并将帧格式设置为 SPI_POL0_PHA0、时希望 CSn 在每个字节之间准备好被拉高。

    您应尝试修改 ESP32主代码、使 SPI 通信在我的第一张图中看起来像。

    BR

    Siri

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

    那么、为什么我需要逐字节发送。 在进行多字节传输时、您的 SPI 是否无法正常工作? 我尝试将 CC1310作为主器件、并通过手动控制 CS 引脚、ESP 能够正确接收(模式 POL0_PHA0):

    如果我理解正确、权变措施是逐字节发送?

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

    我不确定、但我无法使用您的主设备(ESP32)进行测试、因此、如果您发送的数据与 CC1310主设备发送的数据类似、我只能说 CC1310作为从设备工作。  

    最简单的方法是修改主设备、以便传输我们已知适用于 CC1310从设备的数据。

    Siri

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

    好的、我将尝试权变措施、然后回复您

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

    我已将 ESP 和 CC1310设置为 POL0_PHA1、通信现在可以正常工作了。 因此问题仅在模式 POL0_PHA0中出现。 我将使用 POL0_PHA1以避免围绕模式0问题进行黑客攻击。

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

    很高兴您能够使它正常工作。

    BR

    Siri