使用CH32F103C8作为USB主机与CH340通信问题,

您好!将CH559操作CH340代码移植到CH32F103C8中,出现以下问题

1、CH32接收数据成功一次与失败一次交替出现

2、CH32接收数据和发送数据不能并存,CH只能发送一次数据,接收数据成功与失败交替出现。如果加代码InitRootDevice( Com_Buffer );在发送数据前面 每次循环能够发出数据 ,但是不能接收数据。

3、使用CH559移植的接收和发送函数 TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6);和RXDUsbCH341BulkIn();

不想换芯片,希望能够得到帮助!谢谢!



主循环代码:

s = ERR_SUCCESS;

       if ( R8_USB_INT_FG & RB_UIF_DETECT )

{  

    R8_USB_INT_FG = RB_UIF_DETECT ; 

    s = AnalyzeRootHub( );   

   if ( s == ERR_USB_CONNECT ) 

   {

     printf( "New Device In\r\n" );

    FoundNewDev = 1;

 }

 if( s == ERR_USB_DISCON )

{

printf( "Device Out\r\n" );

}

   }

if ( FoundNewDev || s == ERR_USB_CONNECT ) 

FoundNewDev = 0;

Delay_Ms( 200 ); 

s = InitRootDevice( Com_Buffer );  

if ( s == ERR_SUCCESS ) printf( "Device Enum Succeed\r\n" );

else printf( "Device Enum Failed\r\n" );

}

   if(ThisUsbDev.DeviceStatus == ROOT_DEV_SUCCESS)

    {

        InitRootDevice( Com_Buffer );//用于多次发送数据  没有这句只能发送一次

        TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6);

   RXDUsbCH341BulkIn();  // 341批量接收

    }


函数TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6)代码:

UINT8TXDUsbCH341BulkOut( PUINT8 pBuf,UINT8 len )  // 341批量发送

{

  UINT8 TxCnt,s,endp;

  endp = ThisUsbDev.GpVar[2];

while ( len ) {

//printf("len:%d\r\n",len);

Delay_Us( 200 );

R8_UH_TX_LEN = len >= 32 ? 32 : len;

//printf("TX Len:%d\r\n",R8_UH_TX_LEN);

for ( TxCnt = 0; TxCnt != R8_UH_TX_LEN; TxCnt ++ ) {

pHOST_TX_RAM_Addr[ TxCnt ] = *pBuf;

pBuf ++;

}

//printf("USB_PID_OUT:%x\r\n",USB_PID_OUT);

s = USBHostTransact( USB_PID_OUT << 4| (endp & 0x7F) , endp & 0x80 ?  R8_UH_RX_CTRL | R8_UH_TX_CTRL : 0, 10 );  // OUT数据

if ( s == ERR_SUCCESS ){ 

len -= R8_UH_TX_LEN;//R8_UEP2_T_LEN;

endp ^= 0x80;  // 同步标志翻转

ThisUsbDev.GpVar[2] = endp;  // 保存同步标志位

//printf("ERR_SUCCESS\r\n");

}

    else return( s );

}

  return ERR_SUCCESS;

}

函数RXDUsbCH341BulkIn()代码:

UINT8RXDUsbCH341BulkIn( void )  // 341批量接收

{

    UINT8 i,s,len,endp = ThisUsbDev.GpVar[1];

s = USBHostTransact( USB_PID_IN << 4 | (endp & 0x7F), endp & 0x80 ? R8_UH_RX_CTRL | R8_UH_TX_CTRL : 0, 10 );  

if ( s == ERR_SUCCESS ) {

endp ^= 0x80;  // 同步标志翻转

ThisUsbDev.GpVar[1] = endp;  // 保存同步标志位

len = R8_USB_RX_LEN;  // 接收到的数据长度

if ( len ) {

printf("CH341 In data: \n");

for ( i = 0; i < 32; i ++ ) printf("x%02X ",(UINT16)(pHOST_RX_RAM_Addr[i]) );

printf("\n");

}

      return len;

}

else if ( s != ( USB_PID_NAK | ERR_USB_TRANSFER ) ) printf("CH341 error %02x\n",(UINT16)s);  // 可能是断开了

    return 0;

}


icon_rar.gifCH32F103操作CH340.zip

你好,附件是CH32F103操作CH340的例程,将CH340的TX接RX,可实现将下传的数据再回传。效果如图所示:

image.png


谢谢


我用上面例程移植到CH32V103C8T6上,能接受数据,但数据发不出去,这什么原因


您好,@只会吃瓜,关于你的问题已在你的发帖下回复,这边使用你的例程测试与CH340N通信是没有问题的,可以检查一下是否是CH340N出现问题或者接线问题等,后续若有问题,可将问题发我邮箱(lzs@wch.cn)联系。



用这个源码,一直到32V103上。数据能发送和接收。但是波特率都被减少了一半。求指点。


刚才有测试了下,设为115200,设正常的。但是设为9600,实际是4800.


你好,需要看一下设置9600波特率的指令是否正确,可以抓一下电脑端配置CH340 9600波特率下发的USB指令,比对一下程序下发的是否一致。出问题的原因猜测是下发配置指令不对。


说的太专业了。我们菜鸟抓瞎。不如直接提供数据。这类底层驱动厂家要是封装完善好了,能大大降低应用难度。


UINT8   SetupSetBaud1152[] = { 0x40, 0xA1, 0x0c, 0x00, 0x03, 0xCC, 0x00, 0x00 };//115200bps

UINT8   SetupSetBaud9600[] = { 0x40, 0xa1, 0x9c, 0xc3, 0x83, 0xcc, 0x00, 0x00 };

                          // { 0x40, 0xA1, 0x0c, 0x00, 0x02, 0x62, 0x00, 0x00 };//9600bps

UINT8   SetupSetBaud600[] =  { 0x40, 0xA1, 0x0c, 0x00, 0x01, 0x64, 0x00, 0x00 };//600bps



115200和600的数据是可以的。9600的不行。求9600的数据。



icon_rar.gifCH32V103C8T6_one.zip



请大侠帮忙指点下,哪里有问题?


如微信沟通 是下发波特率指令错误,可以通过抓电脑下发CH340配置指令获取正确的指令数据。


请问 ,用UINT8   SetupSetBaud1152[] = { 0x40, 0xA1, 0x0c, 0x00, 0x03, 0xCC, 0x00, 0x00 };//115200bps 配置波特率后,如何进行校验位的修改呢



我的邮箱是wangyy@wch.cn,留个邮箱我们解答一下你的疑问。


请教一下,CH32F103C8和CH340的硬件连接有图吗,D-连接D-,D+连接D+吗,VUSB需要连接吗


您好,连接方式D-接D-,D+接D+,GND接GND,+5V接+5V,一一对应连接就可以了。


嗨,十几画。 你能把ch559和ch340的交互代码扔掉吗?


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