使用CH32F103C8作為USB主機(jī)與CH340通信問題,

您好!將CH559操作CH340代碼移植到CH32F103C8中,出現(xiàn)以下問題

1、CH32接收數(shù)據(jù)成功一次與失敗一次交替出現(xiàn)

2、CH32接收數(shù)據(jù)和發(fā)送數(shù)據(jù)不能并存,CH只能發(fā)送一次數(shù)據(jù),接收數(shù)據(jù)成功與失敗交替出現(xiàn)。如果加代碼InitRootDevice( Com_Buffer );在發(fā)送數(shù)據(jù)前面?每次循環(huán)能夠發(fā)出數(shù)據(jù) ,但是不能接收數(shù)據(jù)。

3、使用CH559移植的接收和發(fā)送函數(shù)?TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6);和RXDUsbCH341BulkIn();

不想換芯片,希望能夠得到幫助!謝謝!



主循環(huán)代碼:

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 );//用于多次發(fā)送數(shù)據(jù)? 沒有這句只能發(fā)送一次

? ? ? ? TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6);

? ?RXDUsbCH341BulkIn();? // 341批量接收

? ? }


函數(shù)TXDUsbCH341BulkOut((PUINT8)tmpBuf, 6)代碼:

UINT8TXDUsbCH341BulkOut( PUINT8 pBuf,UINT8 len )? // 341批量發(fā)送

{

? 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數(shù)據(jù)

if ( s == ERR_SUCCESS ){?

len -= R8_UH_TX_LEN;//R8_UEP2_T_LEN;

endp ^= 0x80;? // 同步標(biāo)志翻轉(zhuǎn)

ThisUsbDev.GpVar[2] = endp;? // 保存同步標(biāo)志位

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

}

? ? else return( s );

}

? return ERR_SUCCESS;

}

函數(shù)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;? // 同步標(biāo)志翻轉(zhuǎn)

ThisUsbDev.GpVar[1] = endp;? // 保存同步標(biāo)志位

len = R8_USB_RX_LEN;? // 接收到的數(shù)據(jù)長(zhǎng)度

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,可實(shí)現(xiàn)將下傳的數(shù)據(jù)再回傳。效果如圖所示:

image.png


謝謝


我用上面例程移植到CH32V103C8T6上,能接受數(shù)據(jù),但數(shù)據(jù)發(fā)不出去,這什么原因


您好,@只會(huì)吃瓜,關(guān)于你的問題已在你的發(fā)帖下回復(fù),這邊使用你的例程測(cè)試與CH340N通信是沒有問題的,可以檢查一下是否是CH340N出現(xiàn)問題或者接線問題等,后續(xù)若有問題,可將問題發(fā)我郵箱(lzs@wch.cn)聯(lián)系。



用這個(gè)源碼,一直到32V103上。數(shù)據(jù)能發(fā)送和接收。但是波特率都被減少了一半。求指點(diǎn)。


剛才有測(cè)試了下,設(shè)為115200,設(shè)正常的。但是設(shè)為9600,實(shí)際是4800.


你好,需要看一下設(shè)置9600波特率的指令是否正確,可以抓一下電腦端配置CH340 9600波特率下發(fā)的USB指令,比對(duì)一下程序下發(fā)的是否一致。出問題的原因猜測(cè)是下發(fā)配置指令不對(duì)。


說的太專業(yè)了。我們菜鳥抓瞎。不如直接提供數(shù)據(jù)。這類底層驅(qū)動(dòng)廠家要是封裝完善好了,能大大降低應(yīng)用難度。


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的數(shù)據(jù)是可以的。9600的不行。求9600的數(shù)據(jù)。



icon_rar.gifCH32V103C8T6_one.zip



請(qǐng)大俠幫忙指點(diǎn)下,哪里有問題?


如微信溝通 是下發(fā)波特率指令錯(cuò)誤,可以通過抓電腦下發(fā)CH340配置指令獲取正確的指令數(shù)據(jù)。


請(qǐng)問 ,用UINT8? ?SetupSetBaud1152[] = { 0x40, 0xA1, 0x0c, 0x00, 0x03, 0xCC, 0x00, 0x00 };//115200bps 配置波特率后,如何進(jìn)行校驗(yàn)位的修改呢



我的郵箱是wangyy@wch.cn,留個(gè)郵箱我們解答一下你的疑問。


請(qǐng)教一下,CH32F103C8和CH340的硬件連接有圖嗎,D-連接D-,D+連接D+嗎,VUSB需要連接嗎


您好,連接方式D-接D-,D+接D+,GND接GND,+5V接+5V,一一對(duì)應(yīng)連接就可以了。


嗨,十幾畫。 你能把ch559和ch340的交互代碼扔掉嗎?


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频