51单片机各类源程序集锦
源代码在线查看: init.c
//***********************************************************************
// *
// P H I L I P S P R O P R I E T A R Y *
// *
// COPYRIGHT (c) 1999 BY PHILIPS SINGAPORE (APIC). *
// -- ALL RIGHTS RESERVED -- *
// *
// File Name : Init.c *
// Author : Albert Goh *
// Created : 3 March 2000 *
// *
//***********************************************************************
//***********************************************************************
// *
// Init.c is the initialization of the device attached and also the D14 *
// It will initialize the various variables and component. *
// *
//***********************************************************************
//***********************************************************************
// *
// Module History *
// ************** *
// *
// Date Version Author Changes *
// ==== ======= ====== ======= *
// 030300 0.1 Albert Created *
// *
// *
//***********************************************************************
//***********************************************************************
//* *
//* Include Files Definition *
//* *
//***********************************************************************
#include "standard.h"
#include "Kernel.h"
#include "D14.h"
//***********************************************************************
//* *
//* External Variable Definition *
//* *
//***********************************************************************
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];
//***********************************************************************
//* *
//* Prototype Routine Definition *
//* *
//***********************************************************************
void Init_D14_SFR(void);
void Init_Endpoint(void);
void Init_Main(void);
void Init_8051(void);
void Init_D14(void);
//***********************************************************************
//* *
//* Variable Definition *
//* *
//***********************************************************************
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;
D14_CNTRL_REG volatile xdata D14_Cntrl_Reg _at_ 0x7000;
D14_CNTRL_REG xdata *D14_Cntrl_Ptr = &D14_Cntrl_Reg;
//***********************************************************************
//* *
//* Routine : Init_Main *
//* Input : None *
//* Output : None *
//* Function : To initialize the D14 and the 8051 *
//* *
//***********************************************************************
void Init_Main(void)
{
AUXR = 0x02;
CKCON = 0x01;
//disable ISP1581 chip select
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;
//检查是否连接了ISP1581
do
{
//reset 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);
//初始化标志寄存器
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();
}
//***********************************************************************
//* *
//* Routine : Init 8051 *
//* Input : 8051 Special Function Register *
//* Output : None *
//* Function : To initialize 8051 *
//* *
//***********************************************************************
void Init_8051(void)
{
//定义定时器方式
TMOD = 0x11;
//初始化定时器时间
Timer.mSEC_Scale = 2000;
Timer.Hundred_mSEC_Scale = 20000;
TL1=80;
TH1=60;
//reset timer control
TCON = 0;
//disable all interrupt
EA = 0;
//disable UART interrupt
//disable timer 1 overflow interrupt
//disable external interrupt 1
//enable timer 0 overflow interrupt
//enable external interrupt 0
IE = 0x03;
ET1=0;
//reset interrupt priority
IP = 0;
PT1 = 1;
PT0 = 1;
// EX0 = 1; //开ISP1581中断
//enable all interrupt
EA = 1;
TR1=0;
//disable all power mode control
//enable half/doble baud rate
PCON = 0x40;
}
//***********************************************************************
//* *
//* Routine : Init D14 *
//* Input : ISP1581 SFR *
//* Output : None *
//* Function : To initialize ISP1581 *
//* *
//***********************************************************************
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中断
}
//***********************************************************************
//* *
//* Routine : Init D14 SFR *
//* Input : ISP1581 SFR *
//* Output : None *
//* Function : To initialize ISP1581 *
//* *
//***********************************************************************
void Init_D14_SFR(void)
{
//enable Global Interrupt enable
//enable soft connect and other feature
//enable wakeup on chip select
//disable soft connect
//设置模式:时钟始终有效,全局中断使能,片选唤醒
D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;
//set all interrupt source to mode 1
//设置全部中断为模式1,电平触发,低电平有效
D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;
//设置中断使能寄存器
//注释: D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x790D0000;先发送高字节
//0x14(xdata)=0x79
//0x15(xdata)=0x0D
//0x16(xdata)=00
//0x17(xdata0=00
//使用端点0和端点2
D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;
}
//***********************************************************************
//* *
//* Routine : Init Endpoint *
//* Input : ISP1581 FIFO *
//* Output : None *
//* Function : To initialize ISP1581 endpoint FIFO *
//* *
//***********************************************************************
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 = 0x0002;//FIFO=64bytes
//Bulk In MaxPacketSize Endpoint
D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;//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;
}