亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ch375lnk.c

?? usb375打印機驅動
?? C
字號:
/* 2004.03.05, 2004.8.18
****************************************
**  Copyright  (C)  W.ch  1999-2004   **
**  Web:  http://www.winchiphead.com  **
****************************************
**  USB 1.1 Host Examples for CH375   **
**  KC7.0@MCS-51                      **
****************************************
*/
/* 用CH375+CH372連接兩個單片機系統,如果設備端不是CH37X,那么可以參考CH375PRT.C分析描述符 */
/* 主機端的程序示例,C語言,CH375中斷為查詢方式 */

/* 以下定義適用于MCS-51單片機,其它單片機參照修改,為了提供C語言的速度需要對本程序進行優化 */
#include <reg51.h>
unsigned char volatile xdata	CH375_CMD_PORT _at_ 0xBDF1;	/* CH375命令端口的I/O地址 */
unsigned char volatile xdata	CH375_DAT_PORT _at_ 0xBCF0;	/* CH375數據端口的I/O地址 */
sbit	CH375_INT_WIRE	=		0xB0^2;	/* P3.2, INT0, 連接CH375的INT#引腳,用于查詢中斷狀態 */

/* 以下為通用的單片機C程序 */
#include <string.h>
#include <stdio.h>

/* 定義CH375命令代碼及返回狀態 */
#include "CH375INC.H"

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

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

/* 基本操作 */

void ERROR() {
	while(1);
}

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

void CH375_WR_DAT_PORT( unsigned char dat ) {  /* 向CH375的數據端口寫入數據,周期不小于1.5uS,如果單片機較快則延時 */
	CH375_DAT_PORT=dat;
	delay1us();  /* 因為MCS51單片機較慢所以實際上無需延時 */
}

unsigned char CH375_RD_DAT_PORT() {  /* 從CH375的數據端口讀出數據,周期不小于1.5uS,如果單片機較快則延時 */
	delay1us();  /* 因為MCS51單片機較慢所以實際上無需延時 */
	return( CH375_DAT_PORT );
}

unsigned char wait_interrupt() {  /* 主機端等待操作完成, 返回操作狀態 */
	while( CH375_INT_WIRE );  /* 查詢等待CH375操作完成中斷(INT#低電平) */
	CH375_WR_CMD_PORT( CMD_GET_STATUS );  /* 產生操作完成中斷, 獲取中斷狀態 */
	return( CH375_RD_DAT_PORT() );
}

unsigned char endp6_mode, endp7_mode;

#define	TRUE	1
#define	FALSE	0
unsigned char set_usb_mode( unsigned char mode ) {  /* 設置CH37X的工作模式 */
	unsigned char i;
	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
	CH375_WR_DAT_PORT( mode );
	endp6_mode=endp7_mode=0x80;  /* 主機端復位USB數據同步標志 */
	for( i=0; i!=100; i++ ) {  /* 等待設置模式操作完成,不超過30uS */
		if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE );  /* 成功 */
	}
	return( FALSE );  /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */
}

/* 數據同步 */
/* USB的數據同步通過切換DATA0和DATA1實現: 在設備端, CH372/CH375可以自動切換;
   在主機端, 必須由SET_ENDP6和SET_ENDP7命令控制CH375切換DATA0與DATA1.
   主機端的程序處理方法是為SET_ENDP6和SET_ENDP7分別提供一個全局變量,
   初始值均為80H, 每執行一次成功事務后將位6取反, 每執行一次失敗事務后將其復位為80H. */

void toggle_recv() {  /* 主機接收成功后,切換DATA0和DATA1實現數據同步 */
	CH375_WR_CMD_PORT( CMD_SET_ENDP6 );
	CH375_WR_DAT_PORT( endp6_mode );
	endp6_mode^=0x40;
	delay2us();
}

void toggle_send() {  /* 主機發送成功后,切換DATA0和DATA1實現數據同步 */
	CH375_WR_CMD_PORT( CMD_SET_ENDP7 );
	CH375_WR_DAT_PORT( endp7_mode );
	endp7_mode^=0x40;
	delay2us();
}

unsigned char clr_stall6() {  /* 主機接收失敗后,復位設備端的數據同步到DATA0 */
	CH375_WR_CMD_PORT( CMD_CLR_STALL );
	CH375_WR_DAT_PORT( 2 | 0x80 );  /* 如果設備端不是CH37X芯片,那么需要修改端點號 */
	endp6_mode=0x80;
	return( wait_interrupt() );
}

unsigned char clr_stall7() {  /* 主機發送失敗后,復位設備端的數據同步到DATA0 */
	CH375_WR_CMD_PORT( CMD_CLR_STALL );
	CH375_WR_DAT_PORT( 2 );  /* 如果設備端不是CH37X芯片,那么需要修改端點號 */
	endp7_mode=0x80;
	return( wait_interrupt() );
}

/* 數據讀寫, 單片機讀寫CH372或者CH375芯片中的數據緩沖區 */

unsigned char rd_usb_data( unsigned char *buf ) {  /* 從CH37X讀出數據塊 */
	unsigned char i, len;
	CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  /* 從CH375的端點緩沖區讀取接收到的數據 */
	len=CH375_RD_DAT_PORT();  /* 后續數據長度 */
	for ( i=0; i!=len; i++ ) *buf++=CH375_RD_DAT_PORT();
	return( len );
}

void wr_usb_data( unsigned char len, unsigned char *buf ) {  /* 向CH37X寫入數據塊 */
	CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375的端點緩沖區寫入準備發送的數據 */
	CH375_WR_DAT_PORT( len );  /* 后續數據長度, len不能大于64 */
	while( len-- ) CH375_WR_DAT_PORT( *buf++ );
}

/* 主機操作 */

unsigned char issue_token( unsigned char endp_and_pid ) {  /* 執行USB事務 */
/* 執行完成后, 將產生中斷通知單片機, 如果是USB_INT_SUCCESS就說明操作成功 */
	unsigned char status;
	CH375_WR_CMD_PORT( CMD_ISSUE_TOKEN );
	CH375_WR_DAT_PORT( endp_and_pid );  /* 高4位目的端點號, 低4位令牌PID */
	status=wait_interrupt();  /* 等待CH375操作完成 */
	if ( status!=USB_INT_SUCCESS && (endp_and_pid&0xF0)==0x20 ) {  /* 操作失敗,如果設備端不是CH37X芯片,那么需要修改端點號 */
		if ( (endp_and_pid&0x0F)==DEF_USB_PID_OUT ) clr_stall7();  /* 復位設備端接收 */
		else if ( (endp_and_pid&0x0F)==DEF_USB_PID_IN ) clr_stall6();  /* 復位設備端發送 */
	}
	return( status );
}

void host_send( unsigned char len, unsigned char *buf ) {  /* 主機發送 */
	wr_usb_data( len, buf );
	toggle_send();
	if ( issue_token( ( 2 << 4 ) | DEF_USB_PID_OUT )!=USB_INT_SUCCESS ) ERROR();  /* 如果設備端不是CH37X芯片,那么需要修改端點號 */
}

unsigned char host_recv( unsigned char *buf ) {  /* 主機接收, 返回長度 */
	toggle_recv();
	if ( issue_token( ( 2 << 4 ) | DEF_USB_PID_IN )!=USB_INT_SUCCESS ) ERROR();  /* 如果設備端不是CH37X芯片,那么需要修改端點號 */
	return( rd_usb_data( buf ) );
}

unsigned char get_descr( unsigned char type ) {  /* 從設備端獲取描述符 */
	unsigned char status;
	CH375_WR_CMD_PORT( CMD_GET_DESCR );
	CH375_WR_DAT_PORT( type );  /* 描述符類型, 只支持1(設備)或者2(配置) */
	status=wait_interrupt();  /* 等待CH375操作完成 */
	if ( status==USB_INT_SUCCESS ) {  /* 操作成功 */
		unsigned char buffer[64];
		unsigned char i, len;
		len=rd_usb_data( buffer );
		printf( "%s描述符是:", type==1?"設備":"配置" );
		for ( i=0; i!=len; i++ ) printf( "%02X ", buffer[i] );
		printf( "\n" );
	}
	return( status );
}

unsigned char set_addr( unsigned char addr ) {  /* 設置設備端的USB地址 */
	unsigned char status;
	CH375_WR_CMD_PORT( CMD_SET_ADDRESS );  /* 設置USB設備端的USB地址 */
	CH375_WR_DAT_PORT( addr );  /* 地址, 從1到127之間的任意值, 常用2到20 */
	status=wait_interrupt();  /* 等待CH375操作完成 */
	if ( status==USB_INT_SUCCESS ) {  /* 操作成功 */
		CH375_WR_CMD_PORT( CMD_SET_USB_ADDR );  /* 設置USB主機端的USB地址 */
		CH375_WR_DAT_PORT( addr );  /* 當目標USB設備的地址成功修改后,應該同步修改主機端的USB地址 */
	}
	return( status );
}

unsigned char set_config( unsigned char cfg ) {  /* 設置設備端的USB配置 */
	endp6_mode=endp7_mode=0x80;  /* 復位USB數據同步標志 */
	CH375_WR_CMD_PORT( CMD_SET_CONFIG );  /* 設置USB設備端的配置值 */
	CH375_WR_DAT_PORT( cfg );  /* 此值取自USB設備的配置描述符中 */
	return( wait_interrupt() );  /* 等待CH375操作完成 */
}

/* 主機端的主程序簡單示例 */
main() {
	unsigned char xdata data_to_send[250], data_by_recv[250];  /* 收發緩沖區 */
	unsigned char i, len;
	set_usb_mode( 6 );  /* 設置USB主機模式, 如果設備端是CH37X, 那么5和6均可 */
	while ( wait_interrupt()!=USB_INT_CONNECT );  /* 等待設備端連接上來 */

#ifdef DEVICE_NOT_CH37X
/* 如果設備端是CH37X,那么以下步驟是可選的,
   如果是其它USB芯片,那么需要執行以下步驟,并且要分析配置描述符的數據獲得配置值以及端點號,并修改本程序中的端點號,
   關于如何分析配置描述符請參考CH375PRT.C文件 */
#define USB_RESET_FIRST	1  /* USB規范中未要求在USB設備插入后必須復位該設備,但是計算機的WINDOWS總是這樣做,所以有些USB設備也要求在插入后必須先復位才能工作 */
#ifdef USB_RESET_FIRST
	set_usb_mode( 7 );  /* 復位USB設備,CH375向USB信號線的D+和D-輸出低電平 */
/* 如果單片機對CH375的INT#引腳采用中斷方式而不是查詢方式,那么應該在復制USB設備期間禁止CH375中斷,在USB設備復位完成后清除CH375中斷標志再允許中斷 */
	for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); }  /* 復位時間不少于1mS,建議為10mS */
	set_usb_mode( 6 );  /* 結束復位 */
	while ( wait_interrupt()!=USB_INT_CONNECT );  /* 等待復位之后的設備端再次連接上來 */
	for ( i=0; i<250; i++ ) delay2us();  /* 有些USB設備要求延時數百毫秒后才能工作 */
#endif
	get_descr(1);  /* 獲取USB設備的設備描述符 */
	set_addr(5);  /* 設置USB設備的地址,因為只有一個USB設備,所以可以分配1到126之間的任意值 */
	get_descr(2);  /* 獲取USB設備的配置描述符 */
	set_config(1);  /* 設置USB配置值,該數值來自USB設備的配置描述符 */
