发新帖我要提问
123
返回列表
打印

stm32f105 USB DEVICE SOS!!

[复制链接]
楼主: 03024003
手机看帖
扫描二维码
随时随地手机跟帖
41
lxyppc| | 2010-1-5 14:11 | 只看该作者 回帖奖励 |倒序浏览
回复38L:
主机会不定时的读取stm32的数据,有可能是1ms,也有可能是100ms,所以我只能在复位后接收到特定的OUT指令后 ...
03024003 发表于 2010-1-5 13:54


改成主机会一直读取STM32的数据,也就是之前xinzha说的随时都保证有一个读取的URB挂在那里

使用特权

评论回复
42
03024003|  楼主 | 2010-1-5 14:49 | 只看该作者
改成主机会一直读取STM32的数据,也就是之前xinzha说的随时都保证有一个读取的URB挂在那里
lxyppc 发表于 2010-1-5 14:11


改成这种:主机用一个线程不停的IN(读取数据)指令,一点问题没有,如果这时主机再OUT指令一次就出问题了(主机无响应,stm32无中断产生).

使用特权

评论回复
43
lxyppc| | 2010-1-5 14:52 | 只看该作者
如果设备已经在IN了,需要等待这一次的数据传输完成再发OUT命令。不能在数据接收的同时发送OUT命令

使用特权

评论回复
44
03024003|  楼主 | 2010-1-5 15:08 | 只看该作者
本帖最后由 03024003 于 2010-1-5 15:17 编辑
如果设备已经在IN了,需要等待这一次的数据传输完成再发OUT命令。不能在数据接收的同时发送OUT命令
lxyppc 发表于 2010-1-5 14:52


做这个处理后,当我OUT4次后,就会出现先前的问题了.
感觉就是当TxFifo中有数据的时候,stm32如果再接收到OUT指令几次后就会无响应,但不知道怎么去修改...

使用特权

评论回复
45
lxyppc| | 2010-1-5 15:44 | 只看该作者
当你STM32收到OUT指令后作了些什么动作?

使用特权

评论回复
46
03024003|  楼主 | 2010-1-5 15:54 | 只看该作者
当你STM32收到OUT指令后作了些什么动作?
lxyppc 发表于 2010-1-5 15:44


只是从RxFifo中读取数据,没干别的.

使用特权

评论回复
47
lxyppc| | 2010-1-5 16:15 | 只看该作者
也就是说你通过BULK OUT来控制STM32是否向主机发送数据

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

楼主这种方式和Mass Storage Bulk Only很像,可以研究一下他的状态机

使用特权

评论回复
48
03024003|  楼主 | 2010-1-5 16:26 | 只看该作者
也就是说你通过BULK OUT来控制STM32是否向主机发送数据

主机读取时一次读取多少的BYTE,STM32每次需要返回多长的数据
比如你使用 ReadFile(buf,4096),非overlap方式
在ReadFile函数返回前,你不能用WirteFile通过O ...
lxyppc 发表于 2010-1-5 16:15


我现在主机一次只读或者只写64字节的,所以不存在IN指令未完成继续OUT的情况.

使用特权

评论回复
49
xobd| | 2010-1-8 17:29 | 只看该作者
50
03024003|  楼主 | 2010-1-11 10:58 | 只看该作者
感谢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;
}

使用特权

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

本版积分规则