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.

[参考译文] TMS320C5505:紧急:确认擦除 USB 上的双缓冲器数据的方法

Guru**** 2583365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629259/tms320c5505-urgent-confirm-the-way-to-erase-the-double-buffer-data-on-usb

尊敬的 TI 专家:

请允许我确认以下问题。
[问题]
您知道擦除 USB 内核双缓冲器上的数据的方法吗?
我的客户想知道、客户是否可以擦除已在 USB 内核上设置的缓冲区数据、而不向 USB 总线发送任何垃圾数据。
如果是、请告诉我该怎么做?

此致。
Kaka

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我已通知团队。 他们的反馈将在此处发布。
    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    感谢您的支持。
    我正在等待您的团队回复。

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

    您是否对此主题有任何更新?
    我们需要尽快向客户回答此问题。

    此致。
    Kaka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的时间。 我们将对此进行研究。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了!! 我正在等待您的回复。

    此致。
    Kaka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    您是否对此主题有任何更新?

    此致。
    Kaka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    很抱歉再次发帖。 我正在等待您的反馈。

    此致。
    Kaka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Kaka-San
    让我在内部检查一下我们为什么尚未解决这一问题。
    很抱歉耽误你的时间。
    将尝试查看我们是否可以在明天美国时间发布此主题的更新。

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

    感谢您的跟进。
    我正在等待您的团队反馈。

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

    我们在以下主题中对此进行了讨论:

    e2e.ti.com/.../615996

    以下是摘要:

    要清除 TX FIFO、必须执行以下步骤:

    如果 FIFONOTEMPTY 为1、则将 FUSHFIFO 置为1

    2、再次检查 FIFONOTEMPTY、如果它为1、则将 FLLUSHFIFO 设置为1秒。 只有在使用双缓冲器且两个缓冲器都已填充且尚未传输时、才需要执行此操作

    如果 FIFONOTEMPTY 为0、则完成操作

    上述步骤将清除 TX FIFO 中的所有等待数据包、USB 主机将不会收到任何垃圾数据。

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

    您好、Ming、

    我的客户尝试执行此序列、但 C5505将垃圾数据发送到 USB 总线。 我们想知道"擦除 USB 内核上双缓冲器上的数据而不擦除 USB 总线上的任何垃圾数据的方法"。 因此、我再次向您的团队提出了类似的问题。

    我和我的客户认为"FLUSHFIFO"意味着"清除 USB 内核上的缓冲区"。 但我认为"清除"并不意味着"清除缓冲区"、而是指"将数据写入缓冲区并发送数据"。
    那么、您是否会解释 FFLUSHFIFO 的功能? 您是否会向我们展示在 USB 内核上擦除双缓冲器上的数据而不擦除 USB 总线上的任何垃圾数据的方法?

    此致。
    Kaka

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

    大家好、Kaka-San、

    我认为您的客户对 FLLUSHFIFO 的理解是正确的。 这意味着清除 FIFO 中的数据、因为 TX 不仅具有该位、RX 也具有该位。 您在帖子中描述的功能还有另一个位、即 TXPKTRDY 、它通知 USB 内核"数据已 写入 FIFO 并准备好发送出去"

    至于 FIFO 清除期间 USB 总线上的垃圾数据、我们将需要更多信息。  您能否在 FIFO 清除中共享客户代码段?

    此致、

    Ming  

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

    感谢您的评论。 我将获取客户的代码。
    顺便说一下、您是否有此示例代码?

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

    您好、Ming、

    我们收到了我的客户的问题。 因此、请允许我确认以下问题、以防万一。
    [问题1]
    我的理解是否正确、如下所示?
    1:下一个发送的 USB 数据在 FIFO 中(双缓冲器)。
    2.如果 TXPKTRDY 位被用户置位,则准备发送数据。
    3、如果主机提出请求、FIFO 数据将发送给 CPU。

    [问题2]
    在置位 TXPKTRDY 后、它能否通过 FLUSHFIFO 清除/擦除 FIFO 上的下一个 USB 数据?
    也就是说、在上面的步骤3中、它能在 USB 主机发出请求之前使用 FFLUSHFIFO 来擦除 FIFO (双缓冲器)数据吗?

    此致。
    Kaka

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

    我希望尽快获得您的反馈。
    请提供您的意见吗?

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

    请在今天日本时间结束前提供您的答案吗?

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

    大家好、Kaka-San、

    我没有用于双缓冲情况的示例代码。 以下代码部分来自 C55XCSL 3.07.00 CSL_usbAux.h 它显示了如何清空 EP FIFO。 对于双缓冲情况、您只需再重复一次。

    Ming

    ------------------ 在这里剪切--------------------------------------------------------------

    静态内联
    void USB_setConfiguration (CSL_UsbDevHandle hUsbDev、
                             uint16          confVal)

     uint16 saveIndex;
     uint16 tempVal;

     saveIndex = 0;

     if (hUsbDev->devNum =CSL_USB0)
     {
      /*保存索引寄存器值*/
      saveIndex = usbRegisters->index_TESTMODE;

      /*为 Tx 和 Rx 配置 EP1 */
      /*选择 EP1 */
      usbRegisters->index_TESTMODE &=~CSL_USB_index_TESTMODE_EPSEL_MASK;
      usbRegisters->index_TESTMODE |= CSL_USB_EP1;

      /*设置 ClrDataTog 位(Txcsr.d6)*/
      usbRegisters->perI_CSR0_INDX |=(CSL_USB_perI_TXCSR_CLRDATOG_MASK);
      /*设置 ClrDataTog 位(Rxcsr.d7)*/
      usbRegisters->perI_RXSR_INDX |=(CSL_USB_perI_RXCSR_CLRDATOG_MASK);

      /*如果 FIFO 不为空则刷新*/
      if (((usbRegisters->perI_CSR0_INDX & CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)==
        CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)
      {
       //usbRegisters->perI_CSR0_INDX |= CSL_USB_perI_TXCSR_FLLUSHFIFO_MASK;

       tempVal = usbRegisters->perI_CSR0_INDX;

       tempVal |= CSL_USB_perI_TXCSR_FLUSHFIFO_MASK;
       tempVal &=~(0x03);

       usbRegisters->perI_CSR0_INDX = tempVal;
      }

      /*为 Tx 和 Rx 配置 EP2 */
      /*选择 EP2 */
      usbRegisters->index_TESTMODE &=~CSL_USB_index_TESTMODE_EPSEL_MASK;
      usbRegisters->index_TESTMODE |= CSL_USB_EP2;

      /*设置 ClrDataTog 位(Txcsr.d6)*/
      usbRegisters->perI_CSR0_INDX |=(CSL_USB_perI_TXCSR_CLRDATOG_MASK);
      /*设置 ClrDataTog 位(Rxcsr.d7)*/
      usbRegisters->perI_RXSR_INDX |=(CSL_USB_perI_RXCSR_CLRDATOG_MASK);

      /*如果 FIFO 不为空则刷新*/
      if (((usbRegisters->perI_CSR0_INDX & CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)==
        CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)
      {
       //usbRegisters->perI_CSR0_INDX |= CSL_USB_perI_TXCSR_FLLUSHFIFO_MASK;

       tempVal = usbRegisters->perI_CSR0_INDX;

       tempVal |= CSL_USB_perI_TXCSR_FLUSHFIFO_MASK;
       tempVal &=~(0x03);

       usbRegisters->perI_CSR0_INDX = tempVal;
      }

      /*为 Tx 和 Rx 配置 EP3 */
      /*选择 EP3 */
      usbRegisters->index_TESTMODE &=~CSL_USB_index_TESTMODE_EPSEL_MASK;
      usbRegisters->index_TESTMODE |= CSL_USB_EP3;

      /*设置 ClrDataTog 位(Txcsr.d6)*/
      usbRegisters->perI_CSR0_INDX |=(CSL_USB_perI_TXCSR_CLRDATOG_MASK);
      /*设置 ClrDataTog 位(Rxcsr.d7)*/
      usbRegisters->perI_RXSR_INDX |=(CSL_USB_perI_RXCSR_CLRDATOG_MASK);

      /*如果 FIFO 不为空则刷新*/
      if (((usbRegisters->perI_CSR0_INDX & CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)==
        CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)
      {
       //usbRegisters->perI_CSR0_INDX |= CSL_USB_perI_TXCSR_FLLUSHFIFO_MASK;

       tempVal = usbRegisters->perI_CSR0_INDX;

       tempVal |= CSL_USB_perI_TXCSR_FLUSHFIFO_MASK;
       tempVal &=~(0x03);

       usbRegisters->perI_CSR0_INDX = tempVal;
      }

      /*为 Tx 和 Rx 配置 EP4 */
      /*选择 EP4 */
      usbRegisters->index_TESTMODE &=~CSL_USB_index_TESTMODE_EPSEL_MASK;
      usbRegisters->index_TESTMODE |= CSL_USB_EP4;

      /*设置 ClrDataTog 位(Txcsr.d6)*/
      usbRegisters->perI_CSR0_INDX |=(CSL_USB_perI_TXCSR_CLRDATOG_MASK);
      /*设置 ClrDataTog 位(Rxcsr.d7)*/
      usbRegisters->perI_RXSR_INDX |=(CSL_USB_perI_RXCSR_CLRDATOG_MASK);

      /*如果 FIFO 不为空则刷新*/
      if (((usbRegisters->perI_CSR0_INDX & CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)==
        CSL_USB_perI_TXCSR_FIFONOTEMPTY_MASK)
      {
       //usbRegisters->perI_CSR0_INDX |= CSL_USB_perI_TXCSR_FLLUSHFIFO_MASK;

       tempVal = usbRegisters->perI_CSR0_INDX;

       tempVal |= CSL_USB_perI_TXCSR_FLUSHFIFO_MASK;
       tempVal &=~(0x03);

       usbRegisters->perI_CSR0_INDX = tempVal;
      }

      /*恢复索引寄存器*/
      usbRegisters->index_TESTMODE = saveIndex;
     }

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

    感谢您的回答。
    我的另一个问题如何?

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

    来自 C5515 TRM:
    2.8.4.1.2运行
    当要通过管道中的批量传输数据时、需要将数据包加载到 FIFO 和中
    将 PERI_TXCSR 寄存器写入以设置 TXPKTRDY 位(位0)。 当数据包已发送时、将显示
    TXPKTRDY 位将由 USB 控制器清零、并产生中断、以便下一个数据包
    可以加载到 FIFO 中。 如果启用了双包缓存、则在第一个数据包完成后
    当 TXPKTRDY 位置位时、USB 控制器将立即清零 TXPKTRDY 位
    并产生中断、以便可以将第二个数据包加载到 FIFO 中。 软件应该
    以相同的方式运行、在接收到中断时加载数据包、无论是否为双精度型
    是否启用了数据包缓冲。

    Q1:以下是 TX (USB IN)的正确顺序:
    在 IN 令牌之前、必须将下一次发送的 USB 数据复制到 TX FIFO 中、这一点非常重要
    来自 USB 主机(用于单缓冲器或双缓冲器)。 如果 IN 令牌传入且没有数据
    在 TX FIFO 中、USB 内核将返回 NOT。
    在用户将下一个发送的数据复制到 TX FIFO、然后将 TXPKTRDY 设置为1后、将由清除
    将数据传输到 USB 主机后的 USB 内核、或使用双缓冲器、用户刚刚加载
    TX FIFO 中双缓冲器的第一个
    3.当 USB 设备(C55xx)接收到来自 USB 主机的输入令牌时、USB 设备将开始传输
    从 TX FIFO 到 USB 主机(PC、Mac 或 Linux)的数据

    Q2:是的、但它必须在步骤2中。 一旦步骤3开始(当 IN 令牌到达时),您将无法清除当前的
    正在传输数据包。 当使用双缓冲器时、从 TX FIFO 中的第二个缓冲器开始、我不确定是
    FIFOFLUSH 将运行。 它可能会清除第二个缓冲区。

    此致、

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

    您好、Ming、

    感谢您的盛情款待。  但 他们也有一些问题。

    IN 令牌中没有"尚未"的数据包。 NOT-Ket 数据包应用于 OUT 令牌。我的理解是否正确?

    此外、它们还使用等时模式来发送音频数据。 在这种模式下 、它不使用握手数据包。  很好吗?

    在使用等时模式的情况下、您是否评估了 FLUSHFIO 的运行?

    此致。

    Kaka

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

    大家好、Kaka-San、

    你是对的。 它不是"尚未"。 当 USB 主机发送输入令牌、而 USB 设备没有准备好发送的数据时、它应该为"NAK"。

    在等时模式下、不存在应答阶段、但仍有输入令牌(或输出令牌)、因此我在上一篇关于 FUSHFIFO 的文章中介绍的过程保持不变。 实际上、应答阶段应该是第4步:USB 主机 在接收到输入数据后发送一个"ACK"。 由于您的客户正在使用等时模式、步骤4不存在。

    此致、

    Ming     

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

    大家好、Kaka-San、

    您能否分享客户的用例并解释他们为什么需要清空 FIFO?

    对于 USB 音频类、难以理解的部分是初始 TX FIFO 设置。 下面是我实现它的方法:

    1.将 EP 设置为 等时模式

    2.向  TX FIFO 发送全零音频数据包(大小由通道数和采样频率决定)

    3.将 TXPKTRDY 设置为1、然后等待 TX EP 中断发生

    4.当 TX FIFO 中的数据已经被发送到 USB 主机时、会产生 TX EP 中断

    5.在响应 TX EP 中断时、将下一个音频数据包(来自音频编解码器输入)放入 TX FIFO

    6.将 TXPKTRDY 设置为1

    根据需要重复4-6。

    如您所见、无需 FLUSHFIFO。

    我可以看到您可能需要 FLUSHFIFO 的唯一位置是当您复位 EP 或启动 IN 数据序列的下一个周期(从步骤2开始第二次)时。 数据序列中可能会有最后一个数据。

    2 (修改):如果(FIFONOTEMPTY=1)、将 FUSHFIFO 设置为1 (如果使用双缓冲器、可能需要两次);  发送一 个全零音频数据包 到 TX FIFO (大小由通道数和采样频率决定)。

    其他一切都保持不变。

    Ming

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

    您好、Ming、

    感谢您的回答。 但是、我对您的答案感到困惑。
    以下是您之前的答案。

    > Q1:以下是 TX (USB IN)的正确顺序:
    >1. 必须在 IN 令牌之前将下一次发送的 USB 数据复制到 TX FIFO 中、这一点非常重要
    >从 USB 主机进入(用于单缓冲器或双缓冲器)。 如果 IN 令牌传入且没有数据
    >在 TX FIFO 中、USB 内核将返回 NOT。

    在令牌中似乎有"尚未"的数据包。 请回答以下问题吗?
    >在使用等时模式的情况下、您是否已评估 FUSHFIO 的运行?
    根据您的回答、似乎答案不是。 对吧?

    此致。
    Kaka

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

    我将检查背景以使用 FLUSHFIFO。
    如果我得到他们的反馈、我会发布。

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

    我从客户那里获得了他们使用 FLUSHFIFO 的代码和背景信息。

    [使用 FLUSHFIFO 的背景]
    自从上次通信结束后、USB 音频打开时、FIFO 中仍有数据的原因如下所示。
    由于 USB 协议的性质、需要提前加载 USB 器件、并且在获取最后数据之前不会从 USB 主机发送"输入令牌"。 因此、如果无法完成 FIFOFlush 操作、则前一个对接的数据将在打开后立即流入数据包并产生噪声。 这就是他们希望使用 FLASHFIFO 的原因。

    正如您所想的那样、为了清除之前的数据包数据、他们希望在您之前的帖子中的步骤2开始之前擦除 FIFO。
    > 2. 向 TX FIFO 发送全零音频数据包(大小由通道数和采样频率决定)

    其代码如下所示。 您是否会检查它是否有任何问题?
    注意:我得到反馈、即使使用此功能、他们也无法获得预期行为。
    *********
    #define TX_EP (1)
    空 UsbAudioTxOpen()

    int i;
    易失性 uint16 reg;
    for (i=0;i<2;i++)

    reg = usbRegisters->EPCSR[TX_EP-1].perI_TXCSR;
    if (reg & CSL_USB_perI_TXcsr_FIFONOTEMPTY_MASK)

    reg |= CSL_USB_perI_TXCSR_FLUSHFIFO_MASK;
    reg &=~(0x3);
    usbRegisters->EPCSR[TX_EP-1].perI_TXCSR;= reg;


    reg = usbRegisters->EPCSR[TX_EP-1].perI_TXCSR;
    对于(i=0;i<48*2;i++) usbRegisters->FIFO1R1 = 0;
    usbRegisters->EPCSR[TX_EP-1].perI_TXCSR = reg | CSL_USB_perI_TXCSR_TXPKTRDY_MASK;
    对于(i=0;i<48*2;i++) usbRegisters->FIFO1R1 = 0;
    usbRegisters->EPCSR[TX_EP-1].perI_TXCSR = reg | CSL_USB_perI_TXCSR_TXPKTRDY_MASK;

    秘书长的报告

    如果您有任何问题、请告诉我。
    此致。
    Kaka
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Kaka-San、

    我在上一个帖子中试图告诉您的是、当 IN 令牌来自 USB 主机时、如果 TX FIFO 中没有数据、则 USB 内核将向 USB 主机发出 NAK (我的错误、还不是)。 这就是为什么您需要在 IN 令牌到达之前将 TX 数据放入 TX FIFO 中的原因。

    是的、我们已经在 USB 音频类2.0框架中的双缓冲器案例中验证了 FLUSHFIFO。

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

    在双缓冲器情况下、关于 FFLUSHFIFO 的客户代码看起来正常。 唯一的问题是、使用此实现方案时、实际音频会在2ms 之前保持静音、但由于双缓冲、这似乎无法避免。

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

    您好、Ming、

    感谢您的评论。

    但是、正如我在之前的帖子中所写的、如果客户使用此代码、则无法确认预期行为。 即 C5505、即使使用了此代码、也会将垃圾数据发送到主机。
    这就是为什么我们已经问您在 TXPKTRDY 置1后、FLTUSHDIO 是否可以擦除 FIFO 上的数据。

    顺便说一下、我们可以从哪里获得 USB 音频类2.0框架? 这意味着什么?

     

    此致。

    Kaka