打印

给个准信,GD32F103RE,BULK双缓上传有坑?

[复制链接]
1741|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcdzxh|  楼主 | 2018-3-30 09:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jcdzxh 于 2018-3-30 11:18 编辑

为了加深理解硬件逻辑,实验程序用寄存器操作的,典型的VCP应用,用的是JlinkVcp的描述,收到触发命令往上位机上传512KB字节,用串口助手接收转存为文件,用WINHEX做比对验明正确性,先是单缓冲实验OK,然后改成双缓冲,问题来了,接收到的512KB,总是有400多到2-3千字节差错,试验30次以上,出错无规律。折腾两天,无果而终,因此论坛求助。同样程序不作任何改动,STM32结果正确。
程序是用STM32的H文件写的,
48M和72M都试过,APB1 1分频2分频都试过,

回头看改动,

_SetEPDblBuf0Addr(ENDP1,ENDP1_TXADDR);
_SetEPDblBuf1Addr(ENDP1,ENDP1_RXADDR);


_SetEPDblBuf0Count(ENDP1,EP_DBUF_IN,i);
_SetEPDblBuf1Count(ENDP1,EP_DBUF_IN,i);

和单缓差别仅仅增加了这2种4个宏操作,试图在GD32F10x_USB_FS_Device_Lib_V2.0.0这个包里找找蛛丝马迹看这些宏操作有没有差别,却没有找到,

恳求哥哥些救我出坑,谢谢!
沙发
jcdzxh|  楼主 | 2018-3-30 09:31 | 只看该作者
补充,接收总字节无差错,IN中断翻GPIO接逻辑分析仪看状态也十分正常

使用特权

评论回复
板凳
baimiaocun2015| | 2018-3-31 18:33 | 只看该作者
这个主时钟频率的没啥问题的吧

使用特权

评论回复
地板
jcdzxh|  楼主 | 2018-4-1 08:53 | 只看该作者
本帖最后由 jcdzxh 于 2018-4-3 21:22 编辑

双缓发送是用测试通过的单缓发送程序改的,问题不在时钟。
补程序贴图,学习程序写得很乱就不发全文了,唯有这块因为折腾的时间长
还稍微整洁点。发送结束标志是早期测试时用的,现在用Len=0判断发送结束,忘删了请无视。
把核心思路贴出来求批。
这段程序在STM32上跑是正常的,多台电脑测试速度在990ms-1050ms/MB之间,GD32上跑如前文所述有错字节现象。


使用特权

评论回复
5
啦儿啦| | 2018-4-2 16:39 | 只看该作者
您好,我最近也正在研究STM32的usb发送双缓冲,您可以发我一份发送双缓冲好使的代码么,谢谢,邮箱18346180868@163.com

使用特权

评论回复
6
单片机单片机| | 2018-4-3 10:52 | 只看该作者
之前调通过STM32F103和GD32F103单片机的USB,把代码贴出来帮你看看,或者发我邮箱也行,xge@ling-ban.com

使用特权

评论回复
7
单片机单片机| | 2018-4-4 12:07 | 只看该作者
仔细看了下你的程序,你贴出来的代码部分和我代码的对应部分是一样的。不知道你是怎么初始化单片机的USB模块的,也没办法继续帮你分析,所以怀疑是不是与你的初始化有关系,或者与你的程序架构有关系就不得而知了,我的代码在STM和GD上都是好用的,因为有其他相关代码以及有公司保密机制也不方便发给你,你用的STM和GD的单片机具体型号分别是什么?

使用特权

评论回复
8
jcdzxh|  楼主 | 2018-4-4 20:26 | 只看该作者
初始化就三句,设置端点1为BULK,KIND=1,状态为NAK
_SetEPDblBuf0Addr(ENDP1,ENDP1_TXADDR);
_SetEPDblBuf1Addr(ENDP1,ENDP1_RXADDR);


我是在GD32F103RE错字节解决不了,试着在STM32F103C8上试,程序又正常
我不知道你的是不是真双缓冲 ,上传速度能到多少?

后来我又用其它方式测试了,我认为是GD32F103RB的PMA双口RAM有BUG,当SIE从PMA取数据发送时,同时CPU通过ABP1写PMA就会有小机率的错误
如果虽然用户初始化端点为双缓冲,但装载不发生在SIE占用PMA时(SW翻晚一些或晚一些再加载另一个BUFF),是不会错误的,我测试过。

只等GD证实我的实验结论。

使用特权

评论回复
9
单片机单片机| | 2018-4-4 20:50 | 只看该作者
jcdzxh 发表于 2018-4-4 20:26
初始化就三句,设置端点1为BULK,KIND=1,状态为NAK
_SetEPDblBuf0Addr(ENDP1,ENDP1_TXADDR);
_SetEPDblBuf ...

对,我也是这么初始化的,应该没问题啊!是不是你的上位机的驱动有问题呢?我是直接在Ubuntu下自己编写的程序接收的单片机的数据,不是用的串口助手接收的,检测数据是对的。还有一个问题,感觉你的代码用的固件库和我的版本不一样,你用的是哪个版本?

使用特权

评论回复
10
jcdzxh|  楼主 | 2018-4-5 10:49 | 只看该作者
本帖最后由 jcdzxh 于 2018-4-5 10:51 编辑

寄存器文件:
  * @file    stm32f10x.h
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    11-March-2011

USB寄存器:

  * @file    usb_regs.h
  * @author  MCD Application Team
  * @version V4.0.0
  * @date    28-August-2012
---------------------
编译MDK4.73

使用特权

评论回复
评论
zzyybb22 2018-4-26 19:32 回复TA
@啦儿啦 :150的可以吗 有悬赏吗? 
啦儿啦 2018-4-7 00:01 回复TA
STM32F103C8T6的USB发送双缓冲谁搞出来了,上传速度可以达到900KByte/s以上而且可控的(我之前搞出来的是不可控的)悬赏300大洋,说话算数!!! 
11
zzyybb22| | 2018-4-26 19:32 | 只看该作者
我有150的双buf程序,SPI Nand Flash模拟U盘 平均速度800KByte 峰值1M,150是10x的精简版 150可以10x应该也不会有问题吧?

使用特权

评论回复
12
jcdzxh|  楼主 | 2018-5-1 20:47 | 只看该作者
zzyybb22 发表于 2018-4-26 19:32
我有150的双buf程序,SPI Nand Flash模拟U盘 平均速度800KByte 峰值1M,150是10x的精简版 150可以10x应该也 ...

我在找150测试,试了我会来更新
本意是想明确有没有这个BUG,免得人纠结,如果有人实现,麻烦给个测试固件证明

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

302

帖子

4

粉丝