出于某种原因,导师要我用stm32F7来驱动5G模块。说实话这真的是吃力不讨好,单片机根本无法利用5G那么快的速度,官方给的程序只有Linux和windows的驱动,其他一点资料都没有。磨了两个月终于给磨出来了,虽然用的是USB Full Speed和速度受限的ppp通信,但好歹成功连上了。这期间遇到的坑实在是太多太多了,在这记录一下。博主是纯新手,轻喷。
模块只支持通过USB传输数据,鼓捣了一段时间确定是使用USB CDC。好在官方有STM32_USB-Host-Device_Lib库,在找不到CDC Host的教程(网上都是Device的)的情况下,只能硬着头皮上去看资料读代码。
使用库里面的例程,先后遇到了许多坑。
1.描述符不对应。这很正常,毕竟是厂商定制的模块,而模块的设备描述符我是完全不知道的。好在厂商提供了windows的驱动,最后在windows上使用USBView软件,成功找到了该设备的所有描述符。然后进程序里面的枚举部分USBH_HandleEnum(USB_OTG_CORE_HANDLE *pdev, USBH_HOST *phost)
修改对应的条件判断。
(其实单片机就算描述符不对应报错也能正确读取设备所有描述符,打印出来对着改就行)
2.获取linecoding失败。
设备没有返回,直接手动设置波特率等内容。
3.能够收发AT指令后,ATD*99***1#返回ERROR
对比了linux的收发数据后确定是在lincoding阶段少发送了一个CDC_SET_CONTROL_LINE_STATE_REQUEST
这是对usb模拟串口握手协议支持(RTS/CTS)