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.

[参考译文] TMS320F28379D:SPI 从器件通过向外发送数据来破坏接收到的数据。 Driverlib

Guru**** 2609755 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/685536/tms320f28379d-spi-slave-corrupts-received-data-by-sending-data-out-driverlib

器件型号:TMS320F28379D

您好!

抱歉、标题令人困惑。 我正在使用 SPIB 配置为从站的28379D Launchpad。 我有一个向从器件发送5个字节的外部器件。 我使用 Driverlib 来配置从外设。 我的配置顺序如下:

-禁用 SPIB
-具有函数指针的寄存器 SPIB_RX
-配置 GPIO
-配置 SPI、相位、从器件、500kHz、8位字
-在 SPIB 上启用 FIFO
-清除 RXFF 的 IRQ 状态
-将 FIFO 电平设置为 TX1、RX5
-启用 IRQ RXFF
-启用 SPIB 模块
-启用 SPIB RX IRQ

我要发送的数据是:0x20 0x48 0xAA 0x00 0x00、非常基本。 我可以看到正在抛出 RX 中断并且数据可用。

我已经使用示波器确认了 SPI 线路上的信号。 也非常直接。

我遇到的从器 件问题是、即使我实际上没有任何将任何数据写入 TX 缓冲区的代码、从器件也会在 MISO 线路上发送数据。

更奇怪的是、数据在 MISO 引脚上输出并破坏 MOSI 上的数据。 几乎每隔一秒传输、第3个字节被处理为0xB5、而不是0xAA。 请参见下图。

第一幅图像显示了  正在发送到从器件的数据0x20 0x48 0xAA 0x00 0x00。 您会注意到、尽管我没有告诉从器件发送任何内容、但从器件仍使用 MISO 上的数据进行响应。 在此示例中、Delfino 正确接收到第3个字节为0xAA。

在下面的这个示例中、主器件正在再次发送相同的数据、但是这次从器件非常短地将 MISO 线路拉至高电平。 在此示例中、从器件认为第3个字节为0x5B。

如果有任何建议,将不胜感激。

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

    Dainius、

    MISO 引脚输出的数据并不是一种奇怪的行为。 这就是 SPI 硬件的实现方式、因为 SPIDAT 本质上是一个移位寄存器。

    清零 TALK 位(SPICTL.TALK = 0)将使 MISO 引脚处于高阻抗状态、数据不会回显。

    此致、

    曼诺伊

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

    您好、Manoj、

    因此、我重新编写了处理接收到的字节的方式。 现在、RX IRQ 被每一个字(8位)抛出、并且我按预期接收所有数据。 接收到的数据未损坏。 我必须写零以避免数据损坏、但不管怎样、它似乎起作用了。

    此外、我在从器件响应的实现方面取得了进展、大多数器件工作正常、但是从器件(F28379D)似乎有时(75%的时间)无法正确为 MISO 位计时。 从属方应发送值0xBA。 有时发送它很好、有时它会错过 CLK。

    下面是正确响应的示例。 从器件以0xBA 进行响应。

    如果我一个接一个地发送请求以发回0xBA、有时返回的数据会被破坏。 从器件返回0xf8而不是0xBA。

    比特率设置为1MHz、主设备处于 SPI 模式1、从设备处于模式0。

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

    Dainius、

    您的消息中不清楚您是否尝试了我的建议。

    此致、

    曼诺伊

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

    Manoj、

    抱歉。 我已经尝试过你的建议。 driverlib 无法单独设置 TALK 位、因此我自己编写了函数

    静态内联 void SPI_DISABLE_SLAVE_OUTPUT (uint32_t base)
    {
    HWREGH (base + SPI_O_CTL)&&~(SPI_CTL_TALK);
    }
    
    静态内联 void SPI_ENABLE_SLAVE_OUTPUT (uint32_t base)
    {
    HWREGH (base + SPI_O_CTL)|= SPI_CTL_TALK;
    } 

    我还将初始化序列更新为  

    -禁用 SPIB
    -具有函数指针的寄存器 SPIB_RX
    -配置 GPIO
    -配置 SPI、相位、从器件、500kHz、8位字
    -禁用从机输出
    -在 SPIB 上启用 FIFO
    -清除 RXFF 的 IRQ 状态
    -将 FIFO 电平设置为 TX1、RX5
    -启用 IRQ RXFF
    -启用 SPIB 模块
    -启用 SPIB RX IRQ

    当 RX IRQ 在每个字节接收时被抛出、TALK 位为0、在接收到第二个字节后、TALK 标志将被启用、并且我的代码在接收完全部5个字节之前不会清除 TALK 位。 不过、示波器迹线显示的是 MISO 在第二个字节前保持高电平、然后在第三个字节计时时、MISO 保持低电平、预载它认为我正在发送值0、 然后 MISO 线路在剩余的两个字节中恢复为高电平(即使代码没有将 TALK 位设置为0)。

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

    Manoj、

    除了我最近的答复外,我还想向你提供更多的资料。 我在整个传输过程中实现了通话标志切换。 和以前一样、我尝试使用 SPI 总线从从器件接收数据。 此时、从器件应应答2个字节的数据0xAA 0xAA。

    下图显示了 MISO 信号在我的软件设置 TALK 标志之前一直处于高电平。 从器件发送2个字节、软件将 MISO 设置回高电平。

    现在、我对谈论的话题有了更深入的了解、因此我感到更加高兴。 但是、我必须进行一些奇怪的函数调用才能实现这一目标。 请参阅以下内容:

    否则、如果(read_two_bytes = request_internal.code)
    {
    uint16_t UPPER =(读取和0xFF00);
    uint16_t LOWER =(读取和0x00FF);
    SPI_resetRxFIFO (DEVICE_SPI_BASE); //<--必须添加此项以停止发送刚刚收到的数据
    SPI_resetTxFIFO (DEVICE_SPI_BASE); //<--必须添加此项以停止发送刚刚收到的数据
    SPI_ENABLE_SLAVE_OUTPUT (DEVICE_SPI_BASE); //<--这是我设置 TALK = 1的自定义函数
    SPI_writeDataBlockingFIFO (device_SPI_base、上部);
    SPI_writeDataBlockingFIFO (device_SPI_base、(较低<< 8));
    } 

    除了 MISO 线路上的信号损坏外、此配置中的一切似乎都相当好。 这里是一个更近的视图。

    这是一个良好的0xAA。

    这是传输的最后一个字节。 应为0xAA、但它作为0xED 进行处理。

    我应该指出、在大多数情况下、两个字节都会损坏、而不仅仅是最后一个字节。 我已经通过 CSS 调试器确认、代码实际上正在为两个字节发送0xAA。

    非常感谢您的支持。

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

    您好!

    快速问题:

    在这种情况下、您的主器件是什么? 您表示主器件和从器件使用不同的模式:

    [引用 user="Dainius Narsutis57"]位速率设置为1MHz,主设备处于 SPI 模式1,从设备处于模式0。

    如果这两个器件都是 C2000器件、则需要主器件和从器件之间的模式匹配。 数据需要在一个边沿上输出、并在另一个边沿上锁存。

    请说明,在 CCS 中,您会看到数据被正确发送和接收为0xAA? 但范围不能正确注册它吗? 您使用的是哪种类型的示波器和探头?  它是您的示波器的数字探头吗? 示波器上的原始信号是什么样的?

    -Mark

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

    Mark、您好!

    感谢您关注我的帖子。

    当我等待基于 Sitara AM-335x 的 SOM 到来(在项目中它将成为主设备)时、我已经购买了其中一 个 USB-SPI 分线模块。 MCP2210 IC (数据表)实现所有4种 SPI 模式。

    我知道、有时制造商会以不同的方式实现它们、但从根本上说、我发现、如果 TI 的 Delfino 处于模式0、 Microchip 的 MCP2210处于模式1中、从设备可以接收来自主设备的发送数据、而主设备可以接收来自从设备的发送数据。 也许这是巧合。

    在 CCS 中、我可以看到将作为0xAA 0xAA 发送的两个字节、当信号由连接了逻辑分析仪(RPL1116)适配器的 RIGOL MSO1104Z 示波器捕获时、SOMI 信号会变得一团糟、如上图所示。

    我还没有查看过原始迹线、我将捕获一些迹线并进行报告。

    非常感谢。

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

    我的双腿之间有一个虚拟尾。

    我决定从零开始、一切都被拔出了。 当我拔下电线时、我注意到我的 Saleae la 未正确断开连接。 我在示波器之前使用了 Saleae la。 我已经从示波器 LA 和 Delfino 之间的 CLK、CS、MISO、MOSI 上断开了电缆连接、您知道什么、数据损坏消失了、我可以清楚地看到我所期望的数据。

    是的人— —一种大脑飞镖。 我在这3天的故障排除时间内、我不会再回来了。

    谢谢您、Mark。 我想我应该投资 一只橡胶鸭。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dainius、
    很高兴听到您能够解决这个问题、我认为在座的每个人都理解您的痛苦。

    此致、
    标记