?? d12driver.c
字號(hào):
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: D12Driver.c
** 最后修改日期: 2004年11月15日
** 描 述: USB驅(qū)動(dòng)程序軟件包: PDIUSBD12 設(shè)備端驅(qū)動(dòng)程序 應(yīng)用層
** 版 本: V5.0
**********************************************************************************************************/
#include <reg52.h>
#include "D12Config.h"
#include "D12CI.h"
#include "D12HAL.h"
#include "Chap_9.h"
#include "Descriptor.h"
#include "D12Driver.h"
INT8U *GenEpBuf; //端點(diǎn)1接收緩沖區(qū)
//INT8U idata EpBuf[EP2_PACKET_SIZE]; //端點(diǎn)2接收緩沖區(qū)
INT8U *EpBuf;
INT8U ep2_len;
INT8U ep1_len;
/*******************************************************************
** 函數(shù)名稱: usbserve()
** 功能描述: USB事件處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void usbserve(void)
{
if (bEPPflags.bits.setup_packet){ //Setup包處理
DISABLE();
bEPPflags.bits.setup_packet = 0;
control_handler(); //調(diào)用請(qǐng)求處理子程序
ENABLE();
}//if setup_packet
if (bEPPflags.bits.bus_reset) { //USB總線復(fù)位處理
DISABLE();
bEPPflags.bits.bus_reset = 0;
ENABLE();
d12_busreset();
} // if bus reset
if (bEPPflags.bits.suspend) { //D12掛起改變處理
DISABLE();
bEPPflags.bits.suspend= 0;
ENABLE();
d12_suspend();
} // if suspend change
//在此添加其它usb事件處理代碼
}
/*******************************************************************
** 函數(shù)名稱: d12_busreset()
** 功能描述: USB總線復(fù)位處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void d12_busreset(void)
{
//在此添加總線復(fù)位處理代碼
}
/*******************************************************************
** 函數(shù)名稱: dma_eot()
** 功能描述: DMA結(jié)束處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void dma_eot(void)
{
//在此添加DMA結(jié)束處理代碼
}
/*******************************************************************
** 函數(shù)名稱: d12_suspend()
** 功能描述: 總線掛起改變處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void d12_suspend(void)
{
//在此添加總線掛起改變代碼
}
/*******************************************************************
** 函數(shù)名稱: ep1_txdone()
** 功能描述: 端點(diǎn)1 IN(發(fā)送)處理處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep1_txdone(void)
{
D12_ReadLastTransactionStatus(3); //清中斷標(biāo)志位
}
/*******************************************************************
** 函數(shù)名稱: ep1_txdone()
** 功能描述: 端點(diǎn)1 OUT(接收)處理處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep1_rxdone(void)
{
INT8U len;
D12_ReadLastTransactionStatus(2); //清中斷標(biāo)志位
len = D12_ReadEndpoint(2,16,GenEpBuf); //讀取數(shù)據(jù)
if(len != 0)
{
bEPPflags.bits.ep1_rxdone = 1; //標(biāo)志接收到數(shù)據(jù)
ep1_len=len;
}
else ep1_len=0;
}
/*******************************************************************
** 函數(shù)名稱: ep2_txdone()
** 功能描述: 端點(diǎn)2 IN(發(fā)送)處理處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep2_txdone(void)
{
D12_ReadLastTransactionStatus(5); //清中斷標(biāo)志位
}
/*******************************************************************
** 函數(shù)名稱: ep2_rxdone()
** 功能描述: 端點(diǎn)2 OUT(接收)處理處理函數(shù)
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep2_rxdone(void)
{
INT8U len;
D12_ReadLastTransactionStatus(4); //清中斷標(biāo)志位
len = D12_ReadEndpoint(4,EP2_PACKET_SIZE,EpBuf); //讀取緩沖區(qū)中的數(shù)據(jù)
if (len != 0)
{
bEPPflags.bits.ep2_rxdone = 1;
ep2_len=len;
}
else ep2_len=0;
}
/***********************************************************************
** 函數(shù)名稱: void Usb_Exception(void)
** 功能描述: D12中斷服務(wù)程序
*************************************************************************/
void Usb_Exception(void) interrupt 2
{
INT16U i_st;
DISABLE(); //進(jìn)入D12中斷服務(wù)程序時(shí)關(guān)中斷
bEPPflags.bits.in_isr = 1;
i_st = D12_ReadInterruptRegister(); //讀取PDIUSBD12中斷寄存器值
if(i_st != 0) {
if(i_st & D12_INT_BUSRESET)
bEPPflags.bits.bus_reset = 1; //USB總線復(fù)位標(biāo)志
if(i_st & D12_INT_EOT)
dma_eot(); //DMA傳輸技術(shù)處理
if(i_st & D12_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend = 1; //掛起改變標(biāo)志置1
if(i_st & D12_INT_ENDP0IN)
ep0_txdone(); //控制端點(diǎn)發(fā)送數(shù)據(jù)處理
if(i_st & D12_INT_ENDP0OUT)
ep0_rxdone(); //控制端點(diǎn)接收數(shù)據(jù)處理
if(i_st & D12_INT_ENDP1IN)
ep1_txdone(); //端點(diǎn) 1發(fā)送數(shù)據(jù)處理
if(i_st & D12_INT_ENDP1OUT)
ep1_rxdone(); //端點(diǎn) 1接收數(shù)據(jù)處理
if(i_st & D12_INT_ENDP2IN)
ep2_txdone(); //端點(diǎn) 2發(fā)送數(shù)據(jù)處理
if(i_st & D12_INT_ENDP2OUT)
ep2_rxdone(); //端點(diǎn) 2接收數(shù)據(jù)處理
}
bEPPflags.bits.in_isr = 0;
ENABLE(); //退出D12中斷服務(wù)程序時(shí)開中斷
}
/************************************************************
** 函數(shù)名稱: disconnect_USB()
** 功能描述: 斷開USB總線
************************************************************/
void disconnect_USB(void)
{
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
} //SoftConnect 斷開
/************************************************************
** 函數(shù)名稱: connect_USB()
** 功能描述: 連接USB總線
************************************************************/
void connect_USB(void)
{
// Initialize D12 configuration
D12_SetDMA(0x00);
D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
} //SoftConnect 連接上,并設(shè)置為無LazyClock,模式為非同步模式
/************************************************************
** 函數(shù)名稱: reconnect_USB()
** 功能描述: 重新連接USB總線
************************************************************/
void reconnect_USB(void)
{
INT16U clk_cnt;
disconnect_USB(); //斷開芯片與USB總線連接
for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++); //延時(shí)處理
connect_USB(); //連接到USB總線
}
/************************************************************
** 函數(shù)名稱: Get_D12_FirmwareVer()
** 功能描述: 重新連接USB總線
** 輸 入: 無
** 輸 出: 16bit整數(shù),如0x0500表示D12固件軟件版本號(hào)為5.00
************************************************************/
/*INT16U Get_D12_FirmwareVer(void)
{
return 0x0500; //D12固件軟件版本號(hào)為5.00
} */
/************************************************************
** 函數(shù)名稱: ReadUsbBuff()
** 功能描述: 查詢USB數(shù)據(jù)
** 輸 入: 無
** 輸 出: 16bit整數(shù),如0x0500表示D12固件軟件版本號(hào)為5.00
************************************************************/
unsigned char ReadUsbBuff(unsigned char ep)
{
if(ep==2)
{
if(bEPPflags.bits.ep2_rxdone==0)return 0;
DISABLE();
bEPPflags.bits.ep2_rxdone = 0;
ENABLE();
return ep2_len;
}
if(ep==1)
{
if(bEPPflags.bits.ep1_rxdone==0)return 0;
DISABLE();
bEPPflags.bits.ep1_rxdone = 0;
ENABLE();
return ep1_len;
}
}
/*********************************************************************
** 函數(shù)名稱: Init_D12()
** 功能描述: 設(shè)置D12與硬件的連接, 初始化D12, 復(fù)位D12
** 輸 入: 無
** 輸 出: 0: 初始化成功 1: 初始化失敗
**********************************************************************/
INT8U Init_D12(void)
{
unsigned char a=1;
bEPPflags.value = 0; //初始化USB事件標(biāo)志變量
Init_D12Port(); //初始化PDIUSBD12與51單片機(jī)連接的端口
Rst_D12(); //復(fù)位PDIUSBD12
reconnect_USB(); //重新連接USB
if (D12_ReadChipID() != 0x1012) //讀取芯片ID號(hào),如果不為1012H
return 1; //則復(fù)位失敗
EA = 1; //開80C51總中斷
EX1 = 1; //開外部中斷0
PX1 = 0; //設(shè)置外部中斷0中斷優(yōu)先級(jí)
if(a)
while(1)
{
usbserve();
if(bEPPflags.bits.configuration)return 0;
}
else
{
ReadUsbBuff(1);
D12_WriteEndpoint(3,a,GenEpBuf);
}
return 1; //初始化成功
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -