◆USB 底层程序设计中的几个概念:
端点(Endpoint):是USB设备中的一个独特的概念,它是USB设备与USB Host交换数据的硬件单元,不同的端点其传输数据的能力不同,适用于不同的应用场合;a USB Device Endpoint uses only one data transfer method;每个设备描述符下应当有多个端点描述符。一般的USB 芯片都会提供几个标准的端点,每个端点都支持单一的总线传输方式,其中端点0必须支持控制传输。
配置(Configuration):是用于定义设备的功能,如果一个设备有几种不同的功能,则每个功能都需要一个配置,配置是接口的集合;
接口(Interface):是指定设备中哪些硬件与USB交换数据,每一个与USB交换数据的硬件就叫一个端点,因此,接口是端点的集合。
基础篇:
Q1:高速USB和USB 2.0有区别吗?哪一种说法是正确的?
# 高速USB和USB 2.0是有区别的,区别在于USB 2.0是一种规范,而“高速USB”仅指在USB 2.0规范中数据传输率为480Mbps的那部分,某个设备可以是符合USB 2.0的设备,同时还可以是全速设备或低速设备。
Q2:USB设备与计算机的通信速度有多快?
# USB 2.0支持低速、全速和高速三种速度,分别为1.5Mbps、12Mbps和480Mbps。
Q3: USB规范定义了哪些数据传输机制(Endpoint Transfer Type)?
四种不同的数据传输机制分别为:
# 控制传输(Control)
USB主机使用控制传输向USB设备发送命令和询问。当枚举USB设备时,控制传输使用端点0(EP0),这样可强制所有USB设备支持EP0而无需考虑支持速度。控制包的最大容量为8、16、32或64字节。低速USB设备中控制传输的包长度必须为8字节,高速USB
设备必须为64字节,而全速USB设备允许8、16、32或64字节(MicroChip官网对此有错误的说法),也就是说控制传输对于最大包长度有固定的要求。最大包长度信息在“设备描述符”中体现,即wMaxPacketSize为“设备描述符”包的Byte7,它反应了该端点对应的Buffer的大小,当通过一个端点进行数据传输而数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输,并且要求除最后一个包外,所有的包长度均等于该最大包长度,也就是说,如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。但需要注意:Setup包总是8 Bytes的。
# 中断传输(Interrupt)
中断传输是USB设备向USB主机请求一定轮询速率的方法。在枚举过程中,USB设备向USB主机请求轮询时间。全速设备的最大轮询速率为每毫秒一次,低速设备为每10毫秒一次。低速USB设备的最大数据负载为8字节,全速USB设备为64字节,而高速设备最大数据包为1024字节。这使得全速USB设备的最大吞吐量为64KB/s,低速USB设备为800B/s。确认中断传输可保证数据的传送。如果传输包接收失败,则会重新发送。中断传输是单向传输,但这里的单向传输并不是说只支持一个方向的传输,而是指在某个端点上该传输仅支持一个方向,或输入,或输出,如果需要在两个方向上进行某种单向传输,需要占用两个端点,可分别配置成不同的方向。
# 批量传输(Bulk)
批量传输是设备传输大量数据的方法,但是不能保证会及时发送。在总线安排传输时,批量传输的优先级最低。当其他传输完成后,余下的带宽复位后将分配给批量传输。与中断传输一样,确认批量传输可保证数据的传送。只有全速和高速设备支持批量传输。对于全速USB设备的端点而言,最大的包容量可为8、16、32或64字节长度。对于高速USB设备的端点而言,最大的包容量可高达512字节长度。
# 同步传输(Isochronous)
同步传输保证了传输速率。全速同步传输每帧可发送1023字节的数据。同步传输无需确认。因此,同步包有可能并未送达。同步传输的典型应用为音频/视频流,其中最重要的是以丢失包为代价保持视频和音频的进行。全速USB设备的最大传输率为1023Kbps。
Note:HID设备只支持控制传输和中断传输方式。
# USB协议定义了四种类型的包:
帧起始、令牌、数据 与 握手,而其中的令牌有三种不同的形式包。
IN —— 通知USB设备,主机欲读取信息
OUT —— 通知USB设备,主机欲发送信息
Setup —— 通知设备,主机要进行控制传输
Q5: 什么是枚举过程?
# USB主机通过枚举过程可了解有新的USB设备与总线相连。在应用开始前,主机向设备询问各种信息,以确定设备的类型、载入设备所需的设备驱动程序以及设备的功率需求等。在枚举过程中,USB主机还为连接的设备分配地址。在地址设定后,USB主机将与位于该地址的设备进行通信。枚举过程的最终任务之一是把设备设定为某一具体运行配置。枚举过程的详细内容在USB规范的9.1.2节中给出。
Q6: USB主机如何识别USB设备的速度?
# USB主机在两根通信线(D+和D-)上均有弱下拉电阻。如果设备要以全速模式运行,将会用较大的上拉电阻上拉D+。如果设备要运行在低速模式下,则会上拉D-。两种情况中的上拉电阻的标称值为1 kΩ(PIC18F1xK50 Datasheet规定该电阻为1.5Kohm)。
Q7: USB主机如何对USB设备进行复位?
# 将D+和D-拉低至少10毫秒,USB主机就会对设备进行复位。当D+和D-拉低时间超过2.5微秒,USB设备就可认为已发生复位。一旦USB设备检测到了复位,在USB主机移除复位后将马上进入默认状态。该复位仅用于USB复位,不可复位控制器。
Q8: 什么是VID和PID?
# VID指的是厂商ID,PID指的是产品ID。通过支付费用,USB-IF会发出VID。USB-IF要求每个厂商拥有自己的VID,以便销售其产品。当所使用的VID/PID不是惟一时,可能会发生法律和技术上的纠纷。
Q9: USB2.0支持三种传输速率:
低速(Low Speed),习惯称为USB1.0,传输速率为1.5Mbps;
全速(Full Speed),习惯称为USB1.1,传输速率为12Mbps;
高速(High Speed),习惯称为USB2.0,传输速率为480Mbps;
Q10. USB接口有三种形式,分别为USB Type A、Type B和Mini-USB,对于AB两种类型来说,都只有四条接线,而Mini-USB却有五条连线,其外观图如下图所示:
Type-A: Type-B:
Mini-USB:
端点(Endpoint):是USB设备中的一个独特的概念,它是USB设备与USB Host交换数据的硬件单元,不同的端点其传输数据的能力不同,适用于不同的应用场合;a USB Device Endpoint uses only one data transfer method;每个设备描述符下应当有多个端点描述符。一般的USB 芯片都会提供几个标准的端点,每个端点都支持单一的总线传输方式,其中端点0必须支持控制传输。
配置(Configuration):是用于定义设备的功能,如果一个设备有几种不同的功能,则每个功能都需要一个配置,配置是接口的集合;
接口(Interface):是指定设备中哪些硬件与USB交换数据,每一个与USB交换数据的硬件就叫一个端点,因此,接口是端点的集合。
◆HID设备的特点:
交换的数据存储在报告结构内,设备必须支持HID报告格式;
每笔事务可以携带小量或中量的数据,低速设备每笔事务最大为8Bytes,全速设备每笔最大为64Bytes(??),高速设备最大为1024Bytes;
有最大传输速度的限制:低速设备最快10ms一笔事务,最高速度为800Bytes/s,全速设备最快1ms一笔事务,最高速度为64KBytes/s;高速设备最快125us一笔事务,最高速度为24.576MByts/s。
没有传输速度的保证。
◆ 为了把一个设备识别为HID类别,设备在定义描述符的"类别"字段必须设备为0x03以表示是HID类别,这样主机就会继续请求获得设备的HID描述符和报告描述符。
◆ USB分层结构如下图所示,对应于“设备”、“配置”、“接口”与“端点”都有相应的“描述符”。
前提:因为该类项目可以以“USB Device - HID - Custom Demos”下的“Generic HID - Firmware”为基础进行修改,因此所需要的文件有:main.c usb_descriptors.c 及HardwareProfile - Low Pin Count USB Development Kit.h HardwareProfile.h usb_config.h,以及lkr文件:rm18f14k50.lkr(注意:以下有些步骤相似于上述Standard HID示例)。
第一步:新建项目:
第二步:加载上述两个c文件与三个h文件:
第三步:修改编译选项,使Include Search Path包含:C:MCC18h,C:Microchip SolutionsMicrochipInclude以及该项目所在路径,如:E:ProgramePICGeneric HID - Firmware,如下图所示:
第三步:修改Library Search Path为C:MCC18lib,如下图所示:
第四步:加载C:Microchip SolutionsMicrochipUsb下的usb_device.c和
C:Microchip SolutionsMicrochipUsbHID Device Driver下的usb_function_hid.c
第五步:加载rm18f14k50.lkr文件,如下所图所示(注意:如果该文件不加载,编译可能不会出错,但功能可能不正常,比如说UART通信收到数据就不正确):
第六步:选择programme工具:
第七步:选择release版本:
第八步:编译下载即可执行,这样下载后的文件可使PC识别到PIC18F14K50,此时对应的PC机测试软件为C:Microchip SolutionsUSB Device - HID - Custom DemosGeneric HID - HID DLL - PC SoftwareMicrosoft Visual C++ 2008 Express,运行程序如下图所示:
当点击Toggle Led(s)时,PC发送一个0x80给PIC18F14K50,可以由此设计相应的应用软件。
第九步:应用软件开发:
在usb_descriptors.c文件中找到"产品技术符"并修改如下:
//Product string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd002={
sizeof(sd002),USB_DESCRIPTOR_STRING,
{
//'S','i','m','p','l','e',' ','H','I','D',' ',
//'D','e','v','i','c','e',' ','D','e','m','o'
'S','i','m','p','l','e',' ','H','I','D',' ',
'D','e','m','o',' ','B','y',' ','H','m','s'
}
};
下载到18F14K50之后,断开MCU系统电源及下载线,插入USB接头,PC机识别如下图:
在18F14K50的main.c文件中找到void ProcessIO(void)函数,在其下的if(!HIDRxHandleBusy(USBOutHandle))
{
//加载用户自己的应用程序
}
在这里可以加入用户的应用程序,比笔者在这里加入了以下代码,将18F14K50通过HID USB自PC接收到的16 bytes数据通过UART发送出去。
//***********************************
for(i=16;i>0;i--)
usend[i-1]=ReceivedDataBuffer[i-1];
USART_Send(usend, 16);
//***********************************
也就是说,18F14K50通过HID USB自PC接收到数据存放在ReceivedDataBuffer[]数组中,其相应的接收函数为:
HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
(接收“端点”为HID_EP,接收数据保存在ReceivedDataBuffer[],而一次接收长度为64)
而18F14K50通过HID USB向PC发送数据的函数为:
HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
(发送“端点”为HID_EP,发送的数据在ToSendDataBuffer[],而一次发送的长度为64)
这样,18F14K50就可以实现HID USB的方式与PC机进行信息交换。
Note:在上述实验第九步中,可以采用“USB-HID描述符工具”修改usb_descriptors.c中的
“设备描述符”-USB_DEVICE_DESCRIPTOR
“配置描述符”-configDescriptor1
“HID类描述符”-ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={};
以满足自己的要求。
希望对采用PIC18F13K50 14K50开发USB系统的朋友有所帮助.
PIC18F13K50 14K50 usb系统开发入门ourdev_527255.pdf(文件大小:677K) (原文件名:HID-USB开发.pdf)
一周热门 更多>