[TOC]
圈圈教你玩USB
http://computer00.21ic.org/ http://blog.ednchina.com/computer00 年份:2009
0、短暂任务
1.先根据这这些文档,把usb协议、外设重定向整个流程过一遍 2.熟悉不同平台的编译和环境搭建,在不同平台下的,usb外设的抓包方式。 3.带着实际的问题,深入学习各个外设模块。
1、USB概述及协议基础
You SB、USA的弟弟。 通用串行总线Universal Serial Bus 即插即用PnP(Plug and Play) USB OTG(On The Go):同一个设备,在不同的场合下可以在主机与从机之间切换。
网站资料:USB开发者论坛
USB是一种主从结构的系统,Host和Device
- host controller
- root hub
- USB hub
- 带宽共享一个USB主控制器
主控制器主要负责数据处理,USB的数据交换只能发生在主机与设备之间,主机与主机、设备与设备之间不能直接互连和交换数据。使用不同的插头和插座区分。所有的数据传输都由主机主动发起,而设备只是被动地负责应答。
USB OTG多一条ID标识线,表明主机还是设备。
USB1.1规定集线器最多4层,USB2.0最多6层,最多可接127个设备,每个USB设备具有7bit地址,0~127,0保留给未初始化的设备使用。
USB的电气特性掠过。
USB4条线:Vbus红、D-白、D+绿、GND黑。接口中两长两短。为了支持热插拔。
芯片闩锁latch up现象
选购短而粗的USB电缆
万用表
速度快的,上拉电阻接正的;速度慢的,上拉电阻接负的。
检测被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备。
USB描述符(知道设备的功能以及行为):设备的类型、厂商ID和产品ID、端点情况、版本号。
设备、匹配值、接口、端点、字符串。Device Qualifier Descriptor和Other Spedd Configuration Descriptor。
HID描述符和音频接口描述符‘厂商自定义的描述符。
一个USB设备只有一个设备描述符,不是只有一种描述符。
设备地址和端点地址。配置和接口。
枚举过程
控制传输:建立过程、可选的数据过程、状态过程。
- 复位,一个数据包的设备描述符
- 再次复位,设置地址阶段
- 再次获取设备描述符18字节
- 主机获取配置描述符9字节
一位一位的传送,LSB在前的方式,最后是最高位MSB。
发送到总线上之前,要经过位填充,再经过NRZI编码。
USB总线上以包为基本单位,一个包被分成不同的域。
每个包都是以同步域开始,接着PID,最终以EOP结束。
同步域以一串0开始,而0被编码为电平翻转。
全速和低速使用00000001
高速使用31个0,后面跟1个1
EOP:一个大约为2个数据位宽度的单端0(SE0)信号。D+和D-同时低电平。
包标识符PID:8位,前4位使用,后4位校验PID。
- 令牌包、数据包、握手包、特殊包。
USB事务transaction:令牌包(启动事务,总是主机发送)、数据包(方向由令牌包指定)和握手包(数据接收正确后发送,也可NAK握手包表未准备好)。
重点:USB的四种传输类型
批量传输:批量读使用批量输入事务和写使用批量输出事务。
数据量大,对数据的实时性要求不高,如USB打印机、扫描仪、大容量存储设备
批量输出事务:OUT令牌包-DATA包(主机发送-主机发送-设备应答)
批量输入事务:IN令牌包-切换接收数据状态(主机发送-设备返回-主机应答)
PING令牌包是USB2.0高速模式输出特有的。
PING令牌包用来探测设备是否有空间接收数据,无数据阶段,只有握手阶段。
中断传输:保证查询频率的传输,数据量不大,但对时间要求严格的设备。
如鼠标、键盘、轨迹球。
等时传输(同步传输):数据量大、对实时性要求高的场合,例如音频设备、视频设备。不保证数据100%正确。不进行重传操纵,无应答包。
控制传输:建立过程(SETUP令牌包)、数据包(DATA0包)、握手包(ACK应答)
复杂:保证数据传输过程的数据完整性。
传输类型与端点支持的最大包长。
第2章 硬件系统设计
USB学习板-USB实验板
MCU
AVR:
ARM:
数据手册datasheet,
DATA数据口,GND地线,CS片选,ALE地址锁存,后面加个N表示低电平有效(有时加横杠或斜杠,即低电平时选中该芯片),INT表示中断请求信号,RD读选通信号,WR写选通信号,RESET复位。XTAL1和XTAL2接晶体的。
USSPEND是挂起,USB特有的。3ms进入挂起。
CLKOUT始终输出,GL(Good Link灯),V_DD接5V,V_OUT3.3芯片内部3.3V输出引脚,A0是地址引脚。
数据手册引脚描述pin description
引脚名,引脚编号,引脚类型,引脚注释。
IO2:2mA驱动能力的输入输出双向数据口。
P:电源引脚
I:输入
IOD4:
O2:输出引脚,最大电流2mA
电流x电阻=电压
排阻有个公共端(1脚)
小容量的电容具有较好的高频特性,主要是ESL等效串联电感较小。
电源滤波电路中看到大电容并联小电容。
松香,焊锡
电路调试
- 观察法
- 电压测量法
- 电阻测量法
- 波形测量法
输出端的驱动能力强些
示波器探头相当于电容。
调试USB学习板
- 接通电源(LED10亮)
- 不亮,电压表测量电源电压是否有
- 短路:割断法+万用表
- 下载程序,ISP和STC,HEX
51内核的单片机
业界流行Keil C软件:支持汇编和C语言的集成开发环境。
推荐Keil UV3,配置文件toos.ini
头文件使用尖括号和双引号都行,区别在于搜索的先后顺序不一样。双引号先搜索当前工程目录。
REGX51.H中是标准51核单片机的寄存器定义,不过,REGX51.H不如AT89X52.H。
void main(void)无返回值无输入参数
初始化工作+死循环
data=9.0使用了9字节的内部RAM
xdata=0未使用外部RAM
code=20使用了20字节的代码,需要20字节的FLASH。而不是HEX文件的大小,是实际代码大小的2.5倍左右。
按键的驱动
- 扫描键值和按键去抖(多次误按键)
#ifndef __MY_TYPE_H__
#define __MY_TYPE_H__
#define
#endif
12行防止头文件被多次引用时重复定义
头文件命名通常写成两个下划线加文件名的格式
关键字volatile:嵌入式系统经常用到,告诉编译器不要优化,可能被意外地修改或重新读回。
普通变量只会留最后一次赋值操作。
idata:将变量分配到高128字节RAM(只能使用间接寻址)。
数字后面可以加UL或者LL等参数,默认为整型。
注意"^"这个操作符,只有跟sbit搭配时才表示定义一个位。
波特率:波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。
在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。
__DATE__:当前的系统时间
__TIME__:当前的系统时间
__FILE__:当前的文件名
__LINE__:当前的行号
PDIUSBD12.h中的D12:
小结
电路板的焊接、调试、程序的编写、调试,以及开发环境的使用。每个USB程序中几乎用到按键、串口的测试程序。
第三章 USB鼠标的实现
重点的一章,最长的一章。以后的实例程序都是在此基础上修改而来的。
循环语句延时。
for(int i = 0; i < x; i++) {
for(int j = 0; j < 227; j++);
}
DMA:
写1字节的函数,加锁读写。
断开USB连接时需要延迟。
当D12芯片完成一个操作后就产生中断请求信号,通知CPU进行相关处理。
中断发生事件:USB总线复位、D12进入挂起状态、成功接收到数据和发送完数据
在读取数据之后,要记得将端点缓冲区清空。
GET_DESCRIPTOR请求:获取描述符。接收者只能是设备。
设备描述符:每个设备都必须有且仅有一个设备描述符。
IN令牌包:
配置描述符:每个USB设备至少都要有一个配置描述符。
接口描述符:必须赋着在配置描述符后一并返回。
端点描述符:必须赋着在配置描述符后一并返回。
USB鼠标属于USB HID类:需要HID类的HID描述符,是一个类描述符,跟在接口描述符后面。
字符串描述符是可选的,字符串索引值为非0时表示它具有字符串描述符。
语言ID:美式英语等0x0409
使能:
散转:switch散转代码。
报告描述符:输入报告(中断输入端点返回)和输出报告(没有中断时,可以通过控制输出端点0发送)。
描述一个报告的结构以及该报告里面的数据是用来干什么用的。
HID规定:短条目和长条目。
Bus Hound:能够监听总线数据的软件,只能看到传输成功的数据包,对于令牌包和应答包、传输出错的数据包看不到。
第4章USB键盘的实现
基本上和USB鼠标一样,都是HID设备。
- 设备描述符:厂商ID号、产品ID号。顾名思义,身份证。当插入USB设备时,右下角会提示。
- 配置描述符:
- 接口描述符:中断输入端点和输出端点。
- HID描述符:HID设备
- 端点描述符:管脚
- 字符串描述符:厂商、产品、产品序列号,估计是显示在显示屏上的信息。
- 报告描述符:即及时的输出报告。
复合设备:
第5章 用户自定义的USB HID设备
HID设备的缺点:数据只能使用中断或者控制传输。
GUID:
串口:
PCI卡
USB是一种总线,总线就可以连接不同的设备。
第6章 串口
通用异步串行通信口(简称串口或者COM口)
PS2接口
VGA口
并口
串口:DB头,一根根小金属棒针就是公头,一个个孔的是母头。
宽在上,DB头插面对准自己,公头从左往右,母头从右往左是1~5脚。
CDC接口:无HID描述符和报告描述符,获取描述符
取而代之的功能描述符的类特殊接口描述符。
inf文件:
第7章 USB MIDI键盘
MIDI是乐器数字接口的缩写。
音频数据:
演奏信息:
WAV文件:3分钟的歌曲需要30MB,MIDI文件只需要几十KB。
第8章 U盘
mass storage device
大容量存储设备的接口类代码bInterfaceclass字段:0x08
接口子类代码binterfacesubclass字段:大部分U盘使用0x06,即SCSI通明命令集
协议代码bInterfaceProtocol字段:0x00(中断传输)、0x01(中断传输)、0x50(批量传输)
仅批量传输协议中,数据传输的结构和过程:命令阶段、数据阶段和状态阶段。
命令块封包CBW:Command Block Wrapper
命令状态封包CSW:Command Status Wrapper
SCSI命令集和UFI命令集
Small Computer System Interface:小型计算机系统接口
USB Floppy Interface:USB软盘接口
UFI命令
- INQUIRY
- READ FORMAT CAPACITIES读格式化容量:容量=块数x每块字节数
- READ CAPACITY
- READ(10)命令
- WRITE(10)命令
- REQUEST SENSE:探测上一个命令执行失败的原因
- TEST UNIT READY:探测设备的某个逻辑单元是否准备好-操作代码0x00
FAT:文件分配表
MBR:主引导记录
EBR:扩展引导记录
DBR:磁盘操作系统引导记录
一个完整的FAT16系统:DBR、FAT表、根目录和数据区
第9章 自定义USB设备及驱动开发
USB设备类中
第10章 USB过滤驱动开发
不想修改设备或者设备程序无法修改