嵌入式操作系统中USB双向通信的设计与实现

发布者:lqs1975最新更新时间:2018-02-19 来源: eefocus关键字:操作系统  USB  双向通信 手机看文章 扫描二维码
随时随地手机看文章

     USB作为一种串行通信总线,采用主从式通信方式,从设备只能被动响应来自主设备的请求,不能主动发起请求。随着嵌入式系统技术的发展,对交互性操作要求越来越迫切,而采用USB双向通信可以很好地解决上述问题。本文介绍一种基于S1C33L11芯片利用嵌入式操作系统的同步机制通过对循环队列及自定义控制包的操作来实现双向通信的方法。

  1嵌入式操作系统USB双向通信系统整体层次结构

  嵌入式操作系统中USB双向通信系统整体层次结构如图1所示。

  2硬件系统

  2.1S1C33L11及其USB BLOCK简介

  S1C33L11是EPSON公司的32位高速,低功耗,低电压MCU。他是以C33 STD 32位RISC CPU为核心,功能强大,除一般外围设备外有LCD控制器,Camera接口,JPEG编码,USB1.1功能控制器,MAC(SPI模式)接口,SmartMedia接口,还包括3个振荡电路和2个锁相环(PLL),内置16kB RAM ,无ROM。

  S1C33L11内建支持USB1.1协议的全速模式。支持控制、块、同步和中断4种传输方式,支持 4个通用通道(Epr(r=a,b,c,d))和一个控制通道(endpoint0),并为每个通道(endpoint)提供1 kB的FIFO。

  2.2S1C33L11DMT01开发板简介

  S1C33L11DMT01开发板采用S1C33L11F00A1芯片为核心,外接2 MB RAM,32 MB FLASH,还带有STN TFT 双屏彩色LCD等,此硬件环境适用于各种嵌入式操作系统的运行及多媒体手机、PDA等产品的开发。?

  3USB双向通信的设计与实现

  本文USB双向通信在基本传输方式上采用USB块传输[1]。他由USB初始化、USB中断处理、控制传输和块传输几部分组成[2]。在实现双向通信上,具体通信机制是:嵌入式应用程序通过读写循环队列和信号量状态与USB 硬件模块中的OUT 和IN FIFO相互通信,而USB下位机与上位机(PC)的读写通信则通过上位机对控制包的读写来实现,最后通过循环队列、信号量、控制包3者结合达到USB双向通信的目的。

  3.1USB双向通信固件程序的设计与实现

  (1)循环队列

  采用IN传输一个循环队列,OUT传输一个循环队列(以下简称队列),每队列动态分配32 kB。OUT队列做为OUT传输时的二级缓冲,即OUT传输时的FIFO的数据必须先放入OUT队列才能由嵌入式操作系统读写;IN队列做为IN传输时的二级缓冲,即IN传输时的FIFO数据必须来自IN队列;嵌入式操作系统只对二级缓冲进行读写,操作系统对队列的管理是采用信号量通知机制来实现。

  (2)控制包

  为实现双向通信,规定一种控制包格式,读控制包是在USB协议之外自定义的。

  控制包固定为5字节。从左到右第一字节为状态字,剩下4字节传送要收发的数据字节数。当控制包由上位机发出时,状态字规定有3种:0x4F:上位机请求OUT传输,0x49:上位机请求IN传输,0x52:上位机请求读取下位机状态;当上位机收到控制包时,状态字规定有5种:0 x00:USB空闲态,0x01:下位机OUT循环队列满(即OUT超时),0x02:下位机IN循环队列空(即IN超时),0x04:OUT传送成功,0x08:IN传送成功。

  (3)嵌入式操作系统端应用程序读写USB过程

  读函数:void ReadUSB(unsigned char * ReadBuffer, DWORD size)函数:

  功能:嵌入式系统应用程序通过USB接口读取上位机(PC)的数据。

  参数说明:unsigned char*ReadBuffer存放数据的指针,DWORD size为要读出的数据的尺寸(单位:B)。

  实现过程:首先判断循环队列是否为空,不为空则判断自身信号量是否可用,若可用,则从队列中读取一字节,每读一字节后向USB任务中的BulkOutGet函数(直接读取OUT的FIFO函数)发出一个信号量,通知BulkOutGet函数队列此时可以向OUT循环队列中写入数据,接着重新判断,依次逐字节从OUT循环队列中读取数据,直到读完要求数据大小为止。当循环队列为空时,首先发一个信号量,通知BulkOutGet函数应向本队列中写入数据了,然后复位自身信号量,接着调用等待信号量的函数,直到信号量到时才接着读取。若超时,则向嵌入式操作系统发出超时通知,同时通过向控制包中写入超时状态(0x01)来向上位机(PC)发出超时信号。

  写函数:void WriteUSB(unsigned char*Write Buffer,DWORD size)函数:

  功能:嵌入式系统应用程序通过USB接口向上位机(PC)发送数据。

  参数说明:unsigned char * WriteBuffer 存放数据的指针,DWORD size为要写入的数据的尺寸(单位:B)。

  实现过程:首先判断循环队列是否满,不为满则判断自身信号量是否可用,若可用,则向队列中写入一字节,每写入一字节后向USB任务中的BulkInDataSet(直接写IN的FIFO函数)函数发出一个信号量通知此函数此时可以从IN循环队列中读取数据;然后接着重新判断依次逐字节向IN循环队列写入数据,直到写完要求数据大小的数据为止。当循环队列满时,先发一个信号量通知BulkInDataSet函数应从队列中取走数据,再复位自身信号量,接着调用等待信号量的函数,直到信号量到时才接着写入,若超时,则向嵌入式操作系统发出超时通知,同时通过向控制包中写入超时状态(0x02)来向上位机(PC)发出超时信号。

  (4) USB块传输函数

  USB块传输函数是直接和USB硬件打交道的函数,他们直接读取IN和OUT传输通道的FIFO。voi d BulkInDataSet(void):其功能是IN传输过程,即从IN循环队列中读取数据并向IN FIFO中写入数据,再对嵌入式操作系统信号量做相应处理。

  void BulkOutDataGet(void)其功能是OUT传输过程,即从OUT FIFO中读出数据并向OUT循环队列中写入数据,再对嵌入式操作系统信号量做相应处理。

  (5) 嵌入式操作系统USB 任务调用函数

  void SystEMInit(void):MCU初始化(微处理器各控制寄存器和状态初始化过程)

  void USBInit(void):USB初始化(包括对循环队列分配内存等)

  void USBThread(void):USB运行体(USB工作过程对USB中断进行处理主要包括USB块传输函 数、USB中断状态分析处理等)。

  void FreeUSB(void):关闭USB和释放由malloc函数分配的循环队列所占内存

  3.2上位机(PC)部分

  USB函数层(USBD及HCD)由Windows98提供,负责管理USB设备驱动程序与USB控制器之间的通信、加载及卸载USB驱动程序等。具体方法是通过DriverWorks软件生成上位机(PC)机端USB驱动程序模板[3],根据下位机的情况处理相应的读写部分,最后通过封装基本API函数ReadFile,WriteFile来实现用户态应用程序与PC机USB驱动程序的隔离,使PC的应用层对USB的使用如同对串口的使用一样方便,给用户态应 用程序提供有了3个接口函数:

  unsigned char Read(void *pReadBuffer,DWORD Size):从下位机中读取数据

  参数说明:void *pBuffer:存放读取数据的缓冲,DWORD Size:需读取数据的大小(字节数)

  返回值:

  0x10:驱动出错(指Windows USB 驱动程序出错)

  0x20:内存空间不足?

  0x30:请求的数据大小为0 B

  0x02:下位机发送软超时

  0x08:读取成功

  unsigned char Write(void *pWriteBuffer,DWORD Size):发送数据到下位机

  参数说明:void *pBuffer; 存放写入数据的缓冲,DWORD Size; 需写入数据的大小(字节数)。

  返回值:

  0x10:USB驱动出错(Windows USB 驱动程序出错)

  0x20:内存空间不足

  0x30:请求的数据大小为0 B

  0x01:下位机读取数据软超时

  0x04:发送成功

  void RequestUSB(void *pRequestBuffer,DWORD Size=5):读取下位机返回的操作状态。

  参数说明:void *pRequestBuffer:5 B控制包缓冲

  其中每次Read或Write函数的调用被分为若干次读/写发送。具体处理是: 设待读写的数据字节数为X B,当X=5B时,分割为X1=4 B和X2=1 B两次发送(由于自定义包是5 B,为了与自定义控制包区分开);当5 B16 kB时则分割以16kB为单位的数据进行发送,不足16 kB的部分再发送一次。每次读/写发送分3个阶段:发控制包,读/写数据,读控制包状态。

  4结语

  基于S1C33L11芯片在嵌入式操作系统基础上实现的USB双向通信严格遵循USB1.1协议,充分利用了S1C33L11芯片的内置功能和嵌入式操作系统的作用,具有交互作用强、嵌入式操作系统中设备无关性好的特点。


关键字:操作系统  USB  双向通信 引用地址:嵌入式操作系统中USB双向通信的设计与实现

上一篇:基于ADS的S3C2410实现嵌入式串口通信
下一篇:嵌入式系统的SD控制器设计实现

推荐阅读最新更新时间:2024-03-16 15:55

通过光纤传输USB信号的电路设计及应用
由于目前计算机的USB信号使用电缆传输,所以通信距离难以延长,一般不超过30米。本文的方案克服了现有电缆传输USB信号距离短的缺点,从而提供一种通过光纤传输USB信号的电路,使USB的通信距离增加到几十千米。 1 实现原理 本方案是一种通过光纤传输USB信号的电路,成对使用,通过光的强度的三个等级(全亮、半亮、暗)分别代表USB数据线的三种状态,当光的强度为最低时(暗)代表USB数据线的闲置状态。先发送USB信号的一方由于其USB的数据状态先改变,其状态的改变通过光纤传输到对方电路的接收电路产生一个下降沿(或者上升沿)触发一个单稳电路,此单稳电路的输出控制USB信号的“收/发”允许。先发送USB信号的一方由于其USB的数据状态先
[嵌入式]
使用独立的PD控制器简化USB-C PD设计
摘要 独立的PD控制器可以通过管理功率问题来帮助应对解决方案尺寸和成本等设计挑战,无需开发固件。本文将简要介绍5 V、9 V、15 V、20 V、28 V、36 V和48 V供电轨之间的同化如何在功率传输中表现多用性,以减少所需的电缆。然后介绍一款独立PD控制器,该器件包含端口检测和非易失性内存,无需使用定制固件。 简介 便携式电池驱动电子设备(例如手机、笔记本电脑、无线音箱、电动工具等)推动USB功率传输(PD)市场持续增长。USB PD为消费电子带来巨大优势,它们可以通过同一个USB Type-C连接器提供高达240 W的功率(参见USB PD 3.1版本规格)。 为了供应广泛的功率,USB PD标准可用的电
[电源管理]
使用独立的PD控制器简化<font color='red'>USB</font>-C PD设计
51单片机控制SL811HS的USB主机底层驱动
引言 基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘,移动硬盘,光驱,USB摄像头,USB鼠标键盘等,同时,51系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域,因此,如果在51单片机系统中增加USB主机接口,实现对USB从机设备的控制,则该单片机系统可以充分利用现有的各种USB从机设备,大大扩展单片机系统功能。 本设计实现了在51单片机系统中增加USB主机功能,采用普通51单片机外接专用USB接口芯片的方案,这种方案虽然会使系统传输速度受到限制,而且在稳定性有所欠缺,但此方案设计灵活性高,且易于移植,为低成本产品的开发提供了广阔前景,设计中采用51单
[应用]
基于AVR实现USB2.0无线测控网络
   前言   nRf2401是挪威Nordic公司推出的单片2.4GHz无线收发一体芯片,支持多点间通信,最高传输速率达到1Mbit/s,可以用于无线网络中。口传输速率是480Mbps,有即插即用和热插拔功能。接口提供内置电源,可以向外设提供5V和最多500mA的电源。因此在以计算机为上位机的控制系统中,USB口比较适合作为计算机与测控网络的接口。   USB接口器件的开发过程比较复杂,开发者需要知道USB协议、USB设备驱动程序开发、主机应用程序开发等知识,使用USB-UART桥接电路CP2102可以避免上述麻烦。    1系统的设计思想及nRf2401和CP2102介绍   系统的设计思想如图1所示。系统是由 CP
