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.

[参考译文] TMS320F28069:USB 串行开发示例-只能看到一个打印-然后是 Nada

Guru**** 2601915 points
Other Parts Discussed in Thread: TMS320F28069, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675422/tms320f28069-usb-serial-dev-example---only-see-one-print---then-nada

器件型号:TMS320F28069
主题中讨论的其他器件: C2000WARE

尊敬的 TI (Sal):

确定-要继续此主题:

我在我的应用程序中发现我必须在 USB_dev_serial.c 中执行以下操作:

在中:

// USBOUARTRXIntHandler -正在进行 UART RX 的中断处理程序
//通过 USB 重定向。

_interrupt void USBUARTRXIntHandler (void)-  

在这个 IRQ 处理程序的末尾、我必须放置以下内容:

 UARTIntClear (UART1_base、UARTIntStatus (UART1_base、false)); (我使用 UART1与 UART0。)

如果我不清除 IRQ;处理程序将不会处理任何其他消息;它将在收到第一条消息后停止。

请注意、我已经尝试查看 SCI-B 和 USB0上的所有状态寄存器;我无法找到问题所在。

但是、如果我将其输入;IRQ 处理程序至少会保留处理消息。

作为测试、为了确保一切正常工作-我在"空闲"任务中执行以下操作:

 uint8_t ui8Char;

ui8Char ='A';
USBBufferWrite (&G) sTxBuffer、(uint8_t *)和 ui8Char、1);

在我的 USB/串行连接至'69 USB I/F 上打印了 A、因此工作正常。

但是,我不知道为什么我必须调用 UARTIntClear ();命令来保持 IRQ 正常运行。

感谢您的任何帮助。

谢谢、
约翰·W

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

    我认为您的理解是正确的。 您需要清除模块中的中断状态以及 PIE、以便生成另一个中断并将其传播到 C28x。

    UART1应等于 SCI-A 您应该能够在 SCI-A 上看到 SCI RX 或 SCI TX 中断状态被设定

    希望这对您有所帮助。

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

    你好 Sal、

    对于 TMS320F28069:

    #define USB0_BASE        0x00004000 // USB 0控制器

    #define UART0_BASE        0x00007050 // SCI-A

    #define UART1_base        0x00007750 // SCI-B

    因此、UART1_base 指向 SCI-B

    在禁用 IRQ 之前、是否有一个状态寄存器可供我检查、以便我可以查看发生了什么情况? -或者这是否是正常操作,如果是,那么

    UARTIntClear (UART1_base、UARTIntStatus (UART1_base、false)); (我使用 UART1与 UART0。)

    或等效的 UART0_BASE 应包含在 TI 发布的示例中。

    传输端注意事项- SCI-B 另一端的器件始终返回正确的字节计数(它具有内置的监控功能)、因此至少看起来正常。

    我还注意到一些较新处理器的代码中有一些内容、而不是使用:

    IntRegister (INT_SCIRXINTB、USBUARTRXIntHandler);
    IntRegister (INT_SCITXINTB、USBUARTTXIntHandler);

    代码使用:

    UARTRXIntRegister (UART1_BASE、USBUARTRXIntHandler);
    UARTTXIntRegister (UART1_BASE、USBUARTTXIntHandler);

    它们是否重要、或者它们是否能够有效地实现相同的功能?

    谢谢、  

    John W、

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

    很抱歉造成混淆。 通常、第一个实例是 SCI A、但在此代码中、它已映射到 SCI B、因此您答对了。

    代码使用 SCI-B、中断状态在 FFTX 寄存器中。 该位为 TXFFINT。 要将其清除、请写入 TXFFINTCLR。 这是否能回答您的问题?

    用于注册 ISR 矢量的函数应该也执行同样的操作。 您可以检查函数定义并查看源代码。

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

    我现在已经通过这种理解使 IRQ 运行得更好了;我也为 SCI-B 编写了一个单独的 IRQ 处理程序来进行一些测试。

    我从外设获得一个数据包;大约为1KB;我意识到不幸的是、这个通信端口(sci 端口)上没有 DMA、否则 dma'ing 数据我肯定会解决这个问题、我现在看到我已经越过了 IRQ、但它不起作用。

    我认为数据到达 SCI-B 端口的情况很好;SCI-A 上有一个 BT 无线电 I/F;我将 SCI-B 上接收到的数据回传到 SCI-A 作为检查;(I
    我的手机上有一个 Android BT 串行端口应用、它可以获取数据包。一旦我超过19.2kB、我就会看到 USB 端口输出上的字符被丢弃或失真。 我认为减速可能在这里:

    USBBufferWrite (&G) sTxBuffer、(uint8_t *)和 ui8Char、1);

    是否有任何方法可以增强此代码的性能?

    如果我以19.2kB 的速率运行所有程序、它将起作用;(SCI-A 至 BT I/F 在115.2kB 的速率下运行还可以-但我只是从 SCI-A 移位寄存器直接回传数据)。

    因此、如果您想了解有关如何加速从 USB 端口到虚拟 COM 端口的传输的任何指针、我们将不胜感激。

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

    Sal、

    在 USB 库代码-我找到了所附的- usbcdc.h 文件的头文件显示 usbhid.h

    这是 C2000 Ware 1.0.3发行版。

    此致、

    John

    e2e.ti.com/.../usbcdc.h

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

    从我在 C2000器件和 Windows PC 机器上进行的 USB 通信分析中、我注意到吞吐量增加的瓶颈实际上是 Windows PC 以数据包形式发送数据。 作为主系统的 Windows OS 必须使用数据包中的 Via data 请求数据。 从器件(C2000)发送数据以响应数据包中的这些数据。

    我不确定如何通过增加 PC 发送的数据包中的数据频率来轻松提高吞吐量。 这可能需要 Windows OS 内核编程和内核驱动程序。 我们对此不提供支持。

    通过将 C2000 USB 大容量器件与 PC 配合使用、我实现了7Mbps 的最大吞吐量。 这是由 PC 造成的。

    希望这对您有所帮助。

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

    我看到 C2000Ware_1_00_04_00已发布-我仍然看到我发布的内容(如上所述)。

    我在这个机器上使用了很多 VCP 文件-我有一些项目的运行速度超过1Mbps;所以我不认为这里的 PC 可能是问题;除非它实际上位于这个代码的 TI 部分;我想这就是您的意思。

    如果可以将 VCP 与大容量 xfer 结合使用、这将是理想情况;但我知道、这可能甚至是不可能的。

    我确实注意到文档中有关删除某些错误检查的一些注释:
    (引言中的第5页:)

    USB 库函数的功能和组织由以下设计决定
    目标:

    它们完全用 C 语言编写
    它们易于理解。
    它们在内存和处理器使用方面效率相当高。
    它们是尽可能自包含的。
    在可能的情况下、可以在编译时执行的计算会在该位置执行
    运行时的状态。

    这些设计目标的一些后果包括:

    为了确保易用性和易理解性、USB 功能不一定高效
    (从代码大小和/或执行速度的角度来看)。
    API 具有删除所有错误检查代码的方法。 因为会进行错误检查
    通常仅在初始程序开发期间有用、可以将其删除以提高代码大小
    和速度。

    因此、我将研究这一点-删除一些错误检查、看看这是否会加快速度。

    谢谢、
    John