
本帖最后由 lcdi 于 2018-3-8 15:28 编辑 —————————————————————————————————————————————————————————————————————————————— 在4.0库里的composite例子,把里面的HID部分去掉,换成virtual comport部分。 把一些关键点写下来给大家参考: 1:主要修改usb_desc.c里的Composite_ConfigDescriptor, bNumInterfaces要改成总共的interface数目,我这里串口用了2个,u盘用了1个。然后是具体的描述,因为串口有2个interface,所以需要IAD描述,如果只有一个,就可以像例程那样直接描述。 // IAD 0x08, //描述符大小 0x0B, //IAD描述符类型 0x00, // bFirstInterface 0x02, // bInterfaceCount 0x02, // bFunctionClass: CDC Class 0x02, // bFunctionSubClass 0x01, // bFunctionProtocol 0x00, // iFunction 下面接串口本来的描述符,IAD里很简单 原串口用了IN2,是中断传输,一直没找到和搞清楚具体的服务函数在哪儿? 因为u盘也用IN2和OUT2,所以把这里改成IN4。 描述完串口接着描述u盘 // IAD 0x08, //描述符大小 0x0B, //IAD描述符类型 0x02, // bFirstInterface 0x01, // bInterfaceCount 0x08, // bFunctionClass: MASS STORAGE Class 0x06, // bFunctionSubClass 0x50, // bFunctionProtocol 0x01, // iFunction 下来照搬u盘描述即可。 Composite_ConfigDescriptor 修改完了,别忘了修改一下usb_desc.h里的Composite_SIZ_CONFIG_DESC,因为增加了描述内容嘛。 这时候就能枚举出符合设备了。 2:整合,增加了端点,需要修改usb_prop.c里端点初始化部分。usb_endp.c里callback函数要修改。按照callback函数的增减修改usb_conf.h。 这里有很重要的定义,改不好的话设备还是用不了。 EP_NUM 是使用的端点数,我使用到ep4,那这里就是5。 下来是BTABLE_ADDRESS 各端点的缓冲区地址设置。BTABLE_ADDRESS是0,第一个缓冲区地址我这里要设为0x28。因为BTABLE_ADDRESS到第一个缓冲区之间是各缓冲区的偏移地址存放处,我用了5个端点,每个端点8个字节,所以我要把第一个缓冲区放在0x28才行。 这个问题搞了好久才明白。 至此,修改完成,两种设备共存都正常工作了! 只是驱动不容易装,如果我安装ST的串口驱动(修改过PID),那么就只有这个设备,u盘没有,如果直接自动装驱动,有u盘没串口。这时候手动更新有惊叹号的设备,指定串口的驱动,装好后测试也就正常了。 —————————————————————————————————————————————————————————————————————————— U盘部分不需要驱动,串口部分不能自动安装驱动(即使系统安装过也不行),变惊叹号设备。如果再安装一次倒是可以用了,但是U盘却没了。对这个惊叹号设备手动选择驱动类型,强制使用以前安装的驱动则可以正常使用。这样搞总是不正常的样子。 其实,要修改驱动包里的INF, %DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750改成 %DESCRIPTION%=DriverInstall,USB\VID_0483&PID_5750&MI_00就可以一切正常了。 因为我这里设置串口为interface 0 开始的,惊叹号设备里也能看到 VID_0483&PID_5750&MI_00这样的信息,所以这样设置驱动就知道是要匹配0号interface的。 至此,全部正常! ____________________________________________________________________________________________________ 测试了一段时间,串口通信不太稳定,表现为通讯一些数据后usb会重置,设备消失一下又出现。暂时还没找到原因。 |
楼主,你好,我想用stm32F1做MSC+u盘的复合设备,有参考程序吗?
156765556@qq.com
谢谢啦!
没了没了,现在库都变了,我这些老经验没参考价值了~有机会再研究新的吧~
没有了,以前项目终止了没完成~现在库都不一样了没意义了,去学习库里自带的例程吧~