之前用F103做USB转CAN调试小工具时候USB和CAN不能同时用,还挂了个串口,很不爽。周末抽空打算改一版用F072来做,直接单片USB转CAN. 072比F4便宜多了,总不至于改成F4的。
先得搞定USB,基本就成了,拿DISCOVER下手。虽然ST有固件库,不过一直是自己写驱动的,USB也不例外,移植很方便,改改宏定义和读写包和端点配置就能用。
左右开2个PDF粗略对比寄存器,看起来F0和F103的USB只有时钟源 中断向量 上拉电阻有差别(充电模块就无视) ,貌似30秒修改就能正常运行,兼容真是一件好事,感觉幸福来得太快。但是点完编译下载,实际发现居然会运行不起来!!发现未知设备,这没道理啊,赶紧进入调试压压惊,简化问题先取消EP0以外所有端点,收包断点暂停,上拉电阻有效 时钟有效 中断有效 接收枚举包也正常,进入收包中断了, 但是读8字节错误, 问题显然出在缓冲区。
先说说ST的USB缓冲区,缓冲区是1024字节,其中最后256字节可以分配给CAN。最前面是一大堆端点条目,每个端点可四个条目,每个条目16位,分别定义数据缓冲位置和大小。条目群后面是端点数据缓冲。
记得貌似F103缓冲区是USB按16位访问 用户按32位访问(高16位无意义)。先观察了一下MEM窗口 每32位后面16位重复前面16位,看起来似乎符合高16位无效情况?已经看到8字节打头那个0X80了,但是收到8字节明显不在预定位置啊。手工修改EP0_RX_ADD不管怎么修改它居然就死定在一个固定位置,真是神了,折腾了好久一阵怎么也挪不动。
不死心再试试将4个条目全部改动,这下RX位置动了,但是位置居然是第二条条目即TX_COUNT定义处。再回看开始不动情况,位置不也正好在TX_COUNT定义处么。仿佛明白了什么----这货极可能不是32位访问,而是16位访问!!赶紧再看手册,条目下有这句Address offset: [USB_BTABLE] + n*8意味着果然是16位访问。吐血啊,对比寄存器只浏览了寄存器定义没看到这行不起眼小字,跟它较劲了半小时。赶紧改动宏定义和缓冲读写语句。枚举妥妥的通过。回翻F103手册条目下有两句分别是+n*8 和+n*16。
回头继续观察MEM窗口,依然是每32位后面16位重复前面16位,误导人!!!难道是MDK的失误?装了ST的STM32 ST-LINK Utility再读内存0X40006000段,显示的跟MDK一模一样,不能怪MDK了,估计是ST改模块或者什么的也是跟我一样没改全,导致调试观察跟实际不对。
再来通信读写数据,HardFault死机,这个好解决,追堆栈死在缓冲区写函数,秒懂这十之**是地址不对齐问题。设个判断断点,果然抓到奇数地址,奇数地址16位访问下就挂了。地址就是UCHAR用户缓冲数组地址,赶紧把用户缓冲加了强制对齐,连续运行正常。
所以,F103的USB往F0上面移时候,不要看到寄存器定义一样就笑开了花,还有个32位访问要改成16位访问的坑在等着你,一不小心没看条目说明下面那句不起眼的小字就掉进去了,然后半天摸不清情况。
|