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

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

?? ch375lnk.c

?? USB驅動芯片簡介及驅動源程序
?? 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一区二区三区免费野_久草精品视频
色香蕉久久蜜桃| 欧美日韩一区二区三区四区| 色呦呦国产精品| 在线播放一区二区三区| 国产校园另类小说区| 亚洲综合精品自拍| 国产成人午夜高潮毛片| 欧美美女激情18p| 亚洲精品久久久蜜桃| 国产91精品免费| 精品欧美乱码久久久久久1区2区| 国产精品久久久久久久久免费桃花 | 日韩欧美国产wwwww| 一区二区三区在线视频播放| 欧美专区亚洲专区| 国产色爱av资源综合区| 男女男精品视频| 6080亚洲精品一区二区| 日本美女视频一区二区| 日韩久久免费av| 欧美日韩不卡一区二区| 亚洲三级电影全部在线观看高清| 久久精品国产一区二区三区免费看| 91麻豆123| 中文字幕日韩欧美一区二区三区| 狠狠色丁香婷婷综合久久片| 日韩一区二区三区精品视频| 日韩精品1区2区3区| 欧美日韩五月天| 午夜精品久久一牛影视| 色婷婷综合久色| 一级日本不卡的影视| 99国产精品久久久久久久久久 | 欧洲av在线精品| 成人欧美一区二区三区| 不卡视频免费播放| 国产精品久久久久一区| 不卡一卡二卡三乱码免费网站| 国产色综合久久| 成人av第一页| 亚洲色图制服丝袜| 色久综合一二码| 亚洲成人动漫精品| 日韩一区二区三区四区五区六区| 日韩不卡在线观看日韩不卡视频| 日韩视频免费观看高清完整版| 日韩av电影免费观看高清完整版在线观看 | 日韩一区二区在线观看视频播放| 日日夜夜免费精品视频| 欧美刺激午夜性久久久久久久| 精品在线亚洲视频| 国产精品女上位| 欧美在线观看视频一区二区| 五月婷婷激情综合| 欧美sm美女调教| 成人久久视频在线观看| 一区二区在线观看视频| 欧美人成免费网站| 国产一区不卡视频| 一区二区三区在线免费播放| 欧美精品久久99久久在免费线| 久久精品国产99| 国产婷婷色一区二区三区四区| 91香蕉视频污在线| 欧美96一区二区免费视频| 精品国精品国产| 奇米精品一区二区三区四区| 成人午夜激情影院| 亚洲一区二区欧美激情| 久久网这里都是精品| 色香蕉久久蜜桃| 国产揄拍国内精品对白| 亚洲精品成人天堂一二三| 欧美变态口味重另类| 91一区二区在线观看| 麻豆精品国产传媒mv男同 | 欧美性猛交一区二区三区精品| 美腿丝袜亚洲一区| 亚洲欧美日韩国产综合| www一区二区| 欧美久久久一区| 91女人视频在线观看| 国产一区二区三区在线观看免费| 亚洲永久精品国产| 国产视频视频一区| 欧美一区二区久久| 在线欧美日韩国产| 成人国产亚洲欧美成人综合网| 日韩电影一区二区三区| 亚洲综合激情另类小说区| 久久精品欧美一区二区三区不卡| 欧美一区二区在线看| 在线中文字幕不卡| 成年人午夜久久久| 国产美女在线观看一区| 奇米色一区二区| 亚洲成人激情自拍| 一区二区视频在线| 中文字幕一区免费在线观看| 久久免费看少妇高潮| 日韩欧美电影一区| 欧美一区永久视频免费观看| 色综合久久久久综合体| 成人一区二区视频| 国产精品一区在线| 极品瑜伽女神91| 久久精品国产99| 九九九久久久精品| 久久成人精品无人区| 蜜桃视频一区二区| 老汉av免费一区二区三区| 国产乱色国产精品免费视频| 日本少妇一区二区| 麻豆精品久久精品色综合| 免费精品视频在线| 亚洲一线二线三线久久久| 91亚洲精华国产精华精华液| 国产不卡视频在线播放| 国内精品不卡在线| 国产麻豆午夜三级精品| 国产大陆亚洲精品国产| 成人小视频在线观看| 成人免费va视频| av中文字幕不卡| 色视频欧美一区二区三区| 欧美日韩精品福利| 欧美一级一区二区| 精品对白一区国产伦| 欧美激情综合五月色丁香| 中文字幕在线播放不卡一区| 成人欧美一区二区三区黑人麻豆| 一区二区三区在线播放| 午夜精品久久久久久| 紧缚奴在线一区二区三区| 成人精品gif动图一区| 99在线精品视频| 欧美日韩和欧美的一区二区| 欧美精品一卡二卡| 欧美刺激脚交jootjob| 久久精品视频免费观看| 国产精品不卡在线| 亚洲专区一二三| 裸体健美xxxx欧美裸体表演| 国产一区二区三区在线观看精品| 不卡视频免费播放| 欧美精品99久久久**| 精品久久久久久久久久久久久久久 | 不卡的av在线| 欧美午夜精品一区二区蜜桃| 日韩欧美精品在线视频| 综合久久久久久| 裸体歌舞表演一区二区| 972aa.com艺术欧美| 欧美一级理论性理论a| 欧美激情一区不卡| 日韩不卡免费视频| 成人午夜免费av| 欧美疯狂性受xxxxx喷水图片| 久久午夜羞羞影院免费观看| 亚洲一区国产视频| 国产精品911| 欧美色爱综合网| 国产午夜精品久久久久久久| 一区二区三区中文字幕精品精品| 久色婷婷小香蕉久久| 色就色 综合激情| 久久久99精品久久| 亚洲成年人影院| 成人精品免费看| 欧美日韩国产综合视频在线观看| 亚洲国产精品传媒在线观看| 日韩成人午夜电影| 一本久久综合亚洲鲁鲁五月天 | 中文字幕一区二区三区蜜月| 精品在线观看视频| 91精品免费在线观看| 亚洲乱码国产乱码精品精小说 | 日韩欧美久久一区| 亚洲丶国产丶欧美一区二区三区| 粉嫩久久99精品久久久久久夜| 欧美一区二区三区系列电影| 亚洲一区免费视频| 91在线porny国产在线看| 久久影院午夜论| 日产国产高清一区二区三区 | 国产成a人无v码亚洲福利| 欧美一区二区三区视频在线| 亚洲伊人色欲综合网| 色综合咪咪久久| 国产精品第四页| 国产精品主播直播| 精品对白一区国产伦| 日韩1区2区日韩1区2区| 欧美一区日韩一区| 一区二区三区.www| 91福利精品第一导航| 一区二区三区 在线观看视频| 日本丶国产丶欧美色综合| 综合激情成人伊人| 色综合天天综合给合国产|