📄 i2c.c
字号:
/*********************************************/
/*I2c program*/
/*********************************************/
#include "reg52.h"
#include "I2C.h"
sbit SDA=P3^7;
sbit SCL=P3^6;
bit _ack;
/*Wait for some time to get proper I2c timing*/
void I2cWait(void)
{
unsigned char i;
for(i=0;i<1;i++) ;
}
/*I2c start condition*/
void I2cStart(void)
{
SDA=1;
SCL=1;
I2cWait();
SDA=0;
I2cWait();
SCL=0;
}
/*I2c stop condition*/
void I2cStop(void)
{
SDA=0;
I2cWait();
SCL=1;
I2cWait();
SDA=1;
}
//master transfer data to slave
//and return acknowledge bit
void I2cSentByte(uchar bb)
{
uchar i;
for(i=0;i<8;i++)
{
if(bb&0x80)
SDA=1;
else
SDA=0;
bb<<=1;
SCL=1;
I2cWait();
SCL=0;
I2cWait();
}
SDA=1;
I2cWait();
SCL=1;
I2cWait();
_ack=SDA;
SDA=1;
SCL=0;
}
//slave transfer data to master
uchar I2cReceiveByte(void)
{
uchar i,bb=0;
for(i=0;i<8;i++)
{
SCL=1;
SDA=1;
I2cWait();
bb<<=1;
CY=SDA;
if(CY) bb|=0x01;
SCL=0;
I2cWait();
}
SDA=1;
return bb;
}
//Master send acknowledge bit to slave
//acknowledge="0",non-acknowledge="1"
void SendAcknowledge(void)
{
SDA=_ack;
I2cWait();
SCL=1;
I2cWait();
SCL=0;
SDA=1;
}
void I2cByteWrite(uchar sla,uchar addr,uchar bb)
{
I2cStart();
I2cSentByte(sla);
I2cSentByte(addr);
I2cSentByte(bb);
I2cStop();
}
uchar I2cByteRead(uchar sla,uchar addr)
{
uchar bb;
I2cStart();
I2cSentByte(sla);
I2cSentByte(addr);
I2cStart();
I2cSentByte(sla|0x01);
bb=I2cReceiveByte();
_ack=1;
SendAcknowledge();
I2cStop();
return bb;
}
void ClrFm24c16(uchar sla,uchar addr,uchar cnt)
{
uchar i;
i=XX24C|(sla<<1);
I2cStart();
I2cSentByte(i);
I2cSentByte(addr);
for (i=0;i<cnt;i++){
I2cSentByte(0x00);
}
I2cStop();
}
void WriteFm24c16(uchar sla,uchar addr,uchar idata *pnt,uchar cnt)
{
uchar i;
i=XX24C|(sla<<1);
I2cStart();
I2cSentByte(i);
I2cSentByte(addr);
for (i=0;i<cnt;i++){
I2cSentByte(*pnt);
pnt++;
}
I2cStop();
}
void ReadFm24c16(uchar sla,uchar addr,uchar idata *pnt,uchar cnt)
{
uchar i;
i=XX24C|(sla<<1);
I2cStart();
I2cSentByte(i);
I2cSentByte(addr);
I2cStart();
I2cSentByte(i|0x01);
for(i=0;i<cnt;i++){
*pnt=I2cReceiveByte();
pnt++;
_ack=0;
if (i==(cnt-1)) _ack=1;
SendAcknowledge();
}
I2cStop();
}
void Write8576(uchar idata *pnt)
{
uchar i;
I2cStart();
I2cSentByte(PCF8576);
I2cSentByte(0xe0);
I2cSentByte(0xc8);
I2cSentByte(0x00);
for(i=0;i<18;i++) I2cSentByte(*pnt++);
I2cStop();
}
uchar ReadAd7416(uchar slave)
{
uchar temp;
I2cStart();
I2cSentByte(AD7416|slave);
I2cSentByte(0x00);
I2cStart();
I2cSentByte(AD7416|slave|0x01);
temp=I2cReceiveByte();
_ack=0;
SendAcknowledge();
I2cReceiveByte();
_ack=1;
SendAcknowledge();
I2cStop();
return temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -