使用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());
}
该如何修改一下或者哪里有问题才能解决此问题把设备返回来的数据正常全部接收下来?谢谢了。