历史上的今天
返回首页

历史上的今天

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

2021年04月06日 | 基于ARM和μC/OS-Ⅱ的嵌入式USB主机设计与应用

2021-04-06 来源:eefocus

1 引 言


通常情况下,打印机、海量存储等设备是由普通PC机来驱动的,由于大量的测控、医疗等系统需要存储、打印数据,因此开发这类设备的嵌入式驱动是非常有实用价值的。目前,各种嵌入式设备基本上是通过软盘存储,并口打印的,而它们的存储容量、数据传输速度已大大落后当前各类嵌入式系统的需求。因此,开发基于 USB接口的嵌入式海量存储设备和打印机驱动已成当务之急。


USB(Universal Serial Bus)是最近几年逐步在PC领域广为应用的新型串行接口技术,它通用性好、实时性强、传输方式多样、成本低、易于扩展和使用,这些优点使它受到许多硬件厂商的青睐,各种类型的USB设备产品大量涌入市场。USB通讯必须是主机和外设通讯,每次通讯都是由主机发起,外设只是被动地执行主机发过来的命令。而市场上所买到和使用的USB 移动设备, 都是USB 的外设(device) , 如USB 的移动硬盘、USB 接口的数码相机、打印机等。这些设备通常只能通过PC 来进行相互的文件和数据交换,没有了PC 机, 这些设备就无法进行数据交换。而实际上并非每个地方都拥有PC机或者适合使用PC机,因此业界和用户需求USB 主机的嵌入式化。也就是开发和设计嵌入式的USB 主机。


根据具体医疗仪器(酶标仪)的实际需要,我们在三星的ARM7处理器 S3C44B0X上移植了实时操作系统(RTOS)——µC/OS-II,并编写了基于USB主控制器芯片SL811的底层驱动。为了能将酶标仪所检测的数据保存到外设(如U盘、移动硬盘)中,研究了对应的文件系统和UFI传输协议,实现了对FAT文件系统的海量存储设备的读写。同时,为了打印霉标仪的检测结果,研究了EPSON打印机的ESC/P打印语言,实现了EPSON C63系列、C65系列、ME1打印机基于USB通讯的嵌入式打印机驱动。


2嵌入式USB主机的硬件设计


酶标仪的硬件平台核心为三星公司的S3C44B0X(主频最高可达66MHz),它集成了ARM7TDMI核,LCD控制器,是一款适用于中端应用的微控制器。系统扩展包括:存储器(8MB SRAM、2MB NOR Flash)、USB主从机(SL811HS)和按键等硬件资源。其中USB部分硬件连接如图1所示。

图1:硬件连接图


SL811HS 是Cypress公司推出的一款嵌入式USB Host/S1ave芯片。支持USB1.1的全速和低速设备。提供USB主机的硬件接口及总线管理的物理机制。带有在片的SIE和USB发送器以及在片的根集线器Hub。因此, 满足了嵌入式USB 主机系统所需要的功能, 即由主机接口芯片来完成总线底层物理数据包的发送、接收, 并能检测总线状态, 发出中断请求。所以, 选择SL811HS 作为本系统的USB接口芯片是合适的。


如图2所示,ARM通过Cs3片选SL811HS来确定SL811HS的基地址。D0-D7为数据和地址的复用线,并通过A0来区分,当A0为“0”的时候,D0-D7上传输的是偏移地址;反之,当A0为“1”的时候,D0-D7作为数据线用。


3嵌入式USB主机的软件设计


3.1嵌入式USB主机的软件总体框架


系统的软件平台核心为µC/OS-II,它是一个源码公开的、占先式多任务管理的实时操作系统内核,其性能完全可与许多商业产品竞争,已在相当多的系统中得到成功应用,是一个经实践证明稳定可靠的内核,且其核心代码短小精悍,简单易学。


USB 主机为USB系统提供的功能有:(1) 检测USB 外设的接入和移出;(2) 管理主机和外设之间进行的USB 标准流量控制;(3) 枚举外设; (4) 管理主机和外设之间的数据流; (5) 搜集系统状态和性能的统计信息;(6) 主机与外设之间的电气接口,包括供电。


USB协议规定了人机接口设备HID 类、MassStorage 类、音频类和打印类等一系列的设备类型, 用于支持不同的设备。根据实际需要,我们开发了USB接口的海量存储类设备和基于ESC/P打印语言的EPSON打印机嵌入式驱动程序。具体驱动程序栈如图2所示。该系统支持热插拔,可以知道识别插上是哪种设备,并调用对应的驱动。

图2:USB驱动程序栈


3.2 USB Mass Storage 类协议框架的实现


USB Mass Storage 类是USB 协议所定义的用来磁盘管理及大容量数据传输的。USB定义了两种海量存储传输协议,它们分别是Buck-only Transport 和Control/Bulk/Interrupt(CBI) Transport。由于目前市场上所出现的海量存储设备基本上都采用前者传输协议,即读写数据都是通过块传输来实现通讯。在命令包CBW (Command Block Wrapper)中包含了标志信息,数据长度以及UFI命令等信息。其中UFI命令含有格式化磁盘、读磁盘、写磁盘和读磁盘容量等一系列磁盘管理命令。


大部分移动存储设备都采用FAT文件系统来管理文件。整个文件系统通过Mass Storage 的UFI 命令与外设的磁盘建立联系。FAT文件系统将海量存储设备上的数据大致分成5个部分:MBR区(主引导区)、DBR区(系统引导区)、FAT区(文件分配表)、FDT区(文件目录表)和DATA区(数据区)。当有USB接口的海量存储设备插上后,系统读取MBR区和DBR区来获得每扇区字节数,每簇扇区数,FAT表个数等文件系统基本信息。获取这些基本信息后从海量存储设备读取一个文件的流程如图3示。因写文件和读文件的流程没有很大的差别,在此就不累述了。

图3读文件流程图


3.3 基于ESC/ P打印控制语言的打印机驱动设计


EPSON公司的打印机基本上都是基于ESC/ P打印控制语言的,不同系列的打印机的控制语言没有太大的差别。因此,我们开发的驱动程序具有比较强的通用性,针对EPSON的C63系列打印机开发的驱动完全适用C65系列和ME1打印机。


各种型号打印机的编程手册可以到EPSON的开发网站上下载。编程手册对各种控制命令作了详细介绍,如初始化打印机(ESC @)、选择图形方式( ESC (C nL nH m )、设置单元大小(ESC (U nL nH m )、打印光栅图像命令(ESC . c v h m N1 Nh d1 ⋯dk)等。


EPSON打印机提供两种打印方式,一种是用来打印文本文件,用该方式打印英文字母、阿拉伯数字、符合的时候向打印机发对应的控制命令后,只要直接发打印内容的ASCII码即可。另一种方式是用来打印光栅图形,当需要打印表格、图片和汉字的时候时往往会用到这种方式。在此,列出几个关键API函数并予已说明:


print_image_init ( void ):因为打印机初始化后默认为打印文本模式,所以要打印光栅图形必须进行相关的初始化。


print_image_command(unsigned int horiz_position,unsigned int verti_position, unsigned char rows, unsigned int columns, char color):调用该函数之前必须事先至少调用过一次print_image_init(),它的功能是向打印机发打印图片命令。其中,第一和第二个输入参数是打印图形的横纵坐标,第三和第四个输入参数分别是打印图形的行数和列数(特别值得注意的是,C63系列和C65系列打印机一次最多可打16行,而 EPSON M1一次只能打15行),第五个输入参数color是选择打印颜色。在调用该函数后,直接向打印机发打印的数据就可以实现打印图片功能了。迎访问无由电子开发网(技术文章 在线阅读 在线商城


由于打印文本模式和打印图形的操作基本相同,而且更简单,在此就不作说明。


3.4 USB协议的实现


这是整个USB 体系软件的根基, 它负责主机和设备之间数据传输。其代码都包含在文件sl811host.c中,可供上层驱动调用的API函数主要有:


EnumUsbDev ():该函数主要实现枚举设备的功能。当有USB设备插上时,系统通过调用到该函数得到设备的标准描述符(接口、配置、端点)并识别是海量存储设备还是打印机。设置地址(SetAdress),设置配置描述符(SetDecriptor),设置配置值(SetConfiguration),设置接口(SetInterface)也在该函数里实现。


BuckSend():该函数主要实现主机上的数据通过块传输方式发送到设备上;


BuckReceive():块传输接受函数;


BuckSend()和BuckReceive()两个函数是最调度最平凡的两个函数,因为对海量存储设备的读写,对打印机发送控制命令、打印数据都是通过块传输通讯的,也就是通过调用这两个函数来实现的。


处理器读写SL811HS单个寄存器或数据存储器的函数如下:


void SL811Write(char a, char d){SL811_ADDR = a;SL811_DATA = d;}


char SL811Read(char a){SL811_ADDR = a; return (SL811_DATA);}


这两个函数是ARM处理器和SL811芯片进行数据交互的基石,所有控制寄存器和数据存储器的读写都可以通过以上两个函数来实现。当需要连续读写SL811中的储存器时可以采用以下方式来实现,可以加快读写速度。


void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)


{SL811H_ADDR = addr;


while (c--)


SL811H_DATA = *s ;}


4 结 论


在基于实时内核µC/OS-II和32位RISC架构ARM7 Core的系统板上,我们实现了嵌入式USB主机设计和开发,为酶标仪这一特定医疗设备提供了读写海量存储设备和打印的功能。经测试,本系统读海量存储设备数据的速度可达750kB/s,写数据的速度最高可达450kB/s;打印功能也完全满足系统要求,性能稳定可靠,使用方便,是一种可行、实用的方案。


推荐阅读

史海拾趣

常忆科技(CHINGIS)公司的发展小趣事

在电子行业的激烈竞争中,常忆科技也面临着诸多挑战。其中,市场需求的快速变化和竞争对手的不断涌现是公司需要重点关注的问题。为了应对这些挑战,常忆科技不断调整和优化产品结构,以满足市场的多样化需求。同时,公司还加大了对核心技术的保护力度,防止技术泄露和侵权行为的发生。

在面对行业危机时,常忆科技展现出了强大的抗风险能力。公司通过加强内部管理、降低运营成本、提高生产效率等措施,成功度过了多次行业危机。这些经历不仅锻炼了公司的应对能力,也进一步提升了公司在行业中的地位和影响力。

台湾三礼(3L)公司的发展小趣事

随着汽车电子市场的快速发展,三礼公司敏锐地捕捉到了这一市场的巨大潜力。2011年,公司成功开发了超薄型模压电感,并完成了全厂70%以上的精益生产配置。同年,公司还取得了车载规范TS16949认证,成为世界第一客户的主要供货商。这一成就不仅彰显了公司在电感领域的技术实力,也为公司进一步拓展车载市场奠定了坚实基础。

DENWIRE公司的发展小趣事

随着汽车电子市场的快速发展,三礼公司敏锐地捕捉到了这一市场的巨大潜力。2011年,公司成功开发了超薄型模压电感,并完成了全厂70%以上的精益生产配置。同年,公司还取得了车载规范TS16949认证,成为世界第一客户的主要供货商。这一成就不仅彰显了公司在电感领域的技术实力,也为公司进一步拓展车载市场奠定了坚实基础。

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

方舟公司不仅关注经济效益,还积极履行社会责任。公司积极参与环保事业,推动绿色生产,减少能源消耗和废弃物排放。同时,方舟公司还关注社会公益事业,捐资助学、扶贫济困,为社会和谐发展贡献了一份力量。

Antelec公司的发展小趣事

在电子行业竞争日益激烈的环境下,Antelec公司深知持续创新的重要性。公司不断加大研发投入,引进先进的研发设备和人才,推动技术升级和产品创新。同时,公司还积极关注行业发展趋势和客户需求变化,及时调整产品策略和市场布局,保持了在市场中的领先地位。

CT [ Central Technologies ]公司的发展小趣事

经过数年的努力,CT公司终于研发出了一款具有颠覆性的新型芯片技术。这款芯片在性能上大幅超越了当时的同类产品,引起了市场的广泛关注。多家知名企业纷纷与CT公司展开合作,将这款芯片应用于他们的产品中。随着合作伙伴的增加和市场份额的扩大,CT公司的知名度逐渐提升,成为了电子行业的一匹黑马。

问答坊 | AI 解惑

电力猫 PLC100IPTV适配器确保IPTV跨过最后10米障碍

随着中国电信、中国移动、中国联通重组的完成,三大公司都拥有了固网,而固网上的增值服务业务特别是新兴的IPTV业务将成为各家竟争的重点。但是IPTV的家庭推广面临克服网络信号从书房(ADSL和PC所在处)到客厅电视机旁网线联接的问题。这个问题已严 ...…

查看全部问答>

(原创)2010年监狱看守所视频监控新特点

2010年监狱看守所视频监控新特点 备注:原创文章,转载请注明出处 从09年底到现在,我们客户向我们咨询看守所和监狱视频监控方面的技术越来越多,各地的看守所和监狱的领导都很重视这方面的问题,这方面的项目也越来越多起来了。原因我就不多说了 ...…

查看全部问答>

关于补丁的问题请大家帮忙

请问大家:         WinCEPB50-081231-Product-Update-Rollup-Armv4I.msi 上面的补丁是不是08年的,包括08以前的 装上这个补丁后,直接打09年的就可以了,是么? 我的是刚刚在线安装的: Windows CE 5.0 Evalua ...…

查看全部问答>

sqlce相关问题

已经用dllregister.exe在wince5.0下注册了ssce20.dll,ssceca20.dll,ssceerroren.dll,adoce31.dll,adoceoledb31.dll,adoxce31.dll 但 HRESULT hr = CoCreateInstance(CLSID_RemoteDataAccess, NULL, CLSCTX_INPROC_SERVER, IID_ISSCERDA, (LPVOID ...…

查看全部问答>

用89C51单片机控制消毒柜的源程序

    消毒柜功能要求:臭氧消毒指示灯两个,假设分别为LED1、LED2;加热指示灯两个,假设分别为LED3、LED4;消毒按键一个,假设为A1;消毒柜照明按键一个,假设为A2。     开机时所有指示灯均熄灭,按下A1则LED1亮,臭氧发生 ...…

查看全部问答>

wince5.0 修改16bit颜色深度为24bit

    液晶屏是支持24bit颜色深度的,wince5.0+S3C2440平台,PQOAL架构BSP,目前显示是16bit颜色深度,想改为24bit,我自行修改过了,不成功。请问各位讨论和提意见,谢谢!…

查看全部问答>

PDA手持终端应用程序的开发

本人在PDA 行业有多年的工作经验,一直从事PDA手持终端应用程序的开发      开发过多种设备:      CASIO   DT900,DT300,DTX10;      Cipher   711  &n ...…

查看全部问答>

关于手机字库

想问一下国内的手机厂商会购买字库吗?难道都是用盗版的?…

查看全部问答>

在VMWare上安装VXworks 出现问题 谢谢指点

最近准备学习VxWorks,在网上看到了前辈留下的资料,就按照 http://www.cevx.com/vmware-vxworks.htm 中描述的进行了设置,我用的是Tornado2.2, VxWorks5.5 和VMware6.0 配置的虚拟机如下图所示: 全部设置完成以后,运行虚拟机,得到的显示 ...…

查看全部问答>

求助:关于驱动test编译问题,肯请高手帮忙。急用,万分感谢!

make 后的错误信息如下: [root@localhost test]# make gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include -c test.c test.c: In function `read_test\': test.c:14: warning: implicit declaration of function `ver ...…

查看全部问答>