TI E2E 英文论坛海量技术问答的中文版全新上线,可点击相关论坛查看,或在站内搜索 “参考译文” 获取。

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.

[参考译文] CC3220SF-LAUNCHXL:SPI_TRANSFEL READ 不正确、与逻辑分析仪上的正确值不同

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1135230/cc3220sf-launchxl-spi_transfer-read-is-incorrect-and-different-from-correct-value-on-logic-analyzer

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件: CC3220SF

我正在尝试使用 SPI_TRANSFER ()在 CC3220SF-LAUNCHXL (SPI 主器件)和外部传感器(Adafruit LIS3MDL)之间建立基本 SPI 通信。 我正在 FreeRTOS 中构建一个使用 Simplelink SDK 版本2.10.00.04的应用程序。

我已成功将 器件 ID 读取命令(0xCF)发送到外部传感器。 在逻辑分析仪上、传感器以预期值(0x3D)进行响应。 但是、读取缓冲区正在接收值0xE3。 我可以反复发送传输、该值始终为0xE3。

这里是否有一些基本配置(软件或硬件)我可能会错?

SPI 配置(索引 CC3220SF_LAUNCHXL_SPI1):

    {
        .baseAddr = GSPI_BASE,
        .intNum = INT_GSPI,
        .intPriority = (~0),
        .spiPRCM = PRCM_GSPI,
        .csControl = SPI_SW_CTRL_CS,
        .csPolarity = SPI_CS_ACTIVELOW,
        .pinMode = SPI_4PIN_MODE,
        .turboMode = SPI_TURBO_OFF,
        .scratchBufPtr = &spiCC3220SDMAscratchBuf[CC3220SF_LAUNCHXL_SPI1],
        .defaultTxBufValue = 0,
        .rxChannelIndex = UDMA_CH6_GSPI_RX,
        .txChannelIndex = UDMA_CH7_GSPI_TX,
        .minDmaTransferSize = 100,
        .mosiPin = SPICC32XXDMA_PIN_07_MOSI,
        .misoPin = SPICC32XXDMA_PIN_06_MISO,
        .clkPin = SPICC32XXDMA_PIN_05_CLK,
        .csPin = SPICC32XXDMA_PIN_NO_CONFIG
    }

SPI_open 调用:

    SPI_Params_init(&xSpiParams);
    xSpiParams.transferMode = SPI_MODE_BLOCKING;
    xSpiParams.transferTimeout = SPI_WAIT_FOREVER;
    xSpiParams.transferCallbackFxn = NULL;
    xSpiParams.mode = SPI_MASTER;
    xSpiParams.bitRate = 1000000;
//    xSpiParams.bitRate = 500000;
    xSpiParams.dataSize = 8;
    xSpiParams.frameFormat = SPI_POL0_PHA0;
//    xSpiParams.frameFormat = SPI_POL1_PHA1;
    xSpiHandle = SPI_open(CC3220SF_LAUNCHXL_SPI1, &xSpiParams);

SPI 读取代码:

static int32_t prlSpiRead(void *handle,
                          uint8_t reg,
                          uint8_t *bufp,
                          uint16_t len)
{
    int32_t lRetVal = 0;
    SPI_Transaction xSpiTransaction = {0};
    SPI_Handle xSpiHandle = *((SPI_Handle*) handle);

    memset(xSpiTxBuff, 0xA5, 100);
    memset(xSpiRxBuff, 0x00, 100);

    GPIO_write(CC3220_LIS3MDL_SPI_CS_PIN, 0);
    xSpiTxBuff[0] = (reg | 0xC0);   //read + auto increment
    xSpiTransaction.count = 1+len;  // 1 command byte + number of expected bytes
    xSpiTransaction.txBuf = (void*) xSpiTxBuff;
    xSpiTransaction.rxBuf = (void*) xSpiRxBuff;
    SPI_transfer(xSpiHandle, &xSpiTransaction);
    GPIO_write(CC3220_LIS3MDL_SPI_CS_PIN, 1);

    memcpy(bufp, &xSpiRxBuff[1], len);

    if(SPI_TRANSFER_COMPLETED != xSpiTransaction.status)
    {
        lRetVal = -1;
    }

    return lRetVal;
}

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

    Daniel、您好!

    由于数据是物理数据、因此您很可能为数据传输设置了不正确的 SPI 相位或极性。 请尝试更改帧格式配置吗?

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

    我尝试了其他3 个极性/相位组合中的每一个都没有成功。

    [极性0相位1]和[极性1相位0]在代码和示波器上都接收到错误值。

    [极性0相位0]和[极性1相位1]均可通过示波器(0x3D)上的传感器产生正确的响应以及代码中的错误值(0xE3)、且可重复。

    从用于 SPI 通信的 LIS3MDL 数据表(第5.2节)中:"SDI 和 SDO 分别是串行端口数据输入和输出。 这些线在 SPC 的下降边沿被驱动并且应该在 SPC 的上升边沿被捕捉。" 在我看来、正确的设置应该是极性1相位1 (时钟低电平有效、采样发生在上升沿)。

    我还尝试将时钟速率降低到500kHz、但没有效果。

    CC3220SF SPI 相位/极性:

    e2e.ti.com/.../lis3mdl.pdf

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

    听起来好像您尝试了所有4种格式模式。 在这种情况下、除非引脚配置不正确、否则问题似乎指向硬件。

    您能否检查并看到 MISO 线路未连接到任何其他组件? 您使用的是 cc3220 TI launchpad 还是定制板?

    您能否尝试运行 SDK 中的一个 SPI (如果您有2个 LaunchPad、则为主器件和从器件)示例? 这可以作为一个基准。

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

    我使用的是 CC3220-LAUNCHXL (最近购买)、是的、MISO 线路未连接到除传感器之外的任何其他组件、除非内部有任何组件。

    就演示而言、我目前无法使用第二个 Launchpad 来测试 SPI 演示。 是否有在某种回路配置或自检中使用单个 CC3220开发板的 SPI 演示? 话虽如此、我引用了演示代码、但我看不到任何明显的不同之处、包括 spiCC3220SDMAHWAttrs 配置和传输代码。

    更多数据点:

    我尝试使用引脚53作为 MISO 引脚(而不是引脚6)。 我只对这个引脚进行了几次测试、我仍然在逻辑分析仪上看到正确的传输、但在这种情况下、我看到代码中接收到一个0xFF 值。 我还连接了 Rigol 示波器、 实际电压信号看起来很干净、并与逻辑分析仪匹配。 断开仍然是 CC3220 SPI 硬件内部的。

    是否有其他可能影响内部 SPI 硬件的配置参数? 我尝试将引脚6 (GPIO_15)的 GPIO 参数更改为不起作用、但我假设 SPI_init ()会覆盖任何 GPIO 参数(我在 GPIO_init ()之后调用 SPI_init ()))。

    我还看到了以下论坛帖子(https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/774668/ccs-cc3220sf-launchxl-spi-communication-reading-wrong-data)、该帖子显示了与我的情况类似的情况。 我尝试添加一个与 MISO 连接串联的1000欧姆电阻器、这也对我看到的任何内容没有影响。 是否还有其他示例需要额外电路来校正 CC3220SF 的 SPI (或其他)信号?

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

    Daniel、您好!

    我之前看到过一些通过 SPI 连接到 CC3220SF 的器件存在问题。 简而言之、我的问题是 MISO 上的位没有正确计时。 听起来就像这里的类似故事。 再说一次、它仅发生在某些外设上。 例如、我尝试使用 SPI 示例将 CC3220连接到 CC3220、但没有遇到此问题、但当我连接第二个器件而不是第二个 CC3220时、我看到数据读取错误。  

    在调试时、我发现当我在 CLK 线路上放置一个示波器探针时、数据现在被正确读取。 永久解决方案是在该 SPI_CLK 引脚上放置一个与振荡探针大小类似的电容器。 这一切都是在 LaunchPad 上完成的。 我猜是由于有一些高频工作、导致数据计时不正确、但由于探针现在是滤波器、因此不可见。   

    假设您已经尝试了所有可能的软件尝试、那么 这是我的最终建议。 SDK 2非常旧、因此我建议尝试使用最新的 SDK 从该器件中读取数据。 我知道您希望使用 FreeRTOS、但这只是一个调试步骤。  

    我还没有尝试将 SPI 主器件示例用作环回、不确定是否可以。  

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

    好的、哇、这是一次兔子洞的旅行。

    我最终将其与您的故事和我之前提到的其他论坛帖子(https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/774668/ccs-cc3220sf-launchxl-spi-communication-reading-wrong-data)结合使用。

    简而言之、我添加了一个与 SPI CLK 引脚串联的47欧姆电阻器、它最终工作正常(不对其他引脚进行调整、极性1相1和1000000位速率)。

    长故事:一开始我 在 MISO 线路上尝试了一个100欧姆的电阻器(和其他值)、因为我误解了论坛帖子(我认为他们在 MISO 线路上放置了一个100欧姆的电阻器)、但没有什么成就。 然后、我想在时钟引脚上尝试它、因为您已经在时钟引脚上指定了电容固定。 我在时钟引脚上尝试了几个电容器、看起来也没有任何效果。 但是、100欧姆电阻 器没有解决我的问题、但它确实导致逻辑分析仪、示波器和 RX 缓冲器中的最终值完全匹配。 我尝试了一个1k 欧姆电阻器、这也导致值匹配、但仍然不正确(也不同于100欧姆电阻器)。 最后、我尝试了一个47欧姆电阻器、这确实使得所有值都与预期值(0x3D)正确匹配。