采用PDIUSBD12的USB系统固件程序设计

发布者:Serendipitous55最新更新时间:2012-06-06 来源: 21IC 关键字:PDIUSBD12  USB系统  固件程序 手机看文章 扫描二维码
随时随地手机看文章

USB(Universal Serial Bus)即通用串行总线,是现在非常流行的一种快速、双向、廉价、可以进行热插拨的接口,在现在的每一台PC机上都可以找到一对USB接口。在遵循USB1.1规范的基础上,USB接口最高传输速度可达12Mb/s:而在最新的USB2.0规范下,更可以达到480Mb/s.同时它可以连接127个USB设备,而且连接的方式也十分灵活,既可以使用串行连接,也可以使用集线器(Hub)把多个设备连接在一起,再同PC机的USB接口相连.此外,它还可以从系统中直接汲取电流,无需单独的供电系统.USB的这些特点使它获得了广泛的应用.但是使用上的方便则意味着开发上的复杂,主要是编程的复杂性大大的增加了.

在设计开发一个USB外设的时候,开发者主要需要编写三部分的程序: ①固件程序;②USB驱动程序;③客户应用程序.本文主要阐述固件程序的编写.

1 固件要完成的主要工作

固件是FIREWARE的对应中文词,它实际上是单片机的程序文件,其编写语言可以采用C语言或是汇编语言.它的操作方式与硬件联系紧密,包括USB设备的连接USB协议、中断处理等,它不是单纯的软件,而是软件和硬件的结合,开发者需要对端口、中断和硬件结构非常熟悉。固件程序一般放入MCU中,当把设备连接到主机上(USB连接线插入插孔)时,上位机可以发现新设备,然后建立连接。因此。编写固件程序的一个最主要的目的就时让Windows可以检测和识别设备。

2 PDIUSBD12芯片特点

PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统,并通过高速通用并行接口与微控制器进行通信,而且支持本地DMA传输。该器件采用模块化的方法实现一个USB接口,允许在众多可用的微控制器中选择最合适的作为系统微控制器,允许使用现存的体系结构使固件投资减到最小。这种灵活性减少了开发时间、风险和成本。该器件使开发成本低且高效的USB外围设备的一种有效途径。PDIUSDB12完全符合USB1.1规范,也能适应大多数设备类规范的设计,如成像类、大容量存储类、通信类、打印类和人工输入设备等。因此,PDIUSBD12非常适合做很多外围设备,如打印机、扫描仪、外部大容量存储器(Zip驱动器)和数码相机等。现在很多用SCSI实现的很多设备如果用USB来实现可以直接降低成本。

PDIUSBD12还集成了SoftConnect、GoodLink、可编程时钟输出、低频晶振和终端电阻等特性。所有这些特性都能在系统实现时节省成本,同时在外围设备上很容易实现更高级的USB功能。

3 PDIUSBD12固件程序的编写

USB设备启动流程如下:

(1) USB设备接入USB口,发出连接USB命令;

(2) 主机发出读设备描述符两次;

(3) 主机根据设备描述符——厂商ID、产品ID,启动相应设备驱动程序;

(4) 设备驱动程序初始化USB设备;

①读设备描述符;

②读配置描述符;

③选择接口、端点(管道),确定传输方式。

图1 PDIUSBD12测试电路连接图

    图1是PDIUSBD12的电路连接图。

USB固件程序程序由三部分组成:①初始化单片机和所有的外围电路(包括PDIUSBD12);②主循环部分,其任务是可以中断的;③中断服务程序,其任务是对时间敏感的,必须马上执行。根据USB协议,任何传输都是由主机(Host)开始的。单片机作它的前台工作,等待中断。主机首先要发令牌包给USB设备(这里是PDIUSBD12),PDIUSBD12接收到令牌包后就给单片机发中断。单片机进入中断服务程序,首先读PDIUSBD12的中断寄存器,判断USB令牌包的类型,然后执行相应的操作。在USB单片机程序中,要完成对各种令牌包的响应,其中比较难处理的是SETUP包,主要是端口0的编程。

单片机与PDIUSBD12的通信主要是靠单片机给PDIUSBD12发命令和数据来实现的。PDIUSBD12的命令字分为三种:初始化命令字、数据流命令字和通用命令字。PDIUSBD12数据手册给出了各种命令的代码和地址。单片机先给PDIUSBD12的命令地址发命令,根据不同命令的要求再发送或读出不同的数据。因此,可以将每种命令做成函数,用函数实现各个命令,以后直接调用函数即可。

下面的程序是处理主机的标准控制请求的一个模板:

unsigned char ENDPOINT_A0_FIFO[8];

//判断输入的是SETUP请求,并将其读入缓冲区ENDPOINT_A0_FIFO

if((ENDPOINT_A0_FIFO[0] & 0b011000000)==0x00)

{

if(ENDPOINT_A0_FIFO[1]<=0C)

{

(*StandardFunctionTable[ENDPOINT_A0_FIFO[1]])();

return;

}

}

const void (*StandardFunctionTable[])(void)=

{

GetSatus,ClearFeature,USB_Reserved,SetFeature,

USB_Reserved,SetAddress,GetDescriptor,SetDescriptor,

GetConfiguration,SetConfiguration,GetInterface,

SetInterface,SynchFrame

};[page]

USB设备在正常使用以前,必须由主机配置设备。主机一般会从USB设备获取配置信息后再确定此设备有哪些功能。

作为配置操作的一部分,主机会设备设备的配置值,如果必要的话会选择合适的接口备选设备。其初始化函数为:

void D12_int()

{ XmtBuff.pNum=16;

D12_COMMAND=0xf4;//读中断寄存器

ist=D12_DATA;

ist=D12_DATA;

if(ist & 0x01) //ENDP0_OUT

{XmtBuff.out=0;

XmtBuff.in=1;

D12_COMMAND=0x40; //读OUT最后状态

ist=D12_DATA;

if(ist & 0x20)//收到SETUP包

{ Setup_read();

Setup_control();

}

else

{ Setup_read();

}

}

else if(ist & 0x02)//ENDP0_IN

{ XmtBuff.in=1;

D12_COMMAND=0x41;//读in最后状态

ist=D12_DATA;

USB_submit();

}

else if(ist & 0x04)//ENDP1_OUT

{ XmtBuff.out=2;

XmtBuff.in=3;

D12_COMMAND=0x42;//读out最后状态

ist=D12_DATA;

read_out();

}

else if(ist & 0x08)//ENDP1_IN

{ XmtBuff.in=3;

D12_COMMAND=0x43;//读in最后状态

ist=D12_DATA;

XmtBuff.b[0]=5;

XmtBuff.wrLength=1;

XmtBuff.p=XmtBuff.b;

USB_submit();

}

……

在发出连接USB命令后,主机先读取设备描述符,然后发出设置USB地址SETUP包,设置USB地址后,进行主机客户驱动与设备初始化。其余端点(ENDPOINT)依此类推。

在其头文件里需定义USB规范中的各种描述符格式,包括设备描述表、配置描述表、接口描述表、端点描述表、字符串描述表以及描述表类型。这样,在发送配置[,接口(1),端点(1),接口(2),端点(2),…,类,厂商等]联合描述表时,主机USBD可以根据描述类型标识区分各种分描述表。[page]

下面是固件程序的主循环部分:

#include

//指向外部D12访问地址

#define D12_COMMAND(*(unsigned char xdata *)0xff01)

#define D12_DATA (*(unsigned char xdata *)0x7f02)

extern void D12_int();

sbit D12_suspend=P1^0;

sbit D12_int_n=P1^1;

sbit D12_eot_n=P1^2;

sbit D12_DMAck_n=P1^3;

sbit D12_DMAreq=P1^4;

void main(void)

{

unsigned char ist;

P1=0xff;

D12_COMMAND=0xf3;

D12_DATA=0x06;//设置模式0

D12_DATA=0x03;//初始化频率12MHz

D12_COMMAND=0xd0;

D12_DATA=0x80;//设置地址0使能

D12_COMMAND=0xf3;//连接主机

D12_DATA=0x16;

while(1)

{ if(!D12_int_n)

{

D12_int();

}

}

}

在编写USB的固件程序时,需要注意:

①单片机的中断应设置为电平触发;中断后一定要读上次传输状态寄存器(命令40~45H),以清除中断寄存器中的中断标志。这样,PDIUSBD12的中断输出才能变回高电平,这一点非常重要。

②在接收到Setup包后,一定要调用D8命令重新使能端口0。

③在向IN端写完数据后,一定调用命令FAH,指明缓冲区中的数据有效,可以发送到主机。

④读写数据后,一定调用命令F2H,以保证可以接收新的包。

⑤可以通过调用命令FDH,检查PDIUSBD12是否工作。该命令要读两个字节数据。

固件程序的编程是整个USB外设开发中非常重要的一环,它直接影响到设计开发的产品的数据传输速度。例如,采用不同的传输类型、设置不同的分组大小、是否采用DMA方式、传输缓冲区的大小等都会使得传输速率发生很大的变化。还有在高速情况下的超时处理等,也包含了很多的内容。

总之,在USB技术应用越来越广泛的今天,只有掌握了固件程序的编写,才可能开发出一个好的USB产品。

关键字:PDIUSBD12  USB系统  固件程序 引用地址:采用PDIUSBD12的USB系统固件程序设计

上一篇:基于PCI接口的高速数字信号处理板卡的设计
下一篇:USB接口芯片FT245AM的原理

推荐阅读最新更新时间:2024-03-16 13:01

如何在您的系统中实现创新的USB Type-C方案
该视频展示安森美半导体的USB Type-C演示方案。我们提供完整的USB Type-C阵容,以从控制器到电源开关和超高速开关的整套分立的、灵活的USB Type-C方案实现了成本、占位和低功耗优化。 iframe src="http://player.youku.com/embed/XMjg1NjY2MzI2NA==" width="510" height="498" frameborder="0" /iframe
[嵌入式]
基于I2S的USB 声卡系统设计
引言 近年来USB产品层出不穷,USB音频类在USB开发者论坛的努力下,成为一种标准的规范,USB声卡也开始在市场上悄然出现。因为USB声卡内置了DAC和有源功放,音频数据以数字方式进入USB声卡,完全杜绝了PC的内部干扰,所以,USB声卡将有可能成为现有内置声卡的替代品。本文介绍了一种基于ARM处理器的USB声卡设计。    USB声卡原理 由USB声卡数据流图(见图1)可以看出USB声卡的工作原理。在主机端播放音乐时,应用软件或驱动程序把各类音频信号转换为统一的格式,如PCM、MPEG等格式的数据流,通过主机的USB接口发送给USB声卡。声卡的USB接口接收到数据后,通过I2S接口把并行音频数据转为串行,再发送给音频编
[单片机]
基于I2S的<font color='red'>USB</font> 声卡<font color='red'>系统</font>设计
基于USB2.0接口的语音采集系统设计
   引言   语音信号的采集和处理在网络、通信、智能仪表、工业控制、医疗卫生、公共安全等领域得到了越来越广泛的应用,而这些工作都需要一套高速的语音信号采集系统来完成,要对语音进行采集就需要一种高速的,能进行长时间、大吞吐量数据传送的计算机接口。USB2.0接口就是一种符合语音采集要求的计算机接口,同时,它还具有支持热插拔、占用系统资源少、易于扩展、使用方便等优点。DSP是利用专门或通用的数字信号处理芯片,以数字计算的方法对信号进行处理,具有处理速度快、灵活、精确、抗干扰能力强、体积小及可靠性高等优点,可满足对信号快速、精确、实时处理及控制的要求,本采集卡采用TI公司高精度浮点DSP芯片TMS320C6713作为主控制器,采用高
[安防电子]
基于PDIUSBD12芯片的USB应用开发
     一、 PDIUSBD12芯片介绍   进行USB开发之前要根据成本与性能选择合适的USB接口芯片。目前USB控制器芯片通常可分成3种:   第一种是专为USB设计的芯片,这类芯片的主要来源是CYPRESS的M8系列和ScanLogic的SL11R系列芯片。这种芯片是为了使用在USB应用设备而特别设计的,而不是在旧的结构上改造出来的,因而其功能的实现能够达到最佳化,但是开发起来比较困难,要学全新的指令集,而且价格较较贵。   第二种是与现有的芯片兼容。大部分和8051系列的芯片兼容,如AMD公司的AM186T和Motorola的68HC05/8。这种芯片的优点是开发者已经熟悉现有芯片的结构和指令集,开发起来会比
[嵌入式]
初涉USB,初学者USB入门总结(2) 设备固件程序
为了更好的说明整个USB启动过程,我们可以用串口实时的跟踪各个USB中断。不过这里先不用串口进行测试,只是简单的用一组变量记录过程。测试程序如下(以下会有程序的说明):    uchar test ;//100长度的变量,记录过程 uchar conters=0;//记录计数值, /*------------------------------------------------------------         高校电子联盟--肖继达      QQ:258347765     -------------------------------------------------------------*/   void EXT
[嵌入式]
基于LabVIEW的USB实时数据采集处理系统的实现
  通用串行总线USB(Universal Serial Bus)作为一种新型的数据通信接口在越来越广阔的领域得到应用。而基于USB接口的 数据采集 卡与传统的PCI卡及ISA卡相比具有即插即用、热插拔、传输速度快、通用性强、易扩展和性价比高等优点。    USB 的应用程序一般用Visual C++编写,较为复杂,LabVIEW语言是一种基于图形程序的编程语言,内含丰富的数据采集、数据信号分析分析以及控制等子程序,用户利用创建和调用子程序的方法编写程序,使创建的程序模块化,易于调试、理解和维护,而且程序编程简单、直观。因此它特别适用于数据采集处理系统。利用它编制USB应用程序,把LabVIEW语言和USB总线紧密结合起来的数
[测试测量]
基于LabVIEW的<font color='red'>USB</font>实时数据采集处理<font color='red'>系统</font>的实现
基于USB总线的高速数据采集系统
摘要:介绍了一种基于USB总线的高速数据采集系统,讨论了USB控制器EZ-USB FX2CY7C68013的性能及传输方式给出了该系统的硬件和基于GPIF主控方式实现数据传输的软件设计方法。 关键词:USB;数据采集;EZ-USB FX2;GPIF 1 引言 现代工业生产和科学研究对数据采集的要求日益提高。目前比较通用的是在PC或工控机内安装数据采集卡(如A/D卡及422、485卡)。但这些数据采集设备存在以下缺陷:安装麻烦、价格昂贵、受计算机插槽数量、地址、中断资源的限制,可扩展性差,同时在一些电磁干扰性强的测试现场,可能无法专门对其作电磁屏蔽,从而导致采集的数据失真。 传统的外设与主机的通讯接口一般是基于PCI总
[应用]
基于LABVIEW的USB接口多路高速数据采集系统的设计
引言   在日常的测试测量中,经常使用数据采集卡采集数据。但是很多数据采集卡往往通过PCI总线完成数据的传输,它有诸多弊端,例如操作不便,受限于计算机插槽数量和中断资源,现场信号对计算机安全有威胁,计算机内部的强电磁干扰对被测信号也会造成很大的影响,最耗时最复杂的数据分析却由用户通过第三方软件(如VC,VB等) 在PC机上编写上位机软件来完成,因此用户不得不在这方面花费大量精力。这些问题都遏制了基于PCI总线的数据采集系统的进一步开发和应用,因此迫切需要设计一种更为简便通用的高速数据采集通信系统来完成数据采集以及与计算机的数据交互。   近年来通用串行总线(USB)以即插即用等技术优势得到了广泛的应用,INTEL等公司最近公
[测试测量]
基于LABVIEW的<font color='red'>USB</font>接口多路高速数据采集<font color='red'>系统</font>的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved