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.

[参考译文] TMS320F2800157:SPI 混淆

Guru**** 2463330 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1354191/tms320f2800157-spi-confusion

器件型号:TMS320F2800157
主题中讨论的其他器件:SysConfigC2000WARE

您好!  

我正在尝试了解 SPI 配置设置。 阅读了 SPI 的技术参考手册后、我仍不知道自己在做什么。  

Im、使用 LaunchpadXL-TMS320F2800157直接连接到我的 Salae la。  

  1. 具体来说、在"spi_ex2_lookback_fifo_interrupts"示例中、包括 SPI 中断以及发送中断的触发方式、因为程序中没有内容填充发送 FIFO、因此 ISR 如何触发?
  2. 另外、任何人都修改了"SPI_pollingNonFIFOTransaction "的 SPI 驱动程序。 我仍然有不稳定的时钟行为,其他人在使用时看到这里: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1248486/tms320f280025c-issues-with-manual-control-of-cs-pin-in-spi-when-using-driverlib-functions/4726334?tisearch=e2e-sitesearch&keymatch=SPI_pollingNonFIFOTransaction#4726334
  3. 如果有人可以共享一个基于中断的 SPI 项目、该项目能够发送多个字节并使用 GPIO 作为芯片选择引脚、这将非常有用。

最佳-灰色

默认工程的代码片段:(在没有任何内容填充 FIFO 并触发中断时如何触发发送 ISR 以发送数据)  

非常感谢您的帮助。 抱歉、Im 是编程、SPI 和嵌入式软件的新手。

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

    你好,灰色! 请在下面查看我的蓝色回答:

    1.具体来说、在"spi_ex2_lookback_fifo_interrupts"示例中会触发 SPI 中断以及发送中断的确切触发方式、因为程序中没有内容填充发送 FIFO、因此 ISR 如何触发?

    同时使用 FIFO 模式和中断的优点在于、中断是根据发送和接收 FIFO 的"满"级别触发的。 这些都是由硬件而不是软件触发的-因此您可能对发送中断(SPI TX ISR)的实际调用方式感到困惑(因为不需要软件操作来启动中断的调用)。

    您可以在配置 SPI 模块时定义 SPI TXFIFO 和 RXFIFO 级别。 "级别"是指 FIFO 中存在的数据量(以及指示该 FIFO 中有多少可用空间)。 当您选择 FIFO 级别时、这意味着当 FIFO 处于相应级别时、相应的发送/接收中断将自动(由硬件)触发。 因此就示例2从 C2000Ware 来看、当您打开 SysConfig 文件时、您会看到 TX 和 RX FIFO 级别都设置为2:

    对于发送侧:当 TXFIFO 中包含2个或更少的字时将触发 TX 中断(这意味着它在 TXFIFO 中至少有14个或更多可用点、因为 FIFO 是16级深)。 请参阅以下器件 TRM 中的寄存器描述:

    对于接收端、当 RXFIFO 中有2个或更多字(表示接收 FIFO 至少有2个满数据的位置)时将触发 RX 中断。 请参阅以下器件 TRM 中的寄存器描述:

    因此、一旦您启动程序、SPI 模块就会识别出 TXFIFO 为空(或者更确切地说、它包含2个或更少的字)、并触发 TX 中断、您应该在该中断中写入发送缓冲区以发送数据。 请告诉我,如果这里仍然有混乱!

    2.另外,有任何人为"SPI_pollingNonFIFOTransaction "修改了 SPI 驱动程序。 我仍然有不稳定的时钟行为,其他人在使用时看到这里: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1248486/tms320f280025c-issues-with-manual-control-of-cs-pin-in-spi-when-using-driverlib-functions/4726334?tisearch=e2e-sitesearch&keymatch=SPI_pollingNonFIFOTransaction#4726334

    是的、最新 C2000Ware 版本5.02.00.00中已修复了此问题! 请下载最新版本并确保您的项目使用的是此版本的驱动程序。  

     

    3.如果有人可以共享一个基于中断的 SPI 项目,该项目可以发送多个字节并使用 GPIO 作为芯片选择引脚,将会非常有用。

    如果使用专用的 SPI_PTE 信号、它会通过来自控制器/主器件的传输自动切换为低电平。 但我假设您是指手动控制 GPIO;我们没有 C2000Ware 中现成可用的此类项目、 但手动将 GPIO 用作芯片选择引脚只需要手动配置 GPIO 寄存器中的正确多路复用、即简单地将 GPIO 设置为"输出"引脚、然后确保手动将"0"或"1"写入该 GPIO 在写入发送缓冲区以传输数据之前/之后(假设您指的是在主/控制器模式下控制芯片选择引脚的器件)。 请告诉我您是否能够实现这一点。  

    最后、

    如果您想更好地了解 SPI、 C2000 Academy 中还有一个部分 可能会有所帮助(我也正在向其中添加、以便更经常收到问题的某些项目更清楚)  -如果您感兴趣,该页面底部还列出了两个资源链接。 该视频是 SPI 概述;该文档不是我们 SPI 模块的工作原理、但如果您详细阅读以深入了解 SPI 的工作原理、我认为它会非常有帮助! 如果您对上述任何项目有进一步的困惑、请告知我-希望这有助于您的理解!

    此致、

    艾里森

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

    哇、非常感谢!  

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

    没问题! 希望上述内容可以解决您的问题。 如果没有、请随时在此处发帖或创建另一个主题

    此致、

    艾里森

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

    我花了大量时间与被破坏的 HAL 传输字节进行斗争。 更新到了5.02 C2000Ware、它实际可以正常工作。  再次非常感谢。  

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

    我不知道该怎么说。"  

    由于某种原因、SPI 控制器仍然不能正确地传输数据。 如您所见、我在 EEPROM 示例中得到 WREN 的值为0x0C、但它是0x06。 我在要传输的所有函数调用以及尝试使用 GPIO 进行芯片选择中看到了相同的行为。  Im 太棒了。  

    下面是问题的图片:  

    我确保相位和时钟模式设置相同:  

    有什么建议吗?

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

    在这个周末工作,没有成功。 SPI 驱动器的函数有发送我需要的数据 x2。  

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

    您好、灰:

    您能否尝试在 SysConfig 中将时钟模式更改为极性= 0和相位= 0? 我看到另一个器件状态的时钟设置:"数据在时钟后沿有效"、我将其解读为期望数据在时钟后沿锁存(读取)(在这种情况下、 后沿是下降沿、因为时钟处于低电平空闲状态、前沿是上升沿)。

    这对应于无延迟的上升沿:

    此致、

    艾里森

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

    我可以发送和接收数据、但似乎无法让 FIFO 正常工作、因此我使用了阻塞事务。  

    我正在尝试使 FIFO 正常工作

    目前、试图使 FIFO 工作的逻辑是 将数据发送到 FIFO 缓冲区、等待使用 FFST 寄存器级别状态填充 RX 缓冲区、然后在发送完毕后将 RX 寄存器清零(因为我要写入地址)。 它运行一次通过主 while (1)循环、但停止下一个循环 、并无限期地等待已清除的 FFST 寄存器级别状态、即使该状态应该已满。

    希望这是合理的、如果我能提供更多信息以便更轻松地进行故障排除、请告诉我

    谢谢!

    灰色

      

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

    您好、灰:

    时钟相位的变化是否提供了帮助?

    如果我理解正确、那么问题是 RXFIFO 在您预期的时候未被填满?

    请记住、SPI 是一种全双工通信协议、因此您必须传输数据才能接收数据。 问题是否是您正在 从控制器设备传输数据、但在控制器设备上接收不正确? 或者问题是程序没有启动下一次从控制器到外设的数据传输?

    此致、

    艾里森

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

    你好、大进展。 SPI 的许多问题都是由硬件问题引起的(完全是我的故障)。

    为了让一切变得更简单,我摆脱了 FIFO 的增强,并把 EEPROM SysConfig 和 C 代码作为参考,看起来像 spi_receiveByte ()仍然不工作。 Im 在 MOSI 上得到一个0xD1 (抱歉、在下面的屏幕截图中是它的屏幕外)、但 temp variable 中没有存储任何内容。 C2000ware 的最新版本上的 Im。

     

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

    您好、灰:

    很高兴听到进展!

    您能解释一下这个问题的背景吗? 您是否发送/接收了其他数据、该数据是正确的、但只有0xD1是错误的? F280015x 是控制器/主器件吗? SPI_receiveByte 应该接收发送到 F280015x 的数据并将其存储到 temp 变量中;如果您在 MOSI (主器件输出、从器件输入)线路上看到它、那么您是说数据正从 F280015x 发出? MISO 线路上有什么内容?

    此致、

    艾里森

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

    我能够成功地传输到我的 SPI 器件以配置寄存器-这样有效。 问题是从 SPI 控制器读回。 我的 Salaea 可以看到使用 receiveByte 和 dummyData 将接收位移出、但该函数的返回 情况不是我在逻辑分析仪上看到的。  

    您能解释一下这个问题的背景吗?

    -> F280015x 现在使用 SPI_trasmitByte HAL 成功发送数据、但 SPI_receveByte 不会返回我正在使用逻辑分析仪观察到的接收到的值。

    您是否发送/接收了其他数据、该数据是正确的、但只有0xD1是错误的? F280015x 是控制器/主器件吗?

    ->是的、F280015x 是主器件。 逻辑分析器正在从从器件接收0XD1 (成功)、但 reiceveByte HAL 未返回该值。 这确实意味着 dummybytes 被 成功地移出 reiceveByte、所以这有点起作用。

    SPI_receiveByte 应接收发送到 F280015x 的数据并将其存储到 temp 变量中

    这正是我现在用它做的,但它不起作用。 最后、我需要接收18个字节、Im 尝试 循环使用 reiceveByte 来完成该操作。 但在测试中、我尝试仅接收一个字节、该字节不起作用。

    请记住、我正在使用 GPIO Chipseelct 控制(顺便说一下、它非常好用!)

    非常感谢您的支持。

    此致!

    灰色  

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

    您好、灰:

    您如何定义"temp"变量?

    一件有助于再次检查的事情是在你有 SPI_receiveByte ()的第236行(或之前)设置一个断点,然后在该行/之前运行程序,然后使用"Step Into"和"Step Over"按钮来查看正在发生的情况。 请尝试逐行通过 receiveByte 函数(当您"步入"函数 并进入 spi_pollingNonFIFOTransaction ()时,应该跳转到 spi.c 文件来执行此操作,因为这就是 receiveByte ()使用的函数)。  

    您仍在使用最新的 C2000Ware driverlib、对吧? 请记住旧版本的 SPI_pollingNonFIFOTransaction ()存在错误。 更正后的版本应如下所示:

    很高兴 GPIO 芯片选择进展顺利!

    此致、

    艾里森

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

    温度变量为 uint16_t 类型。 我刚刚 在新的 Driverlib 5.0.02中检查了 SPI_pollingNonFIFOTransaction (),它和你的屏幕截图一样。 我可以单步执行它、仍然没有得到任何 RX。  

    还有其他想法吗?

     

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

    Hmm 奇怪-要澄清一点、您看到的是 MISO 线路上的正确活动、但它并没有保存到温度变量中? 当您在运行时检查 SPI RXEMU 寄存器时、是否仍然在 SPI RX 缓冲区中看到正确的数据?

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

    是的、我的逻辑分析仪正是连接到 SPI 线路、因此它  可以看到与 C2000相同的总线、但 SPI RXEMU 据说是0x0000。

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

    我觉得有一些基本的问题,我必须问,以防万一:

    • 只是想澄清一下、当您在实际程序中单步执行/通过 receiveByte 时、您看到了经过更正的函数(我在上面绘制了图形)? 有时发生的情况是、即使您下载了最新的 C2000ware、CCS 也不会拉取 driverlib 更改、除非您在 CCS 工作区中手动重新编译 driverlib 库、因此我只是想确保这不是问题。
    • 再快速检查一下、是否在检查寄存器和表达式时打开了持续刷新功能?
    • 您是否在程序期间的任何其他时间接收数据、您可以进行检查以验证 RX 线是否正常工作?

    另一个想法是尝试使用环回模式(其中 RX 和 TX 在内部连接在一起)、发送测试数据并检查是否正确接收到该数据、以验证至少软件配置正常、并可能提示某些硬件问题。

    此致、

    艾里森

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

    • 已启用持续刷新。  

    • 这是 SPIEMU 寄存器的图片。 其 Rxing 0、而逻辑分析仪看到0x64。 是的、我能够接收 RX 值  

    RX 从不起作用。 即0xFF 或0x00。  

    回送测试在芯片上运行良好。 我们尝试了两个驱动程序库示例。 我不知道如果我能在 Saleae 上读出来,它怎么可能是硬件?  

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

    调用。 我用于共享 MISO SPI 总线的二极管的开关速度不够快。 我旧的 rigol 示波器坏了-它绝不会触发、因此我无法看到它、但我最终可以通过在 Saleae 中启用模拟视图来看到它。 Saleae SPI 解码器比 C2000中的 SPI 控制器灵敏得多、这就是为什么我可以在其他情况下看到有效数据的原因。

    感谢您的支持。 我认为、SPI 控制器 可以正常工作、但我的硬件不能:(抱歉、浪费了您的时间。    

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

    啊,我看到了! 很高兴 你能够找到罪魁祸首! 对于它的价值, 调试 永远不会浪费时间在这里-只有更多的教训和获得的智慧 。  

    如果一切似乎都正常、我们可以将此标记为已解决、然后关闭该主题! 但是、如果您完全遇到更多问题、可以随意打开另一个线程。

    此致、

    艾里森