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.

[参考译文] TMS320F28335:SPI 指令长度

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/568718/tms320f28335-spi-instruction-length

器件型号:TMS320F28335
Thread 中讨论的其他器件: controlSUITE

我尝试使用 TMS320F28335上的 SPI 模块与 Cypress FM25L04B F-RAM 芯片进行通信。 F-RAM 需要一个1字节 WREN (写入使能)指令、然后才能将一个字节写入 RAM 中的寄存器。 这意味着单字节 WREN 指令后跟一个3字节写入指令(操作码+地址+数据字节)。 我的问题是、如果我使用16寄存器 FIFO、如何指定指令的长度? 每条指令从 Slave_Enable 引脚拉至低电平开始、一旦指令完成、Slave_Enable 引脚将变为高电平。 因此、寄存器中应该有一些设置来暗示指令的长度、对吧? 如果没有、那么我是否必须控制软件中的 Slave_Enable 位、而不是由 SPI 模块自动处理? 请澄清。

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

    Rohit、

    SPI 是一个通用通信模块、这意味着它不支持硬件中的任何特定指令/数据格式。

    只要有数据要发送、SPI 就会将 CS 保持为低电平。 因此、如果您需要4个字节(32位)的 CS 低电平、则可以将字大小设置为8位、并将4个字写入 FIFO。 如果您需要进行多次连续传输、则需要等待之前的传输完成、然后再将下一组数据写入 FIFO。  您可以使用 GPIO 手动控制 CS、但仍需要遵循与仅使用 FIFO 相同的建议。

    这有道理吗?

    -Mark

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mark、感谢您的回复。 我仍然不清楚如何开展这项工作。 我可以理解以下设置:
    1:时钟极性设置为四个设置之一、SPICCR 寄存器的字大小设置为8位。
    然后、也可以从 SPIBRR 寄存器中选择波特率。
    但是、我不理解的是如何告知处理器要传输的消息具有 X 个字、以便它可以将 Slave_enable 保持为低电平并持续这么多字? 您能否提供有关如何完成以下转让的说明?
    1.将单字报文写入发送 FIFO 的第一个寄存器。
    2.发送
    3.将三个字的报文写入发送 FIFO 的前三个寄存器
    4.发送三个字的消息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rohit、

    只要 FIFO 中有数据、SPI 就会将芯片选择信号保持在低电平。 您是否需要在整个传输期间保持芯片选择低电平? 我在数据表中进行了仔细检查、看起来需要在芯片选择为低电平时传输完整指令。 因此、您只需将4个字(1个字命令+ 3个字数据)写入 FIFO 即可。 如果您在将下一条命令写入 FIFO 之前让它完全传输、则 CSn 信号将返回非活动状态(1)。

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、如果我理解它是正确的、那么传输多字指令的方法是:
    1.将指令的所有字写入 FIFO (小于16)
    2.启动传输
    3.当 FIFO 为空时、用下一条指令重新填充 FIFO、然后重复此操作。
    还有一个问题是、我使用什么命令来启动传输、使用什么命令从接收缓冲区读取数据? 此外、当一个多字指令被发送时、接收器 FIFO 从 SPIDAT 寄存器被填充的频率和时间是多少? 接收 FIFO 的一个寄存器是否在一个字被接收并且该指令的所有字都持续发生这种情况时被填充?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rohit、

    一旦第一个字被写入 SPITXBUF、它就会被传输到 SPIDAT 并开始传输。 当您向 SPITXBUF 写入其他字时、FIFO 将适当填充、并继续、直到 FIFO 中不再有数据。 SPI 中没有特殊的"start"命令。

    您可以使用 SPIRXBUF 寄存器读取接收到的数据。 数据自动从 SPIDAT 移动到 SPIRXBUF。

    请通读 SPI 用户指南。 所有这些信息都在那里、等等。 以下链接 :www.ti.com/.../sprueu3 controlSUITE 中还提供了一些示例、可帮助您了解 SPI 模块的编程。 独立于外部存储器芯片运行这些模块、以了解该模块。

    此致、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mark、您好!
    我已经阅读过几次用户指南、我提出这些问题是因为数据流对我来说不是很清楚。 那么、您说该指令必须写入 FIFO、还是必须写入 SPITXBUF? 在我看来、您在 TX FIFO 中写入数据、然后通过发送器进行传输?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒! 当然、我很乐意回答您的任何问题。
    SPITXBUF 是对 FIFO 的寄存器访问。

    数据流到达 SPITXBUF --> FIFO --> SPIDAT -->引脚(SOMI 或 SIMO,取决于主/从)
    另一个方向是 Pin --> SPIDAT --> FIFO --> RXBUF

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

    Mark、您好!

    从 SPI 手册的图1-2中可以看出、流程如下:

    引脚-> SPIDAT -> SPIRXBUF -> FIFO

    FIFO -> SPITXBUS -> SPIDAT ->引脚

    我在下面附上了一个屏幕截图、其中红色框显示了缓冲区。 我的解释是否不正确?

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

    Rohit、

    是的、您的理解是正确的。 SPIRXBUF 和 SPITXBUF 是用户可访问各自 FIFO 的位置。 您可以将它们视为一个、就编码您的软件而言也是一样的。 当该值自动从 SPIDAT 寄存器复制到 SPIRXBUF (或 SPITXBUF 相反)时、数据也会放置在 FIFO 中。

    谢谢、
    标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还有一个问题。 我将以示例场景进行解释。

    波特率为1Mb/s
    2.字大小为16位
    SPI 在轮询模式下以5kHz 的频率运行
    4.从机使能在软件中单独控制
    5. FIFO 未启用
    6.对于一个多字指令、每个字在每个轮询周期都被放入缓冲区中。 从器件使能在这段时间内一直保持低电平。
    6、根据波特率、一个字的传输时间为16us (1Mb/s 时为16位)、远小于200us 轮询时间(5kHz)。 那么、对于一个多字指令、如果一个完整的字已经被发送、那么 SPI 时钟是否停止切换、这样就不会发生垃圾传输、并且线路在下一个轮询周期前保持空闲状态(当下一个字被载入到 Tx 缓冲器中时)? 请注意、由于在指令完成前有更多字要传输、从器件使能仍然为低电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rohit、

    SPI 最重要的特性之一是时钟在没有传输时停止。 如果您只向缓冲区写入一个字、它将传输数据、然后停止切换时钟。

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 这是一个好知识。 这意味着、如果我以比波特率慢得多的速率进行轮询、则不会有发送垃圾数据的风险。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rohit、

    你是对的。 你的计划是好的。  

    [引用用户="Rohit Baranwal"]…… 不存在发送垃圾数据的风险。[/报价]

    在理想的世界中、您的评论将是完全正确的。 然而、世界是嘈杂的。 SPI 不会发送垃圾数据、这在很大程度上是有保证的;但是、只要芯片选择线路被拉低、就会有系统噪声的风险、从而产生足够的干扰、以便在从器件上注册为有效时钟。 即使在常规传输过程中、这也始终是一种风险、但启用从器件的时间越长、噪声导致损坏的可能性就越大。 这是一个需要注意和采取预防措施的问题。  

    此致、
    标记

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