使用TI的TM4C123G LaunchPad开发板,USB接口,来对同样的芯片进行烧写。
我们只用烧写那一块功能,不用另外一个芯片的开发功能,需要跳线
源码项目:
从官方网站TM4C123G,下载这个板的驱动、烧写程序、工程项目。
LMFlashProgrammer.msi 装完就有烧写程序、驱动和项目了
SW-TM4C-2.0.1.11577.exe ,TivaWare_C_Series-2.0.1.11577项目,examplesoardsek-tm4c123gxl为我们使用的芯片项目
红外屏原理图,见PDM上的项目
讨厌的undefined错误,在拿usb-keyb的代码旺CDC代码上移植时。加了以下头文件
#include "usblib/usbhid.h"
#include "usblib/device/usbdhid.h"
#include "usblib/device/usbdhidkeyb.h"
#include "usb_keyb_structs.h"
#include "usblib/device/usbdhid.h"
#include "usblib/device/usbdhidkeyb.h"
#include "usb_keyb_structs.h"
以USB转串口为基础来改,先干掉CDC部分
除了main函数那个文件的方法,还有.S文件
.S文件中有几个符号导出,已经没有了,以及引用的地方USBUARTIntHandler不再需要,其他2个还是要的,后面移植键盘相关函数,有实现
EXTERN SysTickIntHandler
EXTERN USBUARTIntHandler
EXTERN USB0DeviceIntHandler
EXTERN USBUARTIntHandler
EXTERN USB0DeviceIntHandler
; DCD USB0DeviceIntHandler ; USB0 等等
然后又会提示没有实现KeyboardHandler,然后把USB键盘main函数文件那边,相关的一坨全复制过来,编译成功!
但运行起来无法识别,用PB0,2,3 IO拉低,定位程序,发现运行正常。知道while(1)都没问题。
原来是while(1)这里还需要写代码才行?或者再.S文件里加点东西?
while(1)加了相关代码,还是不行。明天继续试验.S文件
把原来USB的CDC中.s文件去掉;EXTERN USBUARTIntHandler,果然是不行了
现在在.s文件加入keyboard的函数,并删除USBUARTIntHandler,OK,成功识别!
---------------------------------------------------------------------------------------------------------------
改USB鼠标:
usb_xxx_structs的C和H文件,及mian函数要实现的xxxHandler
先观察keyboard,bulk,USB串口都有一个usb_bulk_structs这样的文件
1,都有一个字串的数组定义
const uint8_t * const g_ppui8StringDescriptors[] =
{
g_pui8LangDescriptor,
g_pui8ManufacturerString,
g_pui8ProductString,
g_pui8SerialNumberString,
g_pui8DataInterfaceString,
g_pui8ConfigString
};
{
g_pui8LangDescriptor,
g_pui8ManufacturerString,
g_pui8ProductString,
g_pui8SerialNumberString,
g_pui8DataInterfaceString,
g_pui8ConfigString
};
2,都有设备描述符
tUSBDHIDKeyboardDevice g_sKeyboardDevice =
{
USB_VID_TI_1CBE,
USB_PID_KEYBOARD,
500,
USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE,
KeyboardHandler,
(void *)&g_sKeyboardDevice,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
{
USB_VID_TI_1CBE,
USB_PID_KEYBOARD,
500,
USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE,
KeyboardHandler,
(void *)&g_sKeyboardDevice,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
对于bulk,多定义了2个buffer
tUSBDBulkDevice g_sBulkDevice =
{
USB_VID_TI_1CBE,
USB_PID_BULK,
500,
USB_CONF_ATTR_SELF_PWR,
USBBufferEventCallback,
(void *)&g_sRxBuffer,
USBBufferEventCallback,
(void *)&g_sTxBuffer,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
{
USB_VID_TI_1CBE,
USB_PID_BULK,
500,
USB_CONF_ATTR_SELF_PWR,
USBBufferEventCallback,
(void *)&g_sRxBuffer,
USBBufferEventCallback,
(void *)&g_sTxBuffer,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
对于CDC,类似bulk
tUSBDCDCDevice g_sCDCDevice =
{
USB_VID_TI_1CBE,
USB_PID_SERIAL,
0,
USB_CONF_ATTR_SELF_PWR,
ControlHandler,
(void *)&g_sCDCDevice,
USBBufferEventCallback,
(void *)&g_sRxBuffer,
USBBufferEventCallback,
(void *)&g_sTxBuffer,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
{
USB_VID_TI_1CBE,
USB_PID_SERIAL,
0,
USB_CONF_ATTR_SELF_PWR,
ControlHandler,
(void *)&g_sCDCDevice,
USBBufferEventCallback,
(void *)&g_sRxBuffer,
USBBufferEventCallback,
(void *)&g_sTxBuffer,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
tUSBDHIDKeyboardDevice 这个结构都要被usbdhidkeyboard使用。
同理找到找到usbdhidmouse 中使用 tUSBDHIDMouseDevice,tUSBDHIDMouseDevice搜索出定义
tUSBDHIDMouseDevice g_sMouseDevice
{USB_VID_TI_1CBE,
USB_PID_MOUSE,
500,
USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE,
KeyboardHandler,
(void *)&g_sMouseDevice,
g_ppui8StringDescriptors,
NUM_STRING_DESCRIPTORS
};
NUM_STRING_DESCRIPTORS
};
其他几个很容易改,重点是KeyboardHandler 换成是MouseHandler
分析KeyboardHandler的状态处理,发现都是USB都有的状态,没有什么特别的,可以直接重用:
分析bulk, 就是RxHandler和TxHandler
分析CDC,比较复杂,ControlHandler处理这里常用状态并结合RxHandler,TxHandler
所以Mouse直接用keyboardHanlder就好了
USB_EVENT_CONNECTED
USB_EVENT_DISCONNECTED
USB_EVENT_TX_COMPLETE
USB_EVENT_SUSPEND
USB_EVENT_RESUME
USBD_HID_KEYB_EVENT_SET_LEDS://这个上位机向单片就传送一个LED灯的亮起,键盘才有的事件,鼠标则没有
{
//
// Set the LED to match the current state of the caps lock LED.
//
ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2,
(ui32MsgData & HID_KEYB_CAPS_LOCK) ? GPIO_PIN_2 :
0);
break;
}
{
//
// Set the LED to match the current state of the caps lock LED.
//
ROM_GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_2,
(ui32MsgData & HID_KEYB_CAPS_LOCK) ? GPIO_PIN_2 :
0);
break;
}
不需要SendString及其依赖的WaitForSendIdle,删除即可,不然调用tUSBDHIDKeyboardDevice 结构造成编译错误
main函数的 USBDHIDKeyboardInit,改为对应的
改完后再次编译,总提示未定义,
D: iTivaWare_C_Series-2.0.1.11577examplesoardsek-tm4c123gxlusb_dev_serialusb_keyb_structs.h(34): error: #20: identifier "tUSBDHIDMouseDevice" is undefined
usb_keyb_structs.h(34): error: #20: identifier "tUSBDHIDMouseDevice" is undefined
这条几个小时,最后发现!!!
#include "usblib/device/usbdhidmouse.h"
#include "usb_keyb_structs.h"//必须放在最后,
#include "usb_keyb_structs.h"//必须放在最后,
因为tUSBDHIDMouseDevice定义在usbdhidmouse.h里,被usb_keyb_structs.h引用,如果先引用,则找不到定义
头文件是有顺序的,坑爹!!!
真是自己作死,无论是usb_keyb_structs.c结构文件,还是mian函数文件,都是要注意顺序,"usb_keyb_structs.h"必须放在最后
附资料,extern真是坑人,完全没起作用
extern
在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明:
extern 函数原型;
这样,在源文件B里也可以调用那个函数了
终于!!!编译成功这次可以识别成功鼠标了。
-------------------------------------------------------------
最后是main函数,键盘是把从IO收到的数据,上传到上位机
鼠标同样也是,因此参考键盘的做法,在while循环中来操作
同样的代码,在开发板上正常,可以发送模拟的USB鼠标数据,看到效果
但在目标板上,只能识别USB鼠标,但发送数据不成功。
查看IO,似乎是处理Handler里连接的事件没触发
目标板加了一个保护ESD什么的,需要和硬件工程师一起来调试。
然后,专家辞职跑路。