- int main(void)
- {
- System_init(); //系统初始化函数
- Gpio_init(); //初始化IO口函数
- Uart_init(); //初始化串口函数
- printf("\r\n");
- printf("------------------------------------------\r\n");
- printf("--- NCU120 Board USB_Hid Demo By Gwgj ---\r\n"); //打印开发板相关信息
- printf("------------------------------------------\r\n");
-
- HID_MainProcess(); //HID设备处理函数,在HID_API.c中定义
- }
- void System_init(void)
- {
- UNLOCKREG(); //由于一些寄存器具有写保护功能,所以在写寄存器前要首先
- //进行解锁
- SYSCLK->WRCON.XTL12M_EN = 1; //使能外部12M晶振,也就是把PWRCON寄存器的XTL12M_EN位置1
- DrvSYS_Delay(5000); //延时一段时间,等待外部12M晶振稳定
- DrvSYS_Open(48000000); //打系统时钟设置为48MHZ,以进行USB通信
- LOCKREG();
- }
- void Gpio_init(void)
- {
- DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT ); //把LED1的端口设置为输出
- DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT ); //把LED2的端口设置为输出
- DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT ); //把LED3的端口设置为输出
- DrvGPIO_Open( E_GPA, 5, E_IO_OUTPUT ); //把LED4的端口设置为输出
- }
- void Uart_init(void)
- {
- STR_UART_T sParam; //定义一个STR_UART_T类型的结构体
- DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); //把UART的时钟设置为外部12M晶振
- /* Set UART Pin */
- DrvGPIO_InitFunction(E_FUNC_UART0); //初始化UART0对应的引脚
- /* UART Setting */
- sParam.u32BaudRate = 115200; //设置波特率为115200
- sParam.u8cDataBits = DRVUART_DATABITS_8; //设置数据位为8位
- sParam.u8cStopBits = DRVUART_STOPBITS_1; //设置停止位为1位
- sParam.u8cParity = DRVUART_PARITY_NONE; //设置无奇偶校验位
- sParam.u8cRxTriggerLevel= DRVUART_FIFO_1BYTES; //设置接收FIFO触发等级为1字节
- DrvUART_Open(UART_PORT0,&sParam); //通过刚才配置的sParam参数来设置UART0
- }
- int32_t HID_MainProcess(void)
- {
- int32_t i32Ret = E_SUCCESS;
- E_DRVUSB_STATE eUsbState;
- i32Ret = DrvUSB_Open(0); //初始化USB设备,包括初始化USB SRAM,初始化状态等
- if (i32Ret != E_SUCCESS)
- return i32Ret;
- while (1)
- {
- _DRVUSB_ENABLE_MISC_INT(0); //禁止 USB-related 中断
- _DRVUSB_ENABLE_FLDET_INT(); //使能 float-detection 中断
- // 等待USB连接
- while (1)
- {
- // Order here is significant.
- // Give a chance to handle remaining events before exiting this loop.
- eUsbState = DrvUSB_GetUsbState();//获取USB状态
- //DrvUSB_DispatchEvent();
- if (eUsbState >= eDRVUSB_ATTACHED &&
- eUsbState != eDRVUSB_SUSPENDED)
- {
- break; //如果USB已经连接,跳出循环,结束等待
- }
- }
-
- //初始化HID设备,并把输入和输出报告定向到HID_GetInReport和HID_SetOutReport两个函数
- //这两个函数非常重要,我们就是要在HID_GetInReport和HID_SetOutReport两个函数中实现自己的功能,实现数据传输
- HID_Init((void *)HID_GetInReport, (void *)HID_SetOutReport);
- // 使能USB中断 INTEN_WAKEUP,INTEN_WAKEUPEN,INTEN_FLDET,INTEN_USB和INTEN_BUS
- _DRVUSB_ENABLE_MISC_INT(INTEN_WAKEUP | INTEN_WAKEUPEN | INTEN_FLDET | INTEN_USB | INTEN_BUS);
- // 查询和处理USB事件
- while (1)
- {
- eUsbState = DrvUSB_GetUsbState(); //获取USB状态
- DrvUSB_DispatchEvent();//分发,处理USB事件
- if (eUsbState == eDRVUSB_DETACHED) //如果USB断开了,跳出循环,重新等待USB链接
- {
- printf("USB Disconnected...\r\n");
- break;
- }
- }
- // Disable USB-related interrupts.
- _DRVUSB_ENABLE_MISC_INT(0); //禁止USB-related中断
- }
- }
- //HID_SetOutReport函数用于处理输出报告
- //我们在这里分析上位机发送的数据,并根据相应的数据进行相应的操作
- //收到 1 时:点亮LED 1
- //收到 2 时:点亮LED 2
- //收到 3 时:点亮LED 3
- //收到 4 时:点亮LED 4
- //收到 5 时:熄灭LED 1
- //收到 6 时:熄灭LED 2
- //收到 7 时:熄灭LED 3
- //收到 8 时:熄灭LED 4
- void HID_SetOutReport(uint8_t *pu8EpBuf)
- {
- uint8_t i;
- uint32_t u32Size = (uint32_t)pu8EpBuf[1]; //pu8EpBuf[1]为收到数据的长度,由于我们上位机中每次都只发送一个字节,
- //所以在这里不需要对数据的长度进行判断,如果上位机中发送的数据长度不是恒定的
- //就要首先获取pu8EpBuf[1],再做相应的处理了
- uint8_t cmd=pu8EpBuf[2]; //pu8EpBuf[2]就是我们收到的上位机传来的数据了
- switch(cmd) //根据上位机发送的数据来进行点亮和熄灭LED的操作
- {
- case 1:
- DrvGPIO_ClrBit(E_GPA,2);
- break;
- case 2:
- DrvGPIO_ClrBit(E_GPA,3);
- break;
- case 3:
- DrvGPIO_ClrBit(E_GPA,4);
- break;
- case 4:
- DrvGPIO_ClrBit(E_GPA,5);
- break;
- case 5:
- DrvGPIO_SetBit(E_GPA,2);
- break;
- case 6:
- DrvGPIO_SetBit(E_GPA,3);
- break;
- case 7:
- DrvGPIO_SetBit(E_GPA,4);
- break;
- case 8:
- DrvGPIO_SetBit(E_GPA,5);
- break;
- default:
- break;
- }
- }
//下位机的程序就结束了,由于芯唐提供了USB固件库,因此我们自己只写了几行代码就OK了,呵呵。
5.上位机程序分析。
虽然小弟以前也学过MFC,但是几年没用,已经忘的差不多了,今天就先不用MFC了,先建立一个命令行的工程,测试一下系统的功能,日后再改成MFC吧,真后悔当时没有好好学MFC啊。
开发环境为VS2005。
-
- #include "stdafx.h"
- #include "conio.h"
- #include "Hid.h"
- int _tmain(int argc, _TCHAR* argv[]) //主函数
- {
- CHidCmd io; //定义一个CHidCmd类型的对象
- unsigned char cmd[]={0x00}; //定义一个数组,数组中存放要发送的数据
- unsigned long Length;
- char user_cmd=0;
- printf("----------------------------------------------\n");
- printf("-- NUC120助学板 USB HID Demo By 南信大瑜 --\n"); //打印一些相关信息
- printf("----------------------------------------------\n");
- printf("\n");
- printf("->请进行功能选择:\n");
- //打印一些帮助信息
- printf("1 打开led1\n");
- printf("2 打开led2\n");
- printf("3 打开led3\n");
- printf("4 打开led4\n");
- printf("5 关闭led1\n");
- printf("6 关闭led2\n");
- printf("7 关闭led3\n");
- printf("8 关闭led4\n");
- printf("9 退出程序\n");
- if(!io.OpenDevice(0x051A,0x511B)) //打开HID设备,第一个参数为VID,第二个参数为PID
- {
- printf("->USB 设备打开失败,请检查助学板是否正确连接\n");
- user_cmd='9';
- }
- else
- {
- printf("->USB 设备打开成功\n");
- }
- while(user_cmd!='9') //如果用户输入‘9’,退出程序
- {
- user_cmd=getch();
-
- switch(user_cmd) //如果用户输入的是'1'-'8',则通过USB发送相应命令到助学板
- {
- case '1':
- cmd[0]=0x01;
- printf("\n");
- printf("-->打开LED 1\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '2':
- cmd[0]=0x02;
- printf("\n");
- printf("-->打开LED 2\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '3':
- cmd[0]=0x03;
- printf("\n");
- printf("-->打开LED 3\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '4':
- cmd[0]=0x04;
- printf("\n");
- printf("-->打开LED 4\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '5':
- cmd[0]=0x05;
- printf("\n");
- printf("-->关闭LED 1\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '6':
- cmd[0]=0x06;
- printf("\n");
- printf("-->关闭LED 2\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '7':
- cmd[0]=0x07;
- printf("\n");
- printf("-->关闭LED 3\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '8':
- cmd[0]=0x08;
- printf("\n");
- printf("-->关闭LED 4\r\n\n");
- io.WriteFile((const char *)&cmd,sizeof(cmd),&Length,2000);
- break;
- case '9':
- printf("-->程序退出\n\n");
- default:printf("\n");
- printf("-->输入错误,请重新输入 >__< \n");
- printf("\n");
- break;
- }
- printf("->请进行功能选择:\n");
- printf("1 打开led1\n");
- printf("2 打开led2\n");
- printf("3 打开led3\n");
- printf("4 打开led4\n");
- printf("5 关闭led1\n");
- printf("6 关闭led2\n");
- printf("7 关闭led3\n");
- printf("8 关闭led4\n");
- printf("9 退出程序\n");
-
-
- }
- io.CloseDevice(); //关闭设备
- return 0;
- }
undefined