为什么说你要学习USB?(一)

来源:公众号【鱼鹰谈单片机】

作者:鱼鹰Osprey

ID   :emOsprey

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

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

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

为什么说你要学习USB?(一)

为什么说你要学习USB?(一)

鱼鹰与USB的渊源

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

为什么说你要学习USB?(一)

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

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

为什么说你要学习USB?(一)

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

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

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

为什么说你要学习USB?(一)

这个随缘吧。

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

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

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

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

为什么要学习USB?

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

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

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

为什么说你要学习USB?(一)

(图片来源与网上)

现在大部分 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?(一)

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

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

(以上参考资料可在后台回复关键字,USB参考资料 自行领取)

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

其他

最后说点其他的,为了更好的学习USB,鱼鹰准备做一个USB开发板,STM32为核心(事实上大部分开发板都预留了USB接口),这个开发板的主要特点会是方便调试,并且购买开发板会有相应的教程提供,不过这个只是鱼鹰的初步构想,到时候看情况了。

目前鱼鹰已经找到一位刚毕业不久、兴趣相投的道友画板,毕竟鱼鹰专注于软件,让我画板还真搞不定,不过这个板子不是开发板,而是其他功能,开发板到时候再看了。

还有一件事,关注鱼鹰的老读者应该都知道,越是支持鱼鹰,越能得到更多公众号资源,前段时间因为可分享的资源不多,所以没去新增资源,但这一波 USB 的资源应该会非常丰富,比如完整的 PDF 高清图等资源可是需要条件领取的,如果不知道如何支持鱼鹰的,可点击阅读原文查看。

推荐阅读:

线程CPU使用率到底该如何计算?

许久以后,你会感谢自己写的异常处理代码

终极串口接收方式,极致效率

为什么说你一定要掌握 KEIL 调试方法?

延时功能进化论(合集)

指针,很难吗?| 解析指针的过程与意义(一)

如何写一个健壮且高效的串口接收程序?

KIEL 调试那些事儿之窗口展示——变量(二)

打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知

-THE END-


如果对你有帮助,记得转发分享哦

微信公众号「鱼鹰谈单片机

每周一更单片机知识

为什么说你要学习USB?(一)

长按后前往图中包含的公众号关注