?? device.c
字號(hào):
/************************************************
* NAME : DEVICE.C *
* BY : HappyHd
* Version : 1.Sep.2006 *
***********************************************/
#include "..\inc\Device.h"
#include "..\ucos_ii\ucos_ii.h"
/************************************************************************************************
* s3c44bo設(shè)備驅(qū)動(dòng)
RTC
************************************************************************************************/
char *date[7] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
char *month[12]={ "January ","February ","March ","April ", "May ","June ", "July ", "August ", "September ","October ", "November ", "December "};
INT16U Get_Year;
INT8U Get_Month,Get_Day,Get_Date,Get_Hour,Get_Minutes,Get_Second;
OS_EVENT *Rtc_Alarm_Sem;
OS_EVENT *Rtc_Tick_Sem;
OS_EVENT *Rtc_Rw_Sem;
/*****************************************RTC INT***********************************************/
void Rtc_Init(void)
{
Rtc_Alarm_Sem = OSSemCreate(0);
Rtc_Tick_Sem = OSSemCreate(0);
Rtc_Rw_Sem = OSSemCreate(1);
}
/*
*********************************************************************************************************
* SET DATE ONLY
*
* Description : Set the date of the time-of-day clock
* Arguments : Month is the desired month (1..12)
* Day is the desired day (1..31)
* Year is the desired year (0..99)
* Week is the desired week (0..7)
*********************************************************************************************************
*/
void Set_Rtc_Date(int Year,int Month,int Day,int Week)
{
INT8U err;
OSSemPend(Rtc_Rw_Sem,0,&err);
rRTCCON = 0x01;
rBCDYEAR = Year-2000;
rBCDMON = Month;
rBCDDAY = Day;
rBCDDATE = Week; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
rRTCCON = 0x00;
OSSemPost(Rtc_Rw_Sem);
}
/*
*********************************************************************************************************
* SET TIME ONLY
*
* Description : Set the time-of-day clock
* Arguments : Hour is the desired hour (0..23)
* Minutes is the desired minutes (0..59)
* Second is the desired seconds (0..59)
*********************************************************************************************************
*/
void Set_Rtc_Time(int Hour,int Minutes,int Second)
{
INT8U err;
OSSemPend(Rtc_Rw_Sem,0,&err);
rRTCCON = 0x01;
rBCDHOUR = Hour;
rBCDMIN = Minutes;
rBCDSEC = Second;
rRTCCON = 0x00;
OSSemPost(Rtc_Rw_Sem);
}
/**************************************GET RTC TIME*********************************************/
void Get_Rtc_Time(void)
{
INT8U err;
OSSemPend(Rtc_Rw_Sem,0,&err);
rRTCCON = 0x01;
Get_Year=2000+rBCDYEAR;
Get_Month=rBCDMON;
Get_Day=rBCDDAY;
Get_Date=rBCDDATE;
Get_Hour=rBCDHOUR;
Get_Minutes=rBCDMIN;
Get_Second=rBCDSEC;
rRTCCON = 0x00;
OSSemPost(Rtc_Rw_Sem);
}
/***********************************SET ALARM**************************************************/
void Set_Alarm_Date_Time(int Ayear,int Amonth,int Aday,int Ahour,int Aminute,int Asecond)
{
INT8U err;
OSSemPend(Rtc_Rw_Sem,0,&err);
rRTCCON = 0x01;
rALMYEAR=Ayear-2000;
rALMMON =Amonth;
rALMDAY =Aday ;
rALMHOUR=Ahour ;
rALMMIN =Aminute;
rALMSEC =Asecond;
rRTCCON = 0x00; // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
OSSemPost(Rtc_Rw_Sem);
}
void Alarm_Start(void)
{
rRTCALM =0x7f;
rINTMSK=~(BIT_GLOBAL|BIT_RTC);
}
void Alarm_Stop(void)
{ rRTCALM =0x00;
rINTMSK=BIT_GLOBAL|BIT_RTC;
}
void Rtc_Alarm(void)
{
rI_ISPC=BIT_RTC;
OSSemPost(Rtc_Alarm_Sem);
}
/***********************************SET RTC TICK************************************************/
void Set_Rtc_Tick(void)
{
rINTMSK = BIT_GLOBAL | BIT_TICK;
rRTCCON = 0x01; //R/W enable(for power consumption), 1/32768, Normal(merge), No reset
rTICINT = ((1<<7)+127); //START
rRTCCON = 0x00; //END
rINTMSK=~(BIT_GLOBAL|BIT_TICK);
}
void Rtc_Tick(void)
{
rI_ISPC=BIT_TICK;
OSSemPost(Rtc_Tick_Sem);
}
/*****************************************DISPLAY RTC*******************************************/
void Display_Rtc(void)
{
Get_Rtc_Time();
Uart_Printf("%4x,%s,%2x,%s,%2x:%2x:%2x\n",Get_Year,month[Get_Month],Get_Day,date[Get_Date],Get_Hour,Get_Minutes,Get_Second);
}
/************************************************************************************************
* s3c44bo設(shè)備驅(qū)動(dòng)
IIC
************************************************************************************************/
#define WRDATA (1)
#define POLLACK (2)
#define RDDATA (3)
#define SETRDADDR (4)
#define IICBUFSIZE 0x20
U8 _iicData[IICBUFSIZE];
volatile int _iicDataCount;
volatile int _iicStatus;
volatile int _iicMode;
int _iicPt;
unsigned int save_F,save_PF;
void Iic_Init(void)
{
save_F=rPCONF;
save_PF=rPUPF;
rPCONF |=0xa; //PF0:IICSCL, PF1:IICSDA
rPUPF |=0x3; //pull-up disable
rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);//IICCLK=MCLK/16, Enable ACK,40Mhz/16/(15+1) = 257Khz
rIICADD=0x10; // S3C44B0X slave address
rIICSTAT=0x10;
rINTMSK=~(BIT_GLOBAL|BIT_IIC);//Enable interrupt
}
void Iic_Exit(void)
{
rINTMSK=BIT_GLOBAL|BIT_IIC; //Disable interrupt
rPCONF=save_F;
rPUPF=save_PF;
}
void Wr24LCxx(U32 slvAddr,U32 addr,U8 data)
{
_iicMode=WRDATA;
_iicPt=0;
_iicData[0]=(U8)addr;
_iicData[1]=data;
_iicDataCount=2;
rIICDS=slvAddr;//0xa0
rIICSTAT=0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(_iicDataCount!=-1);
_iicMode=POLLACK;
while(1)
{
rIICDS=slvAddr;
_iicStatus=0x100;
rIICSTAT=0xf0; //MasTx,Start
rIICCON=0xaf; //resumes IIC operation.
while(_iicStatus==0x100);
if(!(_iicStatus&0x1))
break; // when ACK is received
}
rIICSTAT=0xd0; //stop MasTx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.
}
void Rd24LCxx(U32 slvAddr,U32 addr,U8 *data)
{
_iicMode=SETRDADDR;
_iicPt=0;
_iicData[0]=(U8)addr;
_iicDataCount=1;
rIICDS=slvAddr;
rIICSTAT=0xf0; //MasTx,Start
//Clearing the pending bit isn't needed because the pending bit has been cleared.
while(_iicDataCount!=-1);
_iicMode=RDDATA;
_iicPt=0;
_iicDataCount=1;
rIICDS=slvAddr;
rIICSTAT=0xb0; //MasRx,Start
rIICCON=0xaf; //resumes IIC operation.
while(_iicDataCount!=-1);
*data=_iicData[1];
}
void Iic_Int(void)
{
U32 iicSt,i;
rI_ISPC=BIT_IIC;
iicSt=rIICSTAT;
if(iicSt&0x8){} // when bus arbitration is failed.
if(iicSt&0x4){} // when a slave address is matched with IICADD
if(iicSt&0x2){} // when a slave address is 0000000b
if(iicSt&0x1){} // when ACK isn't received
switch(_iicMode)
{
case POLLACK:
_iicStatus=iicSt;
break;
case RDDATA:
if((_iicDataCount--)==0)
{
_iicData[_iicPt++]=rIICDS;
rIICSTAT=0x90; //stop MasRx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.
//too long time...
//The pending bit will not be set after issuing stop condition.
break;
}
_iicData[_iicPt++]=rIICDS;
//The last data has to be read with no ack.
if((_iicDataCount)==0)
rIICCON=0x2f; //resumes IIC operation with NOACK.
else
rIICCON=0xaf; //resumes IIC operation with ACK
break;
case WRDATA:
if((_iicDataCount--)==0)
{
rIICSTAT=0xd0; //stop MasTx condition
rIICCON=0xaf; //resumes IIC operation.
Delay(1); //wait until stop condtion is in effect.
//The pending bit will not be set after issuing stop condition.
break;
}
rIICDS=_iicData[_iicPt++]; //_iicData[0] has dummy.
for(i=0;i<10;i++); //for setup time until rising edge of IICSCL
rIICCON=0xaf; //resumes IIC operation.
break;
case SETRDADDR:
//Uart_Printf("[S%d]",_iicDataCount);
if((_iicDataCount--)==0)
{
break; //IIC operation is stopped because of IICCON[4]
}
rIICDS=_iicData[_iicPt++];
for(i=0;i<10;i++); //for setup time until rising edge of IICSCL
rIICCON=0xaf; //resumes IIC operation.
break;
default:
break;
}
}
/************************************************************************************************
* s3c44bo設(shè)備驅(qū)動(dòng)
ADC
************************************************************************************************/
void Adc_Init(void)
{
rCLKCON = rCLKCON | (1<<12); //控制系統(tǒng)主時(shí)鐘進(jìn)入ADC單元模塊
rADCPSR = 10; //ADC轉(zhuǎn)換頻率為:(int)(MCLK/(2*(rADCPSR+1))/16)
rADCCON = 0x20; //sleep
}
unsigned short Read_Adc(unsigned char ch)
{
int i;
static int prevCh=-1;
if(prevCh!=ch)
{
rADCCON = 0x1|(ch<<2); //設(shè)置AD轉(zhuǎn)換通道
for(i=0;i<150;i++); //最小15uS
}
rADCCON=0x1|(ch<<2); //開(kāi)始AD轉(zhuǎn)換
while(rADCCON & 0x1); //避免標(biāo)志FLAG錯(cuò)誤
while(!(rADCCON & 0x40)); //等待AD轉(zhuǎn)換結(jié)束
for(i = 0; i < rADCPSR; i++); //避免第二次標(biāo)志FLAG錯(cuò)誤
prevCh=ch;
return rADCDAT; //返回AD轉(zhuǎn)換值
}
void Adc_Int(void)
{
rI_ISPC=BIT_ADC;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -