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

上传人:飞*** 文档编号:36674357 上传时间:2018-04-01 格式:DOC 页数:23 大小:63KB
返回 下载 相关 举报
51单片机与USB芯片PDIUSBD12接口固件程序_第1页
第1页 / 共23页
51单片机与USB芯片PDIUSBD12接口固件程序_第2页
第2页 / 共23页
51单片机与USB芯片PDIUSBD12接口固件程序_第3页
第3页 / 共23页
51单片机与USB芯片PDIUSBD12接口固件程序_第4页
第4页 / 共23页
51单片机与USB芯片PDIUSBD12接口固件程序_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《51单片机与USB芯片PDIUSBD12接口固件程序》由会员分享,可在线阅读,更多相关《51单片机与USB芯片PDIUSBD12接口固件程序(23页珍藏版)》请在金锄头文库上搜索。

1、51 单片机与单片机与 USB 芯片芯片 PDIUSBD12 接口固件程序接口固件程序关键词关键词: USB 固件程序 此函数库可以直接使用 PHILIPS 的 Demo 驱动 D12TEST以下只用了端点 1 进行控制传输,端点 2 的数据传输自己添加,没有使用 DMA 功能,为简单的固件程序/*PHILIPS PDIUSBD12 FIRMWARECOPYRIGHT (c) 2005 BY JJJ.- ALL RIGHTS RESERVED -File Name: D12_USB.hAuthor: Jiang Jian JunCreated: 2005/4/3Modified: NORevi

2、sion: 1.0*/#ifndef _D12_USB_H_REVISION_FIRST_#define _D12_USB_H_REVISION_FIRST_#include sbit SUSPEND = P35;#define D12_INT_ENDP0OUT 0x0001 /中断寄存器位定义#define D12_INT_ENDP0IN 0x0002#define D12_INT_ENDP1OUT 0x0004#define D12_INT_ENDP1IN 0x0008#define D12_INT_ENDP2OUT 0x0010#define D12_INT_ENDP2IN 0x0020

3、#define D12_INT_BUSRESET 0x0040#define D12_INT_SUSPENDCHANGE 0x0080#define D12_INT_EOT 0x0100#define D12_SETUPPACKET 0x20 /读最后处理状态寄存器的设置信息包 0010,0000b#define EP0_PACKET_SIZE 16 /p0 最大 16byte#define USB_ENDPOINT_DIRECTION_MASK 0x80 /设备请求类型,传输方向 D7 1000,0000b#define USB_REQUEST_TYPE_MASK 0x30 /bmReque

4、st 的设置#define USB_REQUEST_MASK 0x0f#define USB_STANDARD_REQUEST 0x00 /5,6 位的定义#define USB_VENDOR_REQUEST 0x20#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 /描述符类型 设备描述符 01h,配置描述符 02,接口描述符 04,端点描述符 05#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02#define CONFIG_DESCRIPTOR_LENGTH 0x002E /配置描述符总长度/*/Port And M

5、acros And Structure And Union Definitions#define SWAP(x) (x) /定时器益出事件标记unsigned char BusReset : 1; /USB 总线复位标志unsigned char Suspend : 1; /USB 器件挂起标志unsigned char SetupPacket : 1; /收到 SETUP 包标志unsigned char RemoteWakeup : 1; /远程唤醒标志unsigned char InISR : 1; /USB 中断服务标志unsigned char ControlState : 2; /

6、控制端点处理状态/0:IDEL 空闲状态/1:TRANSMIT 数据发送状态/2:RECEIVE 数据接受状态unsigned char Configuration : 1; /配置标志 (0:未配置;1:已配置)unsigned char Port1RxDone : 1; /端口 1 收到数据标志unsigned char Port2RxDone : 1; /端口 2 收到数据标志unsigned char Port1TxFull : 1; /端口 1 输出缓冲区满标志unsigned char Port2TxFull : 1; /端口 2 输出缓冲区满标志unsigned char Res

7、erve : 3; /保留,未使用Bits;unsigned short int Value;EVENT_FLAGS; /事件标志数据类型typedef struct _DEVICE_REQUEST_unsigned char bmRequestType; /请求类型unsigned char bRequest; /USB 请求unsigned short wValue; /USB 请求值unsigned short wIndex; /USB 请求索引unsigned short wLength; /记数长度DEVICE_REQUEST;#define MAX_CONTROLDATA_SIZE

8、 8typedef struct _control_xferDEVICE_REQUEST DeviceRequest; /USB 请求结构体unsigned short wLength; /传输数据的总字节数unsigned short wCount; /传输字节数统计unsigned char * pData; /传输数据指针unsigned char dataBufferMAX_CONTROLDATA_SIZE; /请求的数据CONTROL_XFER;static EVENT_FLAGS EventFlags; /定义为全局变量,用于与主程序的通信static CONTROL_XFER C

9、ontrolData; /保存 SETUP 包请求类型和请求数据unsigned char idata EndPoint1Buffer4; /控制端点缓存unsigned char idata EndPoint2Buffer64;/主端点缓存/*/硬件提取层,多路地址/数据总线方式读写void Outportb(unsigned int Addr, unsigned char Data)*(unsigned char xdata *) Addr) = Data;unsigned char Inportb(unsigned int Addr)return *(unsigned char xdat

10、a *) Addr);void USB_Delay1ms(unsigned int count)unsigned int i,j;for(i=0;ilen)j=len;for(i=0;ilen)j=len;for(i=0;i16)/最大传 16byteEventFlags.Bits.ControlState=0; /by newerD12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);elseEventFlags.Bits.ControlState=2;/by newer else if(EventFlags.Bits.ControlSta

11、te=2)i=D12_ReadEndpoint_Int(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);ControlData.wCount+=i;if(i!=EP0_PACKET_SIZE|ControlData.wCount=ControlData.wLength)EventFlags.Bits.SetupPacket=1;EventFlags.Bits.ControlState=0;elseEventFlags.Bits.ControlState=0;void EP0_In(void)short i=Control

12、Data.wLength-ControlData.wCount;D12_ReadLastTransactionStatus(1);if(EventFlags.Bits.ControlState!=1) return;if(i=EP0_PACKET_SIZE)D12_WriteEndpoint_Int(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);ControlData.wCount+=EP0_PACKET_SIZE;EventFlags.Bits.ControlState=1;return;if(i!=0)D12_WriteEn

13、dpoint_Int(1,i,ControlData.pData+ControlData.wCount);ControlData.wCount+=i;EventFlags.Bits.ControlState=0;return;D12_WriteEndpoint_Int(1,0,0);EventFlags.Bits.ControlState=0;void EP1_Out(void)unsigned char Length;D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */Length = D12_ReadEndpoint_In

14、t(2, sizeof(EndPoint1Buffer),EndPoint1Buffer);if(Length != 0)EventFlags.Bits.Port1RxDone = 1;void EP1_In(void)D12_ReadLastTransactionStatus(3);void EP2_Out(void)unsigned char Length,EP2Status;D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */EP2Status = D12_ReadEndpointStatus(4);EP2StatusLength = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);if(EP2Status=0x60)Length = D12_ReadEndpoint(4,siz

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号