目录
需求
在产品研发的时候,因为我们的产品是需要用配套的上位机下载固件,以往所有的产品都是用的串口,等我接手的时候,是属于新的一类产品,在下载固件的时候通常比较大,基本上都大于1MB,这个固件对于嵌入式系统来说是非常大的,而且这个产品还要一个需求就是希望我们的用户可以进行傻瓜式下载,不用考虑什么端口什么的,也就是说我要优化通信速度,传统的串口115200波特率下载一个固件几乎要用1分钟到2分钟,我在开发的时候已经被折磨过,还有就是我们的产品在和上位机连接时,能自动识别,而不需要用户自己去选择端口,避免这种用户操作,因为考虑到用户几乎都是非开发者。
解决
所有有了上述需求后,我被任命开发USB的固件替换传统的串口通信,就可以完美的解决上面的问题,而且还被指定要写成 Winusb设备,这是一个专用于微软操作系统上的设备类,这个东西是个好东西,但是国内对其的资料非常少。可以实现Windows下免驱动使用, 免驱动很关键,我们都想让用户避免选择端口了,那自然是不可能让用户再自己安装驱动了。
结果
在此之前我对USB的认识只停留在最表面,我只知道这个东西,可以说是从0开始,但是我们干嵌入式的不都是这样嘛。从我开始认识它到灵活应用它花了接近半个月。我自认为我的学习能力比较强,在查询了大量的规范和工程示例,和不计期数的datasheet后写了很多相关的固件,并且通过测试和实践都可以完美使用。所以在此专栏下写下历程和总结,根据自己对MCU/SOC中USB外设的理解进行讲述。
声明
本专栏下的情景只属于于嵌入式开发中的USB硬件控制器在主机或设备下的工作,因为术业有专业,和专门写USB协议的老哥自然是比不了,但是他们写的往往是应用层或者是和嵌入式情景不相关的开发。
适用:嵌入式工程师以及在学习单片机开发的初学者和想扩展知识的人群。
要求:有单片机的基础开发能力,熟悉基本外设,和基本的通信协议(UART、I2C、SPI),因为如果没有这些能力,那么对于学习USB来说有点过早,而且会很吃力,建立学习完基本的通信协议再来学习。
准备:一块带有USB外设的开发板和逻辑分析仪(有就最好,没有也没事),要保证开发板的外部电路对于USB是没有问题的。
在学习完本专栏后,你可以理解USB的本质,彻底应用任何MCU/SOC中USB外设,以及具备写各种设备类的能力。