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

📄 44blib.c

📁 s3c44b0平台初始化及其iis驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : 44blib.c	
;* 文件功能 : 该文件为S3C44B0硬件平台的通用函数初始化。
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM7开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM7开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\option.h"

#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#define STACKSIZE    0xa00 			
#define HEAPEND     (_ISR_STARTADDRESS - STACKSIZE - 0x500) 
extern  char Image$$RW$$Limit[];
void    *mallocPt = Image$$RW$$Limit;
static  int delayLoopCount = 400;

/*
*************************************************************************************************************
- 函数名称 :  void Delay(int time)
- 函数说明 :  系统延时
- 输入参数 :  time
- 输出参数 :  无
- 详细说明 :  该函数通过看门狗定时器从0xffff减到某个数值(0x9b4)所对应的时间,来推出当time=1时,延时函数空转
-             delayLoopCount个循环的时间,这个时间约为100us。具体计算是:(60x64)/60M,60这是一个看门狗时钟对
-             应的时间,当delayLoopCount=400,time = 200;时,即有80000个循环时,看门狗定时器使用了i个时钟完
-             成,每个时钟的时间为(60x64)/60M,它乘以i,就是80000个循环所花的时间,那么,一秒要用多少个循环
-             呢?80000 --------> (60x64)*i/60M 秒
-                   x   -------->     100/1M           那么100us对应多少个循环呢?
-             所以,x = (80000*100/1M)*(60M/60X64*i) = 400*100/(i*64/200);
*************************************************************************************************************
*/
void Delay(int time)
{														              // time=0: 通过看门狗定时器调整延时函数
    int i,adjust = 0;									                            // time>0: 循环时间的数目
    													                                        // 最小 100us 
    if (time == 0)
    {
		time = 200;
		adjust = 1;
		delayLoopCount = 400;
		rWTCON = ((MCLK/1000000 - 1)<<8 ) | (2<<3);  	          // 1/64, Watch-dog,nRESET,interrupt disable
	 	rWTDAT = 0xffff;
		rWTCNT = 0xffff;	 
		rWTCON = ((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); 	    // 1/64,Watch-dog enable, nRESET,interrupt disable 
    }
    
    for (;time>0;time--)
		for (i=0;i<delayLoopCount;i++);
		
    if (adjust == 1)
    {
		rWTCON = ((MCLK/1000000-1)<<8)|(2<<3);
		i = 0xffff - rWTCNT;   							                            //  1count/16us?????????
		delayLoopCount = 400*100/(i*64/200);			                              //  400*100/(i*64/200)   
    }
}

/*
*************************************************************************************************************
- 函数名称 :  Port_Init(void)
- 函数说明 :  端口初始化
- 输入参数 :  无
- 输出参数 :  无
*************************************************************************************************************
*/
	//注意:应遵循配置端口的次序
	// 1) 设定端口初值 2) 配置控制寄存器 3) 配置上拉电阻寄存器
void Port_Init(void)
{
	//端口A控制组 
	//  BIT 9	   8	  7		 6		 5		 4		 3		 2		 1		 0            
	//      GPA9   GPA8  ADDR22	 ADDR21	 ADDR20	 ADDR19	 ADDR18	 ADDR17	 ADDR16	 ADDR0   	      
	//      0,	   0,	 1,      1,      1,      1,      1,      1,      1,      1    
	//      GPA9->SMCALE, GPA8->SMCCLE
	rPCONA = 0x3ff;
		
	//端口B控制组
	//  BIT  10    9     8         7         6	    5      4     3       2	    1	   0	    
	//      /CS5   /CS4  /CS3     /CS2       /CS1   0      0     /SRAS   /SCAS  SCLK   SCKE      
	//       		     ethernet NANFLASH   USB    LED    LED 	 Sdram   Sdram  Sdram  Sdram     
	//      1,      1,    1,      1,         1,     0,     0,    1,      1,     1,     1          
	rPDATB = 0x7cf;
	rPCONB = 0x7cf;
    
	//端口C控制组
	// BIT    15	  14	   13     12	 11	    10	    9		8                       
	//        O		  0		   RXD1   TXD1	 nCTS1	nCTS0   O	    M/S	                      
	//        NAN_CLE NAN_ALE  Uart1  Uart1	 nCTS1	nCTS0	NAN_CE	USB                 
	//        01	  01	   11	  11	 11	    11		01		01                      

	// BIT	  7		  6		   5	  4		 3		2		1		0
	//		  lcd	  lcd	   lcd    lcd 	 IIS	IIS		IIS		IIS
	//		  VD4	  VD5	   VD6	  VD7	 IISCLK	IISDI	IISDO	IISLRCK
	//		  11	  11	   11	  11	 11	    11	    11	    11
	rPDATC = 0xffff;	//All IO is high
	rPCONC = 0x5ff5ffff;	
	rPUPC  = 0x0000;	//PULL UP RESISTOR should be enabled to I/O

	//端口D控制组
	//  BIT   7       6      5      4      3      2      1     0                                                      
	//        VFRAME  VM     VLINE  VCLK   VD3    VD2    VD1   VDO                                                      
	//        10      10     10     10     10     10     10    10                                                     
	//rPDATD= 0xff;
	rPCOND= 0xaaaa;
	rPUPD = 0x00;
	
	//端口E控制组
	//  Bit	 8		  7	      6		  5		 4		3		2		1		0	
	//		CODECLK	  TOUT4	  TOUT3	  TOUT2	 TOUT1	TOUT0	RXD0	TXD0	IN	
	//			10	  10	  10	  10	 10		10		10		10		00	
	rPDATE = 0x1;
	rPCONE = 0x2AAA8;
	rPUPE  = 0x1FE;

	//端口F控制组
	//  Bit  8		  7		   6		5		 4	      3		   2	  1       0                          
	//       out     in        out      out      nXDREQ0  nXDACK0  nWAIT  IICSDA  IICSCL                  
	//       001	 000	   001		001	     11		  11	   10	  10      10                      
	rPDATF = 0x1FF;
	rPCONF = 0x827EA;
	rPUPF  = 0x0;

	//端口G控制组
	//  BIT  7   	6      5   	  4   	 3     2   	 1      0    	 
	//       INT7   INT6   INT5   INT4   INT3  INT2  INT1   INT0     
	//       11     11     11     11     11    11    11     11       
	rPDATG = 0x00;
	rPCONG = 0xffff;
	rPUPG  = 0x0;	
	
	rSPUCR=0x7;  			//D15-D0 pull-up disable
	rEXTINT=0x22222222;       	//所有的外部硬件中断为低电平触发
	//rEXTINT=0x00;       	//所有的外部硬件中断为低电平触发
}
/*
*************************************************************************************************************
- 函数名称 : Uart_Init(int mclk,int baud,char port)
- 函数说明 : 串口初始化
- 输入参数 : mclk,baud
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Init(int mclk,int baud,char port)
{
    int i;
    if (mclk == 0)
	{
		mclk = MCLK;
    }
    i = (int)((mclk/16.)/baud + 0.5) -1;                                             //mclk / (baud * 16);
    if (port == 0)
    {												                                 //UART0 配置各控制寄存器
        rUFCON0 = 0x0;           					                                             // 禁用 FIFO 
        rUMCON0 = 0x0;
        rULCON0=0x3;     							                //正常模式,无奇偶校验,一个停止位,8个数据位
        //rULCON0=0x7;     						                    //正常模式,无奇偶校验,两个停止位,8个数据位
        rUCON0=0x245;     //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
        rUBRDIV0 = i;								                       //( (int)(mclk/16/baud + 0.5) -1 );
     }
    else if (port == 1)
    {												                                 //UART0 配置各控制寄存器
	 	rUFCON1 = 0x0;								                                             // 禁用 FIFO
    	rUMCON1 = 0x0;
        rULCON1 = 0x3;     							                //正常模式,无奇偶校验,一个停止位,8个数据位
    	//rULCON1 = 0x7;							                //正常模式,无奇偶校验,两个停止位,8个数据位							
    	rUCON1  = 0x245;  //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
    	rUBRDIV1 = i;								                      //( (int)(mclk/16./baud + 0.5) -1 );
    }
    for(i=0;i<100;i++);
}

/*
*************************************************************************************************************
- 函数名称 : Uart_TxEmpty(int port)
- 函数说明 : 等待发送转换寄存器空
- 输入参数 : port
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_TxEmpty(char port)
{
    if (port == 0)
		while(!(rUTRSTAT0 & 0x4)); 					                                  //一直等到发送转换器空.
    else
    	while(!(rUTRSTAT1 & 0x4)); 					                                  //一直等到发送转换器空.
}

/*
*************************************************************************************************************
- 函数名称 : Uart_Getch
- 函数说明 : 选择接收数据就绪的串口 
- 输入参数 : port
- 输出参数 : RdURXH0(),RdURXH1()
*************************************************************************************************************
*/
char Uart_Getch(char port)
{
    if (port == 0)
    {	    
		while(!(rUTRSTAT0 & 0x1)); 					                                          //接收数据就绪
		return RdURXH0();
    }
    else
    {
		while(!(rUTRSTAT1 & 0x1)); 					                                          //接收数据就绪
		return	rURXH1;
    }
}

/*
*************************************************************************************************************
- 函数名称 : Uart_GetKey
- 函数说明 : 得到串口的键值
- 输入参数 : port
- 输出参数 : RdURXH0()或0,rURXH1或0
*************************************************************************************************************
*/
char Uart_GetKey(char port)
{
    if (port == 0)
    {	    
		if(rUTRSTAT0 & 0x1)    						                                           //接收数据就绪
    	    return RdURXH0();
		else
	    	return 0;
    }
    else
    {
		if(rUTRSTAT1 & 0x1)    						                                           //接收数据就绪
	    	return rURXH1;
		else
	    	return 0;
    }
}

/*
*************************************************************************************************************
- 函数名称 : Uart_GetString(char *string)
- 函数说明 : 串口得到字符串
- 输入参数 : string
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_GetString(char *string,char port)
{

⌨️ 快捷键说明

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