基于单片机的USB主控器驱动设计

发布者:知识的海洋最新更新时间:2015-04-21 来源: eechina关键字:单片机  USB  主控器驱动 手机看文章 扫描二维码
随时随地手机看文章
1 引言 

在现代社会,嵌入式系统逐渐深入到人们生活的方方面面,各类嵌入式系统产品之间往往通过某种接口进行交互或数据传递。而现在,USB已经成为嵌入式数据交换的最主要的方式,可是各种USB接口的设备都是基于PC机系统的,所以,基于嵌入式系统的USB接口的研究具有实用的价值和意义,特别是起Master作用的HOST端接口的研究。 

解决这一问题的根本办法就是在需要使用USB设备的嵌入式系统中扩展USB Host功能模块,使之具有与USB设备进行数据传输的能力。 

USB协议按功能分为2部分,USB HOST(USB主协议)和USB SLAVE(USB从协议)分别应用于USB HOST CONTROLLER(USB主控制器)和USB DEVICE(USB设备)。一般,USB HOST要比USB SLAVE复杂,对于广大的非PC用户来说,尤其是嵌入式系统用户来说,由于USB协议的不对称性,使得实现USB HOST比USB SLAVE要困难地多,Philips公司的ISP1161A1芯片很好地解决了这种问题,他封装了复杂的USB协议,使得在嵌入式系统中实现USB HOST和USB SLAVE变得简单方便。 

2 USB HOST技术简介 

USB的通信可以用图1表示,图1中,左半部分为USB主机端,可以看出,USB主机端由2部分构成,即软件体和硬件体,实际上是3个软件组件组成了USB HOST解决方案,即USB客户驱动程序,USB驱动程序和USB主机控制器驱动程序,应用程序的事务处理是由USB客户驱动程序(设备驱动程序)启动的,客户驱动程序把USB设备当做一个可以被访问的端点集合,他可以被控制并与他的功能单元进行通信,USB系统软件包括USB驱动程序和USB主控制器驱动程序,USB驱动程序负责配置管理、用户管理、总线管理和数据传输,USB主控制器驱动程序负责调度管理,队列管理和控制器管理,以及数据的位编码、封包、循环校验、发送、错误处理等。 



如图2所示,USB HOST的软件结构分为3大部分,即USB总线驱动(USBD),USB HOST控制器驱动(HCD)、客户软件、其中客户软件处理和设备有关的信息,USBD处理和硬件无关的协议,而HCD则处理与硬件相关的协议,USBD和HCD都包含了一系列管理各种状态的寄存器。 



3 SP1161体系结构 

要实现USB协议,必须要通过一系列寄存器来完成,这些寄存器要能实现USB软件结构中的USBD和HCD,即要完成USB协议状态的控制,还要有一定的缓冲区来存放进出的数据,ISP1161专门针对USB协议设计的特殊硬件结构可方便地实现USB HOST和USB SLAVE。ISP1161的硬件结构主要是3类不同的寄存器,用户通过操作这3种寄存器来达到实现USB传输的目的,这3类寄存器是: 

(1)HC control and status registers:USB主控制器控制和状态寄存器,主要用于传输过程中控制命令的存放和状态的读取,可读可写的寄存器有2个地址,只读或只写的寄存器只有1个地址。 

(2)Isochronous Transfer List (ITL):同步传输列表缓冲区。 

(3)Acknowledged Transfer List(ATL):接收传输列表缓冲区。 

根据USB协议,数据传输分为4种模式,Control(控制),Bulk(整批),Interrupt(中断)和Isochronous(同步)。其中ITL是为了实现同步传输,ATL则实现其他3种模式的传输。 

4 ISP1161x主控制器编程实现 

设计ISP1161x主控制驱动程序主要涉及以下2个重要内容,下面详细介绍: 

4.1 读/写ATL和ITL缓冲区 

ATL和ITL缓冲区的位于ISP1161x内部的FIFO缓冲RAM之中,每个缓冲区包含许多PTD(Philips Transfer Descriptor),而PTD用于主控制器硬件发送或接收USB包从USB设备,作为调度USB传输的一部分,HCD在系统内存中购建PTD。然后HCD将购建好的PTD移入ATL或者ITL缓冲区,主控制器硬件允许软件去访问每一个缓冲区,就像他们是分离的硬件缓冲区,HCD访问ATL缓冲区通过硬件寄存器HcTransferCounter(22H/A2H)和HcATLBufferPort(41H/C1H),而ITL缓冲区则由HcTransferCounter和HcITLBufferPort(40H/C0H)访问。下面一段示例代码取自于本项目,其功能是向ATL缓冲区写数据,hci→hp→atl_len表示,ATL则在内存中还没有发送的数据的长度,hci→hp→tl表示缓冲区的地址。 [page]



