CH375B总是初始化失败,返回值0x51

使用STM32串口操作CH375BUSB主机,一直初始化不成功,返回0x51.主要函数如下:

void CH375_WR_CMD_PORT( unsigned char cmd ) {  
 short cmd_data=0;
 delay2us();
 cmd_data=cmd+0x0100;
 USART_SendData( USART2, cmd_data);
 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); 
 delay2us();
}

void CH375_WR_DAT_PORT( unsigned char dat ) {
 USART_SendData( USART2, dat);
 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);  
// delay1us(); 
}

unsigned char CH375_RD_DAT_PORT() { 
 delay_us(1);
 while(USART_GetITStatus  (USART2, USART_IT_RXNE) == SET){}
 return(  USART_ReceiveData(USART2));
}

unsigned char wait_interrupt() {
 char i=0;
 while( KEY2 !=0 ){} 
 CH375_WR_CMD_PORT( CMD_GET_STATUS ); 
 i=CH375_RD_DAT_PORT();

 return( i );
}

初始化函数如下:

void CH375_init() {
 unsigned char i=0,RD_Data=0,k=0;
 delay_ms(500);
 uart2_init(9600);
 for( k=100; k!=0; k-- )
 {
 CH375_WR_CMD_PORT( CMD_CHECK_EXIST )

 i = 0x5A;
 CH375_WR_DAT_PORT( i ); 
 i = ~i; 
 RD_Data = CH375_RD_DAT_PORT();         
此处返回值正确
 printf("%d \n",RD_Data);
 if ( RD_Data != i ) 
 {
  for ( i=5; i!=0; i-- )
  {
   CH375_WR_CMD_PORT( CMD_RESET_ALL ); 
  }
  delay_ms(50); 
 }
 else break;
 }

 do
 {
  delay_ms(10); 
  i=set_usb_mode( 6 );          
此处返回值正确,设置成功 
  printf("%d ok \r\n",i); 
 }while(i==0);
 while(1)
 { 
  while ( wait_interrupt()!=USB_INT_CONNECT ); 

此处一直通不过,wait_interrupt()一直返回的是0x51,只有当USB设备拔出的瞬间才会返回0x15


电路图如下,其中V3和Vcc有短路,只使用了INT#、TXD、RXD三个脚。USB的D+和D-也没有接错。


image.png


请麻烦检查下哪里有问题,万分感谢!


while(USART_GetITStatus  (USART2, USART_IT_RXNE) == SET){}
这里是不是有问题?



这条没有问题啊,就算改成while(USART_GetITStatus  (USART2, USART_IT_RXNE) != RESET){}或者if(USART_GetITStatus  (USART2, USART_IT_RXNE) == RESET)都是一样的

很奇怪的是当我拔出设备的时候就能成功返回USB_INT_CONNECT

用示波器看的话INT#脚有两次低电平,第一次时间较长,第二次时间较短,间隔几个ms


参考一下底层串口写法:

  * Function Name  : CH375_WR_CMD_PORT
  * Description    : 写命令
  * Input          : 命令码
  * Return         : None
  */
void CH375_WR_CMD_PORT( unsigned char cmd )//第9位=1
 {
 USART_SendData(UART2_UART, (uint16_t)cmd|0x0100);
 while(USART_GetFlagStatus(UART2_UART,USART_FLAG_TXE)==RESET);
 mDelay1us(5);
}

/**
  * Function Name  : CH375_WR_DAT_PORT
  * Description    : 写数据
  * Input          : 数据
  * Return         : None
  */
void CH375_WR_DAT_PORT( unsigned char dat ) //第9位=0
{
 USART_SendData(UART2_UART, (uint16_t)dat);
 while(USART_GetFlagStatus(UART2_UART,USART_FLAG_TXE)==RESET);
 mDelay1us(5);
}

/**
  * Function Name  : CH375_RD_DAT_PORT
  * Description    : 读数据
  * Input          : None
  * Return         : 数据
  */
unsigned char CH375_RD_DAT_PORT(void)
{
 mDelay1us(5);
 while(USART_GetFlagStatus(UART2_UART,USART_FLAG_RXNE)==RESET);
 
 return( (uint8_t)USART_ReceiveData(UART2_UART) );
}


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