3524|8

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高手请帮忙,usb块传输的问题 [复制链接]

采用万利的板子EK-STM32F

自己编写的两个函数,请高手帮忙看看有什么问题

usb接收数据函数
void USBCom_RecvPacket(u8 *Data)
{
  pUSBRecvData = Data;
  USBRecvLen = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy(pUSBRecvData,ENDP3_RXADDR,USBRecvLen);
  SetEPRxValid(ENDP3);
}

usb发送数据函数
void USBCom_SentData(u8 *Data, u16 USBSentLen)
{
  pUSBSendData = Data;
  UserToPMABufferCopy(pUSBSendData, ENDP1_TXADDR, USBSentLen);
  SetEPTxValid(ENDP1);
}

采用的是ViturlComPort 程序更改过来的,
主函数为
int main(void)
{

#ifdef DEBUG
  debug();
#endif
 
  Set_System();
  Set_USBClock();
  USB_Interrupts_Config();
  USB_Init();

  while(1)
  {
    USBCom_RecvPacket(RecvBuffTemp);
     
    USBCom_SentData(RecvBuffTemp, USBRecvLen);
  }
}

#ifdef  DEBUG

为什么第一次设备接收数据后,设备一直在给PC发送数据?
此帖出自stm32/stm8论坛

最新回复

                                 谢谢,太感动了,高手就是高手!   详情 回复 发表于 2009-3-16 13:57
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

RX

在ST提供的VCD DEMO的源代码中,要通过端点1发送数据,是写以下3句代码,你少了1句。

  UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, count_in);
  SetEPTxCount(ENDP1, count_in);
  SetEPTxValid(ENDP1);
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

RX vigia

我测试过了,发送函数是有问题的,后面我更改了,
/// @param Data  Input the byte array containing the bytes to be sent to USB Port
/// @param pDataLength  Length of Data to be sent
/// @return  None
void USBCom_SendPacket(u8 *Data, u16 DataLength)
{
  u32 Counter = 0x0000FFFF;
  
  USBSendLen = DataLength;
  USBSentLen = Min(USBSendLen, VIRTUAL_COM_PORT_DATA_SIZE);
  pUSBSendData = Data;
  USBSendStatus = TRUE;
  
  UserToPMABufferCopy(pUSBSendData, ENDP1_TXADDR, USBSentLen);
  SetEPTxCount(ENDP1, USBSentLen);
  SetEPTxValid(ENDP1);
  
  do{
    Counter--;
    
    if (Counter == 0)
    {
      return;
    }
  }while (USBSendStatus);
}

这个函数是十分好用的,但是还是存在 第一次设备接收数据后,设备一直在给PC发送数据的问题,这个问题应该是接收函数的问题。
此帖出自stm32/stm8论坛
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 

晕,没看懂

端点1是用来向PC发送数据的,你现在改了,又说函数十分好用,又说设备一直给PC发送数据,那到底是好用还是不好用阿?



还有,设备向PC发送数据的问题为什么是接收函数的问题?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 

re

while(1)
  {

    ...     
    USBCom_SentData(RecvBuffTemp, USBRecvLen);
  }
当然一直发。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 

re

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 

re

我的想法是,让主机给设备发一次数据,设备回一次数据,然后设备在次等待主机发送数据,设备再回一次数据,如此反复。第一个函数为设备接收函数,第二个函数为设备发送函数,发送函数测试过,没有问题,接收函数是有问题的。
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

8
 

RX

刚又仔细看了下你的代码,汗,整个流程都错了。

void USBCom_RecvPacket(u8 *Data)
{
  pUSBRecvData = Data;
  USBRecvLen = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy(pUSBRecvData,ENDP3_RXADDR,USBRecvLen);
  SetEPRxValid(ENDP3);
}
你的这段代码中的  
USBRecvLen = GetEPRxCount(ENDP3);
PMAToUserBufferCopy(pUSBRecvData,ENDP3_RXADDR,USBRecvLen);
这两句话,都应该是在端点3的接收完成后执行的,所以不能放在启动接收的代码中,而应放在端点3的OUT中断中,即EP3_OUT_Callback()中。而启动接收的代码应该是最简单的SetEPRxValid(ENDP3);

整个过程应该是使能端点3的RX -> PC发送数据 -> STM32产生端点3的OUT中断 -> 在中断中把PC发送的数据保存到用户管理的存储区中。-> 配置用户标志位,表示接收完成,同时再次使能端点3的RX,允许下次的数据接收。

简单说你的代码应该是:
main()
{
  ....
  SetEPRxValid(ENDP3);
  while(1){
    if(ReceiveFlag){
      USBCom_SentData(RecvBuffTemp, USBRecvLen);
      ReceiveFlag = 0;
    } 
  }
}

EP3_OUT_Callback()
{
  USBRecvLen  = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy((pUSBRecvData, ENDP3_RXADDR, USBRecvLen );
  SetEPRxValid(ENDP3);
  ReceiveFlag = 1;
}


此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 

NB,谢谢,感动。

                                 谢谢,太感动了,高手就是高手!
此帖出自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
快速回复 返回顶部 返回列表