门关键词: 频率选择用元件 热交换器的工作原理 森海塞尔入耳式耳机 工业防水插头 n73原配耳机 龙胜开关 钐镨钴磁钢
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
电子元器件搜索:
维库电子市场网是知名的电子元器件交易网站,为电子生产企业提供IC库存和技术资料查询服务。
[求助]基于ARM的USB通信问题
新闻出处:嵌入式技术网 发布时间: 2007-06-12
yang2007 发布于 2007-6-12 15:07:08

这是一段USB中断服务程序,找个明白人给分析一下

void ep0_isr(void)
{
u8_t usb_setup_pkg[8];
sl811hs_write(UsbIntStatusReg,EP0_DONE);

ep0a_status = sl811hs_read(EP0A_StatusReg);
ep0a_byte_rcv = sl811hs_read(EP0A_LenReg) - \ (这个符号的含义???)
   sl811hs_read(EP0A_TxCntReg);  

if(ep0a_status & EP_ACK)

{
  if(Slave_UsbAddr){
   sl811hs_write(UsbAddrReg,Slave_UsbAddr);
   Slave_UsbAddr=0;
  }
    if(ep0a_status & EP_SETUP)

{

   u8_t req_type;
   sl811hs_buf_read(EP0A_SLAVE_BUF,&setuppkg[setup_cnt][0],ep0a_byte_rcv);
   sl811hs_buf_read(EP0A_SLAVE_BUF,&usb_setup_pkg[0],ep0a_byte_rcv);
   setup_pkg_usb2arm(&dReq,&usb_setup_pkg[0]);
   setup_cnt++;
   len_req = (u8_t)dReq.wLength;
   in_buffer_idx = 0;
   IN_NULL = FALSE;
   IN_EXACT = FALSE;
   req_type = (dReq.bmRequestType & 0x60)>>5;
  
   switch(req_type){
    case STD_REQUEST: /* standard usb req */
     std_request_response();
     break;
    case CLASS_REQUEST: /* spce class req */
     class_request_response();
     break;
    case VENDOR_REQUEST: /* spec vendor req */
     sl811hs_write(EP0A_CtrlReg,SEND_STALL);
     break;
    default:  /* unsupported req */
     sl811hs_write(EP0A_CtrlReg,SEND_STALL);
     break;
   }//switch(req_type){
  }//if(ep0a_status & EP_SETUP){
  
   else{
   if(sl811hs_read(EP0A_CtrlReg) & DIRECTION){
       in_cnt++;
        if(len_req)

{
     u8_t data_seq;
     data_seq=(((sl811hs_read(EP0A_CtrlReg)&DATAX)==0)?1:0);
     len_tx=(len_req>=EP0_LEN)?EP0_LEN:len_req;
    
     if(FALSE==IN_NULL)
      EP0A_IN_Arm(EP0A_SLAVE_BUF+in_buffer_idx,len_tx,data_seq);
     else
      EP0A_IN_Arm(0,0,data_seq);
     in_buffer_idx+=len_tx;
     len_req-=len_tx;
    
     if(len_req==0 && len_tx==EP0_LEN && (FALSE == IN_EXACT)){
      len_req=1;
      IN_NULL=TRUE;
     }
    }
    else
     EP0A_OUT_Arm(EP0_LEN);
   }
   else

{
      out_cnt++;
    EP0A_OUT_Arm(EP0_LEN);
    
   }
  }
}

else if(sl811hs_read(EP0A_CtrlReg) & 0x20)
  EP0A_OUT_Arm(EP0_LEN);
}


关闭】 【打印
 
相关专题
 
友情链接:
© 2007 电子元件网 网站地图