打印
[圈圈教你玩USB]

请教00:STM32 USB模块的问题

[复制链接]
6314|18
手机看帖
扫描二维码
随时随地手机跟帖
沙发
mengqian11|  楼主 | 2009-9-20 15:33 | 只看该作者
我刚买了00的书,还没有收到,不知道00的书跟我做的东西有什么关系没有

使用特权

评论回复
板凳
computer00| | 2009-9-22 14:12 | 只看该作者
你也可以考虑用USB转串口来做...参考书里面的USB转串口代码,只不过数据源不是串口,而是ADC。上位机直接读串口即可。或者采取自定义HID设备的方法,或者用户自定义的方法,书里都有。

使用特权

评论回复
地板
mengqian11|  楼主 | 2009-9-22 22:29 | 只看该作者
3# computer00
我的上位机软件没有变化,以前是用CP2102转的USB口给上位机,我现在打算用虚拟串口的模式,因为上位机软件用的虚拟串口。虚拟串口是否跟你说的USB转串口一个意思呢?

使用特权

评论回复
5
computer00| | 2009-10-8 23:37 | 只看该作者
是的。

使用特权

评论回复
6
mengqian11|  楼主 | 2009-10-11 11:21 | 只看该作者
你也可以考虑用USB转串口来做...参考书里面的USB转串口代码,只不过数据源不是串口,而是ADC。上位机直接读串口即可。或者采取自定义HID设备的方法,或者用户自定义的方法,书里都有。 ...
computer00 发表于 2009-9-22 14:12

您说用USB转串口的话,硬件上怎么连接呢?STM32的串口连接PC的USB口?还是STM32的USB口接PC的串口?这个概念有些混乱,见笑,望指点

使用特权

评论回复
7
computer00| | 2009-10-12 10:23 | 只看该作者
你把你的STM32想象成一个USB转串口的东西,但是这个转出来的串口的接收端不是物理上的串口,而是由ADC提供的数据源。具体如何实现你可以参考CDC类的虚拟串口。在STM版块应该可以找到相关资料。

使用特权

评论回复
8
mengqian11|  楼主 | 2009-10-16 21:32 | 只看该作者
7# computer00
00您好:看了几天虚拟串口的例程,有些明白又有些糊涂。我是把例程里面的USART去掉了,把AD的数据用
  UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, count_in);
  SetEPTxCount(ENDP1, count_in);
  SetEPTxValid(ENDP1);
发送出去,上位机用SSCOM怎么接受不到数据啊?打电话咨询了万利技术支持,说需要用USART,才能在上位机用SSCOM看,这是为什么啊?
  例程中那个USART不是作为数据源和验证工具用的吗?一定要用USART模块啊?

使用特权

评论回复
9
computer00| | 2009-10-17 01:32 | 只看该作者
不用的啊,直接把数据放进去就行了。

使用特权

评论回复
10
mengqian11|  楼主 | 2009-10-17 19:59 | 只看该作者
9# computer00
恩,今天又问了万利的另一工程师,居然说昨天那个工程师没做过,他不懂,确实不需要那个USART,现在我在那个例程当中添加我的内容,以前写的程序都是用的2.3的库,这个USB例程是3.0的库,结果把两个程序写到一起之后总有好多定义找不到说,不知道怎么解决呢。谢谢00的指导

使用特权

评论回复
11
mengqian11|  楼主 | 2009-10-19 22:06 | 只看该作者
问题解决了,上位机发送开始或者停止命令,STM32收到后启动或停止。我在主程序里
while(1)
{
   if(FHRCounter ==4000)
  {
      FHRSendFlag = 1;
      FHRCounter = 0;
      PackFHRData();
                   //保证此时不发送声音数据
     // if(GetEPTxStatus(ENDP1) == EP_TX_NAK)        ???????为什么加上这句就不行呢?
     // {
         UserToPMABufferCopy(FHRTXBuffer, ENDP1_TXADDR, 5);
         SetEPTxCount(ENDP1, 5);
         SetEPTxValid(ENDP1);
             // }
      FHRSendFlag = 0;               //允许发送声音数据
     }
    //WorkState();        //判断是否工作
  }

在TIM2里面
FHRCounter++;
if (FHRSendFlag == 0)
{
UserToPMABufferCopy(SoundADData, ENDP1_TXADDR, 5);      
SetEPTxCount(ENDP1, 5); //设置端点1的计数值      
SetEPTxValid(ENDP1);  // enable endpoint for transmission  
}
现在TIM2中发送的都能出去,可是while里面的有时候会丢,怎么回事啊?

使用特权

评论回复
12
computer00| | 2009-10-22 21:38 | 只看该作者
当端点空闲的时候,才能写数据的。

使用特权

评论回复
13
e_boys2009| | 2009-10-23 14:16 | 只看该作者
mengqian11你好!一下是你的程序,你这样也能发数据吗??
if(FHRCounter ==4000)
  {
      FHRSendFlag = 1;
      FHRCounter = 0;
      PackFHRData();
                   //保证此时不发送声音数据
     // if(GetEPTxStatus(ENDP1) == EP_TX_NAK)        ???????为什么加上这句就不行呢?
     // {
         UserToPMABufferCopy(FHRTXBuffer, ENDP1_TXADDR, 5);
         SetEPTxCount(ENDP1, 5);
         SetEPTxValid(ENDP1);
             // }
      FHRSendFlag = 0;               //允许发送声音数据
     }
    //WorkState();        //判断是否工作
  }

使用特权

评论回复
14
e_boys2009| | 2009-10-23 14:17 | 只看该作者
连续发送几分中稳不稳定的呀??

使用特权

评论回复
15
e_boys2009| | 2009-10-23 14:25 | 只看该作者
我是用标志if(GetEPTxStatus(ENDP1) & 0xff) != EP_TX_VALID) 作为发送数据条件的,可是当我不停的发的时候(我用软件发数据到STM32,然后通过将其发回,并用软件来判断接收的是否正确)还是会出现类似“覆盖”bug,也就是接收到的有错误(我通过在其前面加了一个判断用于于延时if(!Time_cao || (usbBuf_valid_bytes > 63))意思就是有一个包了我就发,没有一个包时间到了我也发,这样就不是每一次USB接收缓冲区有数据我都发)。(if(GetEPTxStatus(ENDP1) & 0xff) == EP_TX_NAK)也用了也是一样)。

使用特权

评论回复
16
e_boys2009| | 2009-10-23 14:28 | 只看该作者
我加了条件的速度慢了,可是不会有那个“覆盖”bug了,我是想可以不用一个其他的标志来判断是否发送,可不可以不用EP_TX_VALID和EP_TX_NAK,因为用这两个在大量不停发送的时候就有“覆盖”bug问题。

使用特权

评论回复
17
johnsenchen| | 2011-5-7 10:30 | 只看该作者
4# mengqian11
求书!!!!!哪里有卖?????

使用特权

评论回复
18
johnsenchen| | 2011-5-7 10:31 | 只看该作者
8# mengqian11
虚拟串口这个东西,速度怎么样???

使用特权

评论回复
19
heyuanpi| | 2011-10-20 15:57 | 只看该作者
论坛上说能到600多k

使用特权

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

本版积分规则

1

主题

10

帖子

1

粉丝