📄 i2c.c
字号:
#include "main.h"
#include "i2c.h"
void i2c_writ2(uchar bat );
uchar i2c_rea2(bit ack) ;
void i2c_start(void);
void delay_5us();
//#define ADDR 0x50
void i2c_start()
{
SCL=1;delay_5us();
SDA=1;delay_5us();
SDA=0;delay_5us();
SCL=0;delay_5us();
}
void i2c_stop()
{
SCL=0;//wu
SDA=0;delay_5us();
SCL=1;delay_5us();
SDA=1;delay_5us();
}
/**--------------------------------------------------------------------------------
调用方式:bit I2CAck(void) ﹫200 /07/0 4
函数说明:私有函数,I2C用,等待从器件接收方的应答
---------------------------------------------------------------------------------*/
/**--------------------------------------------------------------------------------
调用方式:void SendAck(void) ﹫200 /07/0 4
函数说明:私有函数,I2C用,主器件为接收方,从器件为发送方时,非应答信号。
--------------------------------------------------------------------------------*/
//------------------------------------------------
/*
要求温度的数据为*100/25的整数;或为*4的整数 例如10度,输入的数据为40
*/
/*void write_7416T (uchar adr1,uchar adr2,uint dat)//adr1 is 0x02 or 0x00;
{
dat=dat<<6; // when adr2 is 0x02 express TL ,0x03 express TO (over temp)
i2c_start();
i2c_writ2(0x90|adr1);
i2c_writ2(adr2);
i2c_writ2((uchar)(dat>>8) );
i2c_writ2((uchar)dat);
i2c_stop();
delay(5);//20
} */
void write_7416C(uchar adr1) //adr1 is 0x02 or 0x00;
{
i2c_start();
i2c_writ2(0x90|adr1);
i2c_writ2(0x01);
i2c_writ2(0x10); //2 fault OTI level is low ,比较模式在高出高位值后发生低跳变,低于低设定值后恢复高
i2c_stop();
delay(5);
}
uint read_7416(uchar adr1) //adr is 0x02 or 0x00;
{
uchar i;
uint j;
i2c_start();
i2c_writ2(0x90|adr1);
i2c_writ2(0x00);
i2c_stop();
i2c_start();
i2c_writ2(0x91|adr1);
j=i2c_rea2(1);
i=i2c_rea2(1);
i2c_stop();
j=j<<8;
j=j+i;
return j>>6;
}
/*uint read_74161(uchar adr1) //adr is 0x02 or 0x00;
{
uchar i;
uint j;
i2c_start();
i2c_writ2(0x90|adr1);
i2c_writ2(0x02);
i2c_stop();
i2c_start();
i2c_writ2(0x91|adr1);
j=i2c_rea2(1);
i=i2c_rea2(1);
i2c_stop();
j=j<<8;
j=j+i;
return j>>6 ;
}
uint read_74162(uchar adr1) //adr is 0x02 or 0x00;
{
uchar i;
uint j;
i2c_start();
i2c_writ2(0x90|adr1);
i2c_writ2(0x03);
i2c_stop();
i2c_start();
i2c_writ2(0x91|adr1);
j=i2c_rea2(1);
i=i2c_rea2(1);
i2c_stop();
j=j<<8;
j=j+i;
return j>>6;
}*/
/*void write_24c64(unsigned char adr,uchar dat)
{
//unsigned char add1;
//if(adr>0x1fff)
// return ;
//add1=adr>>8;
i2c_start();
i2c_writ2(0xa6);//
i2c_writ2(adr);
//add1=adr&0x00ff;
//i2c_writ2(add1);
i2c_writ2(dat);
i2c_stop();
delay(30);//20
}
uchar read_24c64(unsigned char adr)
{
uchar i;
//if(adr>0x1fff)
//return 0x10;
//add1=adr>>8;
i2c_start();
i2c_writ2(0xa6);
//i2c_writ2(add1);
//add1=adr&0x00ff;
i2c_writ2(adr);
i2c_start();
i2c_writ2(0xa7);
i=i2c_rea2(0);
i2c_stop();
delay(5);
return i;
}*/
void i2c_writ2(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if((dat&0x80)==0x00) SDA=0;
else SDA=1;
SCL=1;delay_5us();SCL=0;
dat=dat<<1;
}
SDA=0;
SCL=1;delay_5us();
SCL=0;delay_5us();
}
uchar i2c_rea2(bit ack)
{
uchar i,j;
j=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
j=j<<1;
if(SDA) j|=0x01;
SCL=0;delay_5us();
}
if(ack) SDA=0;
SCL=1;delay_5us();
SCL=0;delay_5us();
return j;
}
void delay_5us()
{
uchar i;
//for(i=0;i<2;i++){}
for(i=0;i<4;i++){}
}
//#define WCR0 0xa0
//#define WCR1 0xa4
/* ADDR EQU 01010000B
WCR0 EQU 10100000B
WCR1 EQU 10100100B*/
/*************************************************************************
* 函数原型:void START_I2C(void)
* 功 能:启动I2C总线
* 返 回 值:无
* 最后修改日期:2003-11-4
**************************************************************************/
/*void START_I2C()
{
//EA=0;
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0;
}
/*************************************************************************
* 函数原型:void STOP_I2C(void)
* 功 能:停止I2C总线
* 返 回 值:无
* 最后修改日期:2003-11-4
**************************************************************************/
/*void STOP_I2C()
{
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
//EA=1;
}
/*************************************************************************
* 函数原型:void CACK_I2C(void)
* 功 能:I2C总线MCU检查应答
* 返 回 值:1 成功
* 最后修改日期:2003-11-4
**************************************************************************/
/*bit CACK_I2C()
{
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(!SDA)/*有应答*/
/* {
_nop_();
_nop_();
SCL=0;
_nop_();
return(1);
}
_nop_();
_nop_();
SCL=0;
_nop_();
return(0);
}*/
/*************************************************************************
* 函数原型:void MACK_I2C(void)
* 功 能:I2C总线MCU作出应答
* 返 回 值:无
* 最后修改日期:2003-11-4
**************************************************************************/
/*void MACK_I2C()
{
SDA=0;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}*/
/*************************************************************************
* 函数原型:void SendData_I2C(void)
* 功 能:I2C总线MCU检查应答
* 返 回 值:无
* 最后修改日期:2003-11-4
**************************************************************************/
/*void SendData_I2C(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
if(Data & 0x80)
{SDA=1;}
else
{SDA=0;}
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
Data=Data<<1;
}
SDA=1;//很奇怪,应答要加在这里才可以
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -