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.

[参考译文] TM4C123GH6PM:慢速 USB HID 键盘设备

Guru**** 2466550 points
Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL, EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667504/tm4c123gh6pm-slow-usb-hid-keyboard-device

器件型号:TM4C123GH6PM
主题中讨论的其他器件:DK-TM4C123GEK-TM4C123GXLEK-TM4C1294XL

大家好、

我使用了示例 C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\dk-tm4c123g\USB_dev_keyboard、并针对 TM4C123GH6PM 进行了修改。 它正在成功运行。 但字符之间的延迟太长。 通信速度太慢。 如何提高这一比例?

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

    我假设端口在 EK-TM4C123GXL LaunchPad 上工作? 如果您所做的只是端口、您能否提供项目以便让我了解该行为?

    如果不是、我想更好地了解沟通速度如何。 这可能只是端口的问题、尽管我从未使用该 LaunchPad 尝试过键盘示例。 不过、TivaWare 随附的 EK-TM4C1294XL Launchpad 示例的性能良好、因此我不认为 LaunchPad 硬件应限制它(尽管 EK-TM4C123GXL 板的构建比前面提到的其他板更简单)。

    您还在使用什么键盘? 您是否使用 TivaWare 中未经修改的 HID USB 示例测试了该键盘? (不确定您是否有 DK 123G 板或 TM4C1294 LaunchPad 可用)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    使用 TM4C123GH6PM 设计的网络定制 PCB、在第一个阶段、我在 EK-TM4C123GXL 上试用 了有关 VBUS 的小型插孔。 这是我的代码。

    //*
    main.h
    *
    **创建日期:2 EKI 2017
    * 作者:Metin KOC
    */
    
    #include "main.h"
    
    
    void IntUartDebug (void){
    uint32_t ui32Status;
    int32_t rcv_ch;
    
    ui32Status = MAP_UARTIntStatus (BASE_UART_DEBUG、TRUE);
    MAP_UARTIntClear (BASE_UART_DEBUG、ui32Status);
    
    RCV_ch = MAP_UARTCharGetNonBlocking (BASE_UART_DEBUG);
    
    if (rcv_ch=-1)
    return;
    
    }
    
    
    uint32_t
    KeyboardHandler (void *pvCBData、uint32_t ui32Event、uint32_t ui32MsgData、
    void *pvMsgData)
    {
    switch (ui32event)
    {
    //
    //主机已连接到我们并配置了设备。
    //
    案例 USB_EVENT_Connected:
    {
    sendUartString (base_uart_debug、"connected \r\n);
    G_bConnected = true;
    G_bSuspened = false;
    中断;
    }
    
    //
    //主机已与我们断开连接。
    //
    案例 USB_EVENT_DISCONNECTED:
    {
    sendUartString (base_uart_debug、"已断开连接\r\n);
    G_bConnected = false;
    中断;
    }
    
    //
    //每次主机确认传输时,我们都会收到此事件
    //报告的内容。 这里使用它纯粹是一种确定是否存在的方法
    //主机仍在与我们交谈。
    //
    案例 USB_EVENT_TX_COMPLETE:
    {
    //
    //自我们完成发送内容后输入空闲状态。
    //
    G_eKeyboardState = State_Idle;
    中断;
    }
    
    //
    //此事件表示主机已挂起 USB 总线。
    //
    案例 USB_EVENT_SUSPEND:
    {
    sendUartString (base_uart_debug、"Suspended \r\n");
    G_bSuspened = true;
    中断;
    }
    
    //
    //此事件表示主机已在总线上恢复信令。
    //
    案例 USB_EVENT_RESUME:
    {
    sendUartString (base_uart_debug、"未暂停\r\n");
    G_bSuspened = false;
    中断;
    }
    
    //
    //此事件表示主机已向我们发送输出或
    //功能报告,报告现在位于我们提供的缓冲区中
    //之前的 USBD_HID_EVENT_GET_REPORT_BUFFER 回调。
    //
    案例 USBD_HID_KEYB_EVENT_SET_LED:
    {
    
    中断;
    }
    
    //
    //我们忽略所有其它事件。
    //
    默认值:
    {
    中断;
    }
    }
    
    return (0);
    }
    
    bool
    WaitForSendIdle (uint_fast32_t ui32TimeoutTicks)
    {
    uint32_t ui32Start;
    uint32_t ui32Now;
    uint32_t ui32 Elapsed;
    
    ui32Start = g_ui32SysTickCount;
    ui32Elapsed = 0;
    
    while (ui32Elapsed < ui32TimeoutTicks)
    {
    //
    //键盘空闲,立即返回。
    //
    if (g_eKeyboardState = State_Idle)
    {
    return (true);
    }
    
    //
    //确定自我们开始等待以来已经过去了多少时间。 这种情况
    //在 g_ui32SysTickCount 的换行过程中应该是安全的。
    //
    ui32Now = g_ui32SysTickCount;
    ui32Elapsed =((ui32Start < ui32Now)? (ui32Now - ui32Start):
    ((((uint32_t) 0xFFFFFFFF - ui32Start)+ ui32Now + 1));
    }
    
    //
    //如果我们到达这里,我们将超时,因此返回错误的返回代码以允许
    //呼叫者知道。
    //
    return (false);
    }
    
    void
    SendString (char * pcStr)
    {
    uint32_t ui32char;
    
    
    while (* pcStr)
    {
    //
    //从字符串中获取下一个字符。
    //
    ui32Char =* pcStr++;
    
    //
    //如果该字符是不可打印字符,则跳过该字符。
    //
    
    if (ui32Char ='\n'){
    
    G_eKeyboardState = State_Sending;
    if (USBDHIDKeyboardKeyStateChange ((void *)&g_sKeyboardDevice、
    G_pipi8KeyUsageCodes[0x5F][0]、
    G_pipi8KeyUsageCodes[0x5F][1]、
    true)!= KEYB_SUCCESS)
    {
    返回;
    }
    
    if (!WaitForSendIdle (MAX_SEND_DELAY))
    {
    G_bConnected = 0;
    返回;
    }
    
    G_eKeyboardState = State_Sending;
    if (USBDHIDKeyboardKeyStateChange ((void *)&g_sKeyboardDevice、
    0、g_ppi8KeyUsageCodes [0x5F][1]、
    false)!= KEYB_SUCCESS)
    {
    返回;
    }
    
    if (!WaitForSendIdle (MAX_SEND_DELAY))
    {
    G_bConnected = 0;
    返回;
    }
    
    返回;
    
    ~((ui32Char <')||(ui32Char >'))
    {
    继续;
    }
    
    //
    //将字符转换为索引并将其转换为键盘使用代码
    //表。
    //
    ui32Char -=';
    
    //
    //发送按键消息。
    //
    G_eKeyboardState = State_Sending;
    if (USBDHIDKeyboardKeyStateChange ((void *)&g_sKeyboardDevice、
    G_pipe8KeyUsageCodes[ui32Char][0]、
    G_pipe8KeyUsageCodes[ui32Char][1]、
    true)!= KEYB_SUCCESS)
    {
    返回;
    }
    
    //
    //等待,直到按键消息已发送。
    //
    if (!WaitForSendIdle (MAX_SEND_DELAY))
    {
    G_bConnected = 0;
    返回;
    }
    
    //
    //发送密钥释放消息。
    //
    G_eKeyboardState = State_Sending;
    if (USBDHIDKeyboardKeyStateChange ((void *)&g_sKeyboardDevice、
    0、g_ppi8KeyUsageCodes [ui32Char][1]、
    false)!= KEYB_SUCCESS)
    {
    返回;
    }
    
    //
    //等待密钥释放消息被发送。
    //
    if (!WaitForSendIdle (MAX_SEND_DELAY))
    {
    G_bConnected = 0;
    返回;
    }
    }
    
    
    void initUsb(void){
    
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_USB0);
    MAP_SysCtlUSBPLLEnable();
    
    MAP_SysCtlPeripheralEnable (Periph_GPIO_USB0ID);
    MAP_GPIOPinTypeUSBAnalog (BASE_GPIO_USB0ID、PIN_GPIO_USB0ID);
    
    MAP_SysCtlPeripheralEnable (Periph_GPIO_USB0VBUS);
    MAP_GPIOPinTypeUSBAnalog (BASE_GPIO_USB0VBUS、PIN_GPIO_USB0VBUS);
    
    MAP_SysCtlPeripheralEnable (Periph_GPIO_USB0DM);
    MAP_GPIOPinTypeUSBAnalog (BASE_GPIO_USB0DM、PIN_GPIO_USB0DM);
    
    MAP_SysCtlPeripheralEnable (Periph_GPIO_USB0DP);
    MAP_GPIOPinTypeUSBAnalog (BASE_GPIO_USB0DP、PIN_GPIO_USB0DP);
    
    HWREG (GPIO_PORTB_BASE + GPIO_PDR)|= GPIO_PIN_1;
    
    G_bConnected = false;
    G_bSuspened = false;
    
    
    USBStackModeSet (0、eUSBModeForceDevice、0);
    USBDHIDKeyboardInit(0、&g_sKeyboardDevice);
    
    }
    
    void
    IntWatchdog (void)
    {
    if (clearWatchdog)
    {
    clearWatchdog = false;
    MAP_WatchdogIntClear (WATCHDOG0_BASE);
    MAP_WatchdogReloadSet (WATCHDOG0_BASE、MAP_SysCtlClockGet ());
    }
    }
    
    void initHardware (void){
    
    ROM_FPULazyStackingEnable();
    
    MAP_SysCtlPeripheralEnable( Periph_GPIO_UART_DEBUG );
    MAP_GPIOPinConfigure (CONF_GPIO_UART_DEBUG_TX);
    MAP_GPIOPinConfigure (CONF_GPIO_UART_DEBUG_RX);
    MAP_GPIOPinTypeUART (BASE_GPIO_UART_DEBUG、PIN_GPIO_UART_DEBUG_TX | PIN_GPIO_UART_DEBUG_RX);
    MAP_SysCtlPeripheralEnable( Periph_UART_DEBUG );
    MAP_IntDisable (INT_UART_DEBUG);
    MAP_UARTDisable (base_uart_debug);
    MAP_UARTClockSourceSet (base_uart_debug、UART_clock_PIOSC);
    MAP_UARTConfigSetExpClk (BASE_UART_DEBUG、16000000、BAUDRATE_UART_DEBUG、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
    MAP_UARTIntEnable (BASE_UART_DEBUG、UART_INT_RX | UART_INT_RT);
    MAP_UARTEnable (BASE_UART_DEBUG);
    MAP_IntEnable( INT_UART_DEBUG );
    
    MAP_SysCtlPeripheralEnable( Periph_GPIO_LED_1);
    MAP_GPIOPinTypeGPIOOutput (base_GPIO_LED_1、PIN_GPIO_LED_1);
    MAP_GPIOPadConfigSet (base_GPIO_LED_1、PIN_GPIO_LED_1、GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
    MAP_GPIOPinWrite (base_GPIO_LED_1、PIN_GPIO_LED_1、!PIN_GPIO_LED_1);
    
    MAP_SysCtlPeripheralEnable (Periph_GPIO_LED_2);
    MAP_GPIOPinTypeGPIOOutput (base_GPIO_LED_2、PIN_GPIO_LED_2);
    MAP_GPIOPadConfigSet (base_GPIO_LED_2、PIN_GPIO_LED_2、GPIO_Strength _12mA、GPIO_PIN_TYPE_STD);
    MAP_GPIOPinWrite (BASE_GPIO_LED_2、PIN_GPIO_LED_2、!PIN_GPIO_LED_2);
    
    MAP_SysCtlPeripheralEnable (Periph_timer);
    MAP_TimerConfigure (BASE_TIMER、TIMER_CFG_PERIODICRACRACASE);
    MAP_TimerLoadSet (base_timer、timer_A、MAP_SysCtlClockGet ());
    MAP_TimerIntEnable (BASE_TIMER、INT_TIMER_TYPE);
    MAP_TimerEnable (base_timer、timer_A);
    MAP_IntEnable (INT_TIMER);
    
    
    initUsb();
    
    ROM_SysTickPeriodSet (ROM_SysCtlClockGet ()/SYSTICKS_PER_second);
    ROM_SysTickIntEnable();
    ROM_SysTickEnable();
    
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_WDOG0);
    MAP_WatchdogReloadSet (WATCHDOG0_BASE、MAP_SysCtlClockGet ());
    MAP_WatchdogResetEnable (WATCHDOG0_BASE);
    MAP_WatchdogEnable (WATCHDOG0_BASE);
    MAP_IntEnable (INT_Watchdog);
    }
    
    void
    SysTickIntHandler (void)
    {
    G_ui32SysTickCount++;
    }
    
    
    
    
    int main (void){
    
    uint_fast32_t ui32LastTickCount;
    bool bLastSuspend;
    
    MAP_SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz | SYSCTL_USE_PLL);
    
    initHardware();
    
    sendUartString (base_uart_debug、"Start\r\n");
    
    while (1){
    
    clearWatchdog = true;
    
    while (!g_BConnected)
    {
    clearwatchdog = true;
    }
    
    G_eKeyboardState = State_Idle;
    
    bLastSuspend = false;
    
    bufIxUart = 0;
    
    while (g_BConnected)
    {
    ui32LastTickCount = g_ui32SysTickCount;
    
    if (bLastSuspend!= g_bSuspened)
    {
    bLastSuspend = g_BSuspened;
    
    if (bLastSuspend)
    {
    sendUartString (base_uart_debug、"总线已暂停!\r\n");
    }
    其他
    {
    sendUartString (base_uart_debug、"主机已连接!\r\n");
    }
    }
    
    
    if (g_BSuspened)(如果(g_BSuspened))
    {
    USBDHIDKeyboardRemoteWakeupRequest (
    (void *)&g_sKeyboardDevice);
    }否则{
    
    SendString ("这是尝试");
    }
    
    while (g_ui32SysTickCount = ui32LastTickCount)
    {
    clearwatchdog = true;
    }
    }
    
    
    }
    

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

    我已经看过您的帖子、现在还没有足够的时间深入了解详情、明天将会尝试并回复您。 让您知道自己不会被遗忘。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了一个针对连接缓慢的修复方法。 这与端点间隔有关。 在 C:\ti\TivaWare_C_Series-2.1.4.178\usblib\device\usbdhidkeyb.c 文件中、我更改了以下粗体和彩色 行中的2个参数。

    静态常量 uint8_t g_pui8HIDInEndpoint [HIDINENDPOINT_SIZE]=

      //
      //端点描述符中的中断
      //
      7、//端点描述符的大小。  
      USB_DTYPE_EndPoint、//描述符类型是一个端点。  
      USB_EP_DESC_IN | USBEPToIndex (USB_EP_1)、
      USB_EP_ATTR_INT、//端点是中断端点。
      USBShort (USBFIFOSizeToBytes (USB_FIFO_SZ_64))、
      //最大包大小。
      1、//此端点的轮询间隔。
    };

    静态常量 uint8_t g_pui8HIDOutEndpoint [HIDOUTENDPOINT_SIZE]=

      //
      //中断输出端点描述符
      //
      7、//端点描述符的大小。
      USB_DTYPE_EndPoint、//描述符类型是一个端点。
      USB_EP_DESC_OUT | USBEPToIndex (USB_EP_2)、
      USB_EP_ATTR_INT、//端点是中断端点。
      USBShort (USBFIFOSizeToBytes (USB_FIFO_SZ_64))、
      //最大包大小。
      1、//此端点的轮询间隔。
    };

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

    感谢您与社区分享您的解决方案!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以注意到(有裂缝的工作人员注意到)"没有这样的粗线"是显而易见的!    (因此"共享"-不是如此完整)   

    "颜色编码"(而不是"粗体")可能会证明更有效?

    USB HID 的速度是否增加了多少(甚至估计了多少)?    除了"更好地识别"修复"之外、这将产生 "更有效的共享!"

    海报的努力是非常值得赞赏的-但"修复"不容易被检测到-改进的程度- 应该"更好地描述!"

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

    代码中的"强"注释是黑体... E2E 插入代码功能有时不足、或者可能太强了。 它解析与编码相关的所有内容、包括添加在帖子编辑器中的粗体文本等、因此它不显示正确的编码、而是显示语法。 我不认为颜色编码可以避免这种情况、但我必须承认绝不会这样做。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哇,拉尔夫——你是不倦的——如此的响应!    谢谢你——首先是我——然后是年轻的眼睛——都看不到!
    请注意、我已请求"加速的程度!"   这也很重要-您是否同意?

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

    当然,我不是想忽略你的问题,只是想跳进来,评论我最终能做的事情:)