📄 init.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 + -