PDIUSBD12 USB 驱动程序

2018-01-14 20:21:01编辑:什么鱼 关键字: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, chenmingji 
All Rights Reserved 
V1.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) 
** 功能描述: 获取按键值任务。 
**************************************************************/ 
void get_key_task(void) 

while(1) 

OS_ENTER_CRITICAL(); 
key_buf[0] = ZLG7290_GetKey(); 
OS_EXIT_CRITICAL(); 
OSWait(K_TMO, 1); 
if(key_buf[0] == 0) 

continue; 

OS_ENTER_CRITICAL(); 
key_buf[1] = ZLG7290_GetKey(); 
OS_EXIT_CRITICAL(); 
if(key_buf[0] != key_buf[1]) 

OS_ENTER_CRITICAL(); 
D12_WriteEndpoint(3, 1, &key_buf[0]); 
OS_EXIT_CRITICAL(); 





五.实验示例程序简析 
本由于驱动程序中使用了USB51s.lib 库,故关于该库的使用方法详见实验仪配套光盘 
中的《 PDIUSBD12 固件编程指南 》和书《 PDIUSBD12 固件编程与驱动开发 》。这里仅 
仅就叙述如何在Small RTOS51 下编写D12 USB 驱动程序。 
由于对PDIUSBD12 的操作是一种不能重入的操作,所以必须要在这一次操作完成后才 
能进行下一次对PDIUSBD12 的操作。因此,对PDIUSBD12 器件的操作采用了一个信号量 
(D12_use)来管理。这种信号量管理的方法就像有很多个门共用一把钥匙,必须一次只能 
开一个门,而开这个门的先后则由任务的优先级来决定。 
在驱动中使用了2 个信号量,其含义如下: 

关键字:PDIUSBD12  USB  驱动程序

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018011437347.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:LED16*16点阵滚动显示程序
下一篇:1602液晶电子时钟程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机与USB芯片PDIUSBD12接口固件程序

此函数库可以直接使用PHILIPS的Demo驱动D12TEST以下只用了端点1进行控制传输,端点2的数据传输自己添加,没有使用DMA功能,为简单的固件程序/**************************************************************************                      PHILIPS PDIUSBD12 FIRMWAR  
发表于 2018-01-25 19:43:45

USB PDIUSBD12的接口应用设计

SEMIconductors等公司的产品;另一种就是纯粹的USB接口芯片,仅处理 USB通信,如PHILIPS的PDIUSBD11(I2C接口)、 PDIUSBP11A、PDIUSBD12(并行接口),National Semiconductor的USBN9602、USBN9603、USBN9604等。前一种由于开发时需要单独的开发系统,因此 开发成本较高;而后一种只是一个芯片与MCU接口实现USB通信功能,因此成本较低,而且可靠性高。本文主要介绍PHILIPS公司的PDIUSBD12器件。1 PDIUSBD12芯片特点和内部结构  PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统并与微控制器通过高速通 用并行接口进行通信
发表于 2018-01-11 19:56:24
USB PDIUSBD12的接口应用设计

嵌入式指纹识别系统USB接口电路设计

其他处理器也不太方便,所以必须考虑在此处理器的基础上完成多项任务。由指纹自动识别系统的特点来看,系统在完成指纹录入或登录后才需要利用USB接口完成指纹模板和登录信息的传输,所以对于处理器来说,USB控制和系统控制可以采用时分复用的方式进行。由此,利用一个电平转换芯片和一个8总线收发器来控制数据的选通及流向,以保证系统能够正常工作。   系统USB接口设计   USB接口硬件主要以接口芯片PDIUSBD12为中心,设计它与USB物理接口以及微控制器之间的连接。接口模块通过跳线选择供电方式,可同时支持USB总线供电方式和外设供电方式,为全速USB设备接口。设计过程中充分考虑到可靠性、可测性以及电磁兼容性。其接口电路如图3所示
发表于 2014-11-11 12:28:58
嵌入式指纹识别系统USB接口电路设计

基于DSP平台的USB接口设计

对DSP图像采集系统的操作与控制;  ③实现图像数据在DSP摄像系统与PC机之间高速的双向传输。  基于以上几点可以看出,本方案最主要的特点是成本低廉且传输速度高。  1 硬件方案选择与设计  1.1 方案选择  对于基于DSP平台的USB接口设计,经过综合考虑了几种方案之后决定,采用一个不带MCU内核的USB接口芯片PDIUSBD12(成本非常低,一片PDIUSBD12的价格仅为20元),再加上简单的外围电路和时序调整电路。  这种芯片仅仅完成USB底层的数据链路级交换,并提供给本地微控制器一个并行的接口,但是它并不完成协议层的工作。协议层的工作需要对微控制器编程,控制USB接口芯片来实现USB协议。所以,开发难度相对来说大一些,要做
发表于 2014-06-07 12:54:16
基于DSP平台的USB接口设计

一种智能多协议通信适配器的设计

控制芯片PDIUSBD12,该控制芯片能够实现微控制器的并行总线到USB口的总线接口功能,而且编程方便,适用于多种微控制器,内部集成实现USB功能的PLL、SIE、FIFO模块,与普通的微控制器配合就可以实现功能完备的USB外设。对于一个微控制器而言,PDIUSBD12就象一个带8位数据总线和一个地址位(占两个位置)的存贮器件。与USB的连接是通过1.5kΩ上拉电阻将D+(用于高速USB器件)置为高来实现的。1.5kΩ上拉电阻集成在PDIUSBD12内部,默认状态下不与VCC相连。连接的建立通过外部/系统微控制器发出命令来实现。这就允许系统微控制器在决定与USB建立连接之前完成初始化时序。USB总线连接可以重新初始化而不需要拔出电缆。   考虑到
发表于 2013-12-06 10:46:28
一种智能多协议通信适配器的设计

让设备轻松升级的独立式USB Type-C 输电控制器

意法半导体推出STUSB4500独立式USB Type-C 输电控制器。集供电和充电为一体的标准USB-C接口兼具便利性和环境效益。如今STUSB4500将把这些优势延伸到到各类消费、工业和医疗产品。 STUSB4500是一款通过相关行业认证的独立式USB PD控制器,专为使用一条USB-C线缆供电的受电端应用优化设计,用户可以按照自己的应用方案轻松地自定义STUSB4500的设置。 根据存放在内部非易失性存储器内的默认电源配置文件(PDO),STUSB4500控制器会执行意法半导体独有的算法,与供电设备协商输电协议,无需任何内部支持(自动运行模式),这使其成为自动大功率配置文件充电的理想选择,特别
发表于 2018-07-20 15:01:27
让设备轻松升级的独立式USB Type-C 输电控制器

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved