这里我主要说一下如何做一个USB下位机,这里主要分3部分:1、建立工程;2、添加报文描述符;3、数据的传输。这里就不讲USB的理论知识了,有想要了解的自行百度一下就可以了。
建立工程:工程建立参考:https://www.cnblogs.com/libra13179/p/7193375.html
1、首先打开USB
2、接着把USB设置为下图HID模式
3、选择外部时钟
4、配置时钟树
5、配置USB设置
下面的USB设置就有点讲究了,
6、确认后,生成代码
添加报文描述符:
这里只是建立了一个工程,你编译不会有错,不过PC还是无法识别你这个是USB设备的,因为缺少了关键的报文描述符,这里我就说一下报文描述符怎么写,这个你可以直接用HID descriptor Tool软件生成,如下图,下图就是一个报文的基本要素了,该描述符主要作用是告诉PC机一下USB的信息,简单来说就是告诉PC我有什么用。
这里我说一下这个报文的要素,第一部分你可以理解为报文头;第二部分你可以理解为USB告诉PC机问我要做什么,这里主要告诉PC机我要做一个接收与发送的设备;第三部分是结束标志。
============================================================
下面我插入一个对报文描述符进行一个简单的描述:
标签解析举例(Usage :0x50, 0x01):
(Usage Page标签0x0?)0x05=0000 0101 :
0x05表示前缀,0x01为数据部分,0x05转换成二进制,就是0000 01 01,按照HID类协议5.3 generic item format的定义,这个字节被分成3个部分:
bit0~bit1代表的是这个前缀后面跟的数据长度,这里就是后面0x01的长度,两位可以表示最大4字节的数据,即bsize
bit2~bit3代表的是这个前缀的类型,总共可以有三种类型:0=main,1=global,2=local,3=reserved;
bit4~bit7代表前tag,一般分为input(二进制的1000 00 nn,即bit4~bit7=1000,代表一个tag,bit2~bit3=00,代表main,bit0~bit1=nn,代表这个前缀后面还有nn所代表的数据),output(二进制的 1001 00 nn),feature(1011 00 nn),collection(1010 00 nn),end collection(1100 00 nn)
即:
0000:Usage Page
01: bType,全局(bType=0:主项目;bType=1:全局项目;bType=2:区域项目)
01:bSzie,1字节(bSzie为项目所需数据字节数目,bSzie可为1、2、4,注意bSzie不可为3)
(Page ID)0x01: 表示该Page为Generalic Desktop Controls(Usage ID 0为保留。ID 1到0x1F为”top level” collection保留,这些ID虽然对于Application不是必须,但可以用于识别通用设备类型)
Usage = (usage page:usage ID):其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。所以“传输的数据”和“操作”只是一事件的两种描述方式。用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage ID(用途识别名),文件universal serial Bus HID Usage Table完整列出所有的usage pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途。用途卷标只是报告描述符诸多标签的一个,利用这些卷标取可以清楚完整的描述符操作的用途。
这里其实说的并不清楚,因为作者有点懒就不细说了,想了解更多的可以百度《圈圈教你玩USB》,这里说的比我好。
============================================================================&#