78

帖子

0

TA的资源

一粒金砂(初级)

41
 
改成主机会一直读取STM32的数据,也就是之前xinzha说的随时都保证有一个读取的URB挂在那里
改成这种:主机用一个线程不停的IN(读取数据)指令,一点问题没有,如果这时主机再OUT指令一次就出问题了(主机无响应,stm32无中断产生).
此帖出自stm32/stm8论坛
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

42
 
                                 如果设备已经在IN了,需要等待这一次的数据传输完成再发OUT命令。不能在数据接收的同时发送OUT命令
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

43
 
如果设备已经在IN了,需要等待这一次的数据传输完成再发OUT命令。不能在数据接收的同时发送OUT命令
做这个处理后,当我OUT4次后,就会出现先前的问题了.
感觉就是当TxFifo中有数据的时候,stm32如果再接收到OUT指令几次后就会无响应,但不知道怎么去修改...
此帖出自stm32/stm8论坛
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

44
 
                                 当你STM32收到OUT指令后作了些什么动作?
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

45
 
当你STM32收到OUT指令后作了些什么动作?
只是从RxFifo中读取数据,没干别的.
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

46
 
也就是说你通过BULK OUT来控制STM32是否向主机发送数据

主机读取时一次读取多少的BYTE,STM32每次需要返回多长的数据
比如你使用 ReadFile(buf,4096),非overlap方式
在ReadFile函数返回前,你不能用WirteFile通过OUT向设备发送新的命令
你需要等待设备完成上一次的动作,即要等设备IN的数据发送完成或超时才能继续通过OUT发送下一个命令
即在BULK IN完成前不要作BULK OUT的动作

楼主这种方式和Mass Storage Bulk Only很像,可以研究一下他的状态机
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

47
 
也就是说你通过BULK OUT来控制STM32是否向主机发送数据

主机读取时一次读取多少的BYTE,STM32每次需要返回多长的数据
比如你使用 ReadFile(buf,4096),非overlap方式
在ReadFile函数返回前,你不能用WirteFile通过O ...
我现在主机一次只读或者只写64字节的,所以不存在IN指令未完成继续OUT的情况.
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

48
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

49
 
感谢49的朋友,依照官方论坛网友的回帖,在OTGD_FS_Handle_RxStatusQueueLevel_ISR()中有个寄存器变量未赋初值0,加上后我的问题依旧.

小弟经过前几天的测试,发现只有在TxFIFO中有数据的时候,主机连续OUT几次后再IN,stm32会无中断产生.
所以我在stm32每次接收到主机的OUT指令后,用OTGD_FS_FlushTxFifo(0x10)对TxFIFO进行初始化,然后再OTGD_FS_PCD_EP_Write(EP1_IN, RXBUF0, 64)写入,就会解决这个问题,但是OTGD_FS_FlushTxFifo()这个函数非常的耗费时间(具体多长时间没测试),不知道是否有其他的解决办法.

下面是函数原型:
USB_OTG_Status OTGD_FS_FlushTxFifo (uint32_t num )
{

  USB_OTG_Status status = USB_OTG_OK;
  __IO USB_OTG_rst_ctl_data greset;
  int count = 0;

  greset.d32 = 0;
  greset.b.txfflsh = 1;
  greset.b.txfnum  = num;
  WRITE_REG32( &core_regs.common_regs->rst_ctl, greset.d32 );

  do
  {
    greset.d32 = READ_REG32( &core_regs.common_regs->rst_ctl);
    if (++count > 200000)
    {
      break;
    }
  }
  while (greset.b.txfflsh == 1);

  /* Wait for 3 PHY Clocks*/
  uDELAY(3);

  return status;
}
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表