搞定了stc89c52與ch375b主機(jī)方式的串行通信

2015-10-20

無(wú)線手柄也能穩(wěn)定接收到數(shù)據(jù)了,串口方式每次返回27個(gè)字節(jié),分析了一下只有前7個(gè)字節(jié)有用,其他20個(gè)字節(jié)都是垃圾數(shù)據(jù)。

用bushund5.0抓到的數(shù)據(jù),確實(shí)是7字節(jié)。

以前用并行方式接收的數(shù)據(jù)只有7個(gè),為什么用串口方式會(huì)接收到這么多垃圾數(shù)據(jù)。

?

2015-10-20

現(xiàn)在接無(wú)線鼠標(biāo)已經(jīng)正常,效果很好,但是接無(wú)線手柄的時(shí)候,issue_token()會(huì)返回一個(gè)錯(cuò)誤值0x2B,但我查遍你公司有關(guān)ch375的手冊(cè)上可以找到的資料都沒(méi)有定義這個(gè)返回值是什么含義。有高手知道嗎?

?

/* 主機(jī)接收usb數(shù)據(jù)操作 */
unsigned char issue_token( unsigned char endp_and_pid )?? /* 執(zhí)行USB事務(wù) */
{
?
?/* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說(shuō)明操作成功 */
?CH375_WR_CMD( CMD_ISSUE_TOKEN );
?CH375_WR_DAT( endp_and_pid ); /* 高4位目的端點(diǎn)號(hào), 低4位令牌PID */

?return(wait_interrupt()); /* 等待CH375操作完成 */
?
}

?

/* 主機(jī)端等待操作完成, 返回操作狀態(tài) */
unsigned char wait_interrupt(void)
{??
?CH375_INT_WIRE = 1;
?while( CH375_INT_WIRE );
?CH375_WR_CMD( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */
?return( CH375_RD_DAT() );?
}

?

?

?

?

2015-10-17

又有了新的問(wèn)題,串口host方式連鼠標(biāo),用有線的鼠標(biāo)連接,能讀到鼠標(biāo)數(shù)據(jù),連接狀況非常好,但換成無(wú)線鼠標(biāo)連接狀況卻不理想,十次大概有兩、三次能連上,不知道什么原因,希望路過(guò)的各位神仙能點(diǎn)撥下小弟。

?

原帖:?

我用stc89C52和ch375b串行通信,一直卡在取反測(cè)試過(guò)不去,返回的值不對(duì),我用T2定時(shí)器做串行通信的波特率,感覺(jué)是串口初始化不對(duì),也不知道錯(cuò)在哪里,望大神指點(diǎn)一下,如果有測(cè)試過(guò)的例子,還望能提供一個(gè),不勝感激。

硬件連接如下
?C51???? ????????????? CH375B?? ?
?P3^0(RXD)???????TXD????
?P3^1(TXD)??????? RXD????
?P1^5??????????????? ?INT#???

?

執(zhí)行到下面代碼時(shí)過(guò)不去

CH375_WR_CMD( CMD_CHECK_EXIST );? /* 測(cè)試單片機(jī)與CH375之間的通訊接口 */
CH375_WR_DAT( 0x65 );
retChar = CH375_RD_DAT( );
if ( retChar != 0x9A )
{
?????#ifdef?ENABLE_DEBUG
?????SendString("CH375 test fail!\nretChar = \n");?? //通過(guò)IO模擬串口向PC發(fā)送監(jiān)視信息
?????SendHex(retChar);
?????#endif
?????while(1)????? //阻塞
?????{
??????????flash_led(); //錯(cuò)誤
?????}??
}

?

我的串口初始化如下
void UartInit(void)??? /* 串行口初始化 */
{
?? SCON = 0xD0;??? //串口方式1,1個(gè)起始位,1個(gè)停止位,9位數(shù)據(jù)
?? T2CON = 0x30;?? //計(jì)數(shù)器2,T2用做發(fā)送接收時(shí)鐘,作為串口波特率發(fā)生器
?? RCAP2H = 0xFF;???? //9600波特率,11.0592Mhz晶振
?? RCAP2L = 0 - 11059200/32/9600;?? /* (0xDC)????? 11.0592MHz晶振 */
?? TH2 = RCAP2H;????
?? TL2 = RCAP2L;
?? TR2 = 1;???????????? //啟動(dòng)T2
?? RI = 0;
}

?

訪問(wèn)ch375b的三個(gè)基本函數(shù)如下
/* 向CH375的串口寫入命令 */
void?CH375_WR_CMD( unsigned char mCmd )? /* 向CH375寫命令 */
{
?????TI = 0;
?????TB8 = 1;
?????SBUF = mCmd;
?????while ( TI == 0 );
}

/* 向CH375的串口寫入數(shù)據(jù) */
void?CH375_WR_DAT( unsigned char mData )? /* 向CH375寫數(shù)據(jù) */
{
?????TI = 0;
?????TB8 = 0;
?????SBUF = mData;
?????while ( TI == 0 );
}

/* 通過(guò)串口從CH375讀出數(shù)據(jù) */
unsigned char?CH375_RD_DAT( void )?
{
?????while ( RI == 0 );
?????RI = 0;
?????return( SBUF );
}

?

首先檢查一下硬件有沒(méi)有問(wèn)題供電是否正常、晶振是否起振,復(fù)位輸出25腳(低電平)和26腳(高電平),然后注意一下CH375在復(fù)位期間檢測(cè)到TXD引腳為高才進(jìn)入串口模式??戳四愕某跏蓟绦蚓统跏蓟臀覀兪怯玫亩〞r(shí)器1,其他都一樣:

void CH375_PORT_INIT( ) {
?? ?SCON = 0xD0; // 設(shè)置串口為9位數(shù)據(jù)
?? ?PCON = 0x80;
?? ?TMOD = 0x20;
?? ?TH1 = 0xf3;? // 24MHz晶振, 9600bps
?? ?TR1 = 1;
?? ?TI = 1;
//? RI = 0;
//設(shè)置波特率和其它串口參數(shù)
}



謝謝指點(diǎn),今天晚上看了看文檔,找到了問(wèn)題所在,串行口要在HOST模式下才可用,而我把set_usb_mode()調(diào)用放在了取反測(cè)試的后面了,所以獲取不了正確返回值,把設(shè)置HOST模式的函數(shù)調(diào)用set_usb_mode()放到前面去就可以了,其實(shí)我的串口初始化是沒(méi)問(wèn)題的。


又有了新的問(wèn)題,串口host方式連鼠標(biāo),用有線的鼠標(biāo)連接,能讀到鼠標(biāo)數(shù)據(jù),連接狀況非常好,但換成無(wú)線鼠標(biāo)連接狀況卻不理想,十次有大概能有兩、三次能連上,不知道什么原因,希望路過(guò)的各位神仙能點(diǎn)撥下小弟。


無(wú)線鼠標(biāo)和有線原理上是一樣的,因?yàn)槎际怯赡阒鳈C(jī)控制的,注意一下IN包發(fā)送的時(shí)間,最好的方法是將無(wú)線鼠標(biāo)接到電腦上抓一下電腦的采集過(guò)程。


無(wú)線鼠標(biāo)和有線原理上是一樣的,因?yàn)槎际怯赡阒鳈C(jī)控制的,注意一下IN包發(fā)送的時(shí)間,最好的方法是將無(wú)線鼠標(biāo)接到電腦上抓一下電腦的采集過(guò)程。

?

今天晚上研究了下,現(xiàn)在用串行方式也可以從無(wú)線手柄穩(wěn)定接收到數(shù)據(jù)了,但是每次都返回27個(gè)字節(jié),而且出現(xiàn)大量的端點(diǎn)錯(cuò)誤,要不斷地清除。分析了一下只有前7個(gè)字節(jié)有用,其他20個(gè)字節(jié)都是垃圾數(shù)據(jù)。

