现在的问题又回到了发送的上面,在逻辑分析仪的抓包中,可以看到发送的端点,地址和数据都是正常的。在进入CDC设备的调试后,也在接收端点的回调函数中进行调试,发现数据并未到达该设备接收端点的缓存区域。此问题得结合设备进行排查。
最后,感谢技术大佬的解答。
现在的问题又回到了发送的上面,在逻辑分析仪的抓包中,可以看到发送的端点,地址和数据都是正常的。在进入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;
}
}
}
代码能够接收来自设备的数据,但当设备发送数据过频繁,导致接收缓存溢出,此函数接收的数据会错误。