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

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

?? ch375driver-1.c

?? usb接口芯片Ch375驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <string.h>
#include <stdio.h>
#include <intrins.h>
#include <reg51.h>

#define 		u8 						unsigned char
#define			u16						unsigned int

/*USB設備命令---------------------------------------------------------------------------------------*/
#define 		CMD_WR_USB_DATA7			0x2B		/* 向USB 主機端點的輸出緩沖區寫入數據塊 */
#define 		CMD_RESET_ALL				0x05		/* 執行硬件復位 */
#define 		CMD_ISSUE_TOKEN				0x4F 		/* 產生中斷,發出令牌,執行事務 */
#define 		CMD_CLR_STALL				0x41		/* 產生中斷,清除端點錯誤 */
#define			CMD_ABORT_NAK				0x17		/* 放棄當前NAK 的重試 */
#define			CMD_READ_USB_DATA			0x27		/* 從當前USB 中斷的端點緩沖區讀取數據塊 */
#define			CMD_CHECK_EXIST				0x06		/* 測試工作狀態 */

#define 		CMD_SET_ENDP6				0x1C		/* 設置USB主機端點的接收器 */
#define 		CMD_SET_ENDP7				0x1D 		/* 設置USB主機端點的發送器 */
#define			CMD_SET_RETRY				0x0B		/* 設置USB 事務操作的重試次數 */
#define			CMD_SET_CONFIG				0x49		/* 產生中斷,控制傳輸:設置USB 配置 */
#define 		CMD_SET_USB_MODE			0x15		/* 設置USB 工作模式 */
#define			CMD_SET_ADDRESS				0x45		/* 產生中斷,控制傳輸:設置USB 地址 */
#define			CMD_SET_USB_ADDR			0x13		/* 設置USB 地址,沒有返回值 */

#define			CMD_GET_DESCR				0x46		/* 產生中斷,獲取描述符 */
#define 		CMD_GET_STATUS				0x22		/* 獲取中斷狀態并取消請求 */
/*-------------------------------------------------------------------------------------------------*/

/*如果命令的輸出數據是操作狀態*/
#define 		CMD_RET_SUCCESS				0x51		/* 操作成功 */

#define			DEF_USB_PID_OUT				0x01		/* CH375 支持的USB 令牌PID,執行OUT 事務,發送數據 */
#define			DEF_USB_PID_IN				0x01		/* CH375 支持的USB 令牌PID,執行IN  事務,接收數據 */

#define			SET_USB_MODE_6				0x06		/* 模式代碼為06H 時切換到已啟用的USB 主機方式,自動產生SOF 包 */
#define			SET_USB_MODE_7				0x07		/* 模式代碼為07H 時切換到已啟用的USB 主機方式,復位USB 總線 */

/*USB 主機方式的常用中斷狀態*/
#define			USB_INT_SUCCESS				0x14		/* USB 事務或者傳輸操作成功 */
#define			USB_INT_CONNECT				0x15		/* 檢測到USB 設備連接事件 */
#define			USB_INT_DISCONNECT			0x16		/* 檢測到USB 設備斷開事件 */
#define			USB_INT_BUF_OVER			0x17		/* USB 傳輸的數據有誤或者數據太多緩沖區溢出 */
#define			USB_INT_DISK_READ			0x1D		/* USB 存儲設備讀操作,請求數據讀出 */
#define			USB_INT_DISK_WRITE			0x1E		/* USB 存儲設備寫操作,請求數據寫入 */
#define			USB_INT_DISK_ERR			0x1F		/* USB 存儲設備操作失敗 */



#define			A0_WRITE_CMD				1
#define			A0_READ_WRITE_DATA			0


#define			DELAY_START_value			1			/* 根據單片機的時鐘選擇延時初值 */
#define			UNKNOWN_USB_DEVICE			0xF1
#define			USB_INT_RET_NAK				0x2A		/* 00101010B,返回NAK */

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

