主题中讨论的其他器件:DK-TM4C123G、 EK-TM4C123GXL、 EK-TM4C1294XL
大家好、
我使用了示例 C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\dk-tm4c123g\USB_dev_keyboard、并针对 TM4C123GH6PM 进行了修改。 它正在成功运行。 但字符之间的延迟太长。 通信速度太慢。 如何提高这一比例?
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.
大家好、
我使用了示例 C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\dk-tm4c123g\USB_dev_keyboard、并针对 TM4C123GH6PM 进行了修改。 它正在成功运行。 但字符之间的延迟太长。 通信速度太慢。 如何提高这一比例?
您好 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;
}
}
}
我找到了一个针对连接缓慢的修复方法。 这与端点间隔有关。 在 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、//此端点的轮询间隔。
};