尊敬的 TI 专家:
请允许我确认以下问题。
[问题]
您知道擦除 USB 内核双缓冲器上的数据的方法吗?
我的客户想知道、客户是否可以擦除已在 USB 内核上设置的缓冲区数据、而不向 USB 总线发送任何垃圾数据。
如果是、请告诉我该怎么做?
此致。
Kaka
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.
尊敬的 TI 专家:
请允许我确认以下问题。
[问题]
您知道擦除 USB 内核双缓冲器上的数据的方法吗?
我的客户想知道、客户是否可以擦除已在 USB 内核上设置的缓冲区数据、而不向 USB 总线发送任何垃圾数据。
如果是、请告诉我该怎么做?
此致。
Kaka
您好、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、
我们收到了我的客户的问题。 因此、请允许我确认以下问题、以防万一。
[问题1]
我的理解是否正确、如下所示?
1:下一个发送的 USB 数据在 FIFO 中(双缓冲器)。
2.如果 TXPKTRDY 位被用户置位,则准备发送数据。
3、如果主机提出请求、FIFO 数据将发送给 CPU。
[问题2]
在置位 TXPKTRDY 后、它能否通过 FLUSHFIFO 清除/擦除 FIFO 上的下一个 USB 数据?
也就是说、在上面的步骤3中、它能在 USB 主机发出请求之前使用 FFLUSHFIFO 来擦除 FIFO (双缓冲器)数据吗?
此致。
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;
}
}
大家好、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