📄 main.c
字号:
//*********************************************************************
// VANDER PROPRIETARY
//
// COPYRIGHT (c) 2006 BY VANDER ENGINEERING LTD.
// -- ALL RIGHTS RESERVED --
//
//
// File Name: Main.c
// Author: Willie Hu
// Created: 23 Mar 06
// Modified:
// Revision: 1.0
// Description: Mainloop control
//*********************************************************************/
#include <LPC213X.H>
#include "common.h"
#include "tpbulk.h"
#include "HAL.H"
#include "SL811.H"
#include "HPI.H"
#include "FAT.H"
#define UART_BPS 57600
#define CRYSTAL 11059200
FLAGS bFlags;
extern unsigned char DBUF[BUFFER_LENGTH];
/////////////////////////////////////////////////
extern unsigned long DirStartCluster,DirStartCluster32;
unsigned long DirStartCluster32;
extern unsigned char UARTBUF[UARTBUF_LENGTH];
extern Command_Def Command;
extern SYS_INFO_BLOCK DeviceInfo;
extern Response_Def Response;
extern unsigned char *WAVSEND;
extern WAVdata_Def WAVdata;
extern BG_Def BG;
extern Filelist_Def Filelist;
extern unsigned long setpointer;
extern unsigned short BCDcodeTemp;
void Init_Port(void)
{
PINSEL0 |=(P0_0_TXD0 << P0_0_PINSEL) //P0口功能设置
| (P0_1_RXD0 << P0_1_PINSEL)
| (P0_3_EINT1 << P0_3_PINSEL)
| (P0_15_EINT2<< P0_15_PINSEL);
PINSEL1 |=(P0_16_EINT0<< P0_16_PINSEL)
| (P0_20_EINT3<< P0_20_PINSEL);
PINSEL2 = __0; //P1口功能设置
IO0DIR |=(__1<<P0_2) //P0口方向设置
| (__1<<P0_4)
| (__1<<P0_5)
| (__1<<P0_17)
| (__1<<P0_18)
| (__1<<P0_19)
| (__1<<P0_21)
| (__1<<P0_22);
IO1DIR = 0Xffff0000; //P1口方向设置
}
void Init_EINT(void)
{
EXTMODE |=(1<<EXTMODE0) //EINT0,EINT1,EINT2为边沿触发,EINT3为电平触发
| (1<<EXTMODE1)
| (1<<EXTMODE2)
| (1<<EXTMODE3);
EXTPOLAR |=(1<<EXTPOLAR0) //EINT0,EINT1,EINT2为上升沿出发,EINT3为高电平触发
| (1<<EXTPOLAR1)
| (1<<EXTPOLAR2)
| (1<<EXTPOLAR3);
EXTINT = 0X0F; //清空中断标志
}
void Init_VIC(void)
{
VICIntSelect = (1<<VICIntSel_EINT2); //设置I2S为FIQ中断,其他所有通道为IRQ中断
VICVectCntl1 = VICIntSel_Enable | VICIntSel_EINT1;
VICVectAddr1 = (long)IRQ_EINT1; //设置INT1(FOR SL811)向量地址
VICVectCntl3 = VICIntSel_Enable | VICIntSel_EINT3;
VICVectAddr3 = (long)IRQ_EINT3;
VICIntEnable |=(1<<VICIntSel_EINT1)
| (1<<VICIntSel_EINT3); //使能所有中断中断
}
/*
void Init_UART0(void)
{
unsigned short Fdiv;
U0LCR = 0X83; //使能访问除数锁存
Fdiv = (CRYSTAL*5/4)/(16*UART_BPS); //设置除数
// Fdiv = CRYSTAL/(16*UART_BPS); //设置除数
U0DLM = Fdiv/256;
U0DLL = Fdiv%256;
U0LCR = 0X03; //禁止访问除数锁存
U0IER = 0X01; //使能UART0 RDA中断,即接收中断
}
*/
int main()
{
unsigned long temp;
unsigned long time_count;
//初始化端口及中断
Init_Port();
Init_EINT();
Init_VIC();
// Init_UART0();
enable_INT();
IO0CLR = 1<<OE; //OE=0
IO0SET = 1<<CON_CS; //CON_CS=1
//RESET SL811
IO0CLR = 1<<SL811_RST; //SL811_RST=0
DelayMs(250);
IO0SET = 1<<SL811_RST; //SL811_RST=1
IO0CLR = 1<<SL811_CS;
IO0CLR = 1<<MUTE;
SL811Write(cSOFcnt,0xae); //临时代码,解决了无法写入0X0E寄存器的问题,具体原因有待查证
SL811Write(0x0e,0xe0); //
ComSendByte(SL811Read(0x0e));//
SL811_Init();
bFlags.bits.bUartInDone=0;
DirStartCluster=0;
DirStartCluster32=0;
BG.done = 1;
BG.count = 1;
Filelist.list.done = 0;
bFlags.bits.SLAVE_FOUND = 0;
bFlags.bits.SLAVE_IS_ATTACHED = 0;
setpointer = 0; //音档播放位置指针清零
BCDcodeTemp = 0; //把并口缓存数据清零
for(temp=64;temp>0;temp--)
DBUF[temp]=0;
while(1)
{
time_count++;
if(!bFlags.bits.bUartInDone) //防止读取楼层失败后无法清空并口缓存现象
{
BCDcodeTemp = 0;
}
if(!Filelist.list.done) //建立U盘中已有文件表格
{
if (bFlags.bits.SLAVE_IS_ATTACHED) //检测U盘是否枚举成功
{
DelayMs(50);
Command.CLass = 0x00;
List(); //例举文件名
Filelist.list.number = Response.len>>5; //计算文件数量
Filelist.list.done = 1; //标示例举完成
}
}
if (time_count>10000)//检查接口状态,是否有设备插入或拔出
{
BCDcodeTemp = 0;
disable_INT();
time_count = 0;
enable_INT();
check_key_LED();
}
if(bFlags.bits.SLAVE_FOUND){//如果有设备
disable_INT();
bFlags.bits.SLAVE_FOUND=FALSE;
DelayMs(250);
if(EnumUsbDev(1)) // enumerate USB device, assign USB address = #1
{
bFlags.bits.SLAVE_ENUMERATED = TRUE; // Set slave USB device enumerated flag
DirStartCluster=0;
DirStartCluster32=0;
}
enable_INT();
}
if(bFlags.bits.SLAVE_REMOVED){//拔出U盘
disable_INT();
bFlags.bits.SLAVE_REMOVED = FALSE;
bFlags.bits.SLAVE_ENUMERATED = FALSE;
bFlags.bits.SLAVE_IS_ATTACHED = FALSE;
Filelist.list.done = 0;
enable_INT();
}
if (bFlags.bits.SLAVE_IS_ATTACHED){
disable_INT();
DelayMs(1);
if(bFlags.bits.bUartInDone)
{//有串口通讯
bFlags.bits.bUartInDone=0;
// if((Decode026()))
UartHandler(); //FAT16
}
else //若没有信号,则播放背景音乐
Background();
IO0CLR = 1<<OE; //OE = 0; 关闭CPLD
VICIntEnClr = 1<<VICIntSel_EINT2; //关闭CPLD的中断
}
if(bFlags.bits.bMassDevice){//判断是否为U盘
disable_INT();
bFlags.bits.bMassDevice=FALSE;
if(EnumMassDev())
{
bFlags.bits.SLAVE_IS_ATTACHED = TRUE;
}
else
{
bFlags.bits.SLAVE_IS_ATTACHED = FALSE;
temp=SL811Read(IntStatus);
if(!(temp & 0x40)) bFlags.bits.SLAVE_FOUND=TRUE;
}
enable_INT();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -