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