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

📄 d12driver.c

📁 飞利浦USB D12的官方评估板固件代码
💻 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"
#include "Protozlg.h"

INT8U idata GenEpBuf[EP1_PACKET_SIZE];		//端点1接收缓冲区	
INT8U idata EpBuf[EP2_PACKET_SIZE];			//端点2接收缓冲区

INT16U data D12_DATA;				//D12 数据地址变量
INT16U data D12_COMMAND;			//D12 命令地址变量

/*********************************************************************
** 函数名称: Init_D12()
** 功能描述: 设置D12与硬件的连接, 初始化D12, 复位D12
** 输   入: 无
** 输   出: 0: 初始化成功    1: 初始化失败  
**********************************************************************/
INT8U Init_D12(void)
{
	bEPPflags.value = 0;					//初始化USB事件标志变量

	D12_COMMAND = D12_COMMAND_PORT;			//D12 命令地址
	D12_DATA 	= D12_DATA_PORT;			//D12 数据地址

	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)
{
	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);		//清中断标志位
	//可添加用户代码(进行检测端点号5IN令牌的操作)
	if(byte_cnt.word>0)
	{
		if(byte_cnt.word<64)
		{
			D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
			byte_cnt.word=0;
		}
		else
		{
			byte_cnt.word=byte_cnt.word-64;
			D12_WriteEndpoint(5, 64, EpBuf);
		}
	}
	
	if ((D12_ReadEndpointStatus(5) & 0x60) != 0x60)
	{
		if(byte_cnt.word>0)
		{
			if(byte_cnt.word<64)
			{
				D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
				byte_cnt.word=0;
			}
			else
			{
				byte_cnt.word=byte_cnt.word-64;
				D12_WriteEndpoint(5, 64, EpBuf);
			}
		}
	}
}

/*******************************************************************
** 函数名称: ep2_rxdone()
** 功能描述: 端点2 OUT(接收)处理处理函数
** 输	 入: 无
** 输	 出: 无
********************************************************************/
void ep2_rxdone(void)
{
	INT8U len;

	D12_ReadLastTransactionStatus(4);			//复位中断寄存器
	len = D12_ReadEndpoint(4, 64, EpBuf);		//读取端点2接收数据
	if (bEPPflags.bits.ep2buf_full)
		len += D12_ReadEndpoint(4, 64, EpBuf);	//读取端点2接收数据
	if (len != 0)
		bEPPflags.bits.ep2_rxdone = 1;			//标志端点2接收到数据
}

/***********************************************************************
** 函数名称: void Usb_Exception(void)
** 功能描述: D12中断服务程序
*************************************************************************/
void Usb_Exception(void)  interrupt 0
{
	DISABLE();					        //进入D12中断服务程序时关中断
	fn_usb_isr();	
   	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
}

/************************************************************
** 函数名称: 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -