51单片机与USB芯片PDIUSBD12接口固件程序.doc_第1页
51单片机与USB芯片PDIUSBD12接口固件程序.doc_第2页
51单片机与USB芯片PDIUSBD12接口固件程序.doc_第3页
51单片机与USB芯片PDIUSBD12接口固件程序.doc_第4页
51单片机与USB芯片PDIUSBD12接口固件程序.doc_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机与USB芯片PDIUSBD12接口固件程序关键词: USB固件程序 此函数库可以直接使用PHILIPS的Demo驱动D12TEST以下只用了端点1进行控制传输,端点2的数据传输自己添加,没有使用DMA功能,为简单的固件程序/* PHILIPS PDIUSBD12 FIRMWARE COPYRIGHT (c) 2005 BY JJJ. - ALL RIGHTS RESERVED - File Name: D12_USB.h Author: Jiang Jian Jun Created: 2005/4/3 Modified:NO Revision: 1.0 */#ifndef _D12_USB_H_REVISION_FIRST_#define _D12_USB_H_REVISION_FIRST_#include sbit SUSPEND = P35;#define D12_INT_ENDP0OUT0x0001/中断寄存器位定义#define D12_INT_ENDP0IN0x0002#define D12_INT_ENDP1OUT0x0004#define D12_INT_ENDP1IN0x0008#define D12_INT_ENDP2OUT0x0010#define D12_INT_ENDP2IN0x0020#define D12_INT_BUSRESET0x0040#define D12_INT_SUSPENDCHANGE0x0080#define D12_INT_EOT0x0100#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/bmRequest的设置#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 Macros And Structure And Union Definitions#define SWAP(x) (x) & 0x00FF) 8) & 0x00FF)/交换高低8位#define MSB(x) (x) 8) & 0x00FF)/取数据高8位#define LSB(x) (x) & 0x00FF)/取数据低8位typedef union _Event_Flags_/定义USB事件标志数据类型struct _Bit_Flags_unsigned char Timer : 1;/定时器益出事件标记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;/控制端点处理状态/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 Reserve: 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_SIZE8typedef 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 ControlData;/保存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 xdata *) Addr);void USB_Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+);/*#define D12_DATA 0#define D12_COMMAND 1/PDIUSBD12命令接口函数void D12_SetMode(unsigned char bConfig,unsigned char bClkDiv)Outportb(D12_COMMAND,0xF3);Outportb(D12_DATA,bConfig);Outportb(D12_DATA,bClkDiv);/设置端点void D12_SetEndpointStatus(unsigned char bEndp,unsigned char bStalled)Outportb(D12_COMMAND,0x40+bEndp);Outportb(D12_DATA,bStalled);/应答!void D12_AcknowledgeEndpoint(unsigned char endp)Outportb(D12_COMMAND,endp);Outportb(D12_COMMAND,0xF1);if(endp=0)Outportb(D12_COMMAND,0xF2);/设置地址使能void D12_SetAddressEnable(unsigned char bAddress,unsigned char bEnable)Outportb(D12_COMMAND,0xd0);if(bEnable) bAddress |= 0x80;Outportb(D12_DATA,bAddress);/设置端点使能void D12_SetEndpointEnable(unsigned char bEnable)Outportb(D12_COMMAND,0xD8);if(bEnable)Outportb(D12_DATA,1);elseOutportb(D12_DATA,0);/读中断寄存器unsigned short D12_ReadInterruptRegister(void)unsigned char b1;unsigned int j;Outportb(D12_COMMAND,0xF4);b1=Inportb(D12_DATA);j=Inportb(D12_DATA);jlen)j=len;for(i=0;ilen)j=len;for(i=0;ij;i+)*(buf+i)=Inportb(D12_DATA);Outportb(D12_COMMAND,0xF2);return j;unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,unsigned char * buf)unsigned char i;Outportb(D12_COMMAND,endp);Inportb(D12_DATA);Outportb(D12_COMMAND,0xF0);Outportb(D12_DATA,0);Outportb(D12_DATA,len);for(i=0;ilen;i+)Outportb(D12_DATA,*(buf+i);Outportb(D12_COMMAND,0xFA);return len;unsigned char D12_WriteEndpoint_Int(unsigned char endp,unsigned char len,unsigned char * buf)unsigned char i;Outportb(D12_COMMAND,endp);Inportb(D12_DATA);Outportb(D12_COMMAND,0xF0);Outportb(D12_DATA,0);Outportb(D12_DATA,len);for(i=0;i16)/最大传16byteEventFlags.Bits.ControlState=0; /by newerD12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);elseEventFlags.Bits.ControlState=2;/by newerelse if(EventFlags.Bits.ControlState=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=ControlData.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_WriteEndpoint_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_Int(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);EP2Status&=0x60;Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);if(EP2Status=0x60)Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer);if(Length != 0)EventFlags.Bits.Port2RxDone = 1;void EP2_In(void)D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */*/请求处理typedef struct _usb_device_descriptorunsigned char bLength;unsigned char bDescriptorType;unsigned int bcdUSB;unsigned char bDeviceClass;unsigned char bDeviceSubClass;unsigned char bDeviceProtocol;unsigned char bMaxPacketSize0;unsigned int idVendor;unsigned int idProduct;unsigned int bcdDevice;unsigned char iManufacturer;unsigned char iProduct;unsigned char iSerialNumber;unsigned char bNumConfiguations;USB_DEVICE_DESCRIPTOR;code USB_DEVICE_DESCRIPTOR DeviceDescr=sizeof(USB_DEVICE_DESCRIPTOR), 0x01,/USB_DEVICE_DESCRIPTOR_TYPE, SWAP(0x0100), 0xDC,/USB_CLASS_CODE_TEST_CLASS_DEVICE, 0, 0,EP0_PACKET_SIZE,SWAP(0x0471),SWAP(0x0666),SWAP(0x0100), 0, 0, 0,25;/配置描述符typedef struct _usb_configuration_descriptorunsigned char bLength0x2e;USB_CONFIGURATION_DESCRIPTOR; code USB_CONFIGURATION_DESCRIPTOR ConfigDescr=0x09,0x02,0x2e,0x00,0x01,0x01,0x00,0xa0,0x32,0x09,0x04,0x00,0x00,0x04,0xdc,0xa0,0xb0,0x00,0x07,0x05,0x81,0x03,0x02,0x00,0x0a,0x07,0x05,0x01,0x03,0x02,0x00,0x0a,0x07,0x05,0x82,0x02,0x40,0x00,0x0a,0x07,0x05,0x02,0x02,0x40,0x00,0x0a;/code_tramsitvoid code_transmit(unsigned char code *pRomData,unsigned short len)ControlData.wCount=0;if(ControlData.wLengthlen)ControlData.wLength=len;ControlData.pData=pRomData;if(ControlData.wLength=EP0_PACKET_SIZE)D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);ControlData.wCount+=EP0_PACKET_SIZE;EA = 0;EventFlags.Bits.ControlState=1;EA = 1;elseD12_WriteEndpoint(1,ControlData.wLength,pRomData);ControlData.wCount+=ControlData.wLength;EA = 0;EventFlags.Bits.ControlState=0;EA = 1;/获取描述符void get_descriptor(void)if(MSB(ControlData.DeviceRequest.wValue)=USB_DEVICE_DESCRIPTOR_TYPE)code_transmit(unsigned char code*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR);return;if(MSB(ControlData.DeviceRequest.wValue)=USB_CONFIGURATION_DESCRIPTOR_TYPE)if(ControlData.DeviceRequest.wLengthCONFIG_DESCRIPTOR_LENGTH)ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;/标识符总大小2E byte,第二次请求时wlength=0x00ff/这里的ConfigDescr其实应该包括其他标识符!code_transmit(unsigned char code*)&ConfigDescr,ControlData.DeviceRequest.wLength);return;/single transmitvoid single_transmit(unsigned char *buf,unsigned char len)if(len=EP0_PACKET_SIZE)D12_WriteEndpoint(1,len,buf);/设置地址void set_address(void)D12_SetAddressEnable(unsigned char)(ControlData.DeviceRequest.wValue&0xff),1);/比如wValue是02 00 应该得到02single_transmit(0,0);/设置配置void set_configuration(void)if(ControlData.DeviceRequest.wValue=0)single_transmit(0,0);EventFlags.Bits.Configuration=0;D12_SetEndpointEnable(0);else if(ControlData.DeviceRequest.wValue=1)single_transmit(0,0);D12_SetEndpointEnable(0);D12_SetEndpointEnable(1);EventFlags.Bits.Configuration=1;/读取配置void get_configuration(void)unsigned char c=EventFlags.Bits.Configuration; single_transmit(&c,1);/读取设备接口信息void get_interface(void)unsigned char txdat=0;single_transmit(&txdat,1);static code void (*StandardDeviceRequest)(void)= 0,0,0,0, 0,set_address,get_descriptor,0, get_configuration,set_configuration,get_interface,0, 0,0,0,0;static code void (*VendorDeviceRequest)(void)= 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0;void ControlHandler(void)unsigned char type,req;type=ControlData.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MASK;/0011,0000breq=ControlData.DeviceRequest.bRequest&USB_REQUEST_MASK;/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论