⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d12driver.c

📁 选用89C52+PHLIPHS USBD12开发的控制VISTA或者MCE XP的媒体中心软件。
💻 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

	//在此添加其它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)
{
	INT8U 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 + -