📄 sd_iic.c
字号:
#include "SD_IIC.h"
uint8 Date_Str[11];
/*********I2C延时***********/
void SD_I2CWait(void)
{
Delay_us(5);//_nop_();_nop_();_nop_();_nop_();
}
/********开启SD2200的I2C总线********/
uint8 SD_I2CStart(void)
{
SD_OUT_I2C_SDA;
SD_SETB_I2C_SDA;//SDA=1;
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
SD_CLRB_I2C_SDA;//SDA=0;
SD_I2CWait();
SD_CLRB_I2C_SCL;//SCL=0;
SD_I2CWait();
return TRUE;
}
/********关闭SD2200的I2C总线*******/
void SD_I2CStop(void)
{
SD_OUT_I2C_SDA;
SD_CLRB_I2C_SDA;//SDA=0;
//CLRB_I2C_SCL;//SCL=0;-----------
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
SD_SETB_I2C_SDA;//SDA=1;
}
/*********发送 ACK*********/
void SD_I2CAck(void)
{
SD_OUT_I2C_SDA;
SD_CLRB_I2C_SDA;//SDA=0;
//CLRB_I2C_SCL;//SCL=0;---
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
SD_CLRB_I2C_SCL;//SCL=0;
}
/*********发送NO ACK*********/
void SD_I2CNoAck(void)
{
SD_OUT_I2C_SDA;
SD_SETB_I2C_SDA;//SDA=1;
//CLRB_I2C_SCL;//SCL=0;
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
SD_CLRB_I2C_SCL;//SCL=0;
SD_I2CWait();
SD_CLRB_I2C_SDA;//+++++++++
}
/*********读取ACK信号*********/
uint8 SD_I2CWaitAck(void) //返回为:1=有ACK,0=无ACK
{
uint16 ErrTime = 4000; // 16M晶振
//CLRB_I2C_SDA;//SDA_0; // 关闭上拉
SD_IN_I2C_SDA;
SD_SETB_I2C_SDA;//SCL_1;
SD_I2CWait();
SD_SETB_I2C_SCL;
do{
ErrTime--;
if ( !ErrTime )
{
break;
}
}while( SD_GETB_I2C_SDA );
SD_CLRB_I2C_SCL;//SCL_0;
SD_OUT_I2C_SDA;//SDA_OUT;
return TRUE;
}
/************从SD2200发送一个字节*************/
void SD_I2CSendByte(uint8 demand,uint8 order) //order=1,H_L;order=0,L_H
{
uint8 i=8; //order=1,从HI-->LO发送8bit数据
//order=0,从LO-->HI发送8bit数据
if(order)
{
while(i--)
{
SD_CLRB_I2C_SCL;//SCL=0;
Delay_us(4);//_nop_();
if(demand&0x80)
SD_SETB_I2C_SDA;
else SD_CLRB_I2C_SDA;
//SDA=(bit)(demand&0x80);
demand<<=1;
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
}
SD_CLRB_I2C_SCL;//SCL=0;
}
else
{
while(i--)
{
SD_CLRB_I2C_SCL;//SCL=0;
Delay_us(1);//_nop_();
if(demand&0x01)
SD_SETB_I2C_SDA;
else SD_CLRB_I2C_SDA;
//SDA=(bit)(demand&0x01);
demand>>=1;
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait();
}
SD_CLRB_I2C_SCL;//SCL=0;
}
}
/*********MCU从SD2200读入一字节*********/
uint8 SD_I2CReceiveByte(uint8 order)//order=1,H_L;order=0,L_H
{
uint8 i=8;
uint8 ddata=0;
SD_SETB_I2C_SDA;;//开启上拉
//CLRB_I2C_SDA;
SD_IN_I2C_SDA;
if(order)
{
while(i--)
{
ddata<<=1; //数据从高位开始读取
//CLRB_I2C_SCL;//SCL=0;
//I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait(); //从高位开始 ddata|=SDA;ddata<<=1
if(SD_GETB_I2C_SDA)//SDA)
{
ddata|=0x01;
}
else ddata &= 0xFE;
SD_CLRB_I2C_SCL;// SCLClr();
SD_I2CWait();// SomeNOP();
}
}
else
{
while(i--)
{
ddata>>=1; //数据从低位开始读取
SD_CLRB_I2C_SCL;//SCL=0;
SD_I2CWait();
SD_SETB_I2C_SCL;//SCL=1;
SD_I2CWait(); //从低位开始 ddata|=SDA;ddata>>=1
if(SD_GETB_I2C_SDA)//SDA)
{
ddata|=0x80;
}
}
}
SD_CLRB_I2C_SCL;//SCL=0;
SD_OUT_I2C_SDA;
return ddata;
}
/*写SD2200状态寄存器命令*/
void I2CWriteStatus(void)
{
SD_I2CStart();//if(!I2CStart())return;
SD_I2CSendByte(0x60,1); //发送SD2200状态寄存器_1命令
SD_I2CWaitAck();//if(!I2CWaitAck()){I2CStop();return;}
SD_I2CSendByte(0x03,0); //IC进行复位初始化,24小时制
SD_I2CWaitAck();
SD_I2CStop();
SD_I2CStart();
SD_I2CSendByte(0x62,1); //发送SD2200状态寄存器_2命令
SD_I2CWaitAck();
SD_I2CSendByte(0x00,0); //清TEST位,禁止中断输出
SD_I2CWaitAck();
SD_I2CStop();
}
void I2CWriteTime(void)
{
uint8 date[7];
uint8 n;
date[0]=0x08;//year;2006/03/03/05/13/14/50
date[1]=0x04;//month
date[2]=0x23;//day
date[3]=0x03;//week
date[4]=0x13;//hour
date[5]=0x44;//minute
date[6]=0x00;//second
SD_I2CStart();
SD_I2CSendByte(0x64,1); //发送SD2200写时间寄存器命令,
SD_I2CWaitAck();
for(n=0;n<7;n++)
{
SD_I2CSendByte(date[n],0);
SD_I2CWaitAck();
}
SD_I2CStop();
}
/******读SD2200实时数据寄存器******/
void I2CReadDate(void)
{
uint8 date[7];
uint8 n;
uint8 SDate[3];
extern uint8 Is_Trying;
Clr_Str(Date_Str);
SD_I2CStart();
SD_I2CSendByte(0x65,1);//I2CSendByte(0x65,1);//从年开始读取数据
SD_I2CWaitAck();//if(!I2CWaitAck()){I2CStop();return;}
for(n=0;n<6;n++)
{
date[n]=SD_I2CReceiveByte(0);//I2CReceiveByte(0);
if (n!=6)//if (n!=3) //最后一个数据不应答
{
SD_I2CAck();//I2CAck();
}
}
SD_I2CNoAck();
SD_I2CStop();
Cat_Str(Date_Str,"20");
for (n=0;n<6;n++)
{
if (n==4) date[n]=date[n]&(~BIT(6));
date[n]=(date[n]/16)*10 +date[n]%16;
IntToStr(date[n],SDate,0);
//是否有时钟,无时钟或无电池读出为165-165-165
if (n==0)
if (date[n]>100)
{
Clr_Str(Date_Str);
Cat_Str(Date_Str,"2099-01-01");
break;
}
if (n==0)
if (date[n]<10)
{
Cat_Str(Date_Str,"0");
}
if (n>=0 & n<3)
{
if (n>0 & n<3)
//if (n>0 & n<6)
Cat_Str(Date_Str,"-");
if (n>0)
if (date[n]<10)
Cat_Str(Date_Str,"0");
Cat_Str(Date_Str,SDate);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -