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

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

?? d12ci.c

?? D12 USB 驅動程序,加51源理圖,加上位機測試程序,與驅動程序
?? C
字號:
/****************************************Copyright (c)**************************************************
**                               廣州周立功單片機發展有限公司
**                                     研    究    所
**                                        產品一部 
**
**                                 http://www.zlgmcu.com
**
** 文   件   名: D12CI.c
** 最后修改日期: 2004年11月15日
** 描        述: USB驅動程序軟件包: PDIUSBD12 設備端驅動程序 接口控制驅動層
** 版	     本: V5.0
**********************************************************************************************************/

#include <reg52.h>
#include "D12Config.h"
#include "D12HAL.h"
#include "D12CI.h"
#include "Chap_9.h"

		/*****************************************
			與CPU 無關, 與 USB相關的函數
		*****************************************/

/************************************************************
** 函數名稱: D12_ReadChipID()
** 功能描述: 讀取芯片ID
** 輸   入: 無
** 輸   出: 芯片的ID號
************************************************************/
INT16U D12_ReadChipID(void)
{
	INT16U i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xFD);		//發送讀PDIUSBD12芯片ID號命令	
	i=inportb(D12_DATA);				//讀取ID號低字節
	j=inportb(D12_DATA);				//讀取ID號高位字節
	i += (j<<8);						//組成16位的PDIUSBD12芯片ID號

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return i;
}

/************************************************************
** 函數名稱: D12_SetAddressEnable()
** 功能描述: 設置地址/使能
** 輸   入: INT8U bAddress:  地址
	     	 INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 使能
** 輸   出: 無
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xD0);	//輸出設置地址/使能指令
	if(bEnable)
		bAddress |= 0x80;			//bit7置1,使能
	outportb(D12_DATA, bAddress);	//輸出設置值

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();
}


/************************************************************
** 函數名稱: D12_SetEndpointEnable()
** 功能描述: 設置端點使能
** 輸   入: INT8U bEnable :  0 --- 禁止
	     		     		  1 --- 允許
** 輸   出: 無
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xD8);	//輸出設置端點使能指令
	if(bEnable)
		outportb(D12_DATA, 1);		//設置端點允許
	else
		outportb(D12_DATA, 0);		//設置端點禁止

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();
}

/************************************************************
** 函數名稱: void D12_SetMode()
** 功能描述: 模式設置
** 輸   入: INT8U bConfig:  配置字節信息
	     	 INT8U bClkDiv:  分頻系數
** 輸   出: 無
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xF3);		//輸出設置模式指令
	outportb(D12_DATA, bConfig);		//輸出配置字節信息
	outportb(D12_DATA, bClkDiv);		//輸出時鐘分頻因數字節

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();	
}

/************************************************************
** 函數名稱: void D12_SetDMA()
** 功能描述: 設置DMA工作方式設置
** 輸   入: INT8U bMode: 	設置值
** 輸   出: 無
************************************************************/
void D12_SetDMA(INT8U bMode)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xFB);	//設置DMA工作方命令
	outportb(D12_DATA, bMode);		//輸出設置值

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();			
}

/************************************************************
** 函數名稱: D12_ReadInterruptRegister()
** 功能描述: 讀取中斷寄存器值
** 輸   入: 無
** 輸   出: 中斷寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
	INT8U b1;
	INT16U j;

	outportb(D12_COMMAND, 0xF4);	//讀取中斷寄存器命令
	b1 = inportb(D12_DATA);			//讀取低8位字節
	j = inportb(D12_DATA);			//讀取高8位字節

	j <<= 8;
	j += b1;						//組合為16位

	return j;
}

/************************************************************
** 函數名稱: D12_SelectEndpoint()
** 功能描述: 端點選擇,將內部指針初始化到選擇的緩沖區起始位置
** 輸   入: INT8U bEndp:   端點索引號,取值0 ~ 5
** 輸   出: 讀出的字節
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
	INT8U c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, bEndp);	//端點選擇
	c = inportb(D12_DATA);			//讀出一個字節

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return c;
}

/************************************************************
** 函數名稱: D12_ReadEndpointStatus()
** 功能描述: 讀取端點狀態
** 輸   入: INT8U bEndp:   端點索引號,取值0 ~ 5
** 輸   出: 端點狀態
************************************************************/
#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
	INT8U c;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0x80 + bEndp);	//讀取端點狀態命令
	c = inportb(D12_DATA);					//讀取端點狀態

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return c;
}
#endif

/************************************************************
** 函數名稱: D12_ReadLastTransactionStatus()
** 功能描述: 讀取最后處理狀態寄存器
** 輸   入: INT8U bEndp:   端點索引號,取值0 ~ 5
** 輸   出: 端點最后處理的狀態
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);	//輸出讀取最后處理狀態寄存器命令
	return inportb(D12_DATA);				//讀取狀態
}

/************************************************************
** 函數名稱: D12_SetEndpointStatus()
** 功能描述: 設置端點狀態
** 輸   入: INT8U bEndp:   端點索引號,取值0 ~ 5
	         INT8U bStalled: 狀態值
** 輸   出: 端點狀態
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0x40 + bEndp);	//發送設置端點狀態命令
	outportb(D12_DATA, bStalled);			//設置端點狀態

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();
}

/************************************************************
** 函數名稱: D12_SendResume()
** 功能描述: 傳輸恢復
** 輸   入: 無
** 輸   出: 無
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
	outportb(D12_COMMAND, 0xF6);			//設置發送恢復
}
#endif


/************************************************************
** 函數名稱: D12_ReadCurrentFrameNumber()
** 功能描述: 讀取當前幀號
** 輸   入: 無
** 輸   出: 當前幀號
************************************************************/
#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
	INT16U i,j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, 0xF5);			//發送讀取當前幀數目命令
	i= inportb(D12_DATA);					//讀取幀數目的低8位
	j = inportb(D12_DATA);					//讀取幀數目的高8位

	i += (j<<8);

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return i;								//返目當前幀數目
}
#endif


/************************************************************
** 函數名稱: D12_ReadEndpoint()
** 功能描述: 讀取端點數據
** 輸   入: INT8U endp:     端點索引號,取值 0 ~ 5 
	    	 INT8U len:	     要讀取的數據長度
	     	 INT8U * buf:    接收數據指針
** 輸   出: 實際讀得的字節數
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
	INT8U i, j;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, endp);						//發送選擇端點命令
	if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {		//如果緩沖區為空
		if(bEPPflags.bits.in_isr == 0)
			ENABLE();
		return 0;										//則返回讀到0字節
	}
	len=len;
	outportb(D12_COMMAND, 0xF0);						//發送讀緩沖區命令
	j = inportb(D12_DATA);								//讀取保留字節
	j = inportb(D12_DATA);								//讀取數據字節的數目/長度

	if(j > len)											//如果大于要求讀的字節數目
		j = len;										//則只讀取要求的字節長度

		
	for(i=0; i<j; i++)
		*(buf+i) = inportb(D12_DATA);					//讀取要求的字節數目/長度

	outportb(D12_COMMAND, 0xF2);						//清緩沖區,新的信息包才可以重新被接受

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return j;											//返回讀到的字節數
}

/************************************************************
** 函數名稱: D12_WriteEndpoint()
** 功能描述: 把數據寫入端點
** 輸   入: INT8U endp:     端點索引號,取值 0 ~ 5 
	     	 INT8U len:	     要寫入的數據長度
	     	 INT8U * buf:    發送數據指針
** 輸   出: 實際寫入的字節數
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
	INT8U i;

	if(bEPPflags.bits.in_isr == 0)
		DISABLE();

	outportb(D12_COMMAND, endp);			//發送選擇端點命令
	i = inportb(D12_DATA);					//可選地讀取一個字節

	outportb(D12_COMMAND, 0xF0);			//發送寫緩沖區命令	
	outportb(D12_DATA, 0);					//寫入一個保留字節
	outportb(D12_DATA, len);				//寫入即將寫入的字節數目

	for(i=0; i<len; i++)
		outportb(D12_DATA, *(buf+i));		//寫入指定的字節

	outportb(D12_COMMAND, 0xFA);			//使緩沖區有效

	if(bEPPflags.bits.in_isr == 0)
		ENABLE();

	return len;								//返回寫入的字節數
}

/************************************************************
** 函數名稱: D12_AcknowledgeEndpoint()
** 功能描述: 應答Setup
** 輸   入: INT8U endp:     端點索引號,取值 0 ~ 5 
** 輸   出: 無
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
	outportb(D12_COMMAND, endp);			//選擇端點
	outportb(D12_COMMAND, 0xF1);			//應答Setup指令
	if(endp == 0)		
		outportb(D12_COMMAND, 0xF2);		//清空該端點緩沖區
}

/************************************************************
** 函數名稱: void D12_ClearBuff()
** 功能描述: 清指定端點的緩沖區(包括雙緩沖區)
** 輸   入: INT8U endp:     端點索引號,取值 0 ~ 5 
** 輸   出: 無
************************************************************/
#if D12_ClearBuff_EN
void D12_ClearBuff(INT8U endp)
{	
   	outportb(D12_COMMAND, endp);			//選擇端點
	outportb(D12_COMMAND, 0xF2);			//清空第1個緩沖區	
	
	if (endp >= 4){
   		outportb(D12_COMMAND, endp);		//選擇端點
		outportb(D12_COMMAND, 0xF2);		//清空第2個緩沖區	
	}
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一级片在线播放| 成人午夜激情片| 欧美日韩国产免费| 亚洲成人动漫av| 7777精品伊人久久久大香线蕉最新版| 午夜日韩在线电影| 日韩欧美激情四射| 国产精品白丝av| 亚洲女同一区二区| 欧美高清精品3d| 黄网站免费久久| 国产精品美女久久久久久久网站| 99精品黄色片免费大全| 亚洲福利视频三区| 精品久久久久久无| av在线播放成人| 日日夜夜一区二区| 久久久久久麻豆| 色婷婷av久久久久久久| 日日夜夜免费精品视频| 国产日韩av一区| 欧美三级在线看| 国产精品资源在线看| 亚洲男人天堂一区| 日韩欧美激情一区| 91亚洲永久精品| 麻豆精品久久精品色综合| 欧美激情一区二区三区不卡| 在线免费观看不卡av| 亚洲视频狠狠干| 99re在线视频这里只有精品| 日本怡春院一区二区| 中文字幕一区视频| 日韩西西人体444www| 国产成人精品三级| 日韩不卡一区二区| 国产精品麻豆99久久久久久| 欧美电影影音先锋| 99re视频这里只有精品| 九九九久久久精品| 亚洲风情在线资源站| 国产精品久久久久久亚洲伦 | 日韩女优制服丝袜电影| 99久久er热在这里只有精品66| 天堂一区二区在线免费观看| 欧美国产激情一区二区三区蜜月| 欧美日本一道本| 99视频精品在线| 国产呦精品一区二区三区网站| 一区二区三区在线影院| 国产日韩欧美精品在线| 在线电影国产精品| 色综合久久久久综合| 狠狠狠色丁香婷婷综合激情| 亚洲精品日韩一| 国产精品色在线观看| 欧美不卡在线视频| 欧美一区二区三区四区高清 | 亚洲一区二区精品久久av| 2023国产精品自拍| 欧美一区二区三区白人| 欧美色图免费看| 在线观看亚洲精品| 日本久久一区二区三区| 成人午夜免费电影| 粉嫩av亚洲一区二区图片| 久久99热国产| 麻豆成人在线观看| 捆绑调教一区二区三区| 视频一区免费在线观看| 亚洲成av人影院| 亚洲电影激情视频网站| 亚洲综合清纯丝袜自拍| 一区二区三区av电影| 亚洲欧美日韩国产另类专区| 一区视频在线播放| 国产精品视频线看| 国产精品伦理在线| 亚洲同性同志一二三专区| 国产精品嫩草影院com| 久久精品一区二区三区不卡| 亚洲精品一线二线三线无人区| 精品国产电影一区二区| 久久午夜电影网| 国产拍欧美日韩视频二区| 久久精品人人做人人综合| 国产午夜久久久久| 欧美韩国日本不卡| 亚洲欧洲国产日本综合| 亚洲男人的天堂一区二区| 亚洲欧美另类小说| 亚洲一区二区三区四区在线观看| 午夜视频久久久久久| 蜜臀99久久精品久久久久久软件 | 国产精品一区二区在线观看不卡| 国产精品一二三| 99久久精品一区二区| 欧美色大人视频| 精品国产免费视频| 国产日韩欧美高清| 亚洲区小说区图片区qvod| 亚洲超丰满肉感bbw| 六月丁香婷婷色狠狠久久| 国产精品亚洲一区二区三区妖精 | 亚洲精品一区二区三区蜜桃下载| 久久精品视频一区二区三区| 国产精品免费视频观看| 亚洲成av人片在www色猫咪| 久久国产精品色| www.成人在线| 制服丝袜中文字幕一区| 国产亚洲精品bt天堂精选| 亚洲免费av网站| 久久精品国产一区二区三区免费看| 国产精品69毛片高清亚洲| 91片黄在线观看| 在线播放亚洲一区| 欧美激情一区二区| 亚洲bt欧美bt精品| 成人一区在线观看| 51精品国自产在线| 17c精品麻豆一区二区免费| 日韩vs国产vs欧美| 99久久伊人久久99| 精品久久久久久久久久久久包黑料 | 日韩一卡二卡三卡四卡| 国产精品久久毛片av大全日韩| 亚洲国产精品久久久久婷婷884| 国产成人免费视频| 欧美精品国产精品| 国产精品久久久久久福利一牛影视 | 成人精品免费看| 日韩一区二区三区av| 日韩理论片网站| 国产高清视频一区| 91精品国产91综合久久蜜臀| 亚洲丝袜精品丝袜在线| 韩国三级电影一区二区| 欧美日韩免费在线视频| 国产精品久久网站| 国产麻豆视频一区| 日韩欧美精品在线| 天天综合天天综合色| 色综合天天综合狠狠| 国产午夜精品一区二区三区四区| 亚洲18色成人| 99国内精品久久| 国产精品私人自拍| 国产精品1024久久| 日韩精品一区二区三区四区视频| 亚洲一区二区在线观看视频| 成人黄色小视频| 国产午夜精品福利| 国产美女娇喘av呻吟久久| 日韩一卡二卡三卡国产欧美| 亚洲图片欧美色图| 欧美日韩中文国产| 亚洲国产精品影院| 在线一区二区三区四区五区 | 亚洲成人综合视频| 欧美在线高清视频| 亚洲精品欧美激情| 在线视频一区二区三| 亚洲欧美日本在线| 91福利视频久久久久| 亚洲在线成人精品| 欧美日韩专区在线| 午夜电影一区二区| 欧美日本一区二区| 全部av―极品视觉盛宴亚洲| 56国语精品自产拍在线观看| 秋霞av亚洲一区二区三| 日韩一区二区在线观看视频 | 亚洲第一福利一区| 91精品国产aⅴ一区二区| 麻豆精品一区二区三区| 精品国产免费一区二区三区四区| 国产在线视频精品一区| 国产欧美日韩综合精品一区二区| 粉嫩在线一区二区三区视频| 一区精品在线播放| 91黄色免费版| 蜜桃视频免费观看一区| 日韩精品在线一区| 国产精品18久久久久久久久久久久| 久久精品欧美日韩| av在线播放成人| 午夜av一区二区| 精品美女一区二区三区| 成人免费黄色大片| 亚洲无人区一区| 欧美精品一区二区三区很污很色的| 国产成人免费高清| 亚洲一区二区高清| 日韩手机在线导航| 成人午夜短视频| 五月婷婷综合在线| 欧美国产日本韩| 欧美色大人视频| 国产精品一区二区在线观看网站|