USB驱动程序
- 格式:doc
- 大小:49.50 KB
- 文档页数:8
PDIUSBD12 USB 仿真试验及驱动程序一.实验目的PDIUSBD12(简称D12)USB 芯片符合USB1.1 协议,广泛应用于各种的USB 设备。
本实验程序展示了如何在Small RTOS51 操作系统中实现D12 驱动程序的编写。
示例主要实现了如下功能:USB 设备的枚举,通过D12 的端点2 接受来自上位机的数据,并通过单片机的串口转发回上位机,同时驱动ZLG7290 显示0~9 的数字。
二.实验设备及器件PC 机一台DP-51PROC 单片机综合仿真实验仪一台USB D12 PARK 模块一台USB 连接线一根三.实验步骤1.D12 PARK 插到A6 区的排针内;2.使用导线把A2 区的INT1 与A6 区的P1_INT0 相连;3.使用导线把A2 区的T0 与A6 区的P1_IO2 相连;4.使用导线把A2 区的T1 与A6 区的P1_IO5 相连;5.使用导线把A2 区的A15 与A6 区的P1_CS 1 相连;6.使用导线把A2 区的P16、P17 分别与D5 区的SCL、SDA 相连;7.使用导线把A2 区的P10 与D5 区的/RST 相连,并短接D5 区的JP1;8.使用导线连接A2 区的P14 与B10 区的ZDJ_A;9.B10 区的ZDJ_B 连接到C1 的GND;10.短接B10 区JP18 的电机电源跳线四.实验参考程序主要部分/**************************************************************Small RTOS(51)The Real-Time Kernel(For Keil c51)(c) Copyright 2002-2004, chenmingjiAll Rights ReservedV1.20***************************************************************/#include "config.h"/**************************************************************声明全局变量**********************************************************/extern EPPFLAGS bEPPflags; /*USB 事件标志*/extern uint8 xdata GenEpBuf[]; /*信号包缓冲区(命令区)*/extern uint8 xdata EpBuf[]; /*信号包缓冲区(数据区)*/extern uint16 data D12_DATA; /*D12 数据的地址变量*/extern uint16 data D12_COMMAND; /*D12 命令的地址变量*///指针的NULL 为0,这个变量占用0 地质避免出现有效的NULL 指针uint8 OS_Q_MEM_SEL NotUse _at_ 0x0000;uint8 xdata ShowCase[8];uint8 xdata PWMH; //高电平脉冲的个数uint8 xdata PWM; //PWM 周期uint8 xdata COUNTER;uint8 key_buf[2];void enumerate_task(void);void USB_REC_task(void);void change_speed_task(void);void get_key_task(void);void INTT1() interrupt 3{COUNTER++;if(COUNTER < PWMH){P1_4 = 1; //P1.4 变为高电平}else{P1_4 = 0;}}void usb_ISR(void) interrupt 2{OS_INT_ENTER();EX1 = 0;OSSemIntPost(D12_isr);OSIntExit();}/************************************************************名称:init_port()**功能:端口初始化,D12SUSPD 复位为0****************************************************************/ void init_Hard(){P0 = 0XFF;P1 = 0XFF;P2 = 0XFF;P3 = 0XFF;D12SUSPD = 0;}/**************************************************************** 函数名称: init** 功能描述: 初始化函数,一般在多任务环境启动前调用**************************************************888**************/ void init(void){TMOD &= 0XF0;TMOD |= 0X01;// 每10ms 发生一次T0 中断TL0 = (65536 - (11059200 / 12) / 100) % 256;TH0 = (65536 - (11059200 / 12) / 100) / 256;ET0 = 1;TR0 = 1;PT0 = 0;EA = 1;}void control_init(void){PWMH=0x00;COUNTER=0x01;PWM=255;TMOD = TMOD & 0x0f;TMOD = TMOD | 0x20; //定时器1 在模式2 下工作TL1=0x00;TH1=0x00; //自动重装的值TR1=1;ET1 = 1;}/**************************************************************** 函数名称: void init_display(void)** 功能描述: 初始化LED 显示*****************************************************************/ void init_display(void){uint8 i;ZLG7290_RST = 0;_nop_();_nop_();ZLG7290_RST = 1;for (i = 0; i < 8; i++){ShowCase[i] = 31;}ZLG7290_SendBuf(ShowCase,8);}void main(void){OSInit();init_Hard(); /*初始化硬件*/init();control_init();IT1 = 0;EX1 = 1;PX1 = 1;init_display();D12_DATA = 0x7002; /*定义数据地址*/D12_COMMAND = 0x7003; /*定义命令地址*/D12_SetDMA(0x0); /*不使用DMA 功能*/bEPPflags.value = 0; /*初始化USB 寄存器*/OSTaskCreate(USB_REC_task , NULL , 0); //创建USB 中断处理任务while(1){PCON = PCON |0x01 ; /* CPU 进入休眠状态*/}}/************************************************************* ** 函数名称: void enumerate(void)** 功能描述: 完成USB 请求处理的任务************************************************************/ void enumerate_task(void){//创建其他优先级低的任务OSTaskCreate(get_key_task, NULL,2);OSTaskCreate(change_speed_task, NULL,3);while(1){OSWait(K_TMO, 2);IT1 = 0;EX1 = 1;reconnect_USB();while(USB_VIN){usbserve();OSWait(K_TMO, 1);}}}/********************************************************* 函数名称: void USB_REC(void)** 功能描述: USB 中断处理任务**************************************************************/ void USB_REC_task(void){OSSemCreate(D12_isr , 0);OSSemCreate(D12_use , 1);OSTaskCreate(enumerate_task , NULL ,1); //创建USB 请求处理任务while(1){OSSemPend(D12_isr , 0);OSSemPend(D12_use , 0);fn_usb_isr();OSSemPost(D12_use);EX1=1;}}/************************************************************* ** 函数名称: void change_speed_task(void)** 功能描述: 修改马达速度任务。
*************************************************************/ void change_speed_task(void){while(1){OS_ENTER_CRITICAL();if( bEPPflags.bits.ep1_rxdone){PWMH = GenEpBuf[0];bEPPflags.bits.ep1_rxdone = 0;}OS_EXIT_CRITICAL();ShowCase[0] = PWMH %10;ShowCase[1] = (PWMH /10)%10;ShowCase[2] = (PWMH /100)%10;OS_ENTER_CRITICAL();ZLG7290_SendBuf(ShowCase,8);OS_EXIT_CRITICAL();OSWait(K_TMO,9);}}/************************************************************* 函数名称: void get_key_task(void)** 功能描述: 获取按键值任务。