📄 i2c.c
字号:
#include <io.h>
#define uchar unsigned char
//extern void delay(unsigned int n);
//extern void delay(uchar t_ms);
///------------------------------------------------------------------------- I2C 底层函数
//-------------------------------------------------------------------------------------
void SomeNOP()
{
uchar i;
for(i=0;i<=100;i++){;}
}
void I2CStart(void)
{
EA=0;
SDA=1; SCL=1; SomeNOP();
SDA=0; SomeNOP(); //START
SCL=0;
}
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP();
SCL=1; SomeNOP(); SDA=1; //STOP
EA=1;
}
bit WaitAck(void)
{
uchar errtime=255; //因故障接收方无ACK,超时值为255。
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA)
{
errtime--;
SomeNOP(); //add
if (!errtime)
{ I2CStop();
return 0; }
}
SCL=0;
return 1;
}
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
void I2CSendByte(uchar ch)
{
uchar i=8;
while (i--)
{
SCL=0;
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}
uchar I2CReceiveByte(void)
{
uchar i=8;
uchar rdata=0;
SDA=1;
while (i--)
{
rdata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
rdata|=SDA;
}
SCL=0;
return rdata;
}
/*
void SetVoltageRef(uchar VoltageData)
{
I2CStart();
I2CSendByte(0x58);
WaitAck();
I2CSendByte(0x00);
WaitAck();
I2CSendByte(VoltageData);
WaitAck();
I2CStop();
}
void SetCurrentRef(uchar CurrentData)
{
I2CStart();
I2CSendByte(0x58);
WaitAck();
I2CSendByte(0x01);
WaitAck();
I2CSendByte(CurrentData);
WaitAck();
I2CStop();
}
*/
void AT24C02_write(uchar excur_addr,uchar wr_data)
{
I2CStart();
I2CSendByte(0xA0);
WaitAck();
I2CSendByte(excur_addr);
WaitAck();
I2CSendByte(wr_data);
WaitAck();
I2CStop();
// delay(20); /////??????
}
uchar AT24C02_read(uchar excur_addr)
{
uchar rd_data;
I2CStart();
I2CSendByte(0xA0);
WaitAck();
I2CSendByte(excur_addr);
WaitAck();
I2CStart();
I2CSendByte(0xA1);
WaitAck();
rd_data=I2CReceiveByte();
SendNotAck();
I2CStop();
//delay(10);
return rd_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -