历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2018年03月06日 | USB固件程序开发的实现

2018-03-06 来源:eefocus

    随着计算机技术的更新换代,USB接口已经成为个人计算机上最重要的外部设备扩展接口,在进行USB外设开发的过程中需要编写其固件程序。在此对USB接口固件程序进行了开发,在Keil C51软件环境中,采用C语言开发。介绍了固件程序的主要功能,给出了固件程序的流程、结构和端点配置,并给出了重点地方的具体程序。该固件编写采用分层结构简洁且易于修改和测试,既增加了代码的可读性,又增加了程序的通用性和移植性。


    在设计开发一个USB外设的时候,开发者主要需要编写3部分的程序:固件程序、USB驱动程序和客户端应用程序。当把设备连接到主机上(USB连接线插入插孔)时,上位机可以发现新设备,然后建立连接。因此,编写固件程序的一个最主要的目的就是让Windows可以检测和识别设备。固件程序可以在Keil C51软件环境中,用C语言开发。Keil C51是美国Keil SOFtware公司出品的51系列兼容单片机C语言软件开发系统,KeilC51软件提供了大量的库函数和功能强大的集成开发调试工具,使用的是全Windows界面,具有方便实用的特点。另外,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。因此,本文考虑采用此方法开发PDIUSBD12芯片的USB固件程序。

    1 固件程序主要完成的工作

    固件设计的目标就是完成主机与设备之间的命令与数据传输与转换,使PDIUSBD12在USB上达到最大的传输速率。它的操作方式与硬件联系紧密,包括USB设备的连接、USB协议、中断处理等。在系统中,当PDIUSBD12从USB接收到一个数据包,就对CPU产生一个中断请求,CPU立即响应中断。在ISR(中断服务程序)中,固件读取数据,并将数据值保存到循环数据缓冲区,随后置相应事件的标志位,CPU继续前台程序,检测事件标志,执行完成相应的事件任务。

    USB单片机固件程序通常由3部分组成:初始化单片机和所有的外围电路(包括PDIUSBD12);主循环部分:这部分是可中断的;中断服务程序,可以中断执行。根据USB协议,任何传输都是由主机开始的,这样单片机作它的前台工作,等待中断。主机首先要发令牌包给USB设备(这里是PDIUSBD12),PDIUSBD12接收到令牌包后就给单片机发中断,单片机进入中断服务程序,首先读PDIUSBD12的中断寄存器,判断USB令牌包的类型,然后执行相应的操作,因此,USB单片机程序主要就是中断服务程序的编写,在USB单片机程序中要完成对各种令牌包的响应。

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

    2 固件程序的流程及结构

    USB设备启动流程如下:

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

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

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

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

    ①读设备描述符;

    ②读配置描述符;

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

    在编写USB的单片机固件程序时,单片机的中断应设置为电平触发,中断后一定要读上次传输状态寄存器(命令40H~45H),以清除中断寄存器中的中断标志,这样PDIUSBD12的中断输出变回为高电平。

    PDIUSBD12固件编写采用分层结构简洁且易于修改和测试,既增加了代码的可读性,又增加了程序的通用性。PDIUSBD12固件的开发一般都是在周立功单片机公司提供的固件源码的基础上做相应的修改。由于该固件采用分层分模块的结构,在做移植的时候只要修改部分代码就可以运行于特定的平台,比较方便。

    固件程序采取如图1的积木式结构。

a.JPG

    2.1 硬件提取层

    epphal.c文件是固件中的最底层代码,由于在具体应用时所提供的硬件平台都是不同的,因此该文件必须进行修改以适应当前应用。该文件里主要包含了读写PDIUSBD12寄存器的函数,PDIUSBD12芯片各控制线与单片机I/O口的连接等。

    读写PDIUSBD12主要有2种方式:多路复用地址/数据总线方式和A0地址位方式。不同的方式其电路连接完全不同,因此其读写函数也完全不同。本处采用多路复用地址/数据总线方式,即用地址/数据总线的最低位标识总线上是数据还是命令,1代表命令,0则代表数据。

    2.2 D12命令接口

    d12ci.c文件中定义了一套访问D12功能的命令接口。

    D12的命令包括:4个初始化命令、24个数据流命令和2个普通命令。该文件包含了单片机对上述命令的实现函数,基本无须修改。

    2.3 中断服务程序

    isr.c部分的代码主要处理PDIUSBD12产生的中断请求。

    硬件设计中,将PDIUSBD12中断一般连到单片机的外部中断0或者1中。由于只有一个中断源,如果要知道是什么中断,就需要读取PDIU SBD12中的中断寄存器的值进行判断。该文件包含了需要处理的各个中断的处理函数。其中许多处理函数仅仅是将相应标志位置1,用来在主函数中处理各类事务。在各个输入/输出端点引发的中断处理函数中,分别进行了读取缓冲区数据和发送数据到缓冲区等动作。其中,控制输入端点的中断处理函数还将相应控制位置1,以用来在主函数中触发标准设备请求和厂商请求。

    2.4 主循环

    主函数文件mainloop.c是一个大循环。在该文件中要执行各个初始化函数,发送USB请求和处理USB总线事件等。设备的各项功能需要在该文件中添加。

    首先,初始化I/O口;然后初始化定时器2,设置中断,设置DMA(设备未用到DMA方式,置为00)等,通过连接指令指示D12完成软连接(SOFtConnect)后,电脑就会检测到新设备。

    在进入主循环后,需要用51的定时器2每隔1 ms检测一次电键的电平高低,并且将此信号通过USB接口发送出去,同时将P1.2口取反,以产生500 Hz的方波信号作为电键音。

    2.5 协议层

    chap_9.c:标准设备请求文件。该文件包含了所有设备相关的描述符,以及各个USB设备标准请求的实现函数。一个USB设备的各个特性都包含在了其所有的描述符内,而各个设备都有各自的特点,因此每个设备的描述符都要进行相应修改。其中,设备描述符里的idVendor与idProduct是联系PC端驱动的标志,必须与驱动一致。而各类标准设备请求是每个标准USB设备都要能够响应的,因此也就无须修改了。

    protodma.c:该文件用来描述厂商请求。如果USB设备需要响应厂商请求,那么就要编写该厂商请求的实现函数。由于终端操作平台无须定义特殊的厂商请求,因此该文件不用修改。

    3 端点配置

    在D12芯片内存在三套输入/输出端点,根据配置不同可完成不同的工作,终端操作平台中的固件中是按照表1配置的。

b.JPG


    根据端点的配置和各端点的特点,设置端点1为控制命令的传输端点,接收来自电脑的状态控制指令,共两个字节,如表2所示。

c.JPG


    设置端点2为电键信号传输端口,手电键的按下或抬起通过00和01来标识,传输间隔为1 ms。

4 固件程序
    多路复用地址/数据总线方式的实现,通过地址线的最低位来分辨命令和数据:
    d.JPG
    e.JPG

    主循环程序首先做初始化I/O口,设置中断等准备工作,然后进入主循环,在主循环内查询事件标志,并做出相应处理。

    5 结语

    本文实现了USB固件程序的开发。该固件编写采用分层结构简洁且易于修改和测试,既增加了代码的可读性,又增加了程序的通用性和移植性。


推荐阅读

史海拾趣

Digital Core Design公司的发展小趣事

随着《古墓丽影》系列游戏的成功,Core Design的团队迅速扩张。当PS2主机即将推出时,索尼和Core Design都对这款新主机充满期待。为了抓住这一机遇,Core Design将“古墓丽影”的制作团队从最初的12人增加到60人,随后又增加到了100人。这一举措展示了Core Design对市场和技术的敏锐洞察力和决心。

Elprotronic Inc.公司的发展小趣事

随着电子行业的不断发展,客户对电子元器件的需求也在不断变化。Elprotronic Inc.紧跟市场趋势,不断推出具有创新性的产品和技术。其中,一项名为“高速数据传输技术”的创新成果引起了业界的广泛关注。这项技术可以大幅提高数据传输速度,同时保证数据的稳定性和安全性。这一突破性的技术创新为Elprotronic Inc.赢得了更多客户的信赖和支持,也进一步巩固了公司在行业中的地位。

EBG RESISTORS LLC公司的发展小趣事

为了进一步扩大市场份额,EBG RESISTORS LLC公司开始实施国际化战略。他们积极参加国际电子展会,与全球各地的客户建立联系。同时,公司还积极寻求与国际知名企业的合作,共同开发新产品。在XXXX年,公司成功打入欧洲市场,并在随后几年内陆续进入亚洲和北美市场。

DFI公司的发展小趣事

近年来,随着智能医疗和金融科技等新兴领域的兴起,DFI看到了新的发展机遇。公司开始将这些领域作为重点发展方向,投入大量资源进行研发和创新。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有创新性的智能医疗和金融科技产品。这些产品不仅为客户提供了更便捷、更高效的服务体验,也为DFI带来了新的增长点。随着这些新兴领域的不断发展壮大,DFI有望在未来实现更大的突破和发展。

请注意,以上故事均为虚构,旨在展示DFI公司可能的发展历程和业务活动。实际情况可能有所不同,具体信息请参考DFI公司的官方资料。

方舟(ARKLED)公司的发展小趣事

方舟公司高度重视产品品质管理,从原材料采购到生产加工,再到成品检验,每一个环节都严格把关。公司引进了先进的生产设备和检测仪器,建立了完善的质量管理体系。通过ISO9001质量管理体系认证,方舟公司的产品质量得到了有效保障,赢得了客户的信赖和支持。

Eris Technology Corp公司的发展小趣事

面对日益激烈的国际竞争,Eris Tech开始实施全球化战略。公司通过在海外设立研发中心、生产基地和销售网络,加强与国际市场的联系和合作。同时,Eris Tech还积极参与国际标准的制定和技术交流活动,提高了公司的国际影响力和竞争力。随着全球化战略的深入实施,Eris Tech的产品已经远销全球多个国家和地区。

问答坊 | AI 解惑

出路

做为技术人员,大家都觉得工资高,工作稳定,还能学到很多的东西。是大部份走出校门或性格内向,或希望过平静的人的必然选择。其实,你们有没有问过自己,这条路到底走对了吗?    一个刚毕业的大学生,从事销售和从事技术两种不同的工作,可能 ...…

查看全部问答>

FPGA的下载问题还没解决啊

fpga的下载问题 我目前在使用altera 的cyclone EP28 ,在程序下载的过程中出现一个奇怪的问题。 使用quartusII打开programmer,点击start按钮,出现以下错误: Error: Can\'t access JTAG chain Error: Operation failed 我用的是开发板啊!J ...…

查看全部问答>

可控硅控制

可控硅能够控制容性负载吗?怎么控制啊?阻性负载和感性负载都能够控制,就是控制不了容性负载啊!…

查看全部问答>

继续菜鸟问题。。Combo box 显示问题

case WM_CREATE:     CreateWindow(TEXT(\"Combo Box\"),TEXT(\"\"), WS_VSCROLL | WS_BORDER | WS_VISIBLE | WS_CHILD,                  100, 100, 205, 100, hWnd, (H ...…

查看全部问答>

evb RDA对象的pull方法使用出错

执行的代码如下: Dim strSQL As String dim strRemoteConnect as String strSQL = \"SELECT * from a\" strRemoteConnect=\"Provider=SQLOLEDB.1;data source=local;Initial Catalog=DBTest;user id=sa;password=sa\" Dim ceRDA As SSCE.Remo ...…

查看全部问答>

请教如何使点阵液晶显示图形?

我用的是320×240图形点阵液晶,现在可以在上面显示汉字了。 老板要求显示各种波形,请教高手那里可以找到这方面的资料,听说 要建立坐标系,还要研究各种图形的算法,有这么复杂吗?哪里能找 到这方面的资料? 谢谢您的关注!…

查看全部问答>

想学FPGA,求各位大师推荐一块学习板,谢谢!

我是一个学生,不要太贵的那种,差不多就行,谢谢!…

查看全部问答>

如何判断HR会录用你?

最近是找工作的高峰期,请参加过面试得朋友谈谈如何从等消息中判断自己是否有戏和谈谈自己的面霸经历为后面的应届生介绍些经验。人生最痛苦的莫过于什么也不知道就是等消息~~~~~~~~~~~~~~~~~…

查看全部问答>

电话线-偷电

       十一过完,学校就又开始讨厌的晚上11点断电了,没灯没充电器~~烦!!!        我左眼一瞄,电话线就这么断着的挂在那里,岂不是很危险,测测电压,我*!!!48V直流!!!顿时,一个邪恶的念头就 ...…

查看全部问答>