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

📄 x1228.c

📁 X1228时钟芯片C代码(1234356U7456756UY5U54654U654_
💻 C
字号:
/**************************************** ***********************************************
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: X1228.C
**创   建   人: 
**最后修改日期:  
**描        述: X1228库函数程序
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

#define	  X1228_CCR	0xde					//11011110B  X1228时钟寄存器从地址
#define   X1228_ROM 0xae

extern  uint8         bp;	
#define SDAOut_1 IO0DIR = IO0DIR | 0x00000008;  IO0SET = IO0SET | 0x00000008	//SDA置1		P0.3
#define SDAOut_0 IO0DIR = IO0DIR | 0x00000008;  IO0CLR = IO0CLR | 0x00000008	//SDA清0
#define SCLOut_1 IO0DIR = IO0DIR | 0x00000004;  IO0SET = IO0SET | 0x00000004	//SCL置1		P0.2
#define SCLOut_0 IO0DIR = IO0DIR | 0x00000004;  IO0CLR = IO0CLR | 0x00000004	//SCL清0
#define SDAIn    IO0DIR = IO0DIR & 0xfffffff7                       			//Set SDA input mode
/*********************************************************************************************************
** 函数名称: 	NOP
** 功能描述: 	延时程序
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:      
** 注:         仅限于本文件使用
*********************************************************************************************************/
void  NOP(uint32  dly)
{ uint32  i; ;
   for(; dly>0; dly--);
   if(bp == 0)
   {
    for(i=2000;i>0;i--);
   }
}
/*********************************************************************************************************
** 函数名称: 	X1228_Start
** 功能描述: 	X1228 I2C起始条件
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:      
*********************************************************************************************************/
void X1228_Start(void)
{
   SDAOut_1;
   NOP(20);
   SCLOut_1;
   NOP(20);
   SDAOut_0;
   NOP(20);
   SCLOut_0;
   NOP(20);   
}

/*********************************************************************************************************
** 函数名称: 	X1228_Stop
** 功能描述: 	X1228 I2C结束条件
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:      
*********************************************************************************************************/
void X1228_Stop(void)
{
 	SCLOut_0;
    NOP(10);
 	SDAOut_0;
    NOP(10);
 	SCLOut_1;
    NOP(10);
	SDAOut_1;
	NOP(10);
	
}

/*********************************************************************************************************
** 函数名称: 	X1228_SAck
** 功能描述: 	X1228 I2C发送ACK信号
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:       
*********************************************************************************************************/
void X1228_SAck(void)
{
	SDAOut_0;
    NOP(10);
	SCLOut_1;
    NOP(10);
	SCLOut_0;                                                
    NOP(10);
}

/*********************************************************************************************************
** 函数名称: 	X1228_SNAck
** 功能描述: 	X1228 I2C发送NACK信号
** 输 入:		无
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:       
*********************************************************************************************************/
void X1228_SNAck(void)
{
	SDAOut_1;
    NOP(10);
	SCLOut_1;
    NOP(10);
	SCLOut_0;
    NOP(10);
}

/*********************************************************************************************************
** 函数名称: 	X1228_SendByte
** 功能描述: 	X1228 I2C发送字节
** 输 入:		发送字节数据
** 输 出: 		无
** 全局变量:	无
** 调用模块:	无
** 日 期:       
*********************************************************************************************************/
uint8 X1228_SendByte(uint8 ch)
{uint8 i=8;
 uint8 j=8; 
 	while (i--)
 	{
    	if (ch & 0x80)
    	{
    	    SDAOut_1;
    	}
    	else
        {
            SDAOut_0;	
        }			//SDA=(bit)(ch&0x80);
		ch<<=1;
		NOP(15);
		SCLOut_1;
    	NOP(20);
		SCLOut_0;
    	NOP(15);
	}
	SDAOut_1;
	SDAIn;
	NOP(10);
    SCLOut_1;

    for (i=0;i<8;i++)
    {
        NOP(15);
        j = IO0PIN & 0x00000008;
        if (j == 0) 
        {
          SCLOut_0;
          return 1;
        }
	}
    SCLOut_0;
	return 0;
}

/*********************************************************************************************************
** 函数名称: 	X1228_RcvByte
** 功能描述: 	X1228 I2C接收字节
** 输 入:		无
** 输 出: 		接收字节数据
** 全局变量:	无
** 调用模块:	无
** 日 期:       
*********************************************************************************************************/
uint8 X1228_RcvByte(void)
{
 uint8 i = 8;
 uint8 j = 0;
 uint8 rcv_data=0;
	   SDAIn;
	while (i--)
 	{
		rcv_data <<= 1;
		SCLOut_0;
   		NOP(20);
		SCLOut_1;
   		NOP(20);
   	    j = IO0PIN & 0x00000008;
  	 if (j == 0x00000008) 
  	    {
  	      rcv_data|=1;
  	    }
	}
	SCLOut_0;
	return rcv_data;
}


/*********************************************************************************************************
** 函数名称: 	X1228_SendStr16
** 功能描述: 	X1228 I2C发送多字节
* 入口参数:	sla		器件地址
*          	    suba	16位器件子地址
*               s		数据发送缓冲区指针
*	   	        no 		写数据个数
** 输 出: 		无
** 全局变量:    无
** 调用模块:    无
** 日 期:       
*********************************************************************************************************/
uint8 X1228_SendStr16(uint8 sla,uint16 suba,uint8 *s,uint8 no)
{uint8 i;
	X1228_Start();								//启动开始条件
	if(X1228_SendByte(sla) == 0) return 0;		//发送从地址
	if(X1228_SendByte(suba/256) == 0) return 0;	//发送从地址高位
	if(X1228_SendByte(suba%256) == 0) return 0;	//发送从地址低位
	for (i = 0;i<no;i++,s++)	
	   { 
		if(X1228_SendByte(*s)==0) return 0;		//发送数据
	   }
	X1228_Stop();								//发结束信号
	return 1;
}


/*********************************************************************************************************
** 函数名称: 	X1228_RcvStr16
** 功能描述: 	X1228 I2C接收多字节
* 入口参数:	sla		器件地址
*          	suba	16位器件子地址
*           s		数据接收缓冲区指针
*	   	    no 		读数据个数
** 输 出: 		    无
** 全局变量:		无
** 调用模块:		无
** 日 期:       
*********************************************************************************************************/
uint8 X1228_RcvStr16(uint8 sla,uint16 suba,uint8 *s,uint8 no)
{uint8 i;
       i = (no==0)||(no>32);
    if(i == 1) 
      {
        return 0;
      }
	X1228_Start();								//启动开始条件
	if(X1228_SendByte(sla)==0) return 0;		//发送从地址
	if(X1228_SendByte(suba/256)==0) return 0;	//发送从地址高位
	if(X1228_SendByte(suba%256)==0) return 0;	//发送从地址低位
	X1228_Start();								//重复启动开始条件
	if(X1228_SendByte(sla+1)==0) return 0;		//发送读命令
	for (i=0;i<no;i++,s++)
	{
  	   *s=X1228_RcvByte();						//接收字节数据
	   if (i!=no-1)	X1228_SAck();		         //除最后一个字节外,其他都要从MASTER发应答。
	}
	X1228_SNAck();						         //发送非应答信号
	X1228_Stop();						         //发结束信号
    return 1;
}


/*********************************************************************************************************
** 函数名称: 	X1228_CCRWR
** 功能描述: 	X1228 CCR写操作
** 输 入:		SubAdd :	CCR数据写入寄存器地址
**				*data_buf:	要发送数据的起始地址
**            	num 	:	发送个数
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期:     
*********************************************************************************************************/
void X1228_CCRWR(uint16 SubAdd,uint8 *data_buf,uint8 num)
{uint8 wel=2,rwel=6;
	X1228_SendStr16(X1228_CCR,0x003f,&wel,1);
	NOP(1000);
	X1228_SendStr16(X1228_CCR,0x003f,&rwel,1);		//建立写条件
	NOP(1000);
	X1228_SendStr16(X1228_CCR,SubAdd,data_buf,num);
}

/*********************************************************************************************************
** 函数名称: 	X1228_CCRRD
** 功能描述: 	X1228 CCR读操作
** 输 入:		SubAdd :	CCR数据读入寄存器地址
**				*data_buf:	要接收数据的起始地址
**            	num 	:	接收个数
** 输 出: 		无
** 全局变量:	无
** 调用模块:	IRcvStr16
** 日 期:       
*********************************************************************************************************/

void X1228_CCRRD(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
	X1228_RcvStr16(X1228_CCR,SubAdd,data_buf,num);
}


/*********************************************************************************************************
** 函数名称: 	X1228_WP
** 功能描述: 	X1228写保护操作--关看门狗、开/关EEPROM写保护、1Hz输出
** 输 入:		WP_en:	0不写保护、1写保护
** 输 出: 		无
** 全局变量:	无
** 调用模块:	X1228_CCRRD
** 日 期:       
*********************************************************************************************************/

void X1228_WP(uint8 WP_en)
{
    uint8 dat[1]={0x18};				  //#00011000B--BP2/BP1/BP0/WD1/WD0  关写保护关看门狗
    uint8 wel=2,rwel=6; 
	X1228_SendStr16(X1228_CCR,0x003f,&wel,1);
	NOP(1000);
	X1228_SendStr16(X1228_CCR,0x003f,&rwel,1);		//建立写条件
	NOP(2000);
	if(WP_en != 0)
     {
	   dat[0]=0x78;			       //#01111000B--BP2/BP1/BP0/WD1/WD0    开写保护关看门狗
	 }
	X1228_SendStr16(X1228_CCR,0x0010,dat,1);
}

/*********************************************************************************************************
** 函数名称: 	X1228_TIMEWR
** 功能描述: 	X1228写日期、时间
** 输 入:		*date_time:	日期/时间数组缓冲区首地址
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期: 
*********************************************************************************************************/

void X1228_TIMEWR(uint8 *time_buf)
{	
	X1228_CCRWR(0x0030,time_buf,7);
}

/*********************************************************************************************************
** 函数名称: 	X1228_TIMERD
** 功能描述: 	X1228读日期、时间
** 输 入:		*date_time:	日期/时间数组缓冲区首地址
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期: 
*********************************************************************************************************/

void X1228_TIMERD(uint8 *time_buf)
{
	X1228_CCRRD(0x0030,time_buf,8);
}


/*********************************************************************************************************
** 函数名称: 	X1228_ROMWR
** 功能描述: 	X1228 EEPROM写操作
** 输 入:		SubAdd :	数据写入存储器地址
**				*data_buf:	要发送数据的起始地址
**            	num 	:	发送个数
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期:       
*********************************************************************************************************/

void X1228_ROMWR(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
    X1228_WP(0);							//关闭写保护
	X1228_SendStr16(X1228_ROM,SubAdd,data_buf,num);
}


/*********************************************************************************************************
** 函数名称: 	X1228_ROMRD
** 功能描述: 	X1228 ROM读操作
** 输 入:		SubAdd :	ROM数据读入寄存器地址
**				*data_buf:	要接收数据的起始地址
**            	num 	:	接收个数
** 输 出: 		无
** 全局变量:	无
** 调用模块:	IRcvStr16
** 日 期:       
*********************************************************************************************************/

void X1228_ROMRD(uint16 SubAdd,uint8 *data_buf,uint8 num)
{
	X1228_RcvStr16(X1228_ROM,SubAdd,data_buf,num);
}


/*********************************************************************************************************
** 函数名称: 	X1228_ini
** 功能描述: 	X1228日期、时间初始化、关写保护看门狗
** 输 入:		*date_time:	日期/时间数组缓冲区首地址
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期: 
*********************************************************************************************************/

void X1228_ini(uint8 *time_buf)
{
	X1228_CCRWR(0x0030,time_buf,8);
    X1228_WP(0);							//关闭写保护
}


/*********************************************************************************************************
** 函数名称: 	X1228_start
** 功能描述: 	X1228时钟启动
** 输 入:		*date_time:	日期/时间数组缓冲区首地址
** 输 出: 		无
** 全局变量:	无
** 调用模块:	ISendStr16
** 日 期:      
*********************************************************************************************************/

void X1228_start(void)
{
    uint8 tmp=0x20;
	X1228_CCRWR(0x0037,&tmp,1);
}

⌨️ 快捷键说明

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