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

📄 init.c

📁 该代码是基于菲利普ISP1581USB接口芯片与STC89C51单片机的USB2.0开发代码
💻 C
字号:
/****************************************Copyright (c)**************************************************

** 文   件   名: init.c
** 最后修改日期: 2006年10月19日
** 描        述: USB驱动程序软件包: D14 设备端驱动程序 初始化程序
** 版	     本: V1.0
**********************************************************************************************************/


#include "standard.h"
#include "Kernel.h"
#include "D14.h"

//外部函数
extern void Start_mSEC_Timer(Data);
extern void Start_SEC_Timer(Data);
extern KERNEL Kernel_Flag;
extern USB_INT_FLAG	USB_Int_Flag;
extern USB_DEVICE USB_Device;
extern UI Temp,PIO_Count;
extern UC Device_Config_Value;
extern UC idata Endpt_FIFO[MAX_BUF];
extern void DMA_Init(void);
extern ULI bytecount;
extern UC Address_Count;
extern UC xdata Address[20];

//内部函数
void Init_D14_SFR(void);
void Init_Endpoint(void);

void Init_Main(void);
void Init_8051(void);
void Init_D14(void);

//变量定义
TIMER Timer;
DATA_SWAP	idata	Data_Swap;
DMA_INT_FLAG	DMA_Int_Flag;

UI	count;
UC	Device_Config_Value;
UC 	Type;

UI	idata	Init_Count;

volatile D14_CNTRL_REG	xdata	D14_Cntrl_Reg	_at_	0x0000;

D14_CNTRL_REG xdata *D14_Cntrl_Ptr = &D14_Cntrl_Reg;


//////////////////////////////////////////////////////////



//初始化主函数 
void Init_Main(void)
{

	ISP1581_CS = 1;		//关1581片选
	bytecount = 0;
	PIO_Count = 64;
	
    Type = 0;
	USB_Device.BITS.DMA_Test_Mode = PIO_Test;
	
	//初始化8051
	Init_8051();							
	
	ISP1581_CS = 0;		//片选ISP1581

	D14_Cntrl_Reg.D14_MODE.BITS.SOFTCT = 0;	
	LED=1;

	//检查是否连接了ISP1581
	do
	{
		//复位 ISP1581                  
		ISP1581_RESET = 0;
		Start_mSEC_Timer(100);
		ISP1581_RESET = 1;
		Start_mSEC_Timer(100);
		
		//读取接口器件是否ISP1581            
		if(D14_Cntrl_Ptr->D14_CHIP_ID_MBYTE == 0x81 && D14_Cntrl_Ptr->D14_CHIP_ID_MSB == 0x15)
			break;
	}while(1);
	LED=0;
	
	//初始化标志寄存器
	USB_Int_Flag.VALUE = 0;//USB中断标志寄存器
	DMA_Int_Flag.VALUE = 0;//DMA中断标志寄存器
	Kernel_Flag.VALUE = 0;//ISP1581状态标志寄存器
	
	//设置为设备默认状态
	Kernel_Flag.BITS.HS_FS_State = FULL_SPEED;//设置为全速状态
	HS_FS_LED = FULL_SPEED_LED;
	
	//初始化ISP1581
	Init_D14();
}



//初始化8051
void Init_8051(void)
{
	
	//定义定时器方式-定时器0方式1
	TMOD = 0x01;
	AUXR|=0x03;
	//初始化定时器时间
	Timer.mSEC_Scale = 4000;
	Timer.Hundred_mSEC_Scale = 40000;
	

	//开定时器中断
	ET0=1;			
	PT0 = 1;  //定时器高优先级

	EA = 1;//开总中断				
}


//D14初始化函数
void Init_D14(void)
{
	//初始化ISP1581寄存器
	Init_D14_SFR();
	
	//初始化ISP1581端点
	Init_Endpoint();		
	
	//初始化ISP1581工作标志寄存器
	USB_Device.BITS.State = USB_Default;
	Device_Config_Value = 0;
	USB_Device.BITS.Alter_Interface = 0;
	USB_Device.BITS.Big_Endian = On;
	Kernel_Flag.BITS.Tx_Done = 0;
	EX0 = 1;		//开ISP1581中断
}


//D14寄存器初始化
void Init_D14_SFR(void)
{
	//设置模式:时钟始终有效,全局中断使能,片选唤醒
	D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;
	
	//设置全部中断为模式1,电平触发,低电平有效
	D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;			
	
	//设置中断使能寄存器
	//注释: D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;先发送高字节
	//0x14(xdata)=0x39
	//0x15(xdata)=0xfd
	//0x16(xdata)=00
	//0x17(xdata)=00
	//使用端点0和端点1、端点2
	D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;	
}



//初始化D14各端点
void Init_Endpoint(void)
{
	//设置全速端点
	if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
	{
		//设置全速端点FIFO大小

		//Interrupt Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;	//FIFO=64bytes
		
		//Interrupt In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Bulk Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		
		//Bulk In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		
		//Iso Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Iso In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//设置全速端点类型

		//Interrupt In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
		
		
		//Interrupt Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
		
		
		//Bulk Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
		
		
		//Bulk In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
		
		
		//Iso Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
		
		
		//Iso In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
		
		//端点使能				

		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
	}
	
	//设置高速端点
	if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
	{
		//设置全速端点FIFO大小
		
		//Interrupt Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Interrupt In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Bulk Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Bulk In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		
		//Iso Out MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//Iso In MaxPacketSize Endpoint
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
		
		//设置高速端点类型

		//Interrupt In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
		
		
		//Interrupt Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
		
		
		//Bulk Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
		
		
		//Bulk In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
		
		
		//Iso Out Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
		
		
		//Iso In Endpoint Type
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
		
		//端点使能				

		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			
		
		//enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
		
	}
	
	//设置默认地址有效
	D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80;		
}

⌨️ 快捷键说明

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