基于嵌入式系统的USB(HID)设备

目前嵌入式系统在数字化电子产品领域应用越来越广泛。随着其成本的降低,大有取代单片机的趋势。 USB设备以其小巧、便携、即插即用、成本低廉等优势在当前的桌面应用中有相当的比重,尤其是 HID(人机接口)设备,其免驱的特点(不用安装驱动程序)更是给用户带来极大方便。现在市场上 USB设备多是由专门的 USB控制芯片来实现其应用控制,芯片内集成了 USB协议,成本较高。 PCB板的面积较大。本文提出了仅用一片 MCU(微处器-单片机)或嵌入式系统芯片来实现其与 PC机的通讯的方法。就单片机而言,多数单片机速度较慢,对事件的响应能力较弱,对全速 USB应用不是很好的选择。而嵌入式系统,由于其速度较之单片机快很多,内部 RAM容量较大,用其来仿真 USB设备是个理想的策略。

本文将以 LM310嵌入式芯片仿真USB(HID)键盘为例,研究其仿真 USB的方法。 1 USB协议规范

1.1总线定义:

USB又称通用串地总线,共有四条线,如图 1所示,VBUS是设备供电接线,电压+5V,最大供电电流500mA,向设备提供电源。具有过流保护、供电控制等功能。D-低速信号线;D+全速信号线;GND电源地。

1.2 USB版本常规 USB通讯协议有USB1.1、USB2.0。USB1.1版本的 USB设备,支持全速 12Mb/S低速通讯(1.5Mb/S);USB2.0版本的 USB设备,支持高速通讯(480Mb/S)。由于 USB2.0的通讯速率太高,所以用芯片仿真无法实现(必须由单独芯片控制)。

1.3总线长度USB1.1版本的设备总线长度不大于 5米,通过集线器或中继器,可达到 30米 95个中断器或集线器)。U2.0设备总线长度不大于3米。

1.4 通讯建立 串口通讯另一个标准 RS232的通讯发起方可以从两端发起,而 USB通讯发起方总是在主机端(HOST),设备端总是响应主机端的通讯请求。主机端如果是 PC机,每隔 1ms发起一次对一个设备的通讯建立请求,设备接收到访问己方请求后,立即与主机建议起通讯连接。

1.5 电气特性

对于“D-是低带信号总线,D+是高速信号总线是高速总线”的说法是不准确的,因为USB信号总线是平衡差分式的,这点类似于 485总线。所谓“在-是低速信号总线”是指当US阳低速设备(如鼠标、键盘) 时,D-这条线在 USB设备端加 1.5K上拉电阻。反之对于全速设备(如U盘、打印机、扫描仪),D+信号线加1.5K上拉电阻。

关于D+、D-信号线上的电压浅谈一下,类似于 485总线,当 485总线的 A相电压大,B相电压 200mV时,差分放大器输出逻辑“1”,反之“0”,USB总线在低速设备端D-电压如大于2.0V,D+电压小于 0.8V为逻辑“1”反之为“0”,在主机端,一根为大于2.8V,另一根小于 0.3发,在此主机端不做深入探究。

1.6 NRZI编码及位填充

由于 USB总线没有同步时钟信号线,想要主机与设备建立良好通讯同步效果,只有从数据序列中提取同步时钟。类似 RS232串口通讯,USB通讯的建立也有起始信息,RS232是一个起始位,而 USB起始位也有 8位,称之为同步域(或段)格式为01010100。由于 RS232的通讯速率较低,所以两端同步时钟不大于5%即可实现良好通讯。然而 USB通讯最低速率也大于1Mb/S,对于时钟的同步要求严格的多,况且 USB的数据包中的每个字节不象 RS232每个字节都有起始位(仅在包头有同步域)。鉴此,USB通讯时必须在数据包的位序列中提取同步信息。想象一下,如果数据包序列中数据位全是逻辑“1”或者全是逻辑“0”,芯片是无法提取同步信息的,为此需要一个高效的编码方案,于是就有了 NRZI和位填充概念。何谓NRZI,看图 2所示,NRZI是非“1”跳变。由图可知问题只解决一半,USB规范约定当序列中连续出现 6个逻辑“1”时加进一位“0”,如此问题全部解决,只不过是需要在接收后除去加进的一个位“0”,加进一位“0”的过程就是位填充。

1.7 USB通讯模式 共四种模式:控制传输、等时传输、中断传输、批量传输。

1.8端点

端点也可称为设备终端,每个 USB设备(USB芯片)内可以有1—16个端点,相对USB芯片而言,各端点在通讯中功能传输的数据包的大小和传输模式有所不同。在芯片内数据缓冲 区的地址也有所变化。

2 嵌入式芯片(LM3S310)

Stellaris系列微控制器(包括 L3同S310)是以 ARM Cortex TM-M3为内核设计的。与早期的 ARM7相比较有功耗更低、中断延时更小、代码执行速度更快、价格更低等优势。

3 实现原理

由于 LM3S310控制器每个 GPIO都可配置为中断引脚,所以在这个应用中只需要用两个 同 Port的两个相邻引脚仿真 USB的D+和 D-,图 3所示。

4 软件设计图 4是一个简化程序流程图,实际编程中还有很多细节,在此不再罗列。下面以中断传输为例,将一个事务不同阶段思想重点研讨。

LM3S310芯片利用两个 GPIO(USB)的中断监控 USB总线,当 USB总线从空闲状态变为传输状态,也就是总线由主机发起与同步域(SYN),LM3S310进入 USB接收程序。略过同步阶段,收到的第一个字节是 PID字段(包标识类型)。这字段的低四位描述此包类型方向(IN或OUT),接下来 7位表示设备的地址,然后是四位端点号索引。LM3S310根据设备地址判定主机向本设备发起的请求,如果是则根据包的类型决定继续接收数据或向主机发送数据。对OUT类型数据的后 5—16位是 CRC校验(根据配置决定 CRC的位数)。对 IN类型,LM3S310将准备好数据连同 RC校验数据一同发往主机。数据传输阶段完成后,主机或设备要确认传输成功。

对于低速设备的仿真,LM3S310芯片的速度足以满足要求(包括一些速度较快单片机,如:PIC、EMP、MSP),然而对全速设备的仿真,须要选择速度更快嵌入式芯片,软件实现的原理方法基本相同。

结论

使用微控制器仿真 USB设备的方法,极大地方便了用户的开发,同时降低了功耗、成本。本文作者创新点在于利用 MCU或嵌入式控制器实现 USB设备功能。本方法在 USB读卡器、USB编程器、USB接口转 RS232及 RS485接口等方面有良好的应用前景。

参考文献

[1]《LM3S310数据手册》   作者:Luminary  Micro 2005

[2]《USB大全》作者:[美]Jan Axelson  陈逸 译  2001.5

[3]《USB技术大全》电子教程  2007.2

[4]郭佑民,王杰,孙启国基于嵌入式微处理器 S3C44B0X的 USB通信.微计算机信息[J],2008,1-2: 21-23。

