本篇笔记为 USB 系列教程第一篇,一共有多少篇鱼鹰心里也没底,鱼鹰不会因为篇幅多而停止,会尽可能的将 USB 讲透,让你通过本系列教程入门 USB(Universal Serial Bus,通用串行总线)。

 

当然,因为鱼鹰也是用的不多,所以有些知识点可能是错的,需要对照 USB 官方文档确认。

 

要想讲透,大量的图解是少不了的,不过鱼鹰已经准备的差不多了,先给道友过个目好了。

 

 

鱼鹰与 USB 的渊源

说起鱼鹰和 USB 的渊源要从 2016 年开始,那个时候鱼鹰花了一个月从最基本的 USB 硬件层开始,到 STM32 模块,再到 USB 协议,专注的学习了一个月(学生时间多)才勉强明白 USB 到底是个什么鬼。

 

 

后来因为比赛原因不得不停止,留下上面 5000 字的笔记就暂时放下了。

 

但是鱼鹰还是心心念念着它,所以在工作后准备再次学习,还特地发朋友圈表示决心,最后还是无疾而终,不过那次学习了解了 HID 是个什么鬼。

 

 

这一次鱼鹰终于在工作稳定后开始全面学习 USB 了,最终目标就是实现一个 虚拟串口+ U 盘 + CMSIS-DAP 调试器 的复合 USB 设备,也就是 ST-LINK V2 调试器中实现的功能。

 

要实现这个东西可不简单,USB 是大头,FAT 文件系统老二,Cortex-M 调试组件知识第三,还有其它零零散散的知识点,没有好的基础,根本搞不定。

 

FAT 文件系统知识鱼鹰已经准备好了,又是画了大量的图进行说明,不过到底会不会像 USB 一样写个教程出来,那完全看鱼鹰心情了,毕竟当时学完之后马上写会写的比较清楚,可那个时候公众号发展不如意,也就没那个心思去分享了。

 

 

这个随缘吧。

 

唠嗑了这么多,鱼鹰是想向各位道友表达一个观点,做技术的不容易,能在技术路上走的很远的都是勇士!

 

要想坚持,没有兴趣是很难走下去的。

 

很多人可能会说,这个东西网上不是都有吗,随便找一份源码,改改引脚,调试器就出来了呀,为什么你要费劲巴力的又是画图,又是写教程的,为的是什么?

 

为的是以后当我想实现自己想要的功能时,我能快速实现;为的是遇到 USB 的问题时我能快速定位,这就是鱼鹰的目的,也是鱼鹰一直坚持的学习观点,学透!

 

为什么要学习 USB?

现在回到今天的主题,为什么要学习 USB?

 

有人说串口就够用了啊,串口简单又容易上手,网上也能找到很多 USB 转串口的模块,为什么要学它呢?

 

首先,在速度上,USB 比串口的速度要快的多,最低版本 192 KB/s,最高 1280MB/s,当然这是理想速度,除去协议本身的开销会减少部分,但总的来说,比串口快的多。

 

(图片来源与网上)

 

现在大部分 USB 设备都是全速设备,即 1.5 MB/s,STM32 系列基本都支持全速以上的 USB 接口(有 USB 模块的 STM32 芯片),所以速度上比串口强的多,一般 USB 转串口的模块速率最大也就 115200b/s,换算成字节也就是 11.5 KB/s,而且因为协议简单,所以不存在错误重传,应答等机制,如果不用 485 之类的,抗干扰能力也不强(USB 使用差分传输,抗干扰强)。

 

但这些都不是重点,重点是当你想和电脑通信时,你必须借助各种硬件(杜邦线、转接模块)才能实现一个最简单的串口通信。

 

你想用它和电脑玩点高级货,根本无从下手。

 

而当你掌握了 USB,只需要一个 USB 线,插上电脑,各种玩法就随之而来。

 

DIY 调试器?虚拟串口?虚拟 U 盘?USB 摄像头?虚拟网卡?

 

这些统统没问题,总之你能想到的和电脑通信的设备,它基本都能实现。而这些设备的驱动、上位机你基本能找到现成的。

哦,你只想做个 USB 鼠标、键盘玩玩,那资料满天飞,掌握了 USB,轻轻松松实现。

 

这才是通用接口应该有的样子嘛,而串口目前在笔记本上已经基本被淘汰了,如果想用串口,不好意思,通过 USB 虚拟吧!

 

所以,USB 学习对于今天的我们来说,必不可少!

 

为什么写教程?

USB 教程其实在网上有很多,非常出名的是《圈圈教你玩 USB》,不过它是 2009 出版的,距今已十多年了。

 

虽说很老,但是知识是相通的,鱼鹰也是靠它学了不少东西。

 

但是鱼鹰在学习过程中,有几个问题存在:

第一:图解很少,虽说有很多通俗的语句进行描述,但总感觉还是不甚明了

第二:开发板太老,具体芯片型号鱼鹰已经不记得的,因为鱼鹰没想过买这个开发板,为什么?STM32 已经集成了 USB 接口,为什么还要单独买一个学习呢。

第三:例程不够规范,很多异常没有考虑。确实,作为初学者而言,简单就是最好的,但是对于鱼鹰这样的老手而言,还是需要比较规范、易读的例程才能运用到实际产品中去,以后需求变了,改起来也方便。

 

以上就是鱼鹰在学习过程中遇到的问题点,所以针对这些问题,鱼鹰想自己写!

 

但是因为鱼鹰对于 USB 的了解还不够多,而且也不会面面俱到的写,所以各位道友还是需要从头阅读这本书(网上有 PDF,鱼鹰分享的资料中也会有,有条件的可以购买正版书籍学习)。

 

不过鱼鹰会将一个 CDC (虚拟串口)例程通过图解的方式从头到尾讲透、讲彻底,让大家真正入门 USB,这就是鱼鹰写这个系列的目的。

 

而对于高级部分,比如虚拟 U 盘、调试器、HUB、OTG 等部分可能会选择付费阅读形式进行分享(也可能不分享,看情况了,鱼鹰比较佛系),毕竟这个耗费了鱼鹰太多的精力。

 

但是这些高级部分对于学习了 USB 基础的道友来说,都是能自行学习的,鱼鹰的笔记只不过会让这个学习的时间缩短而已。

 

毕竟,入门才是最难的!

 

怎么学 USB?

鱼鹰计划将以如下学习路线分享教程:

1、底层通信,USB 是如何通过 USB 线传输数据的(类似串口协议部分)。(参考《USB 培训 _Part1_ 协议 .pdf》)

2、STM32 中的 USB 模块(参考《STM32 中文手册》)

3、USB 协议基础(参考《圈圈教你玩 USB.pdf》)

4、CDC 通信过程详解(参考《USB CDC 类入门培训 .pdf》)

 

通过以上讲解,可以让各位道友从下到上,有一个清晰的认识,遇到问题也更容易定位。

 

事实上,对于嵌入式开发来说,我们其实更关注上层的东西,但是硬件上的东西还是需要作为了解性知识进行学习的,否则本来软件没问题,只是硬件原因导致无法通信,如果从软件上查根本找不出问题。

 
这里说说为什么使用 CDC 作为 USB 实战例程呢?

 

市面上很多开发板教程都是用鼠标、键盘来实战的。

 

确实,作为 USB 设备来说,鼠标、键盘是最常见的 USB 设备了,但是我们不可能拿一个开发板去当键盘或鼠标去实际使用吧,所以模拟一个 USB 鼠标和键盘对于我们开发人员来说,根本不实用。

 

而串口虽说速度较低,但还是很多人在使用的,也有很多上位机支持,如果我们能通过 CDC 模拟一个串口,那么我们就可以很方便的使用目前市面上的硬件和软件了,而且因为实质上是 USB,所以速度会更快。

 

以前你的串口打印可能是这样连接的:

 

 

现在是这样:

 

 

省去了中间商赚差价,最大速率取决于 USB 本身,而不是受限于 USB 转接模块,而上位机那边原来该怎么使用现在也怎么使用,方便简单,你值得拥有。

 

当然还有一个原因,对于初学者而言,要理解 HID (参考《USB-HID 协议中文版 .doc》)这个类还是很难的,据说这个类是所有 USB 类中最复杂的类,通信过程也比较麻烦,所以鱼鹰选择了 CDC 这个类讲解,降低学习难度,当你掌握了 USB 基础,再学其他的也就容易的多了。

 

关于 CDC 的例程,鱼鹰已经在整理了,将尽可能的删掉不相关的内容,让各位道友更快的入门 USB,并且鱼鹰的图解也将基于该例程,大家到时候对照着参考就行,建议使用 SI 软件阅读源码。