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.

[参考译文] TM4C1294KCPDT:XFIFO 模式下的 EPI

Guru**** 2482225 points
Other Parts Discussed in Thread: TM4C1294KCPDT, TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/726102/tm4c1294kcpdt-epi-in-xfifo-mode

器件型号:TM4C1294KCPDT
主题中讨论的其他器件: TM4C1294NCPDT

您好!

我正在升级一种设计、该设计以前使用 UART 将大量数据转储到 PC、基于 EPI 的接口。 EPI 工作于8位主机总线模式、子模式为 XFIFO。  EPI 总线从外部连接到 FT2232H USB 桥、该桥在 FT245模式下工作(异步 FIFO 模式、具有 RD、WR、FFULL 和 FEMPTY 信号)。 我刚刚开始介绍 EPI 模块、我有一组初学者问题:

1: 我不清楚 EPI 的写 FIFO 是否总是被使用、或者 FIFO 写操作与直接写总线操作有不同的过程。 查看图"11-1. EPI 方框图"。在 TM4C1294KCPDT 数据表中、AHB 总线似乎可以直接或通过 FIFO 访问主机总线接口。 但是、我不知道软件机制也可以做什么。

2. 问题与#1相同、但用于读 FIFO。

3. 我也不理解读写之间的关系/优先级。 显然、在任何给定的时间、总线只能执行两个(半双工)中的一个。 那么、如果 EPI 的写 FIFO 当前有一些填充的条目"希望"进入外部总线、但也有一个非阻塞就绪状态、会发生什么情况呢? 会发生什么情况? 读取、写入、错误...? 更有建设性地提出这个问题:什么是一种好方法、让我能够不断地将大量数据(写入)转出总线、同时还能监控偶尔传入的数据?

4. 一个专门与 XFIFO 模式相关的问题:考虑到外部 FIFO 中不存在地址概念、将地址映射到 MCU 的 RAM 是否毫无意义? 如果我无论如何映射它、是否只有一个地址有效? 在这方面、是否必须将存储器映射到 MCU 才能使用 EPI?

5、 只是为了确保:在 XFIFO 模式下、EPIBAUD 寄存器的值没有意义、对吧? 考虑到传输速率由 FFULL 和 FEMPTY "流量控制"信号决定。

我可能还有一些问题、尤其是当我开始为此使用 DMA 时、但现在已经很长时间了...

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、
    根据数据表中以下摘录的数据表、WFIFO 和 NBRFIFO 只适用于 GPIO 模式、而不适用于具有 XFIFO 子模式的 HB-8。 我希望这将解决你的前三个问题。

    在 XFIFO 模式下、我认为可以使用连接到外部 FIFO 器件的 CS 所限制的范围内的任何地址。

    仍然需要 EPIBAUD、因为它用于推导 WR 和 RD 信号的等待状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢你的答复。 不过、在我看来、WFIFO 和 NBRFIFO 在 EPI 的主机总线(HB-8)模式下是不使用的。 我刚刚浏览了数据表的 EPI 部分中出现的所有"FIFO"、没有提到这一点。 通常、数据表非常明确地指定了类似的内容。 另一个提示是、关于 DMA 的所有讨论都说 DMA 只向 WFIFO 和 NBRFIFO 传输数据、所以如果这些 FIFO 在 HB-8模式下没有使用、您会说不能用 HB-8模式的 DMA 吗? 在您的回复中、您提到了数据表中的"以下摘录"、但它看起来不像您提供的摘录。 如果可以再次检查、我会很高兴、因为这完全改变了我将要转到项目的这一部分的方式。

    关于其他要点:您能澄清一下吗-

    "在 XFIFO 模式下、我认为可以使用连接到外部 FIFO 器件的 CS 所限制的范围内的任何地址。"

    我不理解这一答复。 正如我已经指出的、XFIFO 中没有地址的概念。 它就像是在讨论 UART 传输中的地址... 这毫无意义。 外部 FIFO 只是一个字节宽(在我的情况下)端口、用于转储在 WR 或 RD 信号边沿上采样的数据。 不涉及地址概念。 因此也没有 CS。

    我理解有关 EPIBAUD 的最后一点、谢谢。

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

    大家好、

     让我回答有关地址的问题。 我指的是 EPIADDRMAP 寄存器中 EPADDR 和 EPSZ 域限定的地址范围。 这两个字段决定了外部外设的基地址及其大小。  

     回到其他三个问题、我需要返回。  

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

    感谢后续行动。 那么、关于地址、它到底会怎么工作? 假设我使用 EPADR = 0x1 (基址0xA000.0000)和 EPSZ = 0x0 (大小为256字节)来映射外部 FIFO。

    现在、我对地址0xA000.0000处的 MCU 存储器执行写操作。 我希望我将在外部 EPI 总线上获得写入事务处理。 如果我现在对0xA000.0004执行写操作、我将得到什么结果? 与以前完全相同的事务? 还是什么都不做? 毕竟、FIFO 中没有地址的概念、它不像外部 RAM、也不像总线将地址位传输到外部器件的任何位置。

    那么、映射存储器区域的一个地址是否真正有效? 或者、是否都处于活动状态、您选择哪一个都无关紧要? 或者、我在这里错过了什么...?

    谢谢、

    家伙。

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

    大家好、

     您的理解是正确的。 如果地址范围配置为256字节、则该范围内从0xA0000000开始的任何地址都可用于访问外部 FIFO。 在 XFIFO 模式中、没有地址引脚连接到外部器件。

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

    谢谢、我现在了解了该部分。 因此、我最初发布的唯一问题是 XFIFO 模式下的内部 FIFO 使用情况(您说过您将进行检查并返回给我)。

    同时、我还有一个更基本的问题:除了 DMA 和(可选)存储器映射到 MCU 地址空间之外、还有其他方法可以读取/写入 EPI 数据吗? 也就是说、EPI 是否有任何寄存器、如果我向它写入数据、那么它将作为 EPI 总线上的事务输出? 我想的是类似于 UART 的 UARTDR 寄存器的内容、在该寄存器中我只需要向该寄存器写入一个字节、它将立即自动传输。

    谢谢、

    家伙。

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

    员工/我一直关注这个话题-请注意、我们不使用'129系列产品。   (而使用168MHz (及更高) Cortex M4和200MHz+ M7s)

    赦免-但至少在我看来-一个重要问题仍未得到回答(或只是间接回答)。

    海报小家伙:"什么是好方法让我能够不断地将大量数据(写入)转出总线、同时也能监控偶尔传入的数据?"   CB1:"Pardonnez-Moi - Monsieur Charles。。"

    这种"分类读取"是(非常)真实的要求-在我看来- 在 FIFO 制度下似乎更"。   (尤其是当 FIFO 为"深度"时。)   现在我们已经意识到、本海报的大部分问题都是由选择与"129 MCU 的 EPI "关联"的"FT2232H USB 桥"导致的、并受其控制。   

    "传入数据"的"最佳/最快响应"不会是(近)标准"并行总线事务"所导致 的、这"泄露"了" FIFO 对(分解)其所有内容的必要性?"   (我记得、'FT245'(器件或模式)可实现此类并行总线功能。)

    被放置在'并行总线模式'中时、比较/对比'FIFO'的'执行速度'-与'EP'的'执行速度'似乎也很有用。   (再次-我是公认的"129 feeb"、但相信这些一般问题-并将重点转向 (希望)证明其价值...)

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

    大家好、

     我仍在等待我的同事确认我的理解。 我再次阅读数据表、在我看来、内部 FIFO 的目的仍然是在 UDMA 操作期间或在 GPIO 模式下用于非阻塞操作。 我的同事确认后、我将返回。 下面是数据表中的一些摘录、这些摘录会使人认为内部 FIFO 与 UDMA 一起使用并处于 GPIO 模式。  

    11.3功能说明
    EPI 控制器提供一个无缝的可编程接口、可连接到各种常见的外部接口
    SDRAM x 16、主机总线 x8和 x16器件、RAM、NOR 闪存、CPLD 等外设
    和 FPGA。 此外、EPI 控制器还提供快速使用 FIFO 的定制 GPIO
    通过使用内部写 FIFO (WFIFO)或非阻塞式读 FIFO (NBRFIFO)进行控制
    WFIFO 可以保存4个字的数据、这些数据以受控的速率写入外部接口
    EPI 主波特率寄存器(EPIBAUD)设置。

    11.3.3 DMA 操作
    μ μDMA 可用于通过 NBRFIFO 和实现 EPI 的最大传输速率
    WFIFO。

    当 TXCNT 时、EPI WRFIFO 会发出 μ μDMA 请求
    EPIWFIFOCNT 寄存器的值大于0、且 EPIWFIFOCNT 寄存器的 WTAV 位域为0
    该寄存器小于 EPIFIFOLVL 寄存器的设置阈值触发 WRFIFO。

    μ■当 EPI 控制器用作 GPIO 接口时、写操作通过 FIFO 寄存器(最多可保持4个单元)
    随时)、并且使用 COUNT0指定的 EPIBAUD 时钟速率可更改多达32个引脚。
    因此、输出引脚控制可作为时间的函数进行非常精确的控制。

     至于您关于创建"写入"事务(而不是使用存储器映射访问或 DMA)的第二个问题、我认为这是不可能的。 但是、对于读取事务、可以使用非阻塞式读取、在其中指定读取的起始地址以及读取的大小和计数。 每次读取完成后、结果将写入 NBRFIFO。 NBRFIFO 可配置为在达到 NBRFIFO 的阈值时中断处理器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Charles。 我对读取这些行的理解与您的理解不同、即我只收集到 UDMA 使用 FIFO、而 GPIO 模式使用 WRFIFO 和 NBRFIFO -我没有读出其他模式不使用 FIFO。 但我想我们最好等待你的同事最后一句话。

    第二点是:如果我可以在 XFIFO 模式下采用非阻塞式读操作、这是否意味着 NBRFIFO 实际上是在 XFIFO 模式下使用的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1、感谢您关注我对 EPI 的问题。

    我也在一些较新的项目中使用其他供应商的 Cortex M4 (TI 和该供应商都有利弊)。 然而、这个当前项目暂时保持与 Tiva 系列的"连接"。 FT2232H 桥现在也必须保持。

    我想了解您对使用标准并行总线事务而不是 FIFO 的看法。 我正在尝试确定您所指的 FT2232H 模式以及应使用哪种 EPI 模式来连接它。 我看到 FT2232H 有两种与"MCU 总线"相关的模式:
    1."MCU 主机总线仿真模式"。
    2."CPU 样式 FIFO 接口模式"(请注意、这不同于我今天尝试使用的" FT245样式异步 FIFO 接口模式")。

    现在、上面的模式1意味着 FT2232H 是主机。 我认为这不起作用,因为(如果我正在正确读取 EPI 文档),Tiva 的 EPI 必须是总线在所有模式下的主机, 您不能有两个主机(即在此模式下、FT2232H 和 Tiva 芯片都希望将 WR 和 RD 引脚作为输出...)。 所以、我想您的意思是#2、"CPU 样式 FIFO 接口模式"。

    现在、看一下 FT2232H 模式的描述、它与我今天使用的 FT245样式 FIFO 模式似乎没有太大不同。 主要区别在于 FT245样式有2个专用于流量控制(TXE 和 RXF)的引脚、而"CPU 样式 FIFO"模式使用这些引脚作为 CS 和 A0位。 要了解您是否有更多的数据需要读取(或更多的写入空间)、您需要执行 A0高电平的读取事务、响应是 FT2232H 的状态字节、它告诉您基本上与 TXE 和 RXF 在 FT245模式下执行的信息相同。

    总之、我看不到使用此模式的相关差异、任何有助于我解决您所引述的困境的东西、即帮助我设计系统、使其能够执行大量写入、 并且能够中断这些写入以进行偶尔的读取。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您-我的主要问题是您(看起来)关注 FIFO -我的问题是"深度 FIFO"似乎会(极大地)阻碍您的 MCU 识别"必须快速读取的关键数据!"

    如果时间允许、我将让员工回顾我们公司如何通过高速外部总线管理如此"高优先级"的数据到达-这些数据到达即"被识别并响应"。 (请注意、这是在(另一个) M4 (和 M7)上完成的-我们(可能)(较早)使用了 FTDI 器件-另一个(更快)器件已升级此系统...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
    我想一种方法是监控 FEMPTY 信号、当该信号为低电平时、意味着从 FT2232H 到达的新字节。 然后、当它为高电平时、我可以取消传出传输(可能基于 DMA)并执行读取。 我觉得有点丑,你不想吗?

    如果您能听到系统(无论在哪种 MCU 上)是如何工作的、那将是一件很棒的事情。 此外、如果您想分享您从 FTDI 升级的通信速度更快的设备、这也会很有趣...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、

     我还没有听到我的同事的反馈。  

    [引用 user="Guy Ovadia">1.  我不清楚 EPI 的写 FIFO 是否总是被使用、或者 FIFO 写操作与直接写总线操作有不同的过程。 查看图"11-1. EPI 方框图" 在 TM4C1294KCPDT 数据表中、AHB 总线似乎可以直接或通过 FIFO 访问主机总线接口。 但是我不知道软件机制也可以做什么。[/QUERP]

    假设 WFIFO 在所有操作中被隐式使用、那么您的应用程序可以遵循以下建议来避免写入或读取停滞。 EPIWFIFOCNT 指示 WFIFO 中可用的空间数。 当为零时、它没有空间来缓冲另一个写入。  

    我想找出是否隐式使用 WFIFO 的一种方法是先设置 GPIO 管脚、然后再对 EPI 接口进行4次写操作、然后清除管脚。 如果使用 WFIFO、那么在4个写入完成之前、您应该会看到管脚清零。 如果不是、则在4个写入完成后、该引脚将被清零。 请注意、Cortex-M4 CPU 内部仍有写入缓冲区、因此您可能仍会在4个 EPI 写入完成之前看到管脚已清零。

    [引用 user="Guy Ovadia"]

    2. 问题与#1相同、但用于读 FIFO。

    [/报价]

    NBRFIFO 用于非阻塞式读操作。 您也应该能够在 XFIFO 中使用它。 有关详细信息、请参阅数据表的非阻塞式读操作部分、例如读操作的起始地址、读操作的大小和计数以及中断 CPU 读操作的 NBRFIFO 阈值。  

    [引用 user="Guy Ovadia">3.  我也不理解读取和写入之间的关系/优先级。 显然、在任何给定的时间、总线只能执行两个(半双工)中的一个。 那么、如果 EPI 的写 FIFO 当前有一些填充的条目"希望"进入外部总线、但也有一个非阻塞就绪状态、会发生什么情况呢? 会发生什么情况? 读取、写入、错误...? 更有建设性地提出这个问题:什么是好方法、既能让我不断地将大量数据(写入)转出总线、又能监控偶尔传入的数据?[/QUERPLET]

    寄存器27:EPI FIFO 深度选择寄存器(EPIFIFOLVL)、偏移量0x200
    该寄存器允许选择触发中断到中断控制器的 FIFO 深度
    或者、更有效地向 μ μDMA 发出 DMA 请求。 NBRFIFO 在触发满时触发
    在匹配或更高(更满)时触发、以便处理器或 μ μDMA 提取
    读取数据。 WFIFO 在空时触发、这样它在匹配或低于(条目数更少)时触发
    以便处理器或 μ μDMA 插入更多的写入数据。
    需要注意的是、FIFO 触发器与 TM4C1294NCPDT 中的其他 FIFO 不相同
    外设。 特别是、提供了空和满触发器、以避免在使用分块时出现等待状态
    操作。
    只有当 μ μDMA 激活或中断使能时、该寄存器中的设置才有意义。
    此外、该寄存器还允许防止写入停止和执行通知
    阻塞式读操作会由于先前的写操作而挂起更多时间。 这两个函数在 A 中的行为
    非正交方式、因为读取和写入不是正交的。
    写入错误位将系统配置为尝试写入已满的 WFIFO
    放弃写入并发出错误中断信号、以防止由于停止而导致意外延迟
    写入。
    读取错误位将系统配置为在由于任何之前的原因而导致读取停止后
    写入 WFIFO 中、产生错误中断。 请注意、不能防止过度失速、
    但是、在通知发生了中断后会生成中断。

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

    您好、Charles、

    谢谢、这些摘录非常有用。 我没有发现寄存器描述中包含 EPI 行为的关键信息、通常前面的文本部分会提供所有的核心信息。 具体而言、以下摘录:

    "此外、该寄存器可防止写入停止和执行通知
    阻塞式读操作会由于先前的写操作而挂起更多时间。"

    此外(来自实际 RSERR 位说明):

    "禁用读操作挂起错误中断。 读取的行为如所示
    正常、并在之前的任何写入完成前被暂停
    读操作返回一个结果。 "

    回答我的问题:

    "那么、如果 EPI 的写 FIFO 当前有一些填充的条目"希望"进入外部总线、但也有正在进行的非阻塞准备工作... 会发生什么情况? 读取、写入、错误...?"

    答案是:写入将会发生。 显然,他们的优先权高于阅读。

    P.S. 我将尝试执行您建议的测试、以确定 WFIFO 是否在 XFIFO 模式下使用、我将在此处报告结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、
    希望它能澄清您的许多疑问、并与我们分享您看到的内容。 这将为将来使用 EPI XFIFO 的社区带来极大的好处。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我尝试了 Charles 建议的测试。 代码如下:

    如果((HWREG (EPI0_BASE + EPI_O_STAT)& EPI_STAT_XFEMPTY)= 0){//非空:有要读取的数据
    IN_CHAR = HWREGB (0xA0000000);
    while (EPIWriteFIFOCountGet (EPI0_BASE)< 4);//等待有传输空间
    SET_YELD_LED (ON);
    HWREGB (0xA0000000)= IN_CHAR;
    HWREGB (0xA0000000)= IN_CHAR;
    HWREGB (0xA0000000)= IN_CHAR;
    HWREGB (0xA0000000)= IN_CHAR;
    SET_YELD_LED (关闭);
    }
    

    结果显示了 WR 线路(信号00)的逻辑分析仪迹线以及写入映射 RAM (信号01)期间切换的 I/O。

    可以清楚地看到、对映射 RAM 的4次写入会立即返回、而实际的 EPI 总线事务会在稍后发生。 这表明 XFIFO 模式确实使用 EPI 的写 FIFO。

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

    大家好、

     感谢分享结果。 WIFO 被隐式使用、因此不能证明我先前的解释。