📄 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 + -