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

📄 sd3530a.c

📁 时钟芯片SD3530A的程序,包括所有的子程序
💻 C
字号:
#include "def.h"  
#include "SD3530A.h"
//******************************************************************************

//******************************************************************************
void I2C_Initial( void )
{
    P4DIR |=SCL;		//将SCL管脚设置为输出管脚
    I2C_Set_sck_low();
    I2C_STOP();
    Delay_ms(10);
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_Set_sda_high( void )
{
    P4DIR |= SDA;		//将SDA设置为输出模式
    P4OUT |= SDA;		//SDA管脚输出为高电平
    
    _NOP();
    _NOP();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_Set_sda_low ( void )
{
    P4DIR |= SDA;		//将SDA设置为输出模式
    P4OUT &= ~(SDA);		//SDA管脚输出为低电平
    
    _NOP();
    _NOP();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_Set_sck_high( void )
{
    P4DIR |= SCL;		//将SCL设置为输出模式
    P4OUT |= SCL;		//SCL管脚输出为高电平
    
    _NOP();
    _NOP();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_Set_sck_low ( void )
{
    P4DIR |= SCL;		//将SCL设置为输出模式
    P4OUT &= ~(SCL);		//SCL管脚输出为低电平
    
    _NOP();
    _NOP();
    return;
}

//******************************************************************************

//******************************************************************************
int  I2C_GetACK(void)
{
    int nTemp = 0;
    int j;
    
    _NOP();
    _NOP();
    I2C_Set_sck_low();
    for(j = 30;j > 0;j--);
    P4DIR &= ~(SDA);		//将SDA设置为输入方向
    I2C_Set_sck_high();
    
    for(j = 30;j > 0;j--);
   // nTemp = (int)(P1IN & SDA);	//获得数据
    nTemp = (int)(P4IN & SDA);	//获得数据
    I2C_Set_sck_low();
    
    return (nTemp & SDA);
}

//******************************************************************************

//******************************************************************************
void I2C_SetACK(void)
{   
    I2C_Set_sck_low();
    I2C_Set_sda_low();
    I2C_Set_sck_high();
    I2C_Set_sck_low();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_SetNAk(void)
{
    I2C_Set_sck_low();
    I2C_Set_sda_high();
    I2C_Set_sck_high();
    I2C_Set_sck_low();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_START(void)
{
    int i;
    
    I2C_Set_sda_high();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_high();
    for(i = 5;i > 0;i--); //超始建立时间>4.7us
    I2C_Set_sda_low();
    for(i = 5;i > 0;i--);//超始锁定时间>4.7us
    I2C_Set_sck_low();
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_STOP(void)
{
    int i;
    
    I2C_Set_sda_low();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_low();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_high();
    for(i = 5;i > 0;i--);//结束条件建立时间>4.0us
    I2C_Set_sda_high();
    for(i = 5;i > 0;i--);
    I2C_Set_sck_low();
    Delay_ms(10);		//延迟一点时间
    
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_TxHToL(int nValue)
{
    int i;
    int j;
  
    for(i = 0;i < 8;i++)
    {
    	if(nValue & 0x80)
    	    I2C_Set_sda_high();
    	else
    	    I2C_Set_sda_low();
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_high();
    	nValue <<= 1;
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_low();
    }
    
    return;
}

//******************************************************************************

//******************************************************************************
void I2C_TxLToH(int nValue)
{
    int i;
    int j;
    for(i = 0;i < 8;i++)
    {
    	if(nValue & 0x01)
    	    I2C_Set_sda_high();
    	else
    	    I2C_Set_sda_low();
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_high();
    	nValue >>= 1;
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_low();
    }
    
    return;
}

//******************************************************************************

//******************************************************************************
// 接收是从 LSB 到 MSB 的顺序
int  I2C_RxByte(void)
{
    int nTemp = 0;
    int i;
    int j;
    
    I2C_Set_sda_high();
    
    P4DIR &= ~(SDA);			//将SDA管脚设置为输入方向
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    for(i = 0;i < 8;i++)
    {
    	I2C_Set_sck_high();
    	
        //if(P1IN & SDA)
    	if(P4IN & SDA)
    	{
    	    nTemp |= (0x01 << i);
    	}
    	for(j = 30;j > 0;j--);
    	I2C_Set_sck_low();
    }
    
    return nTemp;
}

//******************************************************************************

//******************************************************************************
// 获取时间信息,成功返回 1,错误返回 0
int  I2C_ReadSystime (char *pBuf)
{
    int nTemp = 0;
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(0x65);			// 发送读时间信息命令
    
    nTemp = I2C_GetACK();		// 等待 ACK
    
    pBuf[0] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[1] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[2] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[3] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[4] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[5] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[6] = I2C_RxByte();
    I2C_SetACK();
    
    pBuf[7] = I2C_RxByte();
    I2C_SetACK();
    
    I2C_STOP();				// 停止总线
    return nTemp;
}

//******************************************************************************
//设置系统时间
//******************************************************************************
// 写时间信息,成功返回 1,错误返回 0
int  I2C_WriteSystime(char *pBuf)
{
    int nTemp = 0;
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(0x64);			// 发送写时间信息命令
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[0]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[1]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[2]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[3]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[4]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[5]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(pBuf[6]);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_STOP();				// 停止总线
    return (nTemp & SDA);
}

//******************************************************************************
//设置报警时间
// 写报警信息,成功返回 1,错误返回 0
//******************************************************************************

int  I2C_WriteAlarmTime(int nValue,char cmd)
{
    char chrTemp = 0;
    int nTemp = 0;
    chrTemp = (char)(nValue & 0x00ff);
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(cmd);			// 发送写报警时间信息命令
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;
    
    I2C_TxLToH(chrTemp);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0;    
 
    chrTemp = (char)((nValue & 0xff00)>>8);
    I2C_TxLToH(chrTemp);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return 0; 
    
    I2C_STOP();				// 停止总线
    
    return (nTemp & SDA);
}    
//******************************************************************************

//******************************************************************************
int  I2C_Reset(void)
{
    int nTemp = 0;
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(0x60);			// 发送复位命令
    nTemp = I2C_GetACK();		// 等待 ACK
    
    I2C_STOP();				// 停止总线
    return (nTemp & SDA);
}

//******************************************************************************

//******************************************************************************
void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟
{
    unsigned long nCount;
    int i;
    unsigned long j;
    nCount = 2667;
    for(i = nValue;i > 0;i--)
    {
    	for(j = nCount;j > 0;j--);
    }
    return;
}

//******************************************************************************

//******************************************************************************
void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟
{
    int nCount;
    int i;
    int j;
    nCount = 3;
    for(i = nValue;i > 0;i--)
    {
    	for(j = nCount;j > 0;j--);
    }
    return;
}

//******************************************************************************

//******************************************************************************
void Test(unsigned char nVal)
{
    int nTemp = 0;
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(nVal);			// 发送复位命令
    nTemp = I2C_GetACK();		// 等待 ACK
    
    I2C_STOP();				// 停止总线
    
    return;
}

//******************************************************************************

//******************************************************************************
int  I2C_ReadSta(void)
{
    unsigned char nTemp = 0;
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(0x63);			// 发送读状态寄存器命令
    nTemp = I2C_GetACK();		// 等待 ACK
    
    nTemp = I2C_RxByte();
    I2C_SetACK();
    
    
    I2C_STOP();				// 停止总线
    
    return nTemp;
}

//******************************************************************************

//******************************************************************************
void I2C_WriteSta(int nValue)
{
    int nTemp = 0;
    char chrTemp = 0;
    chrTemp = (char)(nValue & 0x00ff);
    
    I2C_START();			// 启动数据总线
    
    I2C_TxHToL(0x62);			// 发送写时间信息命令
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return;
    
    I2C_TxLToH(chrTemp);
    nTemp = I2C_GetACK();		// 等待 ACK
    if(nTemp & BIT6) return;
    
    I2C_STOP();				// 停止总线
    
    return;
}

//******************************************************************************
// 设置为24小时制;INT1,INT2报警中断输出
//******************************************************************************
void SetStatusRegMode(void)
{
   // int nTemp;    
   // nTemp = 0;    
  
     //nTemp = I2C_ReadSta();
     //nTemp |= BIT6+BIT5+BIT4;
     //nTemp &= (~(BIT3))+(~(BIT2))+(~(BIT1))+(~(BIT0));
     
     //nTemp |= BIT6+BIT4;
    // nTemp &= (~(BIT3))+(~(BIT2))+(~(BIT1))+(~(BIT0));    
     
   // I2C_WriteSta(nTemp);
    I2C_WriteSta(0x0070);
     
}
//******************************************************************************
//******************************************************************************
// 设置INT1,INT2报警中断输出禁止,用于当报警有效后将电平拉高
//intoneortwo=0x0050 ->int1
//intoneortwo=0x0060 ->int2
//******************************************************************************
void AlarmRecover(int intoneortwo)
{ 
   // int nTemp;    
   // nTemp = 0; 
   // nTemp = I2C_ReadSta();
    //nTemp &= (~(BIT4))+(~(BIT5));
   // nTemp &= ~(BIT4);
   // I2C_WriteSta(nTemp);
    I2C_WriteSta(intoneortwo);
    
}
//******************************************************************************
/******************************************************************************
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;			//将寄存器的内容清零
					//XT2震荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do 
    {
	IFG1 &= ~OFIFG;                       // 清除OSCFault标志
	for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
					
    BCSCTL1 &= ~(XT2OFF + XTS);//open XT2, LFTX2 select low frequency 
    BCSCTL1 |= RSEL0 + RSEL1 + RSEL2; //DCO Rsel=7(Freq=3200k/25摄氏度)  
    BCSCTL1 |= 0x07;
    BCSCTL2 += SELM1;		//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;		//SMCLK的时钟源为TX2CLK,分频因子为1
    
}
******************************************************************************/
//******************************************************************************
void Init_CLK(void)
{
 unsigned int i;
 BCSCTL1&=~XT2OFF; //XT2有效
 do
 {
    IFG1&=~OFIFG;  //清OSCFault标志
    for (i=0x20;i>0;i--);
 }while((IFG1&OFIFG)==OFIFG); //若振荡器失效标志有效
 BCSCTL2|=SELM1;   //MCLK时钟源为XT2
 BCSCTL2|=DIVM0;  //2分频  4M/2=2M ,一个指令周期为0.5us

}
//******************************************************************************
/*
    SetStatusRegMode();	   
    pTime[0] = 0x07; 
    pTime[1] = 0x08; 
    pTime[2] = 0x25; 
    pTime[3] = 0x32; 
    pTime[4] = 0x11; 
    pTime[5] = 0x03; 
    pTime[6] = 0x00; 
   
    I2C_WriteSystime(pTime); 
    _NOP();
    
    I2C_WriteAlarmTime(0x0411,0x68);//INT1, 14:30
    I2C_WriteAlarmTime(0x0611,0x6a);//INT2,14:35
    _NOP(); 

    I2C_ReadSystime (CurrentTime);
    _NOP(); 
    
    AlarmRecover(0x0050);//int1
    _NOP(); 
    
    AlarmRecover(0x0060);//int2
    _NOP(); 
    
    SetStatusRegMode();	
    _NOP();
 
*/

⌨️ 快捷键说明

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