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

📄 sd2201.c

📁 msp430芯片驱动时钟芯片SD2201的驱动程序。程序用于量产产品中!
💻 C
字号:
//----------------------------------------------------------
//  名称: msp430驱动SD2201程序
//  编写: 王波
//  记录:
//        2006.09.18 在SD2001基础上编写   更改状态寄存器命令,小时屏蔽位。时间读正确,无脉冲中断。
//        2006.09.19 查找出错误:每发一次命令码前要加I2CSTART
//
//----------------------------------------------------------
// "extern.h" 定义I2C总线引脚,引用Delay(unsigned int var)子程序
#include "extern.h"

#define I2C_DELAY 2
//功能:I2C起始条件
//输入:无
//输出:无
void Delay(unsigned int i)
{
   while(i--);
}

static void I2cStart(void)
{
   I2cSDA_POUT|=I2cSDA_B;
   I2cSCL_POUT|=I2cSCL_B;Delay(I2C_DELAY);
   I2cSDA_POUT&=~I2cSDA_B;Delay(I2C_DELAY);
   I2cSCL_POUT&=~I2cSCL_B;
}
//功能:I2C终止条件
//输入:无
//输出:无
static void I2cStop(void)
{
   I2cSDA_POUT &= ~I2cSDA_B;
   I2cSCL_POUT |= I2cSCL_B;Delay(I2C_DELAY);
   I2cSDA_POUT |= I2cSDA_B;Delay(I2C_DELAY);
   I2cSCL_POUT &= ~I2cSCL_B;
}

//功能:I2C发送应答位
//输入:无
//输出:无
static void I2cAck(void)
{
  I2cSDA_POUT &= ~I2cSDA_B;
  I2cSCL_POUT |= I2cSCL_B; Delay(I2C_DELAY);
  I2cSCL_POUT &= ~I2cSCL_B; Delay(I2C_DELAY);
  I2cSDA_POUT |= I2cSDA_B;
}

//功能:I2C发送非应答位
//输入:无
//输出:无
static void I2cNack(void)
{
  I2cSDA_POUT |= I2cSDA_B;
  I2cSCL_POUT |= I2cSCL_B;Delay(I2C_DELAY);
  I2cSCL_POUT &= ~I2cSCL_B;Delay(I2C_DELAY);
  I2cSDA_POUT &= ~I2cSDA_B;
}

//功能:I2C等待应答位(返回值:应答位。正确为0)
//输入:无
//输出:checkbyte = 1 right.
static char I2cWaitAck(void)
{
  char checkbyte;
  I2cSDA_PDIR &= ~I2cSDA_B;Delay(I2C_DELAY);
  I2cSCL_POUT |= I2cSCL_B; Delay(I2C_DELAY);
  checkbyte = I2cSDA_PIN & I2cSDA_B;
  I2cSCL_POUT &= ~I2cSCL_B; Delay(I2C_DELAY);
  I2cSDA_PDIR |= I2cSDA_B;
  return checkbyte;
}
//功能:发送一字节数据至SD2001。(返回值:接收数据)
//输入:data: 数据/命令码
//      order=1,H_L,发送命令;
//      order=0,L_H,发送数据.
//输出:无
static char SendSdByte(char data,char order)
{
  char i=1;
  if(order)
  {
     for(;i<=8;i++)
     {
        if(data&0x80)I2cSDA_POUT|=I2cSDA_B;
        else I2cSDA_POUT&=~I2cSDA_B;
        Delay(I2C_DELAY);
        I2cSCL_POUT|=I2cSCL_B;
        data<<=1;
        Delay(I2C_DELAY);
        I2cSCL_POUT&=~I2cSCL_B;
     }
  }
  else
  {
     for(;i<=8;i++)
     {
        if(data&0x01)I2cSDA_POUT|=I2cSDA_B;
        else I2cSDA_POUT&=~I2cSDA_B;
        Delay(I2C_DELAY);
        I2cSCL_POUT|=I2cSCL_B;
        data>>=1;
        Delay(I2C_DELAY);
        I2cSCL_POUT&=~I2cSCL_B;
     }
  }
  i=I2cWaitAck();
  return i;
}
//功能:从SD2001接收一字节数据(L-H)。
//输入:无
//输出:接收的数据
static char RecvSdByte(void)
{
  char i,data=0;
  I2cSDA_PDIR&=~I2cSDA_B;
  for(i=1;i<=8;i++)
  {
    data>>=1;
    I2cSCL_POUT |= I2cSCL_B;
    Delay(I2C_DELAY);
    if(I2cSDA_PIN&I2cSDA_B) data|=0x80;
    I2cSCL_POUT &=~ I2cSCL_B;
    Delay(I2C_DELAY);
  }
  I2cSDA_PDIR|=I2cSDA_B;
  return(data);
}
//功能:读当前时间(当前时间存储首址 7bytes)
//输入:7bytes 时间结构变量。格式:y m d h m s w(byte)
//输出:更改后的 7bytes 时间结构变量。格式:y m d h m s w(byte)
void ReadSysTime(char *timeptr)
{
  char i,w;
  I2cStart();
  SendSdByte(0x65,1);
  Delay(0);
  for(i=0;i<7;i++,timeptr++)
  {
    *timeptr=RecvSdByte();
    if(i==3){ w=*timeptr; *timeptr--;}
    else if(i==4)*timeptr&=~0x40;
    if(i!=6)I2cAck();
  }
  I2cNack();
  I2cStop();
  *timeptr=w;
}

//功能:I2C起始条件
//输入:无
//输出:无
//设置时间(当前时间存储首址 7bytes)
//时间格式:y m d h m s w (byte)
void SetSysTime(char *timeptr)
{
  char i,tmp;
  I2cStart();
  SendSdByte(0x64,1);
  Delay(0);
  for(i=0;i<7;i++)
  {
      if(i!=3)tmp=*timeptr++;
      else tmp=*(timeptr+3);
      SendSdByte(tmp,0);
  }
  I2cStop();
}
//功能:SD2001初始化
//输入:无
//输出:无
void Sd2001Init(void)
{
    I2cStart();
    SendSdByte(0x60,1);  //发送SD20001C状态寄存器_1命令,
    SendSdByte(0x02,0);  //24小时制,int1 秒脉冲输出,
    I2cStop();
    I2cStart();
    SendSdByte(0x62,1);  //发送SD2200状态寄存器_2命
    SendSdByte(0x01,0);  //清TEST位,固定频率中断输出
    I2cStop();
    I2cStart();
    SendSdByte(0x68,1);  //设置INT_1
    SendSdByte(0x01,0);  //秒脉冲输出
    I2cStop();
}
/*
char time[7]={0,0,0,0,0,0,0};
void main(void)
{
    CloseWatchDog();
    SysInit();
    while(1)
    {
        ReadSysTime(time);
        SetSysTime(time);
    }
}
*/

⌨️ 快捷键说明

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