#include <C8051F120.H>
#include <intrins.h>
#include "stdlib.h"
#include "main.h"
//////////////////////////////////////////////////////////////////////////
//名称:WTDDisable()
//功能:关闭看门狗
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void WTDDisable(void){
GLOBAL_ISR_DISABLE(); //writing to 0xDE and 0xAD must be finished in 4 clock cycles
WDTCN = 0xDE;
WDTCN = 0xAD;
GLOBAL_ISR_ENABLE();
}
//////////////////////////////////////////////////////////////////////////
//名称:SystemClkInit()
//功能:系统时钟初始化
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void SystemClkInit(void){
WORD EXT_DATA tmp;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67; // enable ext osc 10-30MHz range
for (tmp=24500; tmp!=0; tmp--) // Wait 1ms for initialization
{
;
}
while ((OSCXCN & 0x80) == 0)
{
;
}
OSCICN = 0x83; // Enable 24.5 MHz internal osc
for (tmp=24500; tmp!=0; tmp--) // Wait 1ms for initialization
{
;
}
while ((OSCICN & 0x40) == 0)
{
;
}
CLKSEL = 0x00; // Select internal clock source
}
//////////////////////////////////////////////////////////////////////////
//名称:SfrAutoSwithDis()
//功能:SFR自动页切换关闭
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void SfrAutoSwitchDis(void){
SFRPAGE = CONFIG_PAGE;
SFRPGCN = 0x00;
}
//////////////////////////////////////////////////////////////////////////
//名称:PortInit()
//功能:端口初始化
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void PortInit(void){
SFRPAGE = CONFIG_PAGE; // SFR page switching
XBR0 |= 0x04; // enable UART
P0MDOUT |= 0x01; // enable TX as a push-pull output
XBR0 |= 0x02; // Enable SPI
P0MDOUT |= 0x34; // SCK,MOSI,NSS push-pull output
XBR0 |= 0x01; // enable smbus (skip 2 pins)
XBR0 |= 0x10; // enable CEX0 = P1.0,CEX1 = P1.1
XBR1 |= 0x04; // enable /int0 = P1.2
P1MDOUT |= 0xC0; // RESET VRGEN push-pull output
XBR2 |= 0x40; // Enable Crossbar
}
//////////////////////////////////////////////////////////////////////////
//名称:Uart0Init()
//功能:UART0初始化
//入口参数:优先级
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void Uart0Init(BOOL pri){
ES0 = 1;
if(pri){
IP |= 0x10;
}
else{
IP &= 0xEF;
}
SFRPAGE = UART0_PAGE; //Config UART0 register
SCON0 = 0x50; //Mode1(8 bit data),No check stop bit,Enable receive
SSTA0 = 0x10; //Baud rate doubler enable,T1溢出率为TX和RX的时钟源
SFRPAGE = TIMER01_PAGE; //Config timer1 register
TCON = 0x00;
TMOD = 0x20; //T1 timer mode uses 8 bit overload
CKCON = 0x10; //T1 timer is used for system clock
TR1 = 0;
}
//////////////////////////////////////////////////////////////////////////
//名称:Uart0TimeOutTimerInit()
//功能:This function initializes the UART timer (Timer0).
//入口参数:优先级
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void Uart0TimeOutTimerInit(BOOL pri){
PT0 = pri; //定时器0中断优先级控制
SFRPAGE = TIMER01_PAGE;
TMOD |= 0x01; //16 bit
TF0 = 0;
TR0 = 0; //Turn off timer0
}
void Uart0TimeOutTimerTurnOff(void){
BYTE saveSfr = SFRPAGE;
SFRPAGE = TIMER01_PAGE;
TR0 = 0; // stop timer count
TF0 = 0; // clear isr flag
ET0 = 0; // Turn off isr
TH0 = 0; //
TL0 = 0;
SFRPAGE = saveSfr;
}
//////////////////////////////////////////////////////////////////////////
//名称:Spi0Init()
//功能:SPI设置
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void Spi0Init(void){
SFRPAGE = SPI0_PAGE; // SFR page switching
SPI0CFG = 0x40; // master mode, + clock, 1st edge
SPI0CN = 0x0C; // 4 wire NSS high
SPI0CKR = SPI0CKR_VALUE; // init SPI clock
SPI0CN |= 0x01; // enable SPI
SFRPAGE = 0x0F; // disable spi interrupt
EIE1 &=0xF6;
}
//////////////////////////////////////////////////////////////////////////
//名称:ExternalISRInit()
//功能:外部中断设置
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void ExternalISRInit(BOOL pri){
SFRPAGE = TIMER01_PAGE;
TCON |= 0x01; // low level triggered
TCON &= ~0x02; // clear IE0 flag
IE |= 0x01; // Enable INT0
if(pri){
IP |= 0x01;
}
else{
IP &= 0xFE;
}
}
//////////////////////////////////////////////////////////////////////////
//名称:Uart0SetBaudrate()
//功能:UART0波特率设置
//入口参数:波特率
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void Uart0SetBaudrate(BYTE baudrate){
SFRPAGE = TIMER01_PAGE;
TR1 = 0; //Turn off T1
TH1 = baudrate;
TL1 = baudrate;
TR1 = 1; //Turn on T1
}
//////////////////////////////////////////////////////////////////////////
//名称:XdataMemset()
//功能:This function sets the first length bytes in buffer to value
//入口参数:
// p: buffer point to set.
// value: byte value to set
// len: buffer length to set
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void XdataMemset(void EXT_DATA *p, BYTE value, WORD EXT_DATA len) reentrant{
BYTE EXT_DATA *byteP;
if(len == 0){
return;
}
byteP = (BYTE EXT_DATA *)p;
while(len--){
*byteP++ = value;
}
}
//////////////////////////////////////////////////////////////////////////
//名称:UartTRxManaMsgInit()
//功能:Initialize Uart0 trx data control structure
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void UartTRxManaMsgInit(void){
XdataMemset(&gUartTRxManaMsg, 0, sizeof(gUartTRxManaMsg));
gUartTRxManaMsg.TxDataFirstAddr = NULL;
gUartTRxManaMsg.RxDataFirstAddr = NULL;
}
//////////////////////////////////////////////////////////////////////////
//名称:BufBetweenAppAndMacInit()
//功能:This function initialize the buffer information between App and Mac
//入口参数:无
//出口参数:无
//////////////////////////////////////////////////////////////////////////
void BufBetweenAppAndMacInit(void){
XdataMemset(&gAppToMacBuf, 0, sizeof(gAppToMacBuf));
XdataMemset(&gAppToMacSonBufDataLen, 0, sizeof(gAppToMacSonBufDataLen));
XdataMemset(&gMacToAppBuf, 0, sizeof(gMacToAppBuf));
XdataMemset(&gMacToAppSonBufDataLen, 0, sizeof(gMacToAppSonBufDataLen));
gAppToMacBufMana.Buf = &gAppToMacBuf[0][0];
gAppToMacBufMana.Len = gAppToMacSonBufDataLen;
gAppToMacBufMana.MaxSize = APP_TO_MAC_BUF_MAX_SIZE;
gAppToMacBufMana.MaxNum = APP_TO_MAC_BUF_MAX_NUM;
gAppToMacBufMana.WriteIndex = 0;
gAppToMacBufMana.ReadIndex = 0;
gAppToMacBufMana.Status = BUF_EMPTY;
gMacTo