提問 關(guān)于串口控制CH375

參考CH375hst例程編寫USB打印機(jī)程序,獲取描述符處一直無法通過,長度數(shù)據(jù)能獲得(len=0x12),后續(xù)數(shù)據(jù)無法讀取正確,一直是0x00;

1、命令RD_USB_DATA后單片機(jī)必須將后續(xù)數(shù)據(jù)從CH375逐個(gè)讀出,請(qǐng)問是否需要在for循環(huán)中增加數(shù)據(jù)讀取命令RD_USB_DATA;

2、在論壇上找到串行通訊時(shí)TB8需要設(shè)置,在CH375DS手冊(cè)上沒有找到相關(guān)說明,請(qǐng)問那份文件有關(guān)于CH375串口操作的詳細(xì)說明。

例程如下

unsigned char rd_usb_data( unsigned char *buf ) {? //從CH37X讀出數(shù)據(jù)塊
?unsigned char i, len;
?CH375_WR_CMD_PORT( CMD_RD_USB_DATA );? //從CH375的端點(diǎn)緩沖區(qū)讀取接收到的數(shù)據(jù)
?delay_ms(2);
?len=CH375_RD_DAT_PORT();? //后續(xù)數(shù)據(jù)長度?
?for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT();
?return( len );
}

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ù)
}

void xWriteCH375Cmd( UINT8 mCmd ) {
?? ?TI = 0;
?? ?TB8 = 1;
?? ?SBUF = mCmd;
?? ?while ( TI == 0 );
}

void xWriteCH375Data( UINT8 mData ) {
?? ?TI = 0;
?? ?TB8 = 0;
?? ?SBUF = mData;
?? ?while ( TI == 0 );
}

UINT8 xReadCH375Data( void ) {
?? ?while ( RI == 0 );
?? ?RI = 0;
?? ?return( SBUF );
}

2、確保USB設(shè)備連接正常,設(shè)備描述符的獲取進(jìn)入函數(shù)監(jiān)控setup命令是否發(fā)送成功。



1、status=get_descr(1);? // 獲取設(shè)備描述符

能獲得狀態(tài)數(shù)據(jù) 0x14;

2、len=rd_usb_data( buffer );? // 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中

只有長度數(shù)據(jù)返回。

CPU使用的是STM32F103,參考上述程序修改基本操作程序如下:

//基本操作
void CH375_WR_CMD_PORT( unsigned char cmd ) {? //向CH375的命令端口寫入命令,周期不小于4us,如果單片機(jī)較快則延時(shí)
?USART1->DR = (cmd|0x100);?//發(fā)送CH375控制指令??
?while((USART1->SR&0x40) == 0); //等待發(fā)送結(jié)束
?delay_us(1); ?
}
void CH375_WR_DAT_PORT( unsigned char dat ) {? //向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí)
?USART1->DR = (dat&0x0ff);?//發(fā)送CH375控制指令???
?while((USART1->SR&0x40) == 0); //等待發(fā)送結(jié)束
?delay_us(1);
}

u8 CH375_RD_DAT_PORT(void) {? //從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí)

?delay_us(1);
? return(USART1->DR);?
}

串口初始化程序如下?

void uart_init(u32 pclk2,u32 bound)? //波特率9600
{????
?。。。。。???
?RCC->APB2RSTR|=1<<14;?? //復(fù)位串口1
?RCC->APB2RSTR&=~(1<<14);//停止復(fù)位??? ???
?//波特率設(shè)置
??USART1->BRR=mantissa; // 波特率設(shè)置??
??USART1->CR1|=0X300C;??? //1位停止,9個(gè)數(shù)據(jù),無校驗(yàn)
#if EN_USART1_RX??? //如果使能了接收
?//使能接收中斷
?USART1->CR1|=1<<8;??? //PE中斷使能
?USART1->CR1|=1<<5;??? //接收緩沖區(qū)非空中斷使能???? ?
?MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優(yōu)先級(jí)
#endif
}

?

問題出在哪里?焦慮中.......

?


在獲取設(shè)備描述符之前的測(cè)試命令,設(shè)置模式和檢測(cè)U盤連接是否正確通過?返回值是多少?另外注意一下buffer的定義。


主機(jī)模式,設(shè)備為打印機(jī)。

長度數(shù)據(jù)返回0x12。


int usb_Host(void)
?{
?u8 data_to_send[200];? /* 緩沖區(qū) */
//?u8 str_to_print[]="OK, support text print\n";
?u8 s;
?delay_ms(200);//mDelaymS( 200 );
?set_usb_mode( 6 );? /* 設(shè)置USB主機(jī)模式 */
?while ( wait_interrupt()!=USB_INT_CONNECT );? /* 等待USB打印機(jī)連接上來 */

/* 如果設(shè)備端是CH341轉(zhuǎn)打印口或者是CH37X,那么以下步驟是可選的,如果是其它USB芯片,那么可能需要執(zhí)行以下步驟 */
#define USB_RESET_FIRST?1? /* USB規(guī)范中未要求在USB設(shè)備插入后必須復(fù)位該設(shè)備,但是計(jì)算機(jī)的WINDOWS總是這樣做,所以有些USB設(shè)備也要求在插入后必須先復(fù)位才能工作 */
#ifdef USB_RESET_FIRST
?set_usb_mode( 7 );? /* 復(fù)位USB設(shè)備,CH375向USB信號(hào)線的D+和D-輸出低電平 */
/* 如果單片機(jī)對(duì)CH375的INT#引腳采用中斷方式而不是查詢方式,那么應(yīng)該在復(fù)制USB設(shè)備期間禁止CH375中斷,在USB設(shè)備復(fù)位完成后清除CH375中斷標(biāo)志再允許中斷 */
?delay_ms(10);//mDelaymS( 10 );? /* 復(fù)位時(shí)間不少于1mS,建議為10mS */
?set_usb_mode( 6 );? /* 結(jié)束復(fù)位 */
?delay_ms(100);//mDelaymS( 100 );
?while ( wait_interrupt()!=USB_INT_CONNECT );? /* 等待復(fù)位之后的設(shè)備端再次連接上來 */
#endif

?delay_ms(200);//mDelaymS( 200 );? /* 有些USB設(shè)備要等待數(shù)百毫秒才能正常工作 */
?if ( init_print()!=USB_INT_SUCCESS ) while(1);? /* 錯(cuò)誤 */

......

}

設(shè)置主機(jī)模式,設(shè)備連接返回成功。

進(jìn)入init_print()初始化程序獲取設(shè)備描述符始終不能成功,能購獲取到status==0x14;len==0x12; 但始終無法獲得其他描述符數(shù)據(jù)。if判斷無法通過。

程序如下:

if ( status==USB_INT_SUCCESS ) {
??len=rd_usb_data( buffer );? // 將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,返回描述符長度
??if ( len<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE );? //意外錯(cuò)誤:描述符長度錯(cuò)誤或者類型錯(cuò)誤

?


?


if ( len<18 || p_dev_descr->bDescriptorType!=1 ) return( UNKNOWN_USB_DEVICE );? 該語句無法通過

?


buffer里面的值是多少?

你可以使用附件中CH375外部固件的方式獲取試一下。icon_rar.gifch375print外部固件.rar



ZBin 你好,參考外部固件例程將程序修改,主要為init_print()函數(shù)部分

執(zhí)行到if(get_descr_ex()==1),單步跟蹤執(zhí)行進(jìn)入get_descr_ex()函數(shù)
unsigned char get_descr_ex()
{?unsigned char descr_len,status;
?unsigned char *p=buffer;
?
?toggle_send(0);
?wr_usb_data(8,Request.Req_buf);
??? if(issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP)==USB_INT_SUCCESS)
?{
??toggle_recv(1);
?}
?else return(0);
?status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN);
?if(status==USB_INT_SUCCESS)/* DATA階段操作成功 */
?{?if(flag_config_2)descr_len=buffer[2]-rd_usb_data(buffer);
??else descr_len=buffer[0]-rd_usb_data(buffer);?
??...
?}
....
}

第一個(gè)if條件內(nèi)的issue_token()能返回正確值,能夠執(zhí)行toggle_recv(1);語句。
在status=issue_token(( 0 << 4 ) | DEF_USB_PID_IN);處返回值status=0x2e;表明DATA階段操作不成功。
獲取描述符錯(cuò)誤。

其中:

#define?DEF_USB_PID_SETUP?0x0D
#define?DEF_USB_PID_IN??0x09


從你的現(xiàn)象看SETUP命令已經(jīng)下發(fā)成功,IN包沒有取到數(shù)據(jù)。有可能你的SETUP命令有問題(注意單片機(jī)大小端格式,默認(rèn)是大端格式),還有可能你的USB設(shè)備沒有響應(yīng),你可以換一個(gè)其他的USB全速設(shè)備試一下。


修改后,描述符能夠正確獲取到,外部固件模式需要注意大小端格式?;静僮鞒绦蛐薷娜缦隆?/p>

?

//基本操作
void CH375_WR_CMD_PORT( unsigned char cmd ) {? //向CH375的命令端口寫入命令,周期不小于4us,如果單片機(jī)較快則延時(shí)
?USART1->DR = ((u16)cmd|0x100);?
?while((USART1->SR&0x40) == 0); //等待發(fā)送結(jié)束
?delay_us(1); ?
}
void CH375_WR_DAT_PORT( unsigned char dat ) {? //向CH375的命令端口寫入命令,周期不小于1.5uS,如果單片機(jī)較快則延時(shí)
?USART1->DR = ((u16)dat&0x0ff);
?while((USART1->SR&0x40) == 0); //等待發(fā)送結(jié)束
?delay_us(1);
}

u8 CH375_RD_DAT_PORT(void) {? //從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí)

?delay_us(1);
?while((USART1->SR&(1<<5))!=USART_SR_RXNE);
?USART1->SR &=~(1<<5);
? return(USART1->DR);?
}


你好,獲取配置符時(shí)遇到返回0x17,應(yīng)該如何處理?

USB_INT_BUF_OVER?? 0x17???/* USB控制傳輸?shù)臄?shù)據(jù)太多, 緩沖區(qū)溢出 */


是否CH375B的內(nèi)部緩存區(qū)不夠!


因?yàn)镃H375的控制傳輸緩沖區(qū)只有64個(gè)字節(jié),所以當(dāng)描述符的長度超過64字節(jié)時(shí),CH375將返回操作狀態(tài)USB_INT_BUF_OVER。使用外置固件模式就沒這個(gè)問題了。


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

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