书接上文,上回修改了代码以后程序已经正常运行了,上传的数据也非常正常没有丢包。
然后我在测试的时候向电脑上插了两个CH569,他在上传了1000多个包以后又出现了
这个错误。
无法理解,同一个USB设置了独占的,用CH375那个DLL的官方数据上传函数接口,按理说不应该就对这个IO进行读写嘛?为什么我插入另一个CH569会对这个CH569造成影响
书接上文,上回修改了代码以后程序已经正常运行了,上传的数据也非常正常没有丢包。
然后我在测试的时候向电脑上插了两个CH569,他在上传了1000多个包以后又出现了
这个错误。
无法理解,同一个USB设置了独占的,用CH375那个DLL的官方数据上传函数接口,按理说不应该就对这个IO进行读写嘛?为什么我插入另一个CH569会对这个CH569造成影响
补充一下,可以排除原来修改的固件程序本来就会导致这个报错卡死这个可能性,我用那个程序连接单个CH569跑了两天数据没有卡死和丢包,插上另一个CH569后1分钟之内必定报这个错误并卡死。
关键代码如下:
void EP1_IN_Callback(void)
{
UINT8 nump;
nump = USB30_IN_Nump(ENDP_1); //nump: 剩余待发送包数量
switch(nump)
{
case 0://全部发完
R32_PA_OUT |= ( 1 << 8 );
R32_PA_OUT &= ~( 1 << 8 ); //这个标志位别清除,虽然不知道为什么,但是清除就传一会儿数据以后报错
USB30_IN_ClearIT(ENDP_1); //清除端点状态 仅保留包序列号
HSPI_Rx_Notice_Status=1;
break;
default://还剩一包未发完; 在突发过程中主机可能一次不能取走全部的数据包 因此要判断当前剩余包数量 通知主机还有几包未取,end of burst位需写enable
R32_PA_OUT |= ( 1 << 8 );
R32_PA_OUT &= ~( 1 << 8 ); //这个标志位别清除,虽然不知道为什么,但是清除就传一会儿数据以后报错
USB30_IN_ClearIT(ENDP_1); //清除端点状态 仅保留包序列号
USB30_IN_Set(ENDP_1, ENABLE, ACK, nump, 1024); //能够发送1包
USB30_Send_ERDY(ENDP_1 | IN, nump);
break;
}
}
void HSPI_IRQHandler( void )
{
static UINT32V addr_Cnt=0;
if( R8_HSPI_INT_FLAG & RB_HSPI_IF_R_DONE )
{
/* 单包接收完成中断 */
R8_HSPI_INT_FLAG = RB_HSPI_IF_R_DONE;
if(addr_Cnt%2)
{
R32_HSPI_RX_ADDR0 = (UINT32V)(UINT8 *)DEF_HPSI_DMA_RX_ADDR0;
USBSS->UEP1_TX_DMA = (UINT32V)(UINT8 *)DEF_HPSI_DMA_RX_ADDR1; //突发传输 DMA地址偏移 需重重置
}
else
{
R32_HSPI_RX_ADDR1 = (UINT32V)(UINT8 *)DEF_HPSI_DMA_RX_ADDR1;
USBSS->UEP1_TX_DMA = (UINT32V)(UINT8 *)DEF_HPSI_DMA_RX_ADDR0; //突发传输 DMA地址偏移 需重重置
}
addr_Cnt++;
USB30_IN_ClearIT(ENDP_1); //清除端点状态 仅保留包序列号
USB30_IN_Set(ENDP_1, ENABLE, ACK, DEF_ENDP1_IN_BURST_LEVEL, 1024); //能够1号端点能发送HSPI_Rx_Data_LoadNum包
USB30_Send_ERDY(ENDP_1 | IN, DEF_ENDP1_IN_BURST_LEVEL); //通知主机取HSPI_Rx_Data_LoadNum包
}
else if( R8_HSPI_INT_FLAG & RB_HSPI_IF_FIFO_OV )
{
/* FIFO溢出中断 */
R8_HSPI_INT_FLAG = RB_HSPI_IF_FIFO_OV;
}
}
实际就是让DMA交替对两片存储空间存入HSPI数据和读出USB数据,mian函数的死循环中并没有进行任何处理。
在USB读出速度远大于HSPI接收速度的情况下,理论上绝对不会丢包。
继续补充,我测试了官方的代码和一些大佬开源的代码,发现他们一般都会在main函数的死循环中对ERDY包进行处理,而我是在HSPI中对ERDY包进行处理,会不会是这个原因导致的,我修改了程序进行相关测试,发现确实在Main函数的死循环中进行处理后插入多个USB极少会出现这个报错
查询百度后我可以知道的就是,上诉的C0000011错误出现在上位机询问下位机多次无反应后产生
由此我产生了一个疑问,到底是什么原因导致我上述代码出现这种报错,是否是用HSPI发送令牌包导致的错误。多个CH569的通讯处理机制上DLL莫非会询问其他CH569?
我无法理解,并希望获得解答。再次感谢