CH579开发RNDIS,USB卡死问题

C0010000.png



CH579开发RNDIS,功能都ok,测试ARP,Ping,udp,TCP一切正常

现在碰到一个棘手问题,网络发小数据量一切正常,如果持续发大数据量,跑3~10分钟左右,USB会出现卡死,接着就进入SUSPEND中断,重新复位,如此往复几次

最后就停在SETUP OUT0类请求0x21上,C0010000

错误定位在OUT端点上,其他上传端点没有问题

会不会是翻转,回复ACK 这些没有处理好

USB卡死时,CH579其他功能正常,并没有异常产生,就卡死在USB上


另有个疑问,Bluk传输是不是每次接收到数据,不管是不是64byte,都要上传0包,还是接收完整个贞数据再上传,比如一个包有650byte,接收完650byte再回复0?


以下是OUT端点代码:

修改原因:乱码,看楼下代码


晕死,编码都乱了


//----------------------------------------------------------

case UIS_TOKEN_OUT://控制端点0                 
    len = R8_USB_RX_LEN;          
    if(SetupReqCode==0x00) //0x21 00 00 00 00 00 xx xx /卡死位置
    {                  
        if ( (R8_USB_INT_ST & RB_UIS_TOG_OK) ) // 不同步的数据包将丢弃
        {
            memcpy((uint8_t*) &rndis_buffer[0], pEP0_DataBuf, len);  
            make_rndis();                                 

            R8_UEP0_T_LEN = 0;
            R8_UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_ACK; // 准备上传0包

        }

    }      
    else//其他请求
    {
        R8_UEP0_T_LEN = 0;
        R8_UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_NAK; //状态阶段,对IN响应NAK
    }  

    R8_UEP0_CTRL ^= RB_UEP_R_TOG;//同步标志位翻转
break;

//-------------------------------------------------------------------

case UIS_TOKEN_OUT | 3: //端点3 Out / RNDIS 64byte PC->USB        

    LAN_DATA_LED_INV(); //数据LED闪
    R8_UEP3_CTRL ^= RB_UEP_R_TOG;   //一定要翻转,卧槽,不能自动
    if ( (R8_USB_INT_ST & RB_UIS_TOG_OK) ) // 不同步的数据包将丢弃
    {                                              
        GPIOB_InverseBits(GPIO_Pin_0);  //测试LED翻转                        
        len = R8_USB_RX_LEN;                                                            
        if ( (rndis_received + len) < RNDIS_ETH_LEN)
        {      
            memcpy(&usb_tmp_buf[rndis_received], pEP3_OUT_DataBuf, len);
            rndis_received += len;

            if(len < 64 )   //整包接收完全
            {
                rndis_received = 0;
                eth_process();
            }
        }
        else
        {
            rndis_received = 0;
        }
    }

    R8_UEP3_T_LEN = 0;
    R8_UEP3_CTRL |= UEP_R_RES_ACK | UEP_T_RES_ACK; // 准备上传0包
break;


case UIS_TOKEN_IN | 3:  //端点3          
    R8_UEP3_CTRL ^= RB_UEP_T_TOG;
    R8_UEP3_T_LEN = 0;  
    R8_UEP3_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_NAK;    //默认应答NAK
break;



还有一个问题,复位后,OUT3有时会出现


LAN_DATA_LED_INV(); //会闪
if ( (R8_USB_INT_ST & RB_UIS_TOG_OK) ) // 不同步的数据包将丢弃
{
    GPIOB_InverseBits(GPIO_Pin_0);  //不会闪 
    ...
}


同步前的LED灯会闪,同步后的灯不闪,说明接收到的数据都是不同步的。

其他端点数据正常,就OUT3 bluk有问题,所以怀疑是OUT3造成的SETUP 0x21卡死


您好,修改建议放到https://www.wch.cn/bbs/thread-113145-1.html这个帖子里一并回复。


只有登录才能回复,可以选择微信账号登录