#endif

	for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i] );  /* 發送256字節的數據給設備端 */
	host_send( 0, NULL );  /* 假定, 發送空數據給設備端就能通知設備端發送數據 */
	for ( i=0; i<250; i+=len ) len=host_recv( &data_by_recv[i] );  /* 從設備端接收256字節的數據 */
	/* 可以再次繼續發送數據或者接收數據 */
	while(1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文在线资源观看网站视频免费不卡| 91丨九色丨蝌蚪丨老版| 欧美视频一区二区三区在线观看| 国产精品久久久久久福利一牛影视| 国产高清亚洲一区| 国产女人18毛片水真多成人如厕 | 久久精品视频网| 国产一区二区中文字幕| 国产亚洲一本大道中文在线| 国产激情一区二区三区桃花岛亚洲| 久久美女艺术照精彩视频福利播放| 日韩高清不卡在线| 欧美tickle裸体挠脚心vk| 韩国精品主播一区二区在线观看| 国产日韩欧美不卡在线| 99久久久国产精品| 亚洲综合在线电影| 91精品久久久久久久91蜜桃| 六月丁香综合在线视频| 久久久久国产精品人| av亚洲精华国产精华精| 亚洲午夜电影在线| www欧美成人18+| 色综合久久久久综合体桃花网| 亚洲成人一区二区在线观看| 日韩欧美亚洲另类制服综合在线| 国产精品一区二区视频| 亚洲六月丁香色婷婷综合久久| 欧美精品v日韩精品v韩国精品v| 久久99国产精品久久| 国产精品久久毛片a| 欧美日韩aaa| 国产成人精品一区二| 亚洲国产精品视频| 国产欧美中文在线| 欧美巨大另类极品videosbest | 欧美激情一区二区三区在线| 91福利在线免费观看| 久久超碰97中文字幕| 亚洲丝袜精品丝袜在线| 日韩欧美国产一区二区在线播放| 99国产精品99久久久久久| 日韩福利电影在线观看| 亚洲欧洲成人av每日更新| 日韩你懂的在线观看| 91网址在线看| 国产精品一区二区你懂的| 亚洲第一福利视频在线| 中文字幕第一区| 欧美大片在线观看| 欧美午夜片在线观看| 国产91精品一区二区| 琪琪久久久久日韩精品| 亚洲专区一二三| 国产精品电影院| 久久先锋资源网| 欧美一区二区免费视频| 在线日韩av片| 99久久精品免费| 国产一区二区三区精品视频| 日韩av中文字幕一区二区| 日韩理论片在线| 中文av字幕一区| 久久久激情视频| 欧美mv日韩mv国产网站| 制服丝袜亚洲网站| 精品1区2区3区| 欧洲视频一区二区| 91九色最新地址| 91在线你懂得| 97久久超碰精品国产| 成人av免费观看| 国产成人免费视频网站高清观看视频| 蜜桃视频一区二区三区在线观看 | 午夜激情一区二区| 一区二区三区自拍| 一区二区三区.www| 亚洲最新视频在线观看| 综合自拍亚洲综合图不卡区| 国产精品麻豆久久久| 国产精品欧美一区二区三区| 国产欧美一区二区在线观看| 欧美国产精品专区| 国产精品国产三级国产普通话99 | 一本色道a无线码一区v| 波多野结衣欧美| 91玉足脚交白嫩脚丫在线播放| av中文字幕在线不卡| 99精品1区2区| 欧美午夜一区二区| 69堂成人精品免费视频| 欧美一级视频精品观看| 精品国产亚洲在线| 久久久精品综合| 国产精品传媒视频| 亚洲高清久久久| 日韩1区2区3区| 国内精品视频一区二区三区八戒| 国产曰批免费观看久久久| 国产经典欧美精品| 色哟哟日韩精品| 在线成人免费视频| xf在线a精品一区二区视频网站| 日本一区二区三区免费乱视频| **性色生活片久久毛片| 一区二区三区欧美日| 日韩成人午夜精品| 国产福利一区在线观看| 99视频精品在线| 制服丝袜亚洲色图| 国产精品女主播在线观看| 亚洲精品一二三区| 美女mm1313爽爽久久久蜜臀| 国产99久久精品| 欧美日韩一区中文字幕| 久久这里只有精品视频网| 亚洲欧洲成人精品av97| 日韩精品成人一区二区三区| 国产一区不卡视频| 欧美综合天天夜夜久久| 日韩精品一区二区在线| 国产精品久久久久久户外露出| 日韩av中文在线观看| www.激情成人| 日韩视频免费观看高清完整版在线观看 | 国产区在线观看成人精品| 1024亚洲合集| 九色综合国产一区二区三区| 99久久精品国产毛片| 精品久久久久久亚洲综合网| 亚洲精品免费一二三区| 久久机这里只有精品| 欧美自拍偷拍午夜视频| 中文字幕av资源一区| 青青草国产成人av片免费| 色综合久久中文字幕综合网 | 国产精品国产三级国产普通话蜜臀 | 国产精品一区免费在线观看| 欧美日韩亚洲综合一区二区三区| 国产无遮挡一区二区三区毛片日本| 亚洲午夜久久久| k8久久久一区二区三区| 日韩你懂的电影在线观看| 亚洲mv在线观看| 99国产精品久久久| 亚洲国产电影在线观看| 麻豆视频一区二区| 欧美日韩免费不卡视频一区二区三区 | 天堂av在线一区| 91麻豆国产香蕉久久精品| 久久精品亚洲精品国产欧美 | 日本欧美加勒比视频| 成人av网址在线| 国产蜜臀97一区二区三区| 精品一区二区在线视频| 欧美日韩国产免费一区二区| 亚洲午夜免费福利视频| 99re热视频这里只精品 | 亚洲丝袜美腿综合| 成人综合婷婷国产精品久久蜜臀 | 最新不卡av在线| 成人av在线资源网站| 久久久高清一区二区三区| 久久成人精品无人区| 日韩欧美国产一二三区| 免费av网站大全久久| 欧美久久久影院| 污片在线观看一区二区| 欧美性猛交xxxx黑人交| 有码一区二区三区| 色综合久久综合网欧美综合网| 亚洲欧美偷拍卡通变态| 97超碰欧美中文字幕| 亚洲天堂网中文字| 91麻豆免费观看| 亚洲精品免费在线观看| 在线亚洲欧美专区二区| 亚洲自拍偷拍av| 这里只有精品99re| 免费观看久久久4p| 久久久综合激的五月天| 国产高清精品久久久久| 中文字幕电影一区| 一本色道亚洲精品aⅴ| 一区二区国产视频| 色婷婷综合五月| 一级日本不卡的影视| 欧美日韩国产精品自在自线| 亚洲第四色夜色| 欧美电影免费观看完整版| 激情六月婷婷久久| 国产精品视频观看| 色婷婷久久综合| 日韩国产欧美在线视频| 日韩免费成人网| 成人午夜免费av| 亚洲国产精品久久人人爱蜜臀| 日韩欧美成人激情| 成人精品在线视频观看| 一区二区三区日本|