4.2 硬件初始化过程 

当ISP1161x上电时,主控驱动程序(HCD)必须经过下列的顺序对硬件进行初始化,以便主控制器进入可操作状态。 

检测主控制器,软件复位主控制器,配置HcHardwareConfiguration寄存器,配置中断;配置HcControl寄存器,配置HcFmInterval寄存器,配置根集线寄存器,设置ITL和ATL缓冲区长度,安装INT1中断服务程序。 


4.2.1 检测主控制器 

检测的工作由HCD完成的,HCD通过向寄存器HcScratch写一个值,接着从该寄存器读出,与刚才写入的值进行比较。如果写入的和读出的值相等,HCD得出结论:主控制器存在,对HcCHipID寄存器的读也被用来作为额外的条件来检测该寄存器。 

4.2.2 主控制器的软件复位 

软件复位主控制器通常包括2个步骤:复位主控制器;设置主控制器为RESET状态。 

HCD通过设置在HcCommandStatus寄存器的HCR位来复位主控制器: 



一旦主控制器复位了,HCD必须通过设置HcControl寄存器的HCFS字段为00B,以便使主控制器为RESET状态。 

4.2.3 配置HcHardwareConfiguration寄存器 

WRITE_REG16(hci,InterruptPinEnable|InterruptPin Trigger InterruptOutputPolarity |DataBusWidth16|AnalogOCEnable,HcHardwareConfiguration); 

上述这段代码表示将主控制器初始化为INT1允许,中断是边沿触发,中断的输出极性为高电平,数据线的宽度为16b,使用片上过流检测,模拟输入。 

4.2.4 配置中断 

主控制器ISP1161x有2组中断源,第一组包含USB事件产生的中断,比如Startof Frame,调度溢出和根集线器状态改变,这些中断的发生由HcInterruptEnable和HcInterruptDisable寄存器联合控制,而每个中断的状态由HcInterruptStatus寄存器标识。 

第二组是主控制器中状态变化所引起的中断,比如,主控制器延迟所产生的中断,同样,在第一组中断中的任何组合是第二组中断的中断源。 

4.2.5 配置HcFmInterval寄存器 

HcFmInterval寄存器的14位值[FrameInteral,FI]用于表示一帧之内所占用的比特时间(在2个连续的SOFs,15位的值[FSLargestDataPacket,PSMPS)用于表示在没有引发调度溢出下可发送或接收全速最大包大小,FI,PSMPS的推荐值为0x2EDF和0x2778,所以将调用下列语句对该寄存器进行初始化:

WRITE_REG32(hci,0x2EDF|(0x2778<<16),HcFmInterval); 

4.2.6 配置Root Hub(根集线器)寄存器 

随着初始化的深入,下面的专门针对根集线器3个寄存器也必须初始化:HcRhDescriptorA,HcRhDescriptorB 和 HcRhStatus,前2个寄存器是根据电路板的制作自动由ISP1161x配置的,这2个寄存器均用来描述根集线器的特性。 

HcRhStatus被划分为2个部分,低字部分表示集线器状态,而高字部分表示集线器状态的改变,还有保留部分必须被初始化为逻辑0。 

4.2.7 设置ITL和ATL缓冲区的长度 

主控制器ISP1161x内部的FIFO缓冲区有4kb/s,而这4k将被ATL和ITL划分为2部分,分由HcATLBufferLength和HcITLBufferLength寄存器表示,ITL缓冲区又进一步被分为2个相同的ITO0和ITD01缓冲区,ATL缓冲区必须存在,因为ATL缓冲区用于控制,中断和大批量传输,而ITL的存在与否是可选的。 

4.2.8 设置INT1中断的服务程序 

如果在主控制器中发生一个或多个中断,ISP1161x的INT1引脚将会通知微处理器,在本项目中,INT1的引脚直接接在ARM的INT0引脚上,驱动程序通过Linux提供的函数request_irq向操作系统申请中断号,并在此函数中向操作系统提供中断处理函数。 

request_irq(irq,hc_interrupt,0,"ISP116x",hci)  

irq为中断号;hc_interrupt为中断处理函数,0为中断标记,"ISP116x"表示中断设备名称;hci在此表示中断设备号。 

5 在μClinux中编译USB主控驱动 

接下来就如何将驱动文件编译到嵌入式操作系统做一个简要说明。 

(1)将上述文件拷贝到drivers/USB/ 

(2)编辑Drivers/USB/Makefile文件,添加以下内容: 

obj-$(CONFIG_USB_ISP1161)+=hc_isp1161.o 

(3)编辑driver/USB/config.in文件,添加如下内容:

Dep_tristat iisp1161(Philips)support iCONFIG_USB_ISP1161 $ CONFIG_USB 

(4)编译μClinux内核 

编译成功后把生成的映象文件用JTAG烧写器烧写到开发板的ROM中,启动后进行验证实现了对ISP1161A1的控制。 

6 结语 

ISP1161A1使得在嵌入式系统中实现USB HOST变得十分简单方便,便于嵌入式系统中USB的普及。 

一个USB HOST要完成的功能因为需求不同,所使用的协议也不尽相同,有的采用中断传输,有的采用同步传输,USB主机技术在嵌入式系统的应用主要是针对某一种USB设备或集中设备,因而嵌入式系统上可以只固化某几种协议,该技术的应用可以使得在嵌入式系统上轻松接入USB外设、扩展系统的功能、提高仪器的使用灵活性。USB主机技术在嵌入式系统上的应用会有更广泛更美好的前景。
关键字:单片机  USB  主控器驱动 引用地址:基于单片机的USB主控器驱动设计

上一篇:单片红外传感控制器的应用
下一篇:单片机中的看门狗研究

推荐阅读最新更新时间:2024-03-16 13:59

[单片机框架][上位机][Python+PySide2] Dfu升级工具(串口升级+Jlink烧录)
环境: python 3.6.8 编译: .make.bat main.py 安装命令: pip install xxx 依赖:PySide2, pyserial, pyinstaller, pylint, 其余根据提示安装。 ├─ui 存放UI文件 │ └─qss 皮肤 │ └─black_rc ├─res 程序图标 ├─src │ ├─app 业务功能模块 │ ├─lib 一些支持库 │ ├─module 异步串口控件 │ ├─protocols DFU协议 │ └─ui_opt 控件信号槽绑定 └─build
[单片机]
[<font color='red'>单片机</font>框架][上位机][Python+PySide2] Dfu升级工具(串口升级+Jlink烧录)
51单片机入门 - 定时/计数原理及结构(T0和T1)
定时/计数器结构(T0和T1) 16位 寄存器 T0、T1分别由TH0、TL0和TH1、TL1四个8位计数器组成 定时器的区别: T0可分成2个独立的8位定时器,而定时器1则不能; T1可作为串口的波特率发生器,而定时器0则不能。 工作原理 注:T0或T1都不能同时既做定时器也做计数器 补充: 计数器工作原理: 用作计数器时,对T0或T1引脚的外部脉冲计数,如果前一个机器周期采样值为1,后一个机器周期采样值为0 ,则说明有一个脉冲,计数器加1。 在每个机器周期的S5P2期间采样引脚输入电平。新的计数初值于下一个机器周期的S3P1期间装入计数器。 此种方式需要两个机器周期来检测一个1- 0负跳变信号,因此最高的计
[单片机]
51<font color='red'>单片机</font>入门 - 定时/计数<font color='red'>器</font>原理及结构(T0和T1)
单片机的高级语言编程FranklinC51简介
一、变量的定义和变量的空间 对8位单片机,直接支持的变量的类型只有无符号字符和位。注意两个原则: 其一、总是使用尽可能最小的数据类型; 对8位机,显然对“char”类型的对象的操作比对“int”或“long”类型的对象方便得多。C51编译器直接支持所有字符操作。例如:两个“char”类型对象相乘与“MUL AB”8051指令相符合。如果用“int”型完成同样运算,则需要调用库函数。 其二、只要有可能,使用“unsigned”数据类型。 8051系列单片机不直接支持有符号数的运算,为此,编译器必须产生与之相关的更多的代码以解决问题。若使用无符号数据类型,产生的代码要少得多。 在头文件reg51.h中有8051所有SFR
[单片机]
单片机在清除标志位时不要用位操作
这两天在调试一个项目的时候,一台主机与两台从机通信,但是有一台从机的报文收不到,仔细阅读代码,发现寄存器等配置都正常,自信阅读代码发现在清接收完成寄存器的时候用到了位域,猜想这就是问题所在,于是修改了程序,下载后一切正常。在单片机中一般的标志寄存器都是写1清0,好多中断标志等都是这样设计的,这时候就要注意在清除标志的时候不能用位域,因为好多单片机不不支持位操作的。 比如要清除IrqReg寄存器的BIT5,IrqReg.bit5 = 1;在没有位操作的单片机中会编译成 IrqReg |= BIT5;这条语句分三步执行,先读IrqReg寄存器,进行位或操作,最后把位或的结果写入该寄存器,这样问题就产生了,如果这句操作之前IrqRe
[单片机]
STM8S单片机入门3(AD转换及锂电池管理)
锂电池以其容量大、充电性能好的优点,已经得到了广泛引用,特别在小型的需电池供电的电子设备上。但是锂电池的充电和使用条件比较严格,比如充电必须以恒流恒压方式,使用时电压不能低于3V等,所以用锂电池供电的系统一般都需要专门的锂电池管理功能,确保锂电池在正确的工作状态下。 这部分内容以讲述在STM8S单片机系统中,如何使用典型的锂电池充电管理芯片TP4056来实现锂电池的充电,以及如何使用单片机内置的AD转换功能测量电池电压,实现电池电量监控。 1、电路设计 电路图如下,使用TP4056做充电管理,TP4056是一款采用恒定电流/恒定电压线性锂电池充电管理IC,电路简单,只需要外接一个编程电容即可实现恒流恒压充电,
[单片机]
STM8S<font color='red'>单片机</font>入门3(AD转换及锂电池管理)
英飞凌推出AURIX微控制器系列助力实现自动驾驶
英飞凌科技股份公司(FSE: IFX / OTCQX: IFNNY)推出的AURIX™微控制器系列助力实现自动驾驶: 用作NVIDIA DRIVE™ PX 2 AI计算平台的关键安全计算元件和车载接口。 NVIDIA 自动驾驶车辆计算平台集成在新生产的汽车和L3自动驾驶汽车的高级辅助驾驶系统(ADAS)中。AURIX多核微控制器具备确保功能安全所需具备的高级硬件能力。它们通常集成在ADAS和自动驾驶(AD)平台。 英飞凌将在2017年OktoberTech技术论坛上展示在自动驾驶和电动驾驶方面的最新技术,其中包括传感器、微控制器和功率半导体解决方案。 AURIX微控制器助力自动驾驶 AURIX多核微控制器帮助NVI
[汽车电子]
USB设备的调试与测试技巧
USB是一种灵活的高速接口技术,可以替代计算机中原来的串行口和并行口,但灵活性高也意味着更加复杂,使得USB设计调试以及设计完成后的验证都比较困难。本文首先对USB规范做一简要介绍,然后详细讨论USB产品在调试与规范验证方面的一些实用技巧。 通用串行总线(USB)是一种很流行的接口,可用于那些与个人计算机进行通信的设备。近年来,所有新PC机和Mac机都支持USB技术,这种接口有足够的灵活性,既可用于驱动器和键盘之类的普通外围设备,也可用于定制按特殊用途设计的外设。此外USB还有一些对用户和开发人员都很有吸引力的特性,如从总线向设备提供电源、易于通过集线器进行总线扩展,以及主计算机对设备能自动识别等等。 但USB的超强性能也意味着
[测试测量]
<font color='red'>USB</font>设备的调试与测试技巧
CC2531芯片的全速USB接口设计
1 CDC类简介 在USB的文件中,定义了将某种相同属性的设备整合在一起的群体,称之为类。这样做可以同时开发该类的驱动程序,提高了驱动程序的复用性。CDC类是通信设备类的简称,是专为各种通信设备定义的子类。根据应用场合的不同,CDC类可以分成以下不同的模型:POST(传统纯电话业务)模型、ISDN模型和Networking(网络)模型。其中,POST模型又可以分为DL(直接线控制)模型、AC(抽象控制)模型、Datapump(数据泵)模型、T(电话)模型。CDC类的结构如图1所示。本文的USB接口开发就属于POST模型下的AC模型。 图1 CDC类结构图 此外,CDC又由CommunicatiON Interface Clas
[单片机]
CC2531芯片的全速<font color='red'>USB</font>接口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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