打印

如何解决外部中断对USB数据传输的影响?

[复制链接]
2149|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyx_200|  楼主 | 2012-10-7 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yyx_200 于 2012-10-7 20:00 编辑

先上程序.


void sendToENDP3(void)
{
if(section_count > 0) // 还有未接收剩余数
{
     // 缓冲中现有未发出数据大于等于一个包处理
  if( demo_data_count >= EVB_USB_BUF_SIZE )
  {
     demo_data_count -= EVB_USB_BUF_SIZE; // 重新计算缓冲中现有未发出数据长度
    section_count --;                    // 计算剩余数

   // 双缓冲处理 ----------------------------------------------------------
   if(_GetENDPOINT(ENDP3) & EP_DTOG_RX)
   {
    UserToPMABufferCopy(pOutput, ENDP3_TXADDR0, EVB_USB_BUF_SIZE);
    _SetEPDblBuf0Count(ENDP3,EP_DBUF_IN,EVB_USB_BUF_SIZE);
   }else{
    UserToPMABufferCopy(pOutput, ENDP3_TXADDR1, EVB_USB_BUF_SIZE);
    _SetEPDblBuf1Count(ENDP3,EP_DBUF_IN,EVB_USB_BUF_SIZE);
   }
   _SetEPTxStatus(ENDP3, EP_TX_VALID);
   // 移动上传数据起始指针 ------------------------------------------------
   pOutput += EVB_USB_BUF_SIZE;
   // if( pOutput >= demodata + DEMO_DATA_MAX_BUFFER_SIZE ){
   if( pOutput >= pMAXIntput ){// 优化指针
    pOutput  = demodata;
   }
#if 0
   // 做个假数据 ----------------------------------------------------------
   if(demo_data_count < 1 ){  // 做个假数据
    if(section_count>1)
    demo_data_count = 8192;
   }
#endif
  
// ---------------------------------------------------------------------
   
   _ToggleDTOG_RX(ENDP3);
  }


// 大量数据上传处理--------------
void EP3_IN_Callback(void)
{
sendToENDP3();
}

我写了一个STM32程序,用于接收外部器件产生的数据流. 我用两个GPIO接到这个器件上.一个GPIO为clk输入端,另一个GPIO为sdo输入端,这个器件产生时钟和数据.每个时钟的周期是4uS,由于接收外部器件的数据实时性强,我用了外部中断方式,采集数据,并用个32k的buffer空间作为环形队列保存采集到的数据,stm32 根据时钟产生的串行数据流,通过stm32 的usb接口用BULK模式上传到PC,我用的是双缓冲上传,上传速度已经达到1M/s .当用假数据上传到PC时,USB传送正常,但打开外部中断后,却发生队列溢出问题,后来发现是每4US中断干扰了UserToPMABufferCopy 数据的传输.使usb传输变慢导致溢出. 请问各位大侠,如何解决这个问题?
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

40

帖子

0

粉丝