嵌入式linux作为hid设备,基于嵌入式系统的USB(HID)设备相关推荐

  1. 嵌入式linux仪器,一种基于嵌入式Linux设备双系统的启动方法

    一种基于嵌入式Linux设备双系统的启动方法 [技术领域] [0001]本发明涉及一种基于嵌入式Linux设备双系统的启动方法. [背景技术] [0002]Linux操作系统特别是其嵌入式系统由于其源 ...

  2. 嵌入式linux 无线网卡,一种基于嵌入式Linux的无线网卡的制作方法

    本实用新型涉及无线网卡技术领域,具体为一种基于嵌入式Linux的无线网卡. 背景技术: 随着移动通信和便携通信的发展,无线局域网WLAN应用而生,日渐普及,嵌入式系统的无线局域网接入可以实现对嵌入式系 ...

  3. 嵌入式Linux搭建物联网网关,基于嵌入式Linux的物联网网关研究与实现

    摘要: 随着物联网发展速度日益加快,作为连接感知网络和传统通信网络的物联网网关正在其中扮演着重要角色.然而,目前针对物联网网关的统一标准尚未制定,物联网网关的设备类型千差万别.人们往往针对某一具体应用 ...

  4. 嵌入式linux更省电,基于嵌入式Linux的智能手机省电设计方案-消费电子-与非网

    每个系统要正常运行都有赖于CPU 的性能, 系统软件, 中间件一集各种系统策略等等, 智能手机也是一样.这篇文章主要探讨了给智能手机选择合适的CPU, 以及在手机电源管理中的动态电源管理(DPM) 和 ...

  5. 嵌入式linux应用程序升级,基于嵌入式Linux平台的应用升级机制的研究与设计

    摘要: 随着科技的发展与新技术的推出,嵌入式在生活中被广泛应用,嵌入式产品在日常生活中扮演了重要的角色.嵌入式Linux操作系统已经普遍应用到医疗电子,信息家电,远程通信,机顶盒等多个领域,嵌入式Li ...

  6. 嵌入式linux sip电话开发,基于嵌入式Linux和MiniGUI的SIP电话设计

    0 引言 随着VoIP的迅猛发展,越来越多的个人用户正在使用软件电话.IP电话通过VoIP系统拨打国内和国际长途,IP电话的需求量越来越大,同时,人们对IP电话的要求也越来越高,例如要求IP电话体积小 ...

  7. python 嵌入式 linux 产品 发布_基于嵌入式Linux进行Python应用开发

    ByToradex秦海 1).简介 Python 编程语言因其极强的可读性.可移植.易于维护,以及丰富的第三方扩展组件,如数据库.数学计算.图形,甚至机器视觉.人工智能.深度学习框架都提供Python ...

  8. 嵌入式linux内核开启键盘,- 基于嵌入式Linux内核的特殊矩阵键盘设计完整驱动控制模块方案...

    首先设置输入设备的功能,input_set_capability(&sim_key,EV_KEY,KEY_A)函数完成键盘A键的输入使能,类似可完成B-X共24个按键的输入使能.然后设置键盘的 ...

  9. 嵌入式Linux显示实时视频流,基于嵌入式Linux的视频采集系统----实时视频显示模块...

    SDL开源图形图像库的简介 SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,它被广泛的用于游戏.演示软件.模拟器.MPEG播放器等应用软件,SDL可以设置8 ...

最新文章

  1. mysql server_id作用_在MySQL中设置`server-id`变量不起作用
  2. java 变量 占用空间_Java-空变量是否需要内存空间
  3. OP07高级电路图-摘自:Reza Moghim
  4. 基于SAML2.0的SAP云产品Identity Authentication过程介绍
  5. vue路由切换组件没有加载_Vue面试题: 如何实现路由懒加载?
  6. windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug
  7. gettype拿不到值_这五种古董,别说是买豪车豪宅,放在现实中最多就值一顿饭钱...
  8. java类加载器ClassLoader浅析
  9. go java 垃圾回收_JAVA什么时候执行垃圾回收以及回收流程-Go语言中文社区
  10. 无线OSS-高精度整数加法
  11. Quartus 与 ModelSim 联合仿真详细步骤
  12. Protel99SE多张原理图的设计步骤
  13. 阈值分割--大津阈值法(OSTU)
  14. 使用 GO-CQHttp或mirai框架 搭建QQ的机器人
  15. 缓和曲线——回旋曲线的计算
  16. 多传感器数据融合发展综述
  17. 关于Banner制作有感(antD+react)
  18. 【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网
  19. Eclipse输入法无法输入中文
  20. Java开发环境:Win10安装最新版eclipse与jdk(超详细)

热门文章

  1. 重力感应、陀螺仪相关算法
  2. easymock本地安装配置
  3. 龙芯2k1000 linux内核,2017年的龙芯2K1000 已获得新的Linux内核补丁
  4. 三星Samsung CLX-3175FW 驱动
  5. FPGA学习日志——无源蜂鸣器beep
  6. 专升本-计算机公共课考点(6)——数据库技术与 Access 2010
  7. 计算机软件工如何防脱发,【如何防止头顶脱发】_头顶脱发_怎么预防_如何预防_怎么解决-大众养生网...
  8. linksys WRT54G 版本差别
  9. java 风速 转 风级
  10. 什么标志着计算机网络的形成,计算机网络发展的各个阶段标志性的技术是什么?...