CH374T + CP2102通讯问题,求大虾帮忙看看

使用STM32操作CH374T控制CP2102时,在读取CP2102数据时当掉。 CP2102能够正常枚举出来,但在CP2102_Res_Data获取接受长度时会死在里面 u8 CP2102_Res_Data(u8 *p ) { u8 result = 0; u8 count; result = WaitHostTransact374(mDiskBulkInEndp,DEF_USB_PID_IN,mSaveDevEndpTog,20); //1000); if(result!=USB_INT_SUCCESS) { return result; } else { count = CDeviceCH374t_SPIBus_ReadByte(REG_USB_LENGTH); CDeviceCH374t_SPIBus_ReadBuffer(RAM_HOST_RECV, count , p); mSaveDevEndpTog = mSaveDevEndpTog? FALSE : TRUE;; } return result; }

void CDeviceCH374t_USBDeviceUse() { u8 s; u8 buf[250]; if (Query374DeviceIn()) { if(uid == 0x10C4 || pid == 0xEA60) { s=CP2102_Start_stop(0x0001); if(s != USB_INT_SUCCESS) { usbStatus = USB_FREE; return; } s = CP2102_Uart_Bound(19200); if(s!=USB_INT_SUCCESS) { usbStatus = USB_FREE; return; } s=CP2102_Uart_Bit(0x0810); if(s!=USB_INT_SUCCESS) { usbStatus = USB_FREE; return; } CP2102_Res_Data(buf); s = CP2102_Start_stop(0x0000); if(s != USB_INT_SUCCESS) { usbStatus = USB_FREE; return; }

} } else { HostSetBusFree( ); // USB总线空闲 usbStatus = USB_FREE; }

}

枚举的过程是不是一定正确?如果都正确的话,说明374T和CP2102通信没有问题,接下来你得注意CP2102的用法了,比如您发的端点号对不对,发IN令牌的时间间隔


枚举过程是OK的,能正确的识别到CP2102,端点号是通过配置描述符获取的 void CP2102_Get_PortAndEndpoint(u8 *buf) { u8 i; mDiskInterfNumber = ( (PUSB_CFG_DESCR_LONG)buf ) -> itf_descr.bInterfaceNumber; /* ??? */ mDiskBulkInEndp = 0; mDiskBulkOutEndp = 0; for ( i = 0; i < 2; i ++ ) { if ( ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].wMaxPacketSize == 64 && ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bmAttributes == 2 ) { if ( ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bEndpointAddress & 0x80 ) { mDiskBulkInEndp = ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F; /* IN?? */ } else { mDiskBulkOutEndp = ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F; /* OUT?? */ } } } } 我是第一次用CH374T,不太了解IC寄存器设定,我Debug了result = WaitHostTransact374(mDiskBulkInEndp,DEF_USB_PID_IN,mSaveDevEndpTog,20),result在第一次收取的时候是0x14,第二次收取的时候变为0x2A,这说明什么?


0x2a表示设备正在忙,超时参数可以调大点,你前面的枚举过程通过了,说明通信没有问题了,我不太了解CP2101,接下来就是您按CP2101的手册来操作它了


谢谢,确认了一下,当CP2102有串口输入时,会有输出,此时CH374T状态会变为0x14. 而CP2102没有输入时,此时做读取操作会返回0x2A.


返回0X2A表示设备忙,也就是USB那部分返回NAK。表示串口没有数据。和你描述的现象是完全一致的。


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