PDIUSBD12芯片在USB接口电路中的应用
- 格式:doc
- 大小:7.15 KB
- 文档页数:3
用PDIUSBD12和单片机设计智能USB软件狗
夏美云;邢文生
【期刊名称】《焦作大学学报》
【年(卷),期】2004(018)001
【摘要】文章提出了一种低成本USB软件狗的设计方案,介绍了用PDIUSBD12和单片机设计智能USB软件狗的软硬件以及USB软件狗技术的优点、软件狗和主机之间的数据交换、软件狗的加解密技术.
【总页数】2页(P71-72)
【作者】夏美云;邢文生
【作者单位】焦作大学,河南,焦作,454001;焦作大学,河南,焦作,454001
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.基于PDIUSBD12的电阻焊控制器USB通信接口设计 [J], 马海林;冀春涛;涂狄
2.基于PDIUSBD12芯片的数据采集卡USB接口设计 [J], 刘笑嫘;何广平
3.基于PIC16C54单片机的智能软件狗设计 [J], 胡军;刘文江;胡怀中;李嘉;谢凯年
4.基于FPGA和PDIUSBD12的USB通信接口设计 [J], 闫蕴霞;陈鸿
5.基于PDIUSBD12的USB接口设计应用研究 [J], 刘彦
因版权原因,仅展示原文概要,查看原文内容请购买。
基于USB 的数据采集卡设计刘铁(北京经纬纺机新技术有限公司100176)摘 要 本文介绍了PIC 单片机PIC18F4580控制PDIUSBD12,实现USB 主机的硬件设计和底层驱动程序的编写。
通过PC 机上的软件完成对监控设备的脉冲信号频率、CAN 通讯数据监控。
关键词 U SB PIC18F4580 PDIUSBD12 数据采集卡1 引言随着工业技术的发展和现场监控要求的提高,许多应用场合需要对现场的数字、模拟信号以及通讯数据进行实时监控和操作。
目前常用的监控手段一般采用基于PCI 总线的板卡或基于RS232、RS485通讯总线,PCI 总线虽然传输速度快,但要占用PC 机扩展槽地址或中断资源,且现场插拔不方便。
RS232、RS485总线虽然插拔比较方便,但传输速度有限,而USB 接口很好的解决了上述问题,它是PC 机的基本配置,即插即用,并且具有较高的传输速度,是实现数据监控比较理想的一种方式。
2硬件实现图1 系统硬件示意图本硬件系统包括内嵌CAN 总线控制器的Mi crochip 公司PIC18F4580单片机,USB 接口芯片采用Philips 的PDIUSBD12,CAN 通讯收发器采用M CP2551,外部数字脉冲信号直接进入单片机捕获单元。
供电采用U SB 系统电源,由于USB 控制芯片即可以采用5伏供电也可以采用3.3伏供电,因此单片机和USB 控制器数据线和控制线可以直接连接,不需要进行电平转换或缓冲。
硬件系统图如图1所示。
2.1 PIC 18F4580单片机特点PIC18F4580是美国Microchip 公司生产的内嵌增强性CAN 控制器的8位处理器,内部包含了32K Flash Rom,256个字节的EEOROM,1536个字节SRAM ,11路10位A D 输入通道,2路捕获和比较单元,1路EUSRT 和M SSP 模块,灵活的时钟晶振结构和高达40M 时钟频率等十分丰富的外设模块来满足不同用户使用需求。
基于PDIUSBD12的步进电机控制单元的设计
郑才国;刘建新;文琼
【期刊名称】《机械》
【年(卷),期】2005(032)009
【摘要】提出了一个具有USB接口的步进电机控制单元的新的设计思想,阐述了该系统的工作原理和USB接口电路.并介绍了USB系统的软件设计方法.
【总页数】4页(P36-38,41)
【作者】郑才国;刘建新;文琼
【作者单位】成都理工大学,工程技术学院自动化工程系,四川,乐山,614007;西华大学,机械工程与自动化学院,四川,成都,610039;成都理工大学,工程技术学院自动化工程系,四川,乐山,614007
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.PDIUSBD12及其在步进电动机控制单元中的应用 [J], 郑才国;陈远新;戢敏
2.基于PDIUSBD12的电阻焊控制器USB通信接口设计 [J], 马海林;冀春涛;涂狄
3.基于以太网的嵌入式步进电机控制单元 [J], 谢诚;李潮;虢仲平
4.基于FPGA和PDIUSBD12的USB通信接口设计 [J], 闫蕴霞;陈鸿
5.基于8098单片机高速输出单元(HSO)的步进电机控制 [J], 陈小惠
因版权原因,仅展示原文概要,查看原文内容请购买。
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: NORevision: 1.0************************************************************** *************/#ifndef __D12_USB_H_REVISION_FIRST__#define __D12_USB_H_REVISION_FIRST__#include <REGX51.H>sbit SUSPEND = P3^5;#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#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 //设备请求类型,传输方向D 7 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) | (((x) >> 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_SIZE 8typedef struct _control_xfer{DEVICE_REQUEST DeviceRequest; //USB请求结构体unsigned short wLength; //传输数据的总字节数unsigned short wCount; //传输字节数统计unsigned char * pData; //传输数据指针unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; //请求的数据}CONTROL_XFER;static EVENT_FLAGS EventFlags; //定义为全局变量,用于与主程序的通信static CONTROL_XFER ControlData; //保存SETUP包请求类型和请求数据unsigned char idata EndPoint1Buffer[4]; //控制端点缓存unsigned char idata EndPoint2Buffer[64];//主端点缓存//************************************************************ **************//硬件提取层,多路地址/数据总线方式读写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;i<count;i++)for(j=0;j<120;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);j<<=8;j+=b1;return j;}//读取端点状态unsigned char D12_ReadEndpointStatus(unsigned char EndPoint){unsigned char BackValue;if(EventFlags.Bits.InISR == 0)EA = 0;Outportb(D12_COMMAND, 0x80 + EndPoint);//读取端点状态BackValue = Inportb(D12_DATA);if(EventFlags.Bits.InISR == 0)EA = 1;return BackValue;}//读端点最后处理状态unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp){Outportb(D12_COMMAND,0x40+bEndp);return Inportb(D12_DATA);}//读端口unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,un signed char *buf){unsigned char i,j;Outportb(D12_COMMAND,endp);if((Inportb(D12_DATA)&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newerreturn 0;Outportb(D12_COMMAND,0x80+endp);i=Inportb(D12_DATA);i=i&0x60;Outportb(D12_COMMAND,0xF0);j=Inportb(D12_DATA);j=Inportb(D12_DATA);if(j>len)j=len;for(i=0;i<j;i++)*(buf+i)=Inportb(D12_DATA);Outportb(D12_COMMAND,0xF2);return j;}unsigned char D12_ReadEndpoint_Int(unsigned char endp,unsigned char le n,unsigned char *buf){unsigned char i,j;Outportb(D12_COMMAND,endp);if((Inportb(D12_DATA)&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newerreturn 0;Outportb(D12_COMMAND,0x80+endp);i=Inportb(D12_DATA);i=i&0x60;Outportb(D12_COMMAND,0xF0);j=Inportb(D12_DATA);j=Inportb(D12_DATA);if(j>len)j=len;for(i=0;i<j;i++)*(buf+i)=Inportb(D12_DATA);Outportb(D12_COMMAND,0xF2);return j;}unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,un signed 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;i<len;i++)Outportb(D12_DATA,*(buf+i));Outportb(D12_COMMAND,0xFA);return len;}unsigned char D12_WriteEndpoint_Int(unsigned char endp,unsigned char le n,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;i<len;i++)Outportb(D12_DATA,*(buf+i));Outportb(D12_COMMAND,0xFA);return len;}void DisconnectUSB(void){D12_SetMode(0x02,0x03);//SET TO ONE? by newer}void InitialUSBInt(void);void ConnectUSB(void){EventFlags.Value = 0x0000;InitialUSBInt();D12_SetMode(0x16,0x03);}void ReconnectUSB(void){SUSPEND = 0;DisconnectUSB();USB_Delay1ms(1000);ConnectUSB();}//************************************************************ **************//中断服务程序void InitialUSBInt(void){IT1=0; //低电平中断触发EX1=1; //允许外部中断PX1=0; //优先级低EA =1;}void EP0_Out(void){unsigned char ep_last,i;ep_last=D12_ReadLastTransactionStatus(0);//interrupt symbolif(ep_last&D12_SETUPPACKET){ //recieved SETUP packet ---by newerControlData.wLength=0;ControlData.wCount=0;if(D12_ReadEndpoint_Int(0,sizeof(ControlData.DeviceRequest),(unsigned ch ar *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST)){D12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);EventFlags.Bits.ControlState=0; //should define USB_IDLE first --by newerreturn;}acket=1;EventFlags.Bits.ControlState=0; //by newer}else{if(ControlData.DeviceRequest.wLength>16)//最大传16byte{EventFlags.Bits.ControlState=0; //by newerD12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);}else{EventFlags.Bits.ControlState=2;//by newer}}}}else if(EventFlags.Bits.ControlState==2){i=D12_ReadEndpoint_Int(0,EP0_PACKET_SIZE,ControlData.dataBuffer+Con trolData.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+ControlDat a.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),EndPoint1Buffe r);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_descriptor{unsigned 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_descriptor{unsigned char bLength[0x2e];}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.wLength>len)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;}else{D12_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_T YPE){code_transmit((unsigned char code*)&DeviceDescr,sizeof(USB_DEVICE_DE SCRIPTOR));return;}if(MSB(ControlData.DeviceRequest.wValue)==USB_CONFIGURATION_DESCR IPTOR_TYPE){if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;//标识符总大小2E byte,第二次请求时wlength=0x00ff}//这里的ConfigDescr其实应该包括其他标识符!code_transmit((unsigned char code*)&ConfigDescr,ControlData.DeviceRequ est.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_MA SK;//0011,0000breq=ControlData.DeviceRequest.bRequest&USB_REQUEST_MASK;//0000,11 11bif(type==USB_STANDARD_REQUEST)(*StandardDeviceRequest[req])();else if(type==USB_VENDOR_REQUEST)(*VendorDeviceRequest[req])();}void USB_ISR(void) interrupt 2{unsigned int i_st;EA = 0;EventFlags.Bits.InISR=1;i_st=D12_ReadInterruptRegister();if(i_st!=0){if(i_st&D12_INT_ENDP0OUT)EP0_Out();if(i_st&D12_INT_ENDP0IN)EP0_In();if(i_st&D12_INT_ENDP1OUT)EP1_Out();if(i_st&D12_INT_ENDP1IN)EP1_In();if(i_st&D12_INT_ENDP2OUT)EP2_Out();if(i_st&D12_INT_ENDP2IN)EP2_In();}EventFlags.Bits.InISR=0;EA = 1;}//************************************************************ **************#endif//简单主程序文件,自己按需要改写#include <REGX51.H>#include "D12_USB.h"extern EVENT_FLAGS EventFlags; //事件信号extern unsigned char idata EndPoint1Buffer[4];main(){ReconnectUSB();while(1){if(EventFlags.Bits.SetupPacket){EA = 0;EventFlags.Bits.SetupPacket = 0; ControlHandler();EA = 1;}if(EventFlags.Bits.Timer){EventFlags.Bits.Timer = 0;}if(EventFlags.Bits.Port1RxDone){EventFlags.Bits.Port1RxDone = 0; }}}那么可以写5个函数:void print();void copy();void delete();void quit();void help();然后用一个函数指针数组把他们存在一起:void (*p[])() = {print, copy, delete, quit, help}; 然后根据用户入0,1,2,3,4来直接叫函数cin >> index;p[index]();。
UART及USB双模通信接口的研究及实现程丽玲【摘要】研究了通用异步接收发送器(UART)接口和通用串行总线(USB)接口的通信格式和协议特点,提出了一种支持UART和USB双模通信的驱动软件构架以及硬软件设计方法.该方法基于TMS320VC5402DSP的软件中断功能,并融入数据链路层和应用接口层的关健技术设计,解决了双通道通信中存在的内存浪费、不能同时进行实时分析通信等方面的问题,有效节约了电器测量设备的内存空间,提高了数据使用率.【期刊名称】《自动化仪表》【年(卷),期】2013(034)012【总页数】3页(P70-72)【关键词】USB;UART;双模通信;通信协议;驱动软件【作者】程丽玲【作者单位】浙江省检验检疫科学技术研究院,浙江杭州310020【正文语种】中文【中图分类】TP334+.70 引言通用异步接收发送器(universal asynchronous receiver/transmitter,UART)和通用串行总线(universal serial bus,USB)是用户经常使用的两种通信接口。
由于USB灵活的协议设置、接口扩展功能以及即插即用等优点,目前在消费电子产品领域USB接口已经逐步取代了UART接口。
UART接口具有协议简单、数据流稳定可靠等优点,在工业计算机、工业专用电子设备和测试设备领域仍占有一席之地。
因此,在许多场合很多电子设备会同时设计成兼具UART和USB接口,并分别为这两种接口配备各自独立的应用协议软件和各自独立的内存。
这样的设计存在内存空间浪费,不能同时进行数据分析、传输和通信等问题,不利于数据的高效使用,在资源急缺的今天绝对不是一种好的选择。
本文通过研究通用异步接收发送器(UART)接口和通用串行总线(USB)接口的通信格式和协议特点,提出一种支持UART和USB双模通信的驱动软件构架以及硬软件设计方法,以解决双通道共用中统一数据链路层和应用接口层等关键技术设计难题。
用PDIUSBD12和K9F5608U0A设计USB移动闪存摘要简要介绍通用串行总线大容量存储设备类,给出控制12和闪存956080的原理框图,并以这两个芯片为例设计出存储设备的电路图,最后列出程序流程图。
关键词12956080移动闪存引言自从规范发布以来,短短的几年中得到了极大的发展,基于接口的大容量存储设备应运而生。
这类设备主要有移动硬盘、外置光驱、外置软驱、闪存盘等。
但是目前国内介绍这一方面开发的文章并不多。
结合作者实践,本文将以公司的控制器12和公司的内存956080为例,介绍开发大容量存储设备的方法。
1大容量存储设备类大容量存储设备类规范包括四个独立的子类规范,即①;②-;③;④前两个子规范定义了数据命令状态在上的传输方法。
-传输规范仅仅使用端点传送数据命令状态,传输规范则使用三种类型的端点进行数据命令状态传送。
后两个子规范定义了对存储介质的操作命令。
命令规范是针对移动存储而制定的,实际上命令格式是基于-8070和-2规范,总共定义了19个12字节长度的操作命令。
批量单独传输在大部分的通信中使用批量传输,只有在批量端点上清除一个状况,以及传送类别特定请求-时才使用控制传输。
需要注意的是,批量单独传输还支持两个特定的请求是*——重置设备;*——取得设备支持的逻辑单元数目。
大容量存储类支持的设备都有不同的内部结构,控制与读取不同设备需要使用不同的命令区块群。
2器件简介21控制器1212是一个全速芯片,支持一个控制端点,以及四个额外的端点地址,一个端点的地址可以存储128个字节,而双缓冲区可以存256个字节。
该芯片完全由软件控制,在外围设备的送来一个命令来仿真连接总线之前,芯片都是维持与主机分离的状态。
这样才能保证在开机后搜寻设备前,芯片有时间来初始化。
另外,12有一个状态输出可以连接到液晶显示器上,在建立连接时亮灯,而数据传输时闪烁。
12引脚图和逻辑框图分别如图1、2所示。
22956080956080是三星公司生产的90系列闪存中的一种,32容量,读写速度快,数据保存时间长以及高达10万次的擦除写入寿命等优点。
基于51单片机和PDIUSB12的USB接口设计张学峰;陈瑾;翟从鸿;彭文超;朱家俊【摘要】为解决51单片机与计算机的串行总线(USB)的通信问题,以PDIUSB 12芯片为基础,选择51单片机中的STC89C52为示例,设计了一款USB的接口电路,解决了多款51单片机与计算机的USB通信困难的问题.【期刊名称】《微型机与应用》【年(卷),期】2015(034)006【总页数】4页(P16-18,22)【关键词】USB;STC89C52;PDIUSB12;通信【作者】张学峰;陈瑾;翟从鸿;彭文超;朱家俊【作者单位】安徽师范大学物电学院,安徽芜湖241000;安徽师范大学物电学院,安徽芜湖241000;安徽师范大学物电学院,安徽芜湖241000;安徽师范大学物电学院,安徽芜湖241000;安徽师范大学物电学院,安徽芜湖241000【正文语种】中文【中图分类】TN919.5USB因其使用方便、传输速度快、连接灵活而受到用户和计算机厂商的广泛青睐。
微控制器(MCU)在与计算机实现通信时大多依靠USB来实现。
在 MCU中,51单片机是国内使用最广的单片机之一,但是由于多款51单片机无法直接与计算机实现USB通信,而给许多用户开发和使用带来不便。
本文以51单片机中的典型代表STC89C52和恩智浦半导体公司的PDIUSB12为基础设计的USB接口电路,解决了MCU和计算机的USB通信问题。
本方案具有价格便宜、使用简单、无需编写复杂的USB驱动程序、即插即用等优点。
1.1 芯片简介本系统以单片机 STC89C52和 PDIUSB12接口芯片为基础而搭建。
STC89C52是STC公司生产的一种低功耗、高性能 8位 CMOS微处理器,具有经典的 MCS-51内核,主要有以下功能特点:拥有灵活的8 KB Flash程序存储器和512 B RAM 数据存储器,并含有32位I/O口和内置的4 KB EEPROM,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构,全双工串行口;掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止;最高运作频率35 MHz,是一种常用性价比较高的MCU。
第7章USB接口芯片7.1 USB接口芯片分类USB专用的器件大致可以分为以下类型:•USB主控制器•USB根集线器,•微处理器接口的USB专用接口芯片•具有USB接口的微处理器•USB桥芯片•OTG专用芯片其中前两类用于计算机,一般集成于计算机的芯片组中。
在实际的开发中大多项目是针对USB外部设备,用于USB设备的芯片主要是USB专用接口芯片和具有USB接口的微处理器。
USB专用接口芯片内部不包含通用微处理器,提供与通用微处理器的接口电路,可以与大多数微处理器连接,固件的编程在微处理器完成,主要用于基于微处理器的计算机外部设备开发。
USB桥芯片,可以将USB接口转换成为串行接口、并行接口、IrDA等其他标准接口,这类芯片不需要固件编程。
7.2 微处理器接口的USB专用接口器件具备微处理器接口的USB接口芯片与微处理器的接口是不统一的,根据芯片的设计的不同,可以通过通用的串行接口、并行接口、SPI等接口和微处理器连接。
USB接口芯片主要由以下部分组成:•USB收发器•SIE(Serial Interface Engine)•数据缓冲存储器FIFO•时钟及控制逻辑•微处理器接口逻辑这类芯片常用的有Philips公司的PDIUSBD11和PDIUSBD12;National Semiconductor公司的USBN9602、9603和9604;MAXIM公司的MAX3420、MAX3421等。
下表是几种常见的USB专用接口芯片的基本情况。
162 计算机高级接口实践下面对这几款芯片的硬件作简要介绍。
7.2.1 Philips 的PDIUSBD12Philips 的D12是使用很广泛的USB 控制器,主要的特点包括:• 支持控制、中断、批量和实时四种传输模式,批量和实时模式可以达到1MB/sec的传输速率;• 集成了总共320字节的FIFO ,并且在不同的模式下可以灵活分配。
对于中断和批量模式支持2X64字节的双缓冲,对于实时模式支持2X128字节的双缓冲; • 支持完全自动的DMA 接口;• 并行方式的微处理器接口,可以达到最大2MB/sec 的传输速率。