?? d12driver.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: D12Driver.c
** 最后修改日期: 2004年11月15日
** 描 述: USB驅動程序軟件包: PDIUSBD12 設備端驅動程序 應用層
** 版 本: 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 idata GenEpBuf[EP1_PACKET_SIZE]; //端點1接收緩沖區
INT8U idata EpBuf[EP2_PACKET_SIZE]; //端點2接收緩沖區
/*********************************************************************
** 函數名稱: Init_D12()
** 功能描述: 設置D12與硬件的連接, 初始化D12, 復位D12
** 輸 入: 無
** 輸 出: 0: 初始化成功 1: 初始化失敗
**********************************************************************/
INT8U Init_D12(void)
{
bEPPflags.value = 0; //初始化USB事件標志變量
Init_D12Port(); //初始化PDIUSBD12與51單片機連接的端口
Rst_D12(); //復位PDIUSBD12
reconnect_USB(); //重新連接USB
if (D12_ReadChipID() != 0x1012) //讀取芯片ID號,如果不為1012H
return 1; //則復位失敗
return 0; //初始化成功
}
/*******************************************************************
** 函數名稱: usbserve()
** 功能描述: USB事件處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void usbserve(void)
{
if (bEPPflags.bits.setup_packet){ //Setup包處理
DISABLE();
bEPPflags.bits.setup_packet = 0;
control_handler(); //調用請求處理子程序
ENABLE();
}//if setup_packet
if (bEPPflags.bits.bus_reset) { //USB總線復位處理
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
/**************** 掛起處理 *************************/
if (bEPPflags.bits.configuration ==1) // USB已配置完成
MCU_D12SUSPD = 1; // 釋放D12_SUSPEND 掛起腳
else
MCU_D12SUSPD = 0; // 鉗制D12_SUSPEND 為低電平
if(MCU_D12SUSPD == 1) // 如果檢測到掛起信號
{ // D12_SUSPEND為高電平,CPU進入掉電模式
P0 = 0xFF; // 進入掉電前使各引腳電平為高,請根據實際情況來決定
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
MCU_D12SUSPD = 1;
PCON |= 0x02; // 單片機完全掉電
while (1);
}
//在此添加其它usb事件處理代碼
}
/*******************************************************************
** 函數名稱: d12_busreset()
** 功能描述: USB總線復位處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void d12_busreset(void)
{
//在此添加總線復位處理代碼
}
/*******************************************************************
** 函數名稱: dma_eot()
** 功能描述: DMA結束處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void dma_eot(void)
{
//在此添加DMA結束處理代碼
}
/*******************************************************************
** 函數名稱: d12_suspend()
** 功能描述: 總線掛起改變處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void d12_suspend(void)
{
//在此添加總線掛起改變代碼
}
/*******************************************************************
** 函數名稱: ep1_txdone()
** 功能描述: 端點1 IN(發送)處理處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep1_txdone(void)
{
D12_ReadLastTransactionStatus(3); //清中斷標志位
}
/*******************************************************************
** 函數名稱: ep1_txdone()
** 功能描述: 端點1 OUT(接收)處理處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep1_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(2); //清中斷標志位
len = D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf); //讀取數據
if(len != 0)
bEPPflags.bits.ep1_rxdone = 1; //標志接收到數據
}
/*******************************************************************
** 函數名稱: ep2_txdone()
** 功能描述: 端點2 IN(發送)處理處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep2_txdone(void)
{
D12_ReadLastTransactionStatus(5); //清中斷標志位
}
/*******************************************************************
** 函數名稱: ep2_rxdone()
** 功能描述: 端點2 OUT(接收)處理處理函數
** 輸 入: 無
** 輸 出: 無
********************************************************************/
void ep2_rxdone(void)
{
INT8U len;
D12_ReadLastTransactionStatus(4); //清中斷標志位
len = D12_ReadEndpoint(4,EP2_PACKET_SIZE,EpBuf); //讀取緩沖區中的數據
if (len != 0)
bEPPflags.bits.ep2_rxdone = 1;
}
/***********************************************************************
** 函數名稱: void Usb_Exception(void)
** 功能描述: D12中斷服務程序
*************************************************************************/
void Usb_Exception(void) interrupt 0
{
INT16U i_st;
DISABLE(); //進入D12中斷服務程序時關中斷
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總線復位標志
if(i_st & D12_INT_EOT)
dma_eot(); //DMA傳輸技術處理
if(i_st & D12_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend = 1; //掛起改變標志置1
if(i_st & D12_INT_ENDP0IN)
ep0_txdone(); //控制端點發送數據處理
if(i_st & D12_INT_ENDP0OUT)
ep0_rxdone(); //控制端點接收數據處理
if(i_st & D12_INT_ENDP1IN)
ep1_txdone(); //端點 1發送數據處理
if(i_st & D12_INT_ENDP1OUT)
ep1_rxdone(); //端點 1接收數據處理
if(i_st & D12_INT_ENDP2IN)
ep2_txdone(); //端點 2發送數據處理
if(i_st & D12_INT_ENDP2OUT)
ep2_rxdone(); //端點 2接收數據處理
}
bEPPflags.bits.in_isr = 0;
ENABLE(); //退出D12中斷服務程序時開中斷
}
/************************************************************
** 函數名稱: disconnect_USB()
** 功能描述: 斷開USB總線
************************************************************/
void disconnect_USB(void)
{
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
} //SoftConnect 斷開
/************************************************************
** 函數名稱: 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 連接上,并設置為無LazyClock,模式為非同步模式
/************************************************************
** 函數名稱: reconnect_USB()
** 功能描述: 重新連接USB總線
************************************************************/
void reconnect_USB(void)
{
INT16U clk_cnt;
disconnect_USB(); //斷開芯片與USB總線連接
for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++); //延時處理
connect_USB(); //連接到USB總線
}
/************************************************************
** 函數名稱: Get_D12_FirmwareVer()
** 功能描述: 重新連接USB總線
** 輸 入: 無
** 輸 出: 16bit整數,如0x0500表示D12固件軟件版本號為5.00
************************************************************/
INT16U Get_D12_FirmwareVer(void)
{
return 0x0500; //D12固件軟件版本號為5.00
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -