⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 device.c

📁 UCOS2.83移植的s3c44b0x的最终版,如果那为烧友有好的建议请EMAIL我,不胜感激!
💻 C
字号:
/************************************************
 * NAME	    : DEVICE.C							*
 * BY       : HappyHd
 * Version  : 1.Sep.2006						*
 ***********************************************/


#include "..\inc\Device.h"
#include "..\ucos_ii\ucos_ii.h"             
/************************************************************************************************
*                              s3c44bo设备驱动 
                                      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设备驱动 
                                      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设备驱动 
                                      ADC     
************************************************************************************************/

void Adc_Init(void)
{
	rCLKCON = rCLKCON | (1<<12);	//控制系统主时钟进入ADC单元模块		
	rADCPSR = 10;		        //ADC转换频率为:(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);		//设置AD转换通道
   		for(i=0;i<150;i++);		//最小15uS
	}
	
     rADCCON=0x1|(ch<<2);	        //开始AD转换
	while(rADCCON & 0x1);	        //避免标志FLAG错误
     while(!(rADCCON & 0x40));		//等待AD转换结束
	for(i = 0; i < rADCPSR; i++);	//避免第二次标志FLAG错误
     prevCh=ch;
	return rADCDAT;		        //返回AD转换值
}

void Adc_Int(void)
{
rI_ISPC=BIT_ADC;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -