376S做主机跟USB设备之间交换数据只能读取前64字节

使用STM32串口控制376S当USB host,在发送完数据给USB设备后能正常的收到设备返回的前64个字节数据,再次启动接收,设备就返回NAK了,具体的代码实现如下:


//设置重试次数-不重试,NAK状态返回

Write_CH376_Cmd(CMD_SET_RETRY);

Write_CH376_Data(0x25);

Write_CH376_Data(0x00);

endp6_mode = endp7_mode=0x80;                 //DATA0发送器

sta = 0;

WR_USB_Data(4,(unsigned char *)"001?");            //USB host 发送此命令给USB 设备,设备会返回200个字节的数据

Toggle_send();

sta = Issue_token(Out_Num,DEF_USB_PID_OUT);

if(sta == USB_INT_SUCCESS)

{

Uart3_Rx = 0;

for(i=0;i<0xFF;i++)

{

sta = 0;

Toggle_recv();

sta = Issue_token(In_Num,DEF_USB_PID_IN);

if(sta == USB_INT_SUCCESS)                                        //前面两次可以返回)0X14,之后就之一返回NAK

{

memset(Uart3.RX_BUF,0,BUFF_LEN);                    //Uart3.RX_BUF:串口接收数据缓冲区

Uart3_Rx = 0;                                                        //Uart3_Rx:串口中断次数

Write_CH376_Cmd(CMD_RD_USB_DATA0);

USB_Delay_us(380000);                                        //由于使用的时串口中断接收,所以在发送完命令后                                                                                                        延时一段时间,等待串口接收完设备DATA0或者DATA1的数据。

sta = 0;

}

}

}


void Toggle_recv(void) 

{  

Write_CH376_Cmd(CMD_SET_ENDP6);//向CH375的端点缓冲区写入准备接收的数据

Write_CH376_Data(endp6_mode);

endp6_mode^=0x40;

USB_Delay_us(20);

}

uint8_t Issue_token(uint8_t endpnum, uint8_t pid) 

{  

Write_CH376_Cmd(CMD_ISSUE_TOKEN);         //向CH375的端点缓冲区写入准备发送的数据

Write_CH376_Data((endpnum<<4)|pid);//高4位目的端点号, 低4位令牌PID

return (Wait_interrupt());

}

该如何修改一下或者哪里有问题才能解决此问题把设备返回来的数据正常全部接收下来?谢谢了。

你好,当主机发IN包接收到数据后需要切换同步标志实现数据同步,你可以在if(sta == USB_INT_SUCCESS)   下添加toggle_recv()函数切换同步标志。


有切换同步标志啊,那个for循环里面就是有切换同步标志的,for循环里面就只能接收到前两个32字节数据的接收,第三次切换完同步标志Toggle_recv();,发送完Issue_token(In_Num,DEF_USB_PID_IN)命令后中断就一直返回NAK了


您好,看代码初步判断流程出问题的概率不大,如果是一直返回NAK,有可能是设备确实没有准备好数据返回。可以在电脑端用Bus Hound软件看一下在正常通讯下数据交互的情况,对比一下两种情况下是不是少做了什么操作。


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