同時(shí)用bushund5.0在電腦上抓到的數(shù)據(jù),證實(shí)了無(wú)線手柄確實(shí)是只發(fā)出了7個(gè)字節(jié)的數(shù)據(jù)。

以前用并行方式接收的時(shí)候,接收到的數(shù)據(jù)只有7個(gè)字節(jié),為什么用串口方式 ?rd_usb_data() 會(huì)接收到這么多垃圾數(shù)據(jù),而且出現(xiàn)大量的端點(diǎn)錯(cuò)誤。你說(shuō)的“注意一下IN包發(fā)送的時(shí)間”是什么意思,具體要如何分析?


理論上串口和并口是一樣的,首先你看一下中斷狀態(tài)是否正確(USB_INT_SUCCESS),然后rd_usb_data讀出來(lái)的數(shù)據(jù)長(zhǎng)度是多少?是不是長(zhǎng)度讀錯(cuò)了


理論上串口和并口是一樣的,首先你看一下中斷狀態(tài)是否正確(USB_INT_SUCCESS),然后rd_usb_data讀出來(lái)的數(shù)據(jù)長(zhǎng)度是多少?是不是長(zhǎng)度讀錯(cuò)了

奇怪的是我用有線鼠標(biāo)和無(wú)線鼠標(biāo)測(cè)試結(jié)果是正確的,每次返回7個(gè)字節(jié),而用無(wú)線手柄測(cè)試的時(shí)候返回的是27個(gè)字節(jié),后面20個(gè)字節(jié)是無(wú)效數(shù)據(jù)。


unsigned char rd_usb_data( unsigned char *buf )?? /* 從CH37X讀出數(shù)據(jù)塊 */
{
?unsigned char length, lencnt;
?
?CH375_WR_CMD(CMD_RD_USB_DATA); ???/* 從CH375的端點(diǎn)緩沖區(qū)讀取接收到的數(shù)據(jù),并釋放緩沖區(qū) */
?
length=CH375_RD_DAT(); ?????/* 后續(xù)數(shù)據(jù)長(zhǎng)度 */
?
?lencnt=length;
?while( lencnt-- )
?{
??*buf = CH375_RD_DAT();
??buf++;
?}
?return length;
}



我是在切換DATA后發(fā)出issue_token指令,返回USB_INT_SUCCESS后才調(diào)用rd_usb_data()函數(shù)的。相關(guān)的幾個(gè)函數(shù)如下

unsigned char wait_interrupt(void)
{??
?CH375_INT_WIRE = 1;
?while( CH375_INT_WIRE );
?CH375_WR_CMD( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */
?return( CH375_RD_DAT() );?
}

?

unsigned char issue_token( unsigned char endp_and_pid )?? /* 執(zhí)行USB事務(wù) */
{?
?/* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說(shuō)明操作成功 */
?CH375_WR_CMD( CMD_ISSUE_TOKEN );
?CH375_WR_DAT( endp_and_pid ); /* 高4位目的端點(diǎn)號(hào), 低4位令牌PID */

?return(wait_interrupt()); /* 等待CH375操作完成 */?
}

?

unsigned char rd_usb_data( unsigned char *buf )?? /* 從CH37X讀出數(shù)據(jù)塊 */
{
?unsigned char length, lencnt;
?
?CH375_WR_CMD(CMD_RD_USB_DATA); ???/* 從CH375的端點(diǎn)緩沖區(qū)讀取接收到的數(shù)據(jù),并釋放緩沖區(qū) */
??length=CH375_RD_DAT(); ?????/* 后續(xù)數(shù)據(jù)長(zhǎng)度 */
?
?lencnt=length;
?while( lencnt-- )
?{
??*buf = CH375_RD_DAT();
??buf++;
?}
?return length;
}

?


找到原因了,已經(jīng)調(diào)試完全正常了。

程序并沒(méi)用錯(cuò),可能是無(wú)線接收器對(duì)stc89c52造成干擾,導(dǎo)致接收錯(cuò)誤。


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

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