打印
[STM32F1]

请教香水城老师关于USB端点0读数据问题

[复制链接]
1499|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mengzhenyao|  楼主 | 2014-9-16 08:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CustomHID_Data_Setup中有如下操作:

/*** GET_REPORT ***/
else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
&& RequestNo == GET_REPORT)
{

CopyRoutine = read_flash;
}

PC机发不停地发送读64字节的指令,控制传输,STM32收到指令后,就读64字节FLASH,并回传数据。

现在问题是,比如第一个64字节的块,全为0X11,第二个块全为0x22,依次类推。

读出的结果却是:第一块0x11,第二块还是0x11,第3块是0x33,第四块还是0x33

很明显,该显示0x22的时候,还显示了0x11,次序是对的,但是某些块占用了别的块的时间

具体情况是:读块的时间可能稍长。如果读块的时间相当短,不会出现这个问题。


看过香水老师的一些讲解,一、 SETUP DATA_IN(0) DATA_IN(1) DATA_IN(0) ...... STATUS_OUT(1)。现在这个SETUP实际是自动回复了ACK,然后进入了CustomHID_Data_Setup,再在CustomHID_Data_Setup里执行read_flash(),似乎read_flash()并没执行完,DATA_IN(0) 就已经开始了,所以总是出的上一次的数据。

请教香水老师,这具体是哪有问题?怎样解决呢?
沙发
想做大牛的小马| | 2014-9-16 09:52 | 只看该作者
这是中断里处理的,即使读flash速度慢,也是读完再继续的。。。确认一下这4次PC机发过来的64字节指令分别是多少

使用特权

评论回复
板凳
mengzhenyao|  楼主 | 2014-9-16 10:04 | 只看该作者
不止4次,根据FLASH的大小而定次数吧,指令都一样,电脑VC++
        usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
                    program_mode * 16 + READ_FLASH, 0, 0, (char *)(pSerialPro->USB_rxdbuf), flash_pagesize * 2, 5000);

在STM32方面,有个flash_page_ADDR的全局变量,每读一次,自加1

使用特权

评论回复
地板
想做大牛的小马| | 2014-9-16 10:26 | 只看该作者
mengzhenyao 发表于 2014-9-16 10:04
不止4次,根据FLASH的大小而定次数吧,指令都一样,电脑VC++
        usb_control_msg(handle, USB_TYPE_VE ...

我的意思就是比如pc发了4次指令,先确定一下stm32端这4次是否都正确接收了。。。可以搞个buf缓存一下看看,个人感觉这个问题和usb本身处理关系不大~

使用特权

评论回复
5
mengzhenyao|  楼主 | 2014-9-16 10:31 | 只看该作者
这是个好办法,我搞个串口看看数据吧。我是用的内部4M晶振,没HSE,会不会晶振不准引起?

使用特权

评论回复
6
想做大牛的小马| | 2014-9-16 10:37 | 只看该作者
必须接hse,提供精确度很高的48M时钟,否则可能有意想不到的问题哦。。。。

使用特权

评论回复
7
小浣熊| | 2014-9-17 23:11 | 只看该作者
具体情况是:读块的时间可能稍长。如果读块的时间相当短,不会出现这个问题。

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