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

📄 sd_iic.c

📁 SD2200时钟芯片的驱动 SD2200时钟芯片的驱动
💻 C
字号:
#include "SD_IIC.h"

uint8 Date_Str[11];


/*********I2C延时***********/
void SD_I2CWait(void)
{	
	 Delay_us(5);//_nop_();_nop_();_nop_();_nop_();
}


/********开启SD2200的I2C总线********/
uint8 SD_I2CStart(void)
{

 	SD_OUT_I2C_SDA;
	
	SD_SETB_I2C_SDA;//SDA=1;
	SD_SETB_I2C_SCL;//SCL=1;
	SD_I2CWait();
	SD_CLRB_I2C_SDA;//SDA=0;
	SD_I2CWait();
	SD_CLRB_I2C_SCL;//SCL=0;
	SD_I2CWait();
	return TRUE;
}


/********关闭SD2200的I2C总线*******/
void SD_I2CStop(void)
{
    SD_OUT_I2C_SDA;
	
	SD_CLRB_I2C_SDA;//SDA=0;
	//CLRB_I2C_SCL;//SCL=0;-----------
	SD_I2CWait();
	SD_SETB_I2C_SCL;//SCL=1;
	SD_I2CWait();
	SD_SETB_I2C_SDA;//SDA=1;
}


/*********发送 ACK*********/
void SD_I2CAck(void)
{	
    SD_OUT_I2C_SDA;
	
	SD_CLRB_I2C_SDA;//SDA=0;
	//CLRB_I2C_SCL;//SCL=0;---
	SD_I2CWait();
	SD_SETB_I2C_SCL;//SCL=1;
	SD_I2CWait();
	SD_CLRB_I2C_SCL;//SCL=0;
}


/*********发送NO ACK*********/
void SD_I2CNoAck(void)
{	
    SD_OUT_I2C_SDA;
	
	SD_SETB_I2C_SDA;//SDA=1;
	//CLRB_I2C_SCL;//SCL=0;
	SD_I2CWait();
	SD_SETB_I2C_SCL;//SCL=1;
	SD_I2CWait();
	SD_CLRB_I2C_SCL;//SCL=0;
	SD_I2CWait();
	SD_CLRB_I2C_SDA;//+++++++++
}


/*********读取ACK信号*********/
uint8 SD_I2CWaitAck(void)  //返回为:1=有ACK,0=无ACK
{
uint16 ErrTime = 4000;   // 16M晶振
 //CLRB_I2C_SDA;//SDA_0;    // 关闭上拉
 
 SD_IN_I2C_SDA;
 SD_SETB_I2C_SDA;//SCL_1;
 SD_I2CWait();
 
 SD_SETB_I2C_SCL;
 
 do{
  ErrTime--;
  if ( !ErrTime )
  {
   break;
  }
 }while( SD_GETB_I2C_SDA );
 SD_CLRB_I2C_SCL;//SCL_0;
 
 SD_OUT_I2C_SDA;//SDA_OUT;
 
 return TRUE;
}


/************从SD2200发送一个字节*************/
void SD_I2CSendByte(uint8 demand,uint8 order) //order=1,H_L;order=0,L_H
{
	uint8 i=8;                       //order=1,从HI-->LO发送8bit数据
	                                 //order=0,从LO-->HI发送8bit数据
	if(order)
	{
		while(i--)
		{
			SD_CLRB_I2C_SCL;//SCL=0;
			Delay_us(4);//_nop_();
			
			if(demand&0x80)
			SD_SETB_I2C_SDA;
			else SD_CLRB_I2C_SDA;
			//SDA=(bit)(demand&0x80);
			
			
			demand<<=1;
			SD_I2CWait();
			SD_SETB_I2C_SCL;//SCL=1;
			SD_I2CWait();
		}
		SD_CLRB_I2C_SCL;//SCL=0;
	}
     else
	{
		while(i--)
		 {
			SD_CLRB_I2C_SCL;//SCL=0;
			Delay_us(1);//_nop_();
			
			if(demand&0x01)
			SD_SETB_I2C_SDA;
			else SD_CLRB_I2C_SDA;
			
			//SDA=(bit)(demand&0x01);
			
			
			demand>>=1;
			SD_I2CWait();
			SD_SETB_I2C_SCL;//SCL=1;
			SD_I2CWait();
		 }
		 SD_CLRB_I2C_SCL;//SCL=0;
	}
}