typedef struct _USB_CONFIG_DESCRIPTOR 
{
	u8 bLength;
	u8 bDescriptorType;
	unsigned short wTotalLength;
	u8 bNumInterfaces;
	u8 bConfigurationvalue;
	u8 iConfiguration;
	u8 bmAttributes;
	u8 MaxPower;
} USB_CFG_DESCR, *PUSB_CFG_DESCR;

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

typedef struct _USB_ENDPOINT_DESCRIPTOR 
{
	u8 bLength;
	u8 bDescriptorType;
	u8 bEndpointAddress;
	u8 bmAttributes;
	unsigned short wMaxPacketSize;
	u8 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;

#define			CH375_MAX_DATA_LEN			64			
u8 RECV_LEN;									/* 剛接收到的數據的長度 */
u8 idata RECV_BUFFER[ CH375_MAX_DATA_LEN ];	/* 數據緩沖區,用于保存接收到的下傳數據,長度為0到64字節 */
u8 idata *cmd_buf;
u8 idata *ret_buf;

#define p_dev_descr ((PUSB_DEV_DESCR)RECV_BUFFER)
#define p_cfg_descr ((PUSB_CFG_DESCR_LONG)RECV_BUFFER)

u8 endp_out_addr;							/* USB數據接收端點的端點地址 */
u8 endp_out_size;							/* USB數據接收端點的端點尺寸 */
u8 endp_in_addr;								/* USB狀態發送端點的端點地址,為0則只支持單向接口 */
u8 endp6_mode, endp7_mode;

/*
接線圖-----單片機------USB------
			P1.0		 D0
			P1.1		 D1
			P1.2		 D2
			P1.3		 D3
			P1.4		 D4
			P1.5		 D5
			P1.6		 D6
			P1.7		 D7
			
			P3.7		 A0
			P3.5		 RD
			P3.4		 WR
						 CS 接地
			P3.2(int0)	 int

*/

#define CH375_DATA_PORT				P1				/* CH375端口的I/O地址 */

sbit CH375_CMD_DAT = P3^7;							/* CH375地址線輸入A0,A0=1時寫命令,A0=0時讀寫數據 */
sbit CH375_RD = P3^5;								/* CH375讀選通輸入,低電平有效 */
sbit CH375_WR = P3^4;								/* CH375寫選通輸入,低電平有效 */
sbit led = P3^3;									/* 指示燈 */
sbit CH375_INT = P3^2;							/* CH375中斷請求輸出,低電平有效 */

void Delay2us(void);
void Delay50ms(void);
void Delay1s(void);
void FlashLED(void);
void ToggleReceive(void);
void ToggleSend(void);
void Ch375Init( void );
void ComInit(void);
void SendChar(u8 buff);
void Ch375WriteCommand( u8 cmd );
void Ch375WriteData( u8 dat );
void SetUsbMode( u8 mode );
void WriteUsbData( u8 len, u8 *buf );
void HostSend( u8 len, u8 *buf );

u8 ClearStall6( void);
u8 ClearStall7( void);
u8 Ch375ReadData(void);
u8 WaitInterrupt(void);
u8 InitUsbDevice(void);
u8 HostReceive( u8 *buf );
u8 GetDescr( u8 type );
u8 SetAddress( u8 addr );
u8 SetConfig( u8 cfg );
u8 IssueToken( u8 endp_and_pid );
u8 ReadUsbData( u8 *buf );
//void SendChars( u8 *buff );


/*-------------------------------------------------------------------------------*/
void Delay2us(void)
{
	u8 i;
	for ( i=DELAY_START_value*2+1; i!=0; i-- );
}

void Delay50ms(void)
{
	u8 i, j;
	for( i=100; i!=0; i-- )
		for( j=250; j!=0; j-- );
}

void Delay1s(void)
{
	u8 i,j,k;
	
	for( i=10; i!=0; i-- )
		for( j=200; j!=0; j-- )
			for( k=250; k!=0; k-- );
}

void FlashLED(void)
{
	u8 i;
	
	for( i=10; i>0; i-- )
	{
		led=!led;
		Delay1s();
	}
}
/*-------------------------------------------------------------------------------*/
/* 與CH372/CH375有關的基本I/O操作 */
/* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */
void Ch375WriteCommand( u8 cmd )
{
	_nop_();
	_nop_();

	CH375_CMD_DAT = A0_WRITE_CMD;			/* 命令 */
	CH375_DATA_PORT = cmd;
	CH375_RD = 1;
	CH375_WR = 0;
	
	_nop_();
	_nop_();
	
	CH375_WR = 1;
	CH375_CMD_DAT = A0_READ_WRITE_DATA;
	CH375_DATA_PORT = 0xFF;
}

/* 向CH375的數據端口寫入數據,周期不小于1.5uS,如果單片機較快則延時 */
void Ch375WriteData( u8 dat )
{
	_nop_();
	
	CH375_CMD_DAT = A0_READ_WRITE_DATA;			/* 數據 */
	CH375_DATA_PORT = dat;
	CH375_RD = 1;
	CH375_WR = 0;
	
	_nop_();
	
	CH375_WR = 1;
	CH375_DATA_PORT = 0xFF;
}

/* 從CH375的數據端口讀出數據,周期不小于1.5uS,如果單片機較快則延時 */
u8 Ch375ReadData(void)
{
	u8 rev_data;
	
	CH375_DATA_PORT = 0xFF;
	CH375_CMD_DAT = A0_READ_WRITE_DATA; /* 數據 */
	CH375_WR = 1;
	CH375_RD = 0;
	
	_nop_();
	
	rev_data = CH375_DATA_PORT;
	CH375_RD = 1;
	
	return( rev_data );
}

/* 主機端等待操作完成, 返回操作狀態 */
u8 WaitInterrupt(void)
{
	CH375_INT = 1;
	
	while( CH375_INT ) /* 查詢等待CH375操作完成中斷(INT#低電平) */
	{
		if( RI==1 ) /* 串口接收到數據 */
		{
			Ch375WriteCommand( (u8)(CMD_ABORT_NAK) ); /* 放棄當前操作 */
			return( 0xEF );
		}
	}

	Ch375WriteCommand( CMD_GET_STATUS ); /* 產生操作完成中斷, 獲取中斷狀態 */
	return( Ch375ReadData() );
}

/* 設置CH37X的工作模式 */
void SetUsbMode( u8 mode )
{
	u8 i;
	
	Ch375WriteCommand( CMD_SET_USB_MODE );
	Ch375WriteData( mode );
	endp6_mode = endp7_mode = 0x80; /* 主機端復位USB數據同步標志 */
	
	for( i=100; i!=0; i-- )   /* 等待設置模式操作完成,不超過30uS */
	{
		if( Ch375ReadData() == CMD_RET_SUCCESS )
			return; /* 成功 */
	}
	
	while(1)
	{
		FlashLED(); /* CH375出錯 */
	}
}

/************************************************************************************
數據同步
USB的數據同步通過切換DATA0和DATA1實現: 在設備端, USB設備可以自動切換;
在主機端, 必須由SET_ENDP6和SET_ENDP7命令控制CH375切換DATA0與DATA1.
主機端的程序處理方法是為設備端的各個端點分別提供一個全局變量,
初始值均為DATA0, 每執行一次成功事務后取反, 每執行一次失敗事務后將其復位為DATA1
*************************************************************************************/
void ToggleReceive(void)   /* 主機接收成功后,切換DATA0和DATA1實現數據同步 */
{
	Ch375WriteCommand( CMD_SET_ENDP6 );
	Ch375WriteData( endp6_mode );
	
	endp6_mode^=0x40;
	Delay2us();
}

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

u8 ClearStall6(void)   /* 主機接收失敗后,復位設備端的數據同步到DATA0 */
{
	Ch375WriteCommand( CMD_CLR_STALL );
	Ch375WriteData( 0x80 ); /* 對于OUT端點,有效地址是01H~0FH,對于IN端點,有效地址是81H~8FH */
 	endp6_mode=0x80;
	
	return( WaitInterrupt() );
}

u8 ClearStall7(void)   /* 主機發送失敗后,復位設備端的數據同步到DATA0 */
{
	Ch375WriteCommand( CMD_CLR_STALL );
	Ch375WriteData( 0x80 ); /* 對于OUT端點,有效地址是01H~0FH,對于IN端點,有效地址是81H~8FH */
	endp7_mode=0x80;
	
	return( WaitInterrupt() );
}

/* 數據讀寫, 單片機讀寫CH375芯片中的數據緩沖區 */
u8 ReadUsbData( u8 *buf )   /* 從CH37X讀出數據塊 */
{
	u8 len, length;
	
	Ch375WriteCommand( CMD_READ_USB_DATA ); /* 從CH375的端點緩沖區讀取接收到的數據 */
	len = Ch375ReadData(); /* 后續數據長度 */
	length=len;
	while( len-- )
	{
		*buf = Ch375ReadData();
		buf++;
	}
	return( length );
}

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

/* 主機操作 */
u8 IssueToken( u8 endp_and_pid )   /* 執行USB事務 */
{
	u8 status;
	
	/* 執行完成后, 將產生中斷通知單片機, 如果是USB_INT_SUCCESS就說明操作成功 */
	Ch375WriteCommand( CMD_ISSUE_TOKEN );
	Ch375WriteData( endp_and_pid ); /* 高4位目的端點號, 低4位令牌PID */
	
	status = WaitInterrupt(); /* 等待CH375操作完成 */
	return( status );
}

void HostSend( u8 len, u8 *buf )   /* 主機發送 */
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利久久久| 99r国产精品| 不卡的电视剧免费网站有什么| jiyouzz国产精品久久| 欧美精品一卡二卡| 国产精品高清亚洲| 国产一区视频网站| 在线综合视频播放| 亚洲综合免费观看高清完整版在线| 国精产品一区一区三区mba桃花| 欧美视频一区二区三区在线观看| 国产免费成人在线视频| 欧美aa在线视频| 在线免费观看不卡av| 中文字幕一区二区三区在线不卡 | 欧美xxxxx牲另类人与| 最近中文字幕一区二区三区| 激情国产一区二区| 欧美一区二区福利视频| 亚洲成人午夜电影| 在线观看国产一区二区| 亚洲三级理论片| 色综合中文字幕| 亚洲欧美综合网| 91原创在线视频| 中文字幕日韩欧美一区二区三区| 国产成人精品影视| 久久久99久久| 成人性色生活片免费看爆迷你毛片| 久久精品亚洲麻豆av一区二区| 日本aⅴ精品一区二区三区 | 精品国产乱码久久| 日本不卡一二三区黄网| 4438x成人网最大色成网站| 天堂久久一区二区三区| 欧美另类久久久品| 蜜桃视频一区二区三区在线观看 | 91玉足脚交白嫩脚丫在线播放| 欧美激情一区二区三区全黄 | 国产在线视频一区二区三区| 91精品久久久久久久久99蜜臂| 亚洲午夜电影在线观看| 欧美日韩一区国产| 蜜臀久久99精品久久久久久9| 日韩欧美二区三区| 国产一区二区按摩在线观看| 国产日韩精品一区二区三区| 粉嫩高潮美女一区二区三区| 中文字幕在线不卡视频| 欧美影视一区二区三区| 日日欢夜夜爽一区| 精品国产精品一区二区夜夜嗨| 国产成人av一区二区三区在线观看| 中文欧美字幕免费| 在线观看三级视频欧美| 日韩国产欧美视频| 日本一区二区在线不卡| 91理论电影在线观看| 国产福利一区在线观看| 国产婷婷精品av在线| www.日韩精品| 日韩高清欧美激情| 久久久国产精品麻豆| 91猫先生在线| 美女尤物国产一区| 亚洲欧美一区二区久久| 日韩欧美国产电影| 色哟哟国产精品免费观看| 伦理电影国产精品| 亚洲人成在线观看一区二区| 91精品国产一区二区| 99久久综合国产精品| 丝袜国产日韩另类美女| 欧美国产精品专区| 欧美高清性hdvideosex| 成人国产免费视频| 久久国产乱子精品免费女| 1024成人网| 欧美成人精品福利| 在线这里只有精品| 国产精品99久久久久久有的能看| 亚洲成人动漫av| 中文字幕在线播放不卡一区| 日韩欧美成人一区二区| 欧美网站一区二区| 99国产精品久久久久久久久久久 | 亚洲人成精品久久久久| 日韩你懂的在线观看| 日本精品一级二级| 国产精品亚洲人在线观看| 日本怡春院一区二区| 一区免费观看视频| 久久老女人爱爱| 欧美一级欧美一级在线播放| 在线观看视频欧美| 91论坛在线播放| 99re视频这里只有精品| 国产盗摄精品一区二区三区在线| 日韩国产精品大片| 午夜电影网一区| 亚洲韩国一区二区三区| 国产精品国产三级国产普通话蜜臀| 精品99一区二区| 日韩精品一区二区三区蜜臀| 在线不卡中文字幕播放| 欧美日韩国产电影| 欧美日韩一区二区三区在线看| 一本大道综合伊人精品热热| 91亚洲精品乱码久久久久久蜜桃 | 精品一区二区av| 欧美aaaaaa午夜精品| 日韩国产高清在线| 欧美aa在线视频| 免费不卡在线视频| 精品中文av资源站在线观看| 青娱乐精品在线视频| 日韩激情一二三区| 麻豆91在线看| 蜜桃视频一区二区三区| 精彩视频一区二区三区| 国产黄色精品网站| 成人精品国产福利| 色婷婷激情一区二区三区| 欧美亚洲一区二区在线观看| 日本电影欧美片| 欧美美女网站色| 欧美大黄免费观看| 中文字幕+乱码+中文字幕一区| 国产精品久久夜| 夜夜爽夜夜爽精品视频| 丝袜美腿成人在线| 国产乱对白刺激视频不卡| 不卡一区二区中文字幕| 色婷婷综合五月| 56国语精品自产拍在线观看| 欧美一区二区三区四区在线观看| 精品裸体舞一区二区三区| 欧美韩国日本一区| 亚洲一区二区三区中文字幕 | www.亚洲人| 欧美日韩激情一区| 国产午夜精品一区二区三区视频| 亚洲天堂久久久久久久| 日韩av高清在线观看| 国产一区二区三区电影在线观看| 不卡av在线网| 欧美日本一区二区三区| ww久久中文字幕| 国产精品成人在线观看| 亚洲国产视频一区| 国产精品亚洲人在线观看| 在线这里只有精品| 久久久久久免费| 亚洲午夜久久久久中文字幕久| 91看片淫黄大片一级在线观看| 欧美一区二区视频免费观看| 欧美韩国日本一区| 爽好久久久欧美精品| 成人免费高清在线观看| 欧美区视频在线观看| 国产精品麻豆视频| 日韩中文欧美在线| 91丨porny丨最新| 久久综合久久综合九色| 亚洲综合免费观看高清完整版 | 丝袜亚洲精品中文字幕一区| 国产福利不卡视频| 欧美精品亚洲一区二区在线播放| 国产片一区二区三区| 日韩av在线播放中文字幕| 91在线观看成人| 欧美韩国日本综合| 精品午夜久久福利影院| 欧美精品色一区二区三区| 亚洲欧美中日韩| 国产黄色成人av| 2021国产精品久久精品| 日韩精品一级中文字幕精品视频免费观看| 国产aⅴ精品一区二区三区色成熟| 欧美一区日韩一区| 亚洲一级二级在线| 色婷婷亚洲精品| 国产精品免费视频网站| 国产精品影音先锋| 精品国产凹凸成av人导航| 日韩精品成人一区二区三区 | av在线免费不卡| 欧美激情中文不卡| 国产精华液一区二区三区| 日韩一区二区三区高清免费看看 | 一区2区3区在线看| av电影在线观看一区| 亚洲国产精品av| 国产99久久久久久免费看农村| 欧美成人精品福利| 激情久久五月天| 久久伊人蜜桃av一区二区| 久久国产精品色婷婷| 欧美刺激脚交jootjob| 激情六月婷婷久久|