[单片机]
基于AVR实现<font color='red'>USB</font>2.0无线测控网络
华为公布了三大鸿蒙车载操作系统
据财联社报道,在8月14日2020中国汽车论坛上,华为智能汽车解决方案BU总裁王军公布了华为鸿蒙车载系统:鸿蒙座舱操作系统HOS、智能驾驶操作系统AOS和智能车控操作系统VOS。 其中,HOS、AOS操作系统已经有大量的合作伙伴在进行开发;VOS可支持包括恩智浦等在内的芯片供应商。上述三大系统由跨域集成软件框架Vehicle Stack控制管理。
[手机便携]
三种嵌入式操作系统的深入分析与比较
1、嵌入式系统与嵌入式操作系统   1.1 嵌入式系统   嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性能有严格要求的专用计算机系统。   嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。   1.2 嵌入式操作系统   
[应用]
解读车载USB供电的方方面面
哪有白来的充电方便,都是工程师在幕后想了很多办法。面向未来,不支持USB Type-C接口的汽车不要买。 随着便携式电子设备的广泛普及,用户在开车时为自己的设备充电变得越来越频繁。USB供电功能让设备充电变得极为便利。USB的高数据率也让新一代信息娱乐系统支持丰富多样的车载功能,如音频播放、屏幕和应用共享,以及数据连接等等。 传统USB Type-A接口已经广泛应用于汽车OEM厂商的各种车型,其供电能力最高为7.5W(5V电压,最高1.5A电流)。随着USB Type-C接口在PC机、智能手机和其它便携式电子设备上快速普及,USB Type-A接口正迅速被淘汰。USB Type-C半导体市场预计出货量到2022年将超过9亿
[嵌入式]
解读车载<font color='red'>USB</font>供电的方方面面
固态USB开关及其它过流保护器件的浪涌测试
摘要:固态过流保护IC,比如USB和卡槽的电源开关,提供了一种简单、可靠的引脚保护方法,在生产测试或用户使用不当发生过载或短路时提供有效的系统保护。这些器件的保护能力并非没有限制,本文主要讨论了这些限制因素。 概述 对于1.2A限流,通常认为在发生故障或短路时电路保护IC会保持在完全受控状态。而实际情况是,在达到限流条件后通常需要一个延时才能真正关闭开关。发生硬件短路时,电流迅速上升,首先会达到直流限制条件并开始关闭开关(直流限制可以非常精确,但反应速度较慢,较慢的反应速度可以避免浪涌和其它伪故障事件造成开关闭合)。虽然开关会在短时间内断开,但此时峰值电流可能已经远远高于直流门限。引线寄生电感较低时,电流可能上升更快。请参考图
[电源管理]
固态<font color='red'>USB</font>开关及其它过流保护器件的浪涌测试
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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