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.

[参考译文] RM46L430:SPI BUF TXFULL 标志未被置位

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/593479/rm46l430-spi-buf-txfull-flag-is-not-being-set

器件型号:RM46L430
主题中讨论的其他器件:HALCOGEN

大家好、

我尝试编写一个 SPI 驱动程序、该驱动程序通过轮询和传输组使用 MIBSPI。

传输组/ MIB 部分工作正常、而轮询则导致我出现问题!

数据表 、SPNU514B、2015年4月-表27-24。 SPI 接收缓冲寄存器(SPIBUF)字段描述为:

发送数据缓冲区已满。此标志为只读标志。 在 TX 移位寄存器满时写入 SPIDAT0或 SPIDAT1域将自动置位 TXFULL 标志。 一旦该字被复制到移位寄存器、TXFULL 标志将被清除。 当 TXBUF 和 TX 移位寄存器都为空时、写入 SPIDAT0或 SPIDAT1不会置位 TXFULL 标志。

我的理解是、这个标志完全由控制 器管理、并且每次它为"0"时、我可以将数据写入 SPIDAT1。 我的问题是从未设置此标志、并且轮询算法始终认为 TXBUF 是空闲的。 因此、7个 SPI 帧的传输结果只有帧1、4和7出现在逻辑分析仪上。 我已经记录了轮询期间发生的所有 SPIBUF 读取、其中大约有64个在软件超时前发生、并且 TXFULL 标志从未被置位。 根据我对数据表的理解、RXEMPTY 标志的行为确实如此。 我在写入 SPIDAT1时放置一个调试 GIO 脉冲、可以看到在第一个2MHz 8位帧完成传输之前、轮询将三次写入 SPIDAT1寄存器。 这似乎与数据表相矛盾、因为 TX 移位寄存器和 TXBUF 应该在第二次写入后都已满。

我已经在 HalCoGen 代码中查找了安装、它使用 SPIFLG 寄存器(RXINTFLG)的位8来确定传输是否完成。 这不是一种非常有效的实现方式、因为它会导致传输帧之间存在间隙。 由于 TXBUF 保持满、TXFULL 标志机制可确保在一个帧完成后立即加载 TX 移位寄存器。

我已查看勘误表、找不到任何相关内容。

有人能纠正我对这种机制的误解吗?

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

    我认为寄存器部分的位描述与27.2.2.1节中的数据流标志设置描述之间存在一些差异、其中规定:

    27.2.2.1写入 SPIDAT0或 SPIDAT1时的数据排序
    •如果 TX 移位寄存器和 TXBUF 都是空的、那么数据被直接复制到 TX 移位中
    寄存器。 对于具有 DMA 的器件、如果启用了 DMA、则发送 DMA 请求(TX_DMA_REQ)为
    以获取下一个字。 如果发送中断被使能、那么发送器为空
    产生中断。
    •如果 TX 移位寄存器已满或正在移位过程中、并且如果 TXBUF 是昂贵的、则数据
    写入 SPIDAT0/SPIDAT1被复制到 TXBUF 并且 TXFULL 标志同时被设定为1。
    •移位操作完成后、TXBUF 中的数据(如果已满)被复制到 TX 移位寄存器中
    TXFULL 标志清零表示可以提取下一个数据。 发送 DMA 请求
    (如果启用)或发送器空中断(如果启用)同时生成。

    根据上述说明、当数据从 SPIDAT0/1移动到 TXBUF 寄存器时、TXFULL 将被置位。 当数据从 TXBUF 移动到 TXSHIFT 寄存器时、TXFULL 标志将清零。

    这与中引用的描述略有不同、即数据流状态根据 TXBUF 的状态而不是 TXShift 寄存器来设置标志。

    在一个快速变化的位流中、根据 TXFULL 标志的状态为这个执行提供服务、例如用例、 我认为 TXFULL 条件很可能很难查看/捕获、因为 CPU 访问外设以写入 SPIDAT0/1寄存器数据的延迟以及 SPIDAT0/1寄存器之间向 TXBUF 寄存器移动数据的延迟较小 TXShift 寄存器。 Hercules 中的外设访问延迟大约为20-25个周期的数量级、其中 TXBuff 和 TXShift 寄存器之间的延迟将只有几个 VBUSP 周期。 简而言之、当您加载 SPIDAT0并将其传输到 TXBUF 时、它将传输到 TXSHupLIFT 寄存器、然后您有时间加载 SPIDAT1寄存器、反之亦然。 因此、除非从器件出于某种原因而保持主器件 TX、否则 TXFULL 标志置1的情况真的很少见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    感谢您花时间回答问题、但我不确定我是否遵循了您回答问题的逻辑:

    • 如果我写入 SPI1DAT 并且 TX 移位寄存器为空、那么它将直接写入 TX 移位寄存器、之后 TXFULL 应指示为空:
      • (27.2.2.1)如果 TX 移位寄存器和 TXBUF 都为空、那么数据被直接复制到 TX 移位寄存器。 对于具有 DMA 的器件、如果启用了 DMA、则会生成发送 DMA 请求(TX_DMA_REQ)以获取下一个字。 如果发送中断被使能、那么就会产生一个发送器为空的中断。

    • 如果我写入 SPI1DAT 并且 TX 移位寄存器正忙于移出数据、那么它将写入 TXBUF、之后 TXFULL 应指示已满:
      • (27.2.2.1)如果 TX 移位寄存器已经满或者正在移位中并且如果 TXBUF 是昂贵的、那么写入 SPIDAT0/SPIDAT1的数据将被复制到 TXBUF 并且 TXFULL 标志同时被设定为1。

    • TX 移位寄存器完成移出数据后、它将从 TXBUF 中复制下一个数据、之后 TXFULL 应指示为空:
      • (27.2.2.1)当一个移位操作完成时、来自 TXBUF 的数据(如果已满)被复制到 TX 移位寄存器中、TXFULL 标志被清零以指示下一个数据可被提取。 同时产生发送 DMA 请求(如果使能)或发送器空中断(如果使能)。

    这个机制确保了 TXBUF 被永久载入并且 TX 移位寄存器永远不会等待下一个帧的数据。

    如果我没有错(有时我错了)、您没有考虑移位操作在 SIMO 上获取所有数据所需的时间。

    回答您的两行回答:

    >简而言之、当您加载 SPIDAT0并将其传输到 TXBUF 时、它将传输到 TXSHupLIFT 寄存器、然后您将有时间加载 SPIDAT1寄存器、反之亦然

     只有在移位过程完成后、它才能将数据传输到"TXSHFIT"、每帧传输4µs μ s。  

    >因此、除非从器件出于某种原因而保持主器件 TX、否则 TXFULL 标志置1的情况真的很少见。

    它不是从机挂起主机、而是8位帧的 μ 4µs 传输时间。 主器件本身"保持"。

    基于以下内容:

    • 20-25时钟外设延迟200MHz -> 125ns 的延迟。
    • 4µs 8位帧的2MHz SPI ->帧发送时间为 μ s。
    • 程序代码从 TCM (无闪存管道开销)以200MHz 运行。
    • 4µs 分析仪显示了在第一个 SPI 帧传输的 μ s 期间对 SPI1DAT 执行的四次写入操作。
    • 所有轮询 SPIBUF 读取(大约60次)的日志显示 TXFULL 从不指示已满、但 RXEMPTY 标志值符合预期。

    逻辑分析仪显示:

    有关"报文"的注意事项:

    • 写入 SPIDAT1是一个围绕 SPI1DAT 寄存器写入的 GIO 脉冲。
    • 使用数据读取 RXBUF 是在读取 SPIBUF 周围的一个 GIO 脉冲、用于指示新数据。

    其他一些观察结果:

    • 27.2.2.1表示'如果 TXBUF 是昂贵的、那么写入的数据'、但是根据逻辑分析仪跟踪中的读取数据序列、它显示了一个到一个完整 TXBUF 的 SPIDAT1写入会覆盖并且不会丢弃。

    • 我还注意到、如果 TXBUF 保持满、那么无需管理 SPI1DAT 中的 CSHOLD 位、因为控制器似乎很乐意在没有帧间隙的情况下连续发送 SPI 帧、或者移除芯片选择并将其重新置为有效。 这是预期的功能吗? 如果是这样、它会使传输算法变得更简单、更快、因为轮询循环之前的设置更少(更快)、轮询更频繁(轮询分辨率更高、可以更快完成)。

    此致、

    标记。

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

    你好、Chuck、

    您说:

    >因此、除非从器件出于某种原因而保持主器件 TX、否则 TXFULL 标志置1的情况真的很少见。

    主器件被8个 SPI 位的 μ 4µs 传输"保持关闭"、因此我希望 TXFULL 标志被置位。

    此致、

    标记。

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

    我相信我说过、"如果"主器件由于某种原因被关闭、例如使用 Nena 或 C2T 延迟值。 我假设在您的实现中没有这样的延迟、因为您需要一个连续的位流。

    我想说的是、如果你在 SPIDAT0和 SPIDAT1之间持续切换并交替填充、并且不断接收数据、那么可能是由于时间原因、条件永远不会满足。 经过一些额外的讨论和调查、我认为这不是您的问题。

    在过去的几天里、我一直在处理类似的问题、即客户在尝试接收/传输数据时没有位流中的任何缺口。 我发现这方面存在一些限制。 如果 TMS570是从机、则 VCLK 与 SPICLK 的比率必须大于1/16、以便有足够的时间将 TXRAM/SPIDAT1内容传输到 SPISHupLIFT 寄存器进行传输。 即、传输之间需要存在间隙。 由于您的应用使用2MHz 的 SPICLK、我假设这完全符合要求。

    然而,也出现了另一个事实。 在传输期间、SPIDAT0或 SPIDAT1不能同时使用。 在 Halcogen 提供的 SPI 发送例程中就是这种情况。 这可能是您只看到部分数据被传输的原因。 您能否查看您是否将应用程序限制为仅使用 SPIDAT1、所有数据是否按预期传输。 这可能会清除您看到的许多问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    我只使用 SPIDAT1、我的当前实现是:

    "TX?" 由于 TXFULL 位始终为0、因此始终采用"是"路径。

    下表显示了流程图中"读取 SPIBUF (并记录其值)"操作的 SPIBUF 日志:

    SPIBUF 值 状态位 RXEMPTY TXFULL 操作 已触发
    803E00E5 10000000 1 0 写入帧1
    803E00E5 10000000 1 0 写入帧2
    803E00E5 10000000 1 0 写入帧3
    803E00E5 10000000 1 0 写入帧4
    003E00E5 00000000 0 0 写入帧5、提取读取数据
    803E00E5 10000000 1 0 写入帧6
    003E00F7 00000000 0 0 写入帧7、提取读取数据
    803E00F7 10000000 1 0
    803E00F7 10000000 1 0
    803E00F7 10000000 1 0
    803E00F7 10000000 1 0
    003E00FF 00000000 0 0 提取读取数据
    803E00FF 10000000 1 0
    803E00FF 10000000 1 0
    803E00FF 10000000 1 0
    803E00FF 10000000 1 0

    TXFULL 位在任何时候都不置位。 您可以在我的另一篇文章中的逻辑分析仪跟踪上看到这种情况的结果。

    为什么写入帧2不会导致 TXFULL? 帧1直接复制到 TXSHIFT、数据开始移位。 由于 TXSHIFT 处于忙状态、帧2被复制到 TXBUFF、TXFULL 现在应被置位、并应保持置位状态、直到下一个 TXBUF 传输到 TXSHIFT。 我可以看到(大致)当 RXEMPTY 标志改变时、数据移动完成时、这意味着此时 TXFULL 显示的变化回到0。 在第一次 RXEMPTY 标志更改之前有4个轮询周期、这意味着其中至少2个(写入帧3和4)符合 TXSHIP BUSY 和 TXBUFF FULL 的 TXFULL 标准。

    请向我解释为什么我不希望 TXFULL 位被置位。 上述日志似乎与用户手册相矛盾。

    在您的第一篇帖子中、您说:

    >...it 被传输到 TXBUF 中、在您有时间加载 SPIDAT1寄存器之前、它将被传输到 TXSHIFT 寄存器中...

    但是、如果 TXSHIFT 寄存器当前正在移位、但尚未准备好新值、 4µs、由于 TXSHupLIFT 忙 μ s (2MHz 8位)、外设延迟为125ns (20-25个时钟)、程序代码从 TCM 以200MHz 的频率运行、因此有足够的时间再次加载 SPI1DAT 寄存器。

    此致、

    标记。

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

    你好、Chuck、

    写入 SPIDAT1的速度快于 TXSHIFT 可以对位进行序列化和移出的速度、但 TXFULL 从未设置。

    用户手册说明:

    (27.2.2.1)如果 TX 移位寄存器已经满或者正在移位中并且如果 TXBUF 是昂贵的、那么写入 SPIDAT0/SPIDAT1的数据将被复制到 TXBUF 并且 TXFULL 标志同时被设定为1。

    您说过我误解了用户手册。 所以、请向我解释为什么 TXFULL 没有被置位、因为上面的用户手册声明看起来很清楚

    此致、

    标记。

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

    很抱歉、在回答此主题时存在差距。 如果您看一下我们的 SPI 驱动程序、我们将使用 RXFlag 来指示何时写入 SPIDAT1。 这意味着仅在所有数据都已移出并接收数据移入后。 据我所知、此过程对于您所需的行为来说太慢了? 如果以这种方式使用现有的 SPI 驱动器、则传输之间的间隔有多短? 注意根据我之前的帖子、根据 IP 设计进行的传输与将数据从 TXBUFF 转移到 TXSHIFT 的时间之间必须存在一定的差距。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

    是的、即使 MibSPI 在使用中、帧之间始终存在间隙。

    但在我之前的帖子中、您可以从逻辑分析仪捕获中看到、轮询版本的算法可以像传输组版本一样快速写入。

    我唯一的问题是 TXFULL 标志不能按规定工作。

    我已经执行了一项测试:

    设置1MHz SPI 16位字

    将结果设置为0

    环路10次:

    写入 SPI1DAT 以发送字

    将 SPIBUF 和‘或’读取为结果

    已‘“或”SPIBUF 结果

    ‘或’结果没有置位 TXFULL 位、我看到一个发送的16位字。 我非常确信,TXSHIFT 和 TXBUF 在大多数传输中都已满,但没有记录 TXFULL。

    请向我解释为什么 TXFULL 没有按照用户手册中的规定运行?

    此致、

    标记。

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

    让我与我们的 IP 设计团队核实这一点、看看他们是否对此有任何见解或已知问题。 仅供参考、由于他们处于不同的时区、并且没有专门的支持、因此他们可能需要几天的时间才能与我联系。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好!

    这是我从模块设计人员那里收到的详细信息。

    "观察到的行为是预期的、正确的。

     

    请注意,当用户将第一个数据写入 SPIDATx 寄存器时,它被直接复制到移位寄存器中–TXFULL 保持‘0’。 只有当你把另一个数据写入 SPIDATx 寄存器时、如果移位寄存器仍在移动数据、被写入的数据才会被复制到 TXBUF 寄存器。 现在、TXFULL 标志将被置位、指示缓冲区已满。 这正是下面 MibSPI 规范–快照中所述的内容。

     

    另请参阅 MibSPI 中的图1以更清楚地了解逻辑结构。

     

    通常、如果用户使用 CPU 来馈送数据、那么最好在开头连续写入其中两个数据(这会填充 TX 移位寄存器和 TXBUF)。 之后、继续轮询 TXFULL 标志以馈送下一组数据。 这样可以实现最佳的数据吞吐量。 其工作原理如下。

    1. TX 移位寄存器中的第一个数据被移出。

    2. 一旦这个移位完成,TXBUF 的数据(它是第二个数据)就会被硬件逻辑复制到 TX 移位寄存器中,TXFULL 标志被清零‘0’。

    3. 如果 SW 将下一个数据写入 SPIDATx 寄存器,则该数据将被复制到 TXBUF,TXFULL 标志将设置为‘1’。

    4. 当第2个数据移位完成时,TXBUF 内容(如果它已经满了-由 TXFULL 标志指示)将被硬件逻辑复制到 TX 移位寄存器,TXFULL 标志将被清除。

       

    只要新数据在 TXFULL 标志被清零‘后一直被馈送到 SPIDATx 寄存器,这个周期就会继续。 用户基本上有一个 SPI 传输窗口,从 TXFULL 清零到‘0’再写入下一个数据,以将两次传输之间的空闲周期保持在最小值。

     

    基本上、用户需要使用 TXFULL 标志来确定是否可以写入 SPIDATx 寄存器的下一个数据。 如果 TXFULL 标志为‘0’,则表示用户可以立即写入下一个数据。”

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

    "用户需要使用 TXFULL 标志来确定是否可以写入 SPIDATx 寄存器的下一个数据"正是我尝试实现的、但该标志从未置位!

    是否有任何其他设置可使此标志正常工作?

    为什么 HaCoGen 代码使用 RX 标志? 这是因为积分器无法使 TXFULL 标志正常工作吗?

    此致、

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

    是的、我知道这是您尝试执行的操作。 直接复制专家帖子的原因是为了确保您遵循他所概述的确切流程。

    我不确定代码中使用 Rx 标志的确切原因。 我想、这是因为一旦 Rx 标志被置位、TXBUFF 中的数据就已经被发送/移出了、这是有一定的确定性的。 我不确定是否有人会按照您的工作方式来优化代码。 但是、TXFULL 功能在设计阶段得到了验证、在该阶段可以更好地控制缓冲器的内部工作。

    您是否曾尝试减慢 TX 的周期以保证满足 TXFULL 的条件?