TM4C123G紅外觸摸屏:開發板好不容易實現了原理,放到專家設計的板子上沒法運行,因而專家跑路項目黃了

使用TI的TM4C123G LaunchPad開發板,USB接口,來對一樣的芯片進行燒寫。數組


咱們只用燒寫那一塊功能,不用另一個芯片的開發功能,須要跳線
 
源碼項目:
 
從官方網站TM4C123G,下載這個板的 驅動、燒寫程序、工程項目
LMFlashProgrammer.msi  裝完就有燒寫程序、驅動和項目了
SW-TM4C-2.0.1.11577.exe ,TivaWare_C_Series-2.0.1.11577項目,examples\boards\ek-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"
 
 
以USB轉串口爲基礎來改,先幹掉CDC部分
除了main函數那個文件的方法,還有.S文件
 
.S文件中有幾個符號導出,已經沒有了,以及引用的地方USBUARTIntHandler再也不須要,其餘2個仍是要的,後面移植鍵盤相關函數,有實現
    EXTERN  SysTickIntHandler
        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
};
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
};
對於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
};
對於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
};
 
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
};
其餘幾個很容易改,重點是 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;
        }
 
 
不須要SendString及其依賴的WaitForSendIdle,刪除便可,否則調用 tUSBDHIDKeyboardDevice 結構形成編譯錯誤
main函數的 USBDHIDKeyboardInit,改成對應的
改完後再次編譯,總提示未定義,
D:\ti\TivaWare_C_Series-2.0.1.11577\examples\boards\ek-tm4c123gxl\usb_dev_serial\usb_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"//必須放在最後,
由於 tUSBDHIDMouseDevice定義在usbdhidmouse.h裏,被usb_keyb_structs.h引用,若是先引用,則找不到定義
頭文件是有順序的,坑爹!!!
真是本身做死,不管是usb_keyb_structs.c結構文件,仍是mian函數文件,都是要注意順序,"usb_keyb_structs.h"必須放在最後
 
附資料 extern真是坑人,徹底沒起做用

externide

   在源文件A裏定義的函數,在其它源文件裏是看不見的(即不能訪問)。爲了在源文件B裏能調用這個函數,應該在B的頭部加上一個外部聲明:函數

   
  extern   函數原型;   網站


  這樣,在源文件B裏也能夠調用那個函數了ui

 
 
終於!!!編譯成功此次能夠識別成功鼠標了。
-------------------------------------------------------------
 
 
 
最後是main函數,鍵盤是把從IO收到的數據,上傳到上位機
鼠標一樣也是,所以參考鍵盤的作法,在while循環中來操做
 

一樣的代碼,在開發板上正常,能夠發送模擬的USB鼠標數據,看到效果
但在目標板上,只能識別USB鼠標,但發送數據不成功。
 
查看IO,彷佛是處理Handler裏鏈接的事件沒觸發
 
目標板加了一個保護ESD什麼的,須要和硬件工程師一塊兒來調試。
 
而後,專家辭職跑路。
相關文章
相關標籤/搜索