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