看到帖子《移植CherryUSB 到LPC55S69》 https://www.nxpic.org.cn/module/forum/thread-629656-1-1.html
測試了一下LPC55S69基于CherryUSB協(xié)議棧的例子,發(fā)現(xiàn)移植不完善。例子只實現(xiàn)了USB鼠標的應用,沒有實現(xiàn)輸出端點控制。本次就加以補充完善了輸入輸出端點發(fā)送接收數(shù)據(jù)。測試了HID類,MSC類和CDC類,基本正常工作。其他的例子還沒測試。
先放上例子工程。下面是工程:
lpc55s69_CherryUsb.rar (6.99 MB)
移植的主要文件在usb_dc_lpc3511.c中。
這里要注意先初始化USB的VBUS功能引腳。我在pin_mux.c中初始化的。
const uint32_t port0_pin22_config = (/* Pin is configured as USB0_VBUS */
0x07 |
/* No addition pin function */
IOCON_PIO_MODE_INACT |
/* Standard mode, output slew rate control is enabled */
IOCON_PIO_SLEW_STANDARD |
/* Input function is not inverted */
IOCON_PIO_INV_DI |
/* Enables digital function */
IOCON_PIO_DIGITAL_EN |
/* Open drain is disabled */
IOCON_PIO_OPENDRAIN_DI);
/* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */
IOCON_PinMuxSet(IOCON, 0U, 22U, port0_pin22_config);
工程界面如下
main.c中使用了3個宏定義測試了3個例子。
#ifdef HID_MOUSE_TEST
extern void hid_mouse_init(void);
extern void hid_mouse_test(void);
#endif
#ifdef MSC_RAM_TEST
extern void msc_ram_init(void);
#endif
#ifdef CDC_ACM_HID_MSC_TEST
extern void cdc_acm_hid_msc_descriptor_init(void);
extern void cdc_acm_data_send_with_dtr_test(void);
extern void hid_mouse_test(void);
#endif
extern void video_init();
extern void video_test();
/*!
* @brief Main function
*/
int main(void)
{
char ch;
/* Init board hardware. */
/* set BOD VBAT level to 1.65V */
POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
/* attach main clock divide to FLEXCOMM0 (debug console) */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
BOARD_InitDebugConsole();
POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB0 Phy */
FT9341_Init(DEMO_SPI_LCD_WriteCmd,DEMO_SPI_LCD_WriteData);
PRINTF("hello world.rn");
DEMO_FlushDisplay(0,0,200,190,(uint16_t *)c_bmpClockFace);
#ifdef HID_MOUSE_TEST
hid_mouse_init();
#endif
#ifdef MSC_RAM_TEST
msc_ram_init();
#endif
#ifdef CDC_ACM_HID_MSC_TEST
cdc_acm_hid_msc_descriptor_init();
#endif
while (1)
{
// ch = GETCHAR();
// PUTCHAR(ch);
#ifdef HID_MOUSE_TEST
hid_mouse_test();
#endif
#ifdef CDC_ACM_HID_MSC_TEST
cdc_acm_data_send_with_dtr_test();
hid_mouse_test();
#endif
}
}
在如下位置定義宏定義開關選擇測試例子。
定義HID_MOUSE_TEST是使用hid_mouse_template.c例子,實現(xiàn)的是一個鼠標指針動作。
定義MSC_RAM_TEST是使用msc_ram_template.c例子,實現(xiàn)的是一個u盤。
上電插上USB后會識別出U盤來,并且彈出需要格式化。格式化之后就可以看到容量了,可以讀寫數(shù)據(jù)了。
不過這只是用RAM模擬的存儲區(qū),斷電會消失。
可以看到識別的設備了。
下一步就是格式化U盤。
格式化后可以新建文件了。
定義CDC_ACM_HID_MSC_TEST是使用cdc_acm_hid_msc_template.c例子,實現(xiàn)的是一個復合設備,包含HID,MSC,CDC 3個類。
其中HID我簡單改了下,改成了USB的手柄控制器。
編譯下載之后,會出現(xiàn)3個設備。其中串口CDC沒有裝上驅動,有感嘆號。等下裝個驅動測試。MSC會要求格式化。
下面就是游戲控制器手柄
下面為串口CDC裝個驅動,這個會提示驅動不匹配之類的,不管他,先確定繼續(xù)。
裝好驅動之后就出來串口了。感嘆號也消失了。
下面看看串口數(shù)據(jù)。打開串口6。
測試連續(xù)發(fā)送數(shù)據(jù)2048字節(jié)。
void cdc_acm_data_send_with_dtr_test(void)
{
if(usb_device_is_configured() == 0) return ;
if (dtr_enable) {
memset(&write_buffer[10], 'a', 2038);
ep_tx_busy_flag = true;
usbd_ep_start_write(CDC_IN_EP, write_buffer, 2048);
while (ep_tx_busy_flag) {
}
}
}