请教当发生 USB 错误USTS c00000012 ,时USB的上传端口就会被挂起,无法再次发送任何数据。因为无法完全杜绝产生这个错误,那么在usb的中断里面是否有相应的中断,然后在中断里面去处理?
您好,该问题应该是由于电脑识别到上传的数据不对产生的,麻烦你可以将完整的抓包数据发至我的邮箱(lzs@wch.cn)这边看一下,其次麻烦你告知一下模拟的是一个什么设备,此外你可以检查一下枚举过程中设置的端点包大小是否和数据实际上传过程中的一致。后续若有问题,也可通过邮箱和我沟通。
是这样的,比如上位机从端口4发送一帧命令,然后监听端口2
正常的情况下,下位机应该返回4个字节的应答帧,但是因为一些其他原因返回了3个字节的数据,这个时候就会触发这个错误。并且usb的端口再也无法发送任何数据到电脑。
用BUS HOUND 模拟的情况也是如此,比如下位机上传的是3个字节读数据,但是读取的时候读4个字节就会发生这样的错误。
现在是如果发生错误了,下位机这边在也无法上传任何数据,接收是正常的。该怎么判断发送了这错误是否有相应的中断。
你好,出现这种错误的原因大概是,MCU上传的数据不符合某种标准,导致上位机报错,可以检查MCU部分的代码是否有错误,MCU没有办法产生这种错误中断。
如果下位机无法避免这种问题,上位机出现报错之后,可以查找是否有相关API处理。
可以将相关上位机软件和MCU的代码发送到邮箱zc@wch.cn
void USB_SendData2 (uint8_t bEpNum, uint8_t *p_data, uint32_t num)
{
uint32_t remain = num;
uint32_t index = 0;
while (remain >= 64) //??????64??
{
// while (SendOverFlag != 1); SendOverFlag = 0;
USB_SendData(bEpNum,(p_data+index),64);
index += 64; //??????????
remain -= 64;
//delay_us(500);//等待发送完成
}
//while (SendOverFlag != 1); SendOverFlag = 0;
USB_SendData(bEpNum,(p_data+index),remain);
}
这个是我USB 上传的函数,usb的最大包64个字节,经常出现实际只上传了1个字节就不能再上传了。(电脑USB监听软件看到)。
板子上传超过最大的缓冲区64字节循环发送直到发送完数据包,有时候发现原来是要发送0x1ff个字节的数据包,结果只发送了第一个字节比如只发送了上图中的0X53 第一个字节,之后USB 就在也不能上传任何数据了必须从其CPU
就像这样,通信协议是上位机发送21 0D 0A 2A 0D 0A 后下位机上传数据包,不知道什么原因有时候就只能上传一个字节
上传的是0X1FF字节 实际只上传了一个字节
这是发送问题时仿真时看到的数据,所以问题应该出在usb的上传函数部分
USB的传输机制和注意事项可以参考这两个帖子
https://www.cnblogs.com/wchmcu/p/17913838.html
https://www.cnblogs.com/wchmcu/p/17508110.html