/*********MCU从SD2200读入一字节*********/
uint8 SD_I2CReceiveByte(uint8 order)//order=1,H_L;order=0,L_H
{
	uint8 i=8;
	uint8 ddata=0;
	
	SD_SETB_I2C_SDA;;//开启上拉
	//CLRB_I2C_SDA;
	SD_IN_I2C_SDA;
	
	if(order)
          {
	   while(i--)
	     {
		ddata<<=1;          //数据从高位开始读取
		//CLRB_I2C_SCL;//SCL=0;
		//I2CWait();
		SD_SETB_I2C_SCL;//SCL=1;
		SD_I2CWait();	   //从高位开始 ddata|=SDA;ddata<<=1
		if(SD_GETB_I2C_SDA)//SDA)
		{
			ddata|=0x01;
		}
		else ddata &= 0xFE; 
        SD_CLRB_I2C_SCL;// SCLClr();
        SD_I2CWait();// SomeNOP(); 
		
	     }
          }
        else
          {
           while(i--)
	     {
		ddata>>=1;          //数据从低位开始读取
		SD_CLRB_I2C_SCL;//SCL=0;
		SD_I2CWait();
		SD_SETB_I2C_SCL;//SCL=1;
		SD_I2CWait();	   //从低位开始 ddata|=SDA;ddata>>=1
		if(SD_GETB_I2C_SDA)//SDA)
		{
			ddata|=0x80;
		}
	     }      
          }
	SD_CLRB_I2C_SCL;//SCL=0;
	SD_OUT_I2C_SDA;
	return ddata;
}


/*写SD2200状态寄存器命令*/

void I2CWriteStatus(void)
{		
	SD_I2CStart();//if(!I2CStart())return;
	SD_I2CSendByte(0x60,1);      //发送SD2200状态寄存器_1命令
	SD_I2CWaitAck();//if(!I2CWaitAck()){I2CStop();return;}   
	SD_I2CSendByte(0x03,0);      //IC进行复位初始化,24小时制
	SD_I2CWaitAck();
	SD_I2CStop();        
	SD_I2CStart();
	SD_I2CSendByte(0x62,1);      //发送SD2200状态寄存器_2命令
	SD_I2CWaitAck();   
	SD_I2CSendByte(0x00,0);      //清TEST位,禁止中断输出
	SD_I2CWaitAck();
	SD_I2CStop();        
}



void I2CWriteTime(void)
{		
    uint8 date[7];     
	uint8 n;
	    date[0]=0x08;//year;2006/03/03/05/13/14/50
        date[1]=0x04;//month
        date[2]=0x23;//day
        date[3]=0x03;//week
        date[4]=0x13;//hour
        date[5]=0x44;//minute
        date[6]=0x00;//second	
	SD_I2CStart();
	SD_I2CSendByte(0x64,1);      //发送SD2200写时间寄存器命令,
	SD_I2CWaitAck();   
        for(n=0;n<7;n++)
	    {
		SD_I2CSendByte(date[n],0);
		SD_I2CWaitAck();
	    }
	SD_I2CStop();
	      
}




/******读SD2200实时数据寄存器******/
void I2CReadDate(void)
{
    uint8 date[7];  
	uint8 n;
	uint8 SDate[3];
	extern uint8 Is_Trying;
	
	
	Clr_Str(Date_Str);
	
	SD_I2CStart();
	SD_I2CSendByte(0x65,1);//I2CSendByte(0x65,1);//从年开始读取数据
	SD_I2CWaitAck();//if(!I2CWaitAck()){I2CStop();return;}
	
	for(n=0;n<6;n++)
	{
		date[n]=SD_I2CReceiveByte(0);//I2CReceiveByte(0);
		
		if (n!=6)//if (n!=3)         //最后一个数据不应答
		{
			SD_I2CAck();//I2CAck();
		}
	}
	SD_I2CNoAck();
	SD_I2CStop();
	
	Cat_Str(Date_Str,"20");
		
	for (n=0;n<6;n++)
	{
	  if (n==4) date[n]=date[n]&(~BIT(6));
	  
	  date[n]=(date[n]/16)*10 +date[n]%16;
	  IntToStr(date[n],SDate,0);
	  
	 //是否有时钟,无时钟或无电池读出为165-165-165
     if (n==0) 
	    if (date[n]>100) 
		{
		  Clr_Str(Date_Str);
		  Cat_Str(Date_Str,"2099-01-01");		  
		  break;
		}	  
	  if (n==0)
	    if (date[n]<10) 
		{
		  Cat_Str(Date_Str,"0");
	     }
	   if (n>=0 & n<3)
	   {
	      if (n>0 & n<3)
		  //if (n>0 & n<6)
	      Cat_Str(Date_Str,"-");
		  
		  if (n>0)
		  if (date[n]<10) 
		     Cat_Str(Date_Str,"0");
		  
	      Cat_Str(Date_Str,SDate);
		}
		
		
	}	

	
}


⌨️ 快捷键说明

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