历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2018年02月19日 | 嵌入式操作系统中USB双向通信的设计与实现

2018-02-19 来源:eefocus

     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芯片的内置功能和嵌入式操作系统的作用,具有交互作用强、嵌入式操作系统中设备无关性好的特点。


推荐阅读

史海拾趣

优先(苏州)半导体公司的发展小趣事

1994年,三星电子(苏州)半导体有限公司在苏州工业园区成立,成为园区首批入驻的外资企业之一。公司初期主要生产配套、低附加值产品,但随着市场的变化和竞争的加剧,公司开始寻求转型。2003年,苏州工厂开始转型生产核心产品,标志着公司从低端生产向高端制造的转变。此后,公司不断加大在智能制造方面的投入,采用先进的半导体自动化生产管理系统和ERP管理系统,实现了“无人化”自动化生产,生产自动化率可达90%以上。同时,公司始终坚持“绿色经营”的可持续发展理念,致力于保护及改善周边环境,履行企业的环保社会责任。

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

2000年3月,成都华微科技诞生。当时,集成电路设计行业刚刚起步,市场竞争激烈。然而,公司凭借对中国电子信息产业集团的坚定信任,以及对中国集成电路设计市场的深刻洞察,毅然决然地踏上了这条充满挑战的道路。初创期的华微科技,虽然规模较小,但团队成员都怀揣着对技术的热情和对未来的憧憬,为公司的长远发展奠定了坚实的基础。

Crosspoint Solutions公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crosspoint Solutions公司深知这一点,因此始终将品质管理放在首位。公司建立了严格的质量检测体系,从原材料采购到产品出厂的每一个环节都进行严密把控。这种对品质的执着追求赢得了客户的信任和好评,使公司在市场上树立了良好的口碑。

Giga公司的发展小趣事
如开机自检、按键去抖等。
Embedded Planet公司的发展小趣事

Embedded Planet公司始终关注社会责任的履行。公司积极参与公益事业和慈善活动,为社会做出了积极贡献。例如,公司捐赠了一批嵌入式系统设备给偏远地区的学校和教育机构,帮助他们改善教学条件和提高教育质量。此外,公司还积极参与环保和扶贫等公益活动,用实际行动践行企业的社会责任。

请注意,以上故事仅为示例,并非真实发生的事件。如果您需要更详细和具体的信息,建议您查阅Embedded Planet公司的官方网站或相关新闻报道。

意普(ESPE)公司的发展小趣事

随着工业自动化和智能化的不断发展,意普(ESPE)公司开始将光电保护技术与智能制造相结合,推出了多款智能光电保护产品。这些产品具有更高的检测精度和更快的反应速度,能够更好地保护操作人员的安全。同时,公司还积极参与工业互联网和物联网的建设,推动光电保护技术的智能化发展。

问答坊 | AI 解惑

自己做个AT89S52的ISP数据线可行吗?

在不用编程器的情况下用ISP口能实现代码的下载固化,比较方便了,可没有知道这个数据线是如何做出来的,是用373还是245缓冲的好呢,还是有其他更稳定的,请大伙推荐几中方案好吗?…

查看全部问答>

强人自制磁悬浮实验,不知是什么液体?

$(\'swf_Vc7\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMTM3ODYzNTk2/v.sw ...…

查看全部问答>

如何把输入单片机中的程序导出?

如何把输入单片机中的程序导出?求助!!!!!…

查看全部问答>

wince5.0摄像头驱动开发问题,在线等待

      在pxa270芯片上用到OV511摄像头,BSP没提供摄像头的驱动,到pudn网下载一个,编译好dll为ov511.dll,得到镜像后,在板子上运行,插入摄像头,提示找不到驱动类型。请问,platform.bib和platform.reg按照下面添加有什么问 ...…

查看全部问答>

关于x86模拟器的问题

我想跑x86的模拟器,是不是只能用wince5.0,wince6.0要跑可能很麻烦?…

查看全部问答>

单片机--你知道哪些国产的?

近今年一直关注国产的单片机,忽然有个想法。 想把所有的国产单片机的厂家或者品牌列出来。 这样行业内朋友选型也好有参考。 毕竟只有走出来,才有可能走得好。 衷心祝愿国产单片机一路走好!…

查看全部问答>

你们了解什么公司用MSP430做产品呢

在我们国家,用51的多如牛毛,虽然没做过调查,但大家都这么说,在MCU DAY上,一个跟我坐一起的大叔,跟他聊了几句,他公司就是做51的。 但是,430呢?似乎没怎么听说。 问了好几个我认识的电子领域的朋友。(也可能他们大多跟我一样,大多是学生 ...…

查看全部问答>

AVR单片机信号采样的问题

请教各位高手,我现在是刚接触AVR单片机,现在我要测一个信号的电压与脉宽,但是该信号脉宽仅为3us,不知道AVR哪款单片机的采样频率能达到这个要求?请大家出个主意…

查看全部问答>

求教!MMA7455串口数据丢失问题。

    用MSP430将加速度传感器MMA7455的数据传到上位机,MMA7455选2g模式。出现如下两个问题:1、发现XYZ三轴读到的数和数据手册都不一样,Z轴是0到127而不是手册上的-63到63,XY轴是横跨256但也并不关于256对称。2、三个轴的加速度数据是 ...…

查看全部问答>

51单片机串口接收1602显示的问题

#include #include #define uchar unsigned char #define uint  unsigned int #define fosc 120000 #define bps 9600 /*LED_Buffer[16]用来存储串口发送的数据,com_dat用来记录串口发送的个数*/ uchar LED_Buffer[16], *q, com_ ...…

查看全部问答>