?? d12ci.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: D12CI.c
** 最后修改日期: 2004年11月15日
** 描 述: USB驅(qū)動程序軟件包: PDIUSBD12 設(shè)備端驅(qū)動程序 接口控制驅(qū)動層
** 版 本: V5.0
**********************************************************************************************************/
#include <reg52.h>
#include "D12Config.h"
#include "D12HAL.h"
#include "D12CI.h"
#include "Chap_9.h"
/*****************************************
與CPU 無關(guān), 與 USB相關(guān)的函數(shù)
*****************************************/
/************************************************************
** 函數(shù)名稱: D12_ReadChipID()
** 功能描述: 讀取芯片ID
** 輸 入: 無
** 輸 出: 芯片的ID號
************************************************************/
INT16U D12_ReadChipID(void)
{
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xFD); //發(fā)送讀PDIUSBD12芯片ID號命令
i=inportb(D12_DATA); //讀取ID號低字節(jié)
j=inportb(D12_DATA); //讀取ID號高位字節(jié)
i += (j<<8); //組成16位的PDIUSBD12芯片ID號
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return i;
}
/************************************************************
** 函數(shù)名稱: D12_SetAddressEnable()
** 功能描述: 設(shè)置地址/使能
** 輸 入: INT8U bAddress: 地址
INT8U bEnable : 0 --- 禁止
1 --- 使能
** 輸 出: 無
************************************************************/
void D12_SetAddressEnable(INT8U bAddress, INT8U bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xD0); //輸出設(shè)置地址/使能指令
if(bEnable)
bAddress |= 0x80; //bit7置1,使能
outportb(D12_DATA, bAddress); //輸出設(shè)置值
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函數(shù)名稱: D12_SetEndpointEnable()
** 功能描述: 設(shè)置端點(diǎn)使能
** 輸 入: INT8U bEnable : 0 --- 禁止
1 --- 允許
** 輸 出: 無
************************************************************/
void D12_SetEndpointEnable(INT8U bEnable)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xD8); //輸出設(shè)置端點(diǎn)使能指令
if(bEnable)
outportb(D12_DATA, 1); //設(shè)置端點(diǎn)允許
else
outportb(D12_DATA, 0); //設(shè)置端點(diǎn)禁止
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函數(shù)名稱: void D12_SetMode()
** 功能描述: 模式設(shè)置
** 輸 入: INT8U bConfig: 配置字節(jié)信息
INT8U bClkDiv: 分頻系數(shù)
** 輸 出: 無
************************************************************/
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xF3); //輸出設(shè)置模式指令
outportb(D12_DATA, bConfig); //輸出配置字節(jié)信息
outportb(D12_DATA, bClkDiv); //輸出時(shí)鐘分頻因數(shù)字節(jié)
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函數(shù)名稱: void D12_SetDMA()
** 功能描述: 設(shè)置DMA工作方式設(shè)置
** 輸 入: INT8U bMode: 設(shè)置值
** 輸 出: 無
************************************************************/
void D12_SetDMA(INT8U bMode)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xFB); //設(shè)置DMA工作方命令
outportb(D12_DATA, bMode); //輸出設(shè)置值
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函數(shù)名稱: D12_ReadInterruptRegister()
** 功能描述: 讀取中斷寄存器值
** 輸 入: 無
** 輸 出: 中斷寄存器值
************************************************************/
INT16U D12_ReadInterruptRegister(void)
{
INT8U b1;
INT16U j;
outportb(D12_COMMAND, 0xF4); //讀取中斷寄存器命令
b1 = inportb(D12_DATA); //讀取低8位字節(jié)
j = inportb(D12_DATA); //讀取高8位字節(jié)
j <<= 8;
j += b1; //組合為16位
return j;
}
/************************************************************
** 函數(shù)名稱: D12_SelectEndpoint()
** 功能描述: 端點(diǎn)選擇,將內(nèi)部指針初始化到選擇的緩沖區(qū)起始位置
** 輸 入: INT8U bEndp: 端點(diǎn)索引號,取值0 ~ 5
** 輸 出: 讀出的字節(jié)
************************************************************/
INT8U D12_SelectEndpoint(INT8U bEndp)
{
INT8U c;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, bEndp); //端點(diǎn)選擇
c = inportb(D12_DATA); //讀出一個(gè)字節(jié)
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return c;
}
/************************************************************
** 函數(shù)名稱: D12_ReadEndpointStatus()
** 功能描述: 讀取端點(diǎn)狀態(tài)
** 輸 入: INT8U bEndp: 端點(diǎn)索引號,取值0 ~ 5
** 輸 出: 端點(diǎn)狀態(tài)
************************************************************/
#if D12_ReadEndpointStatus_EN
INT8U D12_ReadEndpointStatus(INT8U bEndp)
{
INT8U c;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0x80 + bEndp); //讀取端點(diǎn)狀態(tài)命令
c = inportb(D12_DATA); //讀取端點(diǎn)狀態(tài)
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return c;
}
#endif
/************************************************************
** 函數(shù)名稱: D12_ReadLastTransactionStatus()
** 功能描述: 讀取最后處理狀態(tài)寄存器
** 輸 入: INT8U bEndp: 端點(diǎn)索引號,取值0 ~ 5
** 輸 出: 端點(diǎn)最后處理的狀態(tài)
************************************************************/
INT8U D12_ReadLastTransactionStatus(INT8U bEndp)
{
outportb(D12_COMMAND, 0x40 + bEndp); //輸出讀取最后處理狀態(tài)寄存器命令
return inportb(D12_DATA); //讀取狀態(tài)
}
/************************************************************
** 函數(shù)名稱: D12_SetEndpointStatus()
** 功能描述: 設(shè)置端點(diǎn)狀態(tài)
** 輸 入: INT8U bEndp: 端點(diǎn)索引號,取值0 ~ 5
INT8U bStalled: 狀態(tài)值
** 輸 出: 端點(diǎn)狀態(tài)
************************************************************/
void D12_SetEndpointStatus(INT8U bEndp,INT8U bStalled)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0x40 + bEndp); //發(fā)送設(shè)置端點(diǎn)狀態(tài)命令
outportb(D12_DATA, bStalled); //設(shè)置端點(diǎn)狀態(tài)
if(bEPPflags.bits.in_isr == 0)
ENABLE();
}
/************************************************************
** 函數(shù)名稱: D12_SendResume()
** 功能描述: 傳輸恢復(fù)
** 輸 入: 無
** 輸 出: 無
************************************************************/
#if D12_SendResume_EN
void D12_SendResume(void)
{
outportb(D12_COMMAND, 0xF6); //設(shè)置發(fā)送恢復(fù)
}
#endif
/************************************************************
** 函數(shù)名稱: D12_ReadCurrentFrameNumber()
** 功能描述: 讀取當(dāng)前幀號
** 輸 入: 無
** 輸 出: 當(dāng)前幀號
************************************************************/
#if D12_ReadCurrentFrameNumber_EN
INT16U D12_ReadCurrentFrameNumber(void)
{
INT16U i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, 0xF5); //發(fā)送讀取當(dāng)前幀數(shù)目命令
i= inportb(D12_DATA); //讀取幀數(shù)目的低8位
j = inportb(D12_DATA); //讀取幀數(shù)目的高8位
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return i; //返目當(dāng)前幀數(shù)目
}
#endif
/************************************************************
** 函數(shù)名稱: D12_ReadEndpoint()
** 功能描述: 讀取端點(diǎn)數(shù)據(jù)
** 輸 入: INT8U endp: 端點(diǎn)索引號,取值 0 ~ 5
INT8U len: 要讀取的數(shù)據(jù)長度
INT8U * buf: 接收數(shù)據(jù)指針
** 輸 出: 實(shí)際讀得的字節(jié)數(shù)
************************************************************/
INT8U D12_ReadEndpoint(INT8U endp,INT8U len,INT8U * buf)
{
INT8U i, j;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, endp); //發(fā)送選擇端點(diǎn)命令
if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) { //如果緩沖區(qū)為空
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return 0; //則返回讀到0字節(jié)
}
outportb(D12_COMMAND, 0xF0); //發(fā)送讀緩沖區(qū)命令
j = inportb(D12_DATA); //讀取保留字節(jié)
j = inportb(D12_DATA); //讀取數(shù)據(jù)字節(jié)的數(shù)目/長度
if(j > len) //如果大于要求讀的字節(jié)數(shù)目
j = len; //則只讀取要求的字節(jié)長度
for(i=0; i<j; i++)
*(buf+i) = inportb(D12_DATA); //讀取要求的字節(jié)數(shù)目/長度
outportb(D12_COMMAND, 0xF2); //清緩沖區(qū),新的信息包才可以重新被接受
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return j; //返回讀到的字節(jié)數(shù)
}
/************************************************************
** 函數(shù)名稱: D12_WriteEndpoint()
** 功能描述: 把數(shù)據(jù)寫入端點(diǎn)
** 輸 入: INT8U endp: 端點(diǎn)索引號,取值 0 ~ 5
INT8U len: 要寫入的數(shù)據(jù)長度
INT8U * buf: 發(fā)送數(shù)據(jù)指針
** 輸 出: 實(shí)際寫入的字節(jié)數(shù)
************************************************************/
INT8U D12_WriteEndpoint(INT8U endp, INT8U len,INT8U * buf)
{
INT8U i;
if(bEPPflags.bits.in_isr == 0)
DISABLE();
outportb(D12_COMMAND, endp); //發(fā)送選擇端點(diǎn)命令
i = inportb(D12_DATA); //可選地讀取一個(gè)字節(jié)
outportb(D12_COMMAND, 0xF0); //發(fā)送寫緩沖區(qū)命令
outportb(D12_DATA, 0); //寫入一個(gè)保留字節(jié)
outportb(D12_DATA, len); //寫入即將寫入的字節(jié)數(shù)目
for(i=0; i<len; i++)
outportb(D12_DATA, *(buf+i)); //寫入指定的字節(jié)
outportb(D12_COMMAND, 0xFA); //使緩沖區(qū)有效
if(bEPPflags.bits.in_isr == 0)
ENABLE();
return len; //返回寫入的字節(jié)數(shù)
}
/************************************************************
** 功能描述: 應(yīng)答Setup
** 輸 入: INT8U endp: 端點(diǎn)索引號,取值 0 ~ 5
** 輸 出: 無
************************************************************/
void D12_AcknowledgeEndpoint(INT8U endp)
{
outportb(D12_COMMAND, endp); //選擇端點(diǎn)
outportb(D12_COMMAND, 0xF1); //應(yīng)答Setup指令
if(endp == 0)
outportb(D12_COMMAND, 0xF2); //清空該端點(diǎn)緩沖區(qū)
}
/************************************************************
** 函數(shù)名稱: void D12_ClearBuff()
** 功能描述: 清指定端點(diǎn)的緩沖區(qū)(包括雙緩沖區(qū))
** 輸 入: INT8U endp: 端點(diǎn)索引號,取值 0 ~ 5
** 輸 出: 無
************************************************************/
#if D12_ClearBuff_EN
void D12_ClearBuff(INT8U endp)
{
outportb(D12_COMMAND, endp); //選擇端點(diǎn)
outportb(D12_COMMAND, 0xF2); //清空第1個(gè)緩沖區(qū)
if (endp >= 4){
outportb(D12_COMMAND, endp); //選擇端點(diǎn)
outportb(D12_COMMAND, 0xF2); //清空第2個(gè)緩沖區(qū)
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -