本帖最后由 lvben5d 于 2022-9-8 07:24 编辑
由于目前用到了AT32F403A,这款芯片的USB缓冲区 如果不使用,还可以被CAN0或1霸占。 跟我之前调试好的AT32F4X5 具备独立1280字节的缓冲区是不同的。当然我是有可能既用USB也用一个CAN通道~
库函数也略有一些不同点,比如AT32F403A 可以霸占CAN0 CAN1的所有1280RAM,成为双端口的 SRAM 缓冲区。 双端口的好处,应该是MCU 控制USB收和发分开的时候,就可以尽快访问内存控制器了吧? 加快了以前 单SRAM必须 一个读或写完,才可以进行下一个。(好像CAN0 CAN1无法同时霸占掉 1280BYTE 参看RM_AT32F403A_407_407A_CH_V2.03 381页 24.3.3 USB缓冲区)
个人从实际应用出发感觉:除了EP0 占用了收和发EP 各最大64字节 (实际可以少几个字节,根据设备描述符最大字节设计),其余缓存实战中,如果是USBFS模式 一个包最大64字节,
收包这边 很容易要做成 软件层面的叠包处理,我一般把USB D这边 第一个包的包头作为区分后续要不要叠包的head 然后跟着包的长度指示字节(2Byte) 为什么是2Bytes, 因为上位机更新FLASH (我目前435 的1个FLASH Page是1024字节) 上位机解析HEX文件后加协议包头、长度 、SN 、内容 、CRC8 一共是1030字节。
如果我们上传内容一次超过64字节,那么我们是自己拆包分发呢,还是直接把超过64字节的数据 塞入USB EP TX FIFO里,让USB驱动层去处理拆包分发,减少应用层麻烦 (这个我后面有空去测试下,哪个方便实战)。 我记得我以前用GD USBFS Dev,可以塞入大于64字节内容,交给USB驱动层去上传(需要确认下)
|