CH375驅(qū)動HP-1022激光打印機(jī)的問題???

你將你的打印機(jī)接在1.1的計(jì)算機(jī)上,看發(fā)的數(shù)據(jù)和你在單片機(jī)里的數(shù)據(jù)是不是一樣,看下有沒有打印機(jī)給計(jì)算機(jī)返回?cái)?shù)據(jù)之類的數(shù)據(jù)


你用我們的CH375HST.ZIP文件是什么時間的,因?yàn)槲覀兊倪@個文件已經(jīng)更新過,要不你發(fā)個郵件將你的程序發(fā)過來幫你查下.


這個文件(CH375HST.ZIP)那里有的下載?個人信息保護(hù),已隱藏


在網(wǎng)站上面就有下載


是用網(wǎng)上最新的那個呀 /* 2004.03.05, 2004.8.18, 2005.12.29 **************************************** ** Copyright (C) W.ch 1999-2005 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB 1.1 Host Examples for CH375 ** ** KC7.0@MCS-51 ** **************************************** */ /* 單片機(jī)通過CH375控制USB打印機(jī) */ /* 程序示例,C語言,CH375中斷為查詢方式,只負(fù)責(zé)數(shù)據(jù)傳輸,不涉及打印格式及打印描述語言 */ /* 另可提供多臺計(jì)算機(jī)共享一臺USB打印機(jī)的方案 */

/* 以下定義適用于MCS-51單片機(jī),其它單片機(jī)參照修改,為了提供C語言的速度需要對本程序進(jìn)行優(yōu)化 */ #include unsigned char volatile xdata CH375_CMD_PORT _at_ 0xf001;//0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xf000;//0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */ sbit CH375_INT_WIRE = 0xB0^4; /* P3.2, INT0, 連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ unsigned char volatile xdata bell _at_ 0x8001;//蜂 unsigned char volatile xdata pio1cm _at_ 0x8003; typedef unsigned char BOOL1; /* typedef bit BOOL1; */

/* 以下為通用的單片機(jī)C程序 */ #include #include

/* 定義CH375命令代碼及返回狀態(tài) */ #include "CH375INC.H" void be(); typedef unsigned char UCHAR; typedef unsigned short USHORT;

typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; } USB_DEV_DESCR, *PUSB_DEV_DESCR;

typedef struct _USB_CONFIG_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT wTotalLength; UCHAR bNumInterfaces; UCHAR bConfigurationValue; UCHAR iConfiguration; UCHAR bmAttributes; UCHAR MaxPower; } USB_CFG_DESCR, *PUSB_CFG_DESCR;

typedef struct _USB_INTERF_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bInterfaceNumber; UCHAR bAlternateSetting; UCHAR bNumEndpoints; UCHAR bInterfaceClass; UCHAR bInterfaceSubClass; UCHAR bInterfaceProtocol; UCHAR iInterface; } USB_ITF_DESCR, *PUSB_ITF_DESCR;

typedef struct _USB_ENDPOINT_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bEndpointAddress; UCHAR bmAttributes; UCHAR wMaxPacketSize; UCHAR wMaxPacketSize1; UCHAR bInterval; } USB_ENDP_DESCR, *PUSB_ENDP_DESCR;

typedef struct _USB_CONFIG_DESCRIPTOR_LONG { USB_CFG_DESCR cfg_descr; USB_ITF_DESCR itf_descr; USB_ENDP_DESCR endp_descr[4]; } USB_CFG_DESCR_LONG, *PUSB_CFG_DESCR_LONG;

unsigned char buffer[64]; /* 公用緩沖區(qū) */

/* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }

/* 延時1微秒,不精確 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }

/* 以毫秒為單位延時,不精確,適用于24MHz時鐘 */ void mDelaymS( unsigned char delay ) { unsigned char i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時鐘下延時500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時鐘下延時500uS */ } }

/* 基本操作 */

void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時 */ // delay2us(); CH375_CMD_PORT=cmd; delay2us(); }

void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */ CH375_DAT_PORT=dat; // delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時 */ }

unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */ // delay1us(); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時 */ return( CH375_DAT_PORT ); }

unsigned char wait_interrupt() { /* 主機(jī)端等待操作完成, 返回操作狀態(tài) */ unsigned short i; // while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ for ( i = 0; CH375_INT_WIRE != 0; i ++ ) { /* 如果CH375的中斷引腳輸出高電平則等待,通過計(jì)數(shù)防止超時 */ // delay1us(); if ( i == 0xF000 ) CH375_WR_CMD_PORT( CMD_ABORT_NAK ); /* 如果超時達(dá)61mS以上則強(qiáng)行終止NAK重試,中斷返回USB_INT_RET_NAK */ }

CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ return( CH375_RD_DAT_PORT() ); }

#define TRUE 1 #define FALSE 0 unsigned char set_usb_mode( unsigned char mode ) { /* 設(shè)置CH375的工作模式 */ unsigned char i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); for( i=0; i!=100; i++ ) { /* 等待設(shè)置模式操作完成,不超過30uS */ if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE ); /* 成功 */ } return( FALSE ); /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */ }

/* 數(shù)據(jù)同步 */ /* USB的數(shù)據(jù)同步通過切換DATA0和DATA1實(shí)現(xiàn): 在設(shè)備端, USB打印機(jī)可以自動切換; 在主機(jī)端, 必須由SET_ENDP6和SET_ENDP7命令控制CH375切換DATA0與DATA1. 主機(jī)端的程序處理方法是為設(shè)備端的各個端點(diǎn)分別提供一個全局變量, 初始值均為DATA0, 每執(zhí)行一次成功事務(wù)后取反, 每執(zhí)行一次失敗事務(wù)后將其復(fù)位為DATA1 */

void toggle_recv( BOOL1 tog ) { /* 主機(jī)接收同步控制:0=DATA0,1=DATA1 */ CH375_WR_CMD_PORT( CMD_SET_ENDP6 ); CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 ); // delay2us(); }

void toggle_send( BOOL1 tog ) { /* 主機(jī)發(fā)送同步控制:0=DATA0,1=DATA1 */ CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); CH375_WR_DAT_PORT( tog ? 0xC0 : 0x80 ); // delay2us(); }

unsigned char clr_stall( unsigned char endp_addr ) { /* USB通訊失敗后,復(fù)位設(shè)備端的指定端點(diǎn)到DATA0 */ CH375_WR_CMD_PORT( CMD_CLR_STALL ); CH375_WR_DAT_PORT( endp_addr ); return( wait_interrupt() ); }

/* 數(shù)據(jù)讀寫, 單片機(jī)讀寫CH375芯片中的數(shù)據(jù)緩沖區(qū) */

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ù) */ len=CH375_RD_DAT_PORT(); /* 后續(xù)數(shù)據(jù)長度 */ for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT(); return( len ); }

void wr_usb_data( unsigned char len, unsigned char *buf ) { /* 向CH37X寫入數(shù)據(jù)塊 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375的端點(diǎn)緩沖區(qū)寫入準(zhǔn)備發(fā)送的數(shù)據(jù) */ CH375_WR_DAT_PORT( len ); /* 后續(xù)數(shù)據(jù)長度, len不能大于64 */ while( len-- ) CH375_WR_DAT_PORT( *buf++ ); }

/* 主機(jī)操作 */ unsigned char endp_out_addr; /* 打印機(jī)數(shù)據(jù)接收端點(diǎn)的端點(diǎn)地址 */ unsigned char endp_out_size; /* 打印機(jī)數(shù)據(jù)接收端點(diǎn)的端點(diǎn)尺寸 */ BOOL1 tog_send; /* 打印機(jī)數(shù)據(jù)接收端點(diǎn)的同步標(biāo)志 */ unsigned char endp_in_addr; /* 雙向打印機(jī)發(fā)送端點(diǎn)的端點(diǎn)地址,一般不用 */ BOOL1 tog_recv; /* 雙向打印機(jī)發(fā)送端點(diǎn)的同步標(biāo)志,一般不用 */

unsigned char issue_token( unsigned char endp_and_pid ) { /* 執(zhí)行USB事務(wù) */ /* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說明操作成功 */ CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN ); CH375_WR_DAT_PORT( endp_and_pid ); /* 高4位目的端點(diǎn)號, 低4位令牌PID */ return( wait_interrupt() ); /* 等待CH375操作完成 */ }

unsigned char issue_token_X( unsigned char endp_and_pid, unsigned char tog ) { /* 執(zhí)行USB事務(wù),適用于CH375A */ /* 執(zhí)行完成后, 將產(chǎn)生中斷通知單片機(jī), 如果是USB_INT_SUCCESS就說明操作成功 */ CH375_WR_CMD_PORT( CMD_ISSUE_TKN_X ); CH375_WR_DAT_PORT( tog ); /* 同步標(biāo)志的位7為主機(jī)端點(diǎn)IN的同步觸發(fā)位, 位6為主機(jī)端點(diǎn)OUT的同步觸發(fā)位, 位5~位0必須為0 */ CH375_WR_DAT_PORT( endp_and_pid ); /* 高4位目的端點(diǎn)號, 低4位令牌PID */ return( wait_interrupt() ); /* 等待CH375操作完成 */ }

void soft_reset_print( ) { /* 控制傳輸:軟復(fù)位打印機(jī) */ tog_send=tog_recv=0; /* 復(fù)位USB數(shù)據(jù)同步標(biāo)志 */ toggle_send( 0 ); /* SETUP階段為DATA0 */ buffer[0]=0x21; buffer[1]=2; buffer[2]=buffer[3]=buffer[4]=buffer[5]=buffer[6]=buffer[7]=0; /* SETUP數(shù)據(jù),SOFT_RESET */ wr_usb_data( 8, buffer ); /* SETUP數(shù)據(jù)總是8字節(jié) */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) { /* SETUP階段操作成功 */ toggle_recv( 1 ); /* STA


你將void wr_usb_data( unsigned char len, unsigned char *buf ) { /* 向CH37X寫入數(shù)據(jù)塊 */ 函數(shù)改為void wr_usb_data( unsigned char len, unsigned char xdata *buf ) { /* 向CH37X寫入數(shù)據(jù)塊 */ 試下


改了是一樣的.還有我用SL811試過,速度還是很慢,傳一兩個數(shù)據(jù)包(64)后就反回NAK了, 可能真的要看看USB2.0的協(xié)議,看高速和全速有什么區(qū)別,我英文不好呀,老大能幫忙看看嗎?


要不你用USB1.1的計(jì)算機(jī)接上你的打印機(jī),用BUSHOUND抓下看下你要打印的數(shù)據(jù)和你要發(fā)的數(shù)據(jù)是不是一樣的,同時你要看下在計(jì)算機(jī)給打印機(jī)發(fā)送數(shù)據(jù)的過程中,打印機(jī)有沒有什么返回給計(jì)算機(jī)的數(shù)據(jù).


我用USBHOUND抓過了,1.1電腦的數(shù)據(jù)和2.0的是一樣的,只是慢了一點(diǎn),4096字節(jié)要250ms,而2.0的只要2ms, 不過比用單片機(jī)的600/S的快得多了,當(dāng)中也沒什么其它的數(shù)據(jù),就只有DO,


那和你SEND_TO_DATA緩沖區(qū)的數(shù)據(jù)是一樣的嗎??


是一樣的,


你在 else if ( s==USB_INT_RET_NAK ) { /* USB打印機(jī)正忙,如果未執(zhí)行SET_RETRY命令則CH375自動重試,所以不會返回USB_INT_RET_NAK狀態(tài) */ /* USB打印機(jī)正忙,正常情況下應(yīng)該稍后重試 */ /* s=get_port_status( ); 如果有必要,可以檢查是什么原因?qū)е麓蛴C(jī)忙 */ } 改為 else if ( s==USB_INT_RET_NAK ) { /* USB打印機(jī)正忙,如果未執(zhí)行SET_RETRY命令則CH375自動重試,所以不會返回USB_INT_RET_NAK狀態(tài) */ /* USB打印機(jī)正忙,正常情況下應(yīng)該稍后重試 */ s=get_port_status( ); // 如果有必要,可以檢查是什么原因?qū)е麓蛴C(jī)忙 */ } 看下是什么問題導(dǎo)致打印機(jī)忙,你在將"s"輸出來看下是什么數(shù)據(jù)??


以上的試過,返回的數(shù)據(jù)有時為0xff,有時為0xf7;是不是要設(shè)這里的: CH375_WR_CMD_PORT( CMD_SET_RETRY ); /* 設(shè)置USB事務(wù)操作的重試次數(shù) */ CH375_WR_DAT_PORT( 0x25 ); CH375_WR_DAT_PORT( 0x09 ); /* 位7為1則收到NAK時無限重試, 位3~位0為超時后的重試次數(shù) */ 也設(shè)了,是什么原因呢?


不需要設(shè)置這個,因?yàn)檫@個設(shè)置的是出錯(STALL)時候的重試次數(shù),而不是NAK的重試次數(shù),NAK的重試次數(shù)在RETRY中的位7為1,位6為0時為無限次重試,你想停止的話可以用ABORT命令停止重試


老大是什么原因呀?我快要放棄用國產(chǎn)的CH375了,


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

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