关于CH376作HOST的问题请教

现在的问题又回到了发送的上面,在逻辑分析仪的抓包中,可以看到发送的端点,地址和数据都是正常的。在进入CDC设备的调试后,也在接收端点的回调函数中进行调试,发现数据并未到达该设备接收端点的缓存区域。此问题得结合设备进行排查。

最后,感谢技术大佬的解答。


@~~稻草人

你好,我仍一直在尝试CH376的发送数据。目前就是在CDC设备仍不会进行接收来自CH376数据,用逻辑分析仪,USBLyzer等工具进行抓包,在电脑PC下传和CH376主机下传的数据、地址、包格式等都一致 ,只有PC下传CDC设备能够响应。CDC设备是STM32基于USB OTG的设备。在CDC的调试代码调试中加入断点,PC下传能够正常进入断点,CH376下传则不去触发。

数据接收已经能够正常进行。

另外,我将CH376作为从机的时候,电脑能够将设备枚举,在设备管理器中出现了CH372_CDC设备的标志。但显示小黄标,点开显示是驱动无正常安装。工程移植自CH376做CDC设备进行通信的例程。


发送程序能够正常下发,贴上我的发送代码。

/* 主机发送数据块,一次最多64KB */
void send_data( uint8_t len, uint8_t *buf )
{  
    uint8_t l, s;
    
    while( len ) /* 连续输出数据块给USB打印机 */
    {  
        if((send_mode &0x40) == 0x40)        
        {
            send_mode = 0x00;
        }
        else
            send_mode = 0x40;

        toggle_send( tog_send );      /* 数据同步 */    
        l = len>endp_out_size?endp_out_size:len;  /* 单次发送不能超过端点尺寸 */
        WR_USB_DATA( l, buf );      /* 将数据先复制到CH375芯片中 */
        issue_token(send_mode, ( endp_out_addr << 4 ) | DEF_USB_PID_OUT );
        s = wait_interrupt();          /* 请求CH375输出数据 */      
        if ( s == USB_INT_SUCCESS ) /* CH375成功发出数据 */
        {  
            tog_send = ~ tog_send;  /* 切换DATA0和DATA1进行数据同步 */
            len-=l;          /* 计数 */
            buf+=l;          /* 操作成功 */
            if(!len)
            {
                printf("USB Send Data Success\r\n");
            }
        }
        else
        {  /* 操作失败,正常情况下不会失败 */
        //    clr_stall( endp_out_addr );  /* 清除打印机的数据接收端点,或者 soft_reset_print() */
/*            soft_reset_print();  打印机出现意外错误,软复位 */
            soft_reset_cdc( );
            tog_send = 0;  /* 操作失败 */
            printf("USB never Back data, and over time\r\n");
            return;
        }
    }
}

接收函数仍有点小BUG,暂时不贴。


贴上接收代码

//用中断的方式去触发中断
uint8_t receive_data(uint8_t *buf)
{
    uint8_t s,len;
    for(uint8_t i=0; i!= 10; i++)
    {
        toggle_recev(tog_recv);
        issue_token(0x80, (endp_in_addr << 4)| DEF_USB_PID_IN);    //endp_in_addr 0x81
        s = wait_interrupt();    
//        Delay_ms(100);    
//        Delay_ms(100);    
        printf("status is 0x%02x\r\n",s);
        if(s == USB_INT_SUCCESS)
        {
            tog_recv = ~tog_recv;
            len = RD_USB_DATA(buf);        

            clr_stall( endp_in_addr );
            return len;
        }
        else
        {
            tog_recv = 0;
            clr_stall( endp_in_addr );
            return 0;
        }
    }
}
代码能够接收来自设备的数据,但当设备发送数据过频繁,导致接收缓存溢出,此函数接收的数据会错误。


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