📄 i2c.c
字号:
//
//
//for at24c02
//
#include "reg52.h"
#include "i2c.h"
#include "common.h"
sbit SDA = P3^4;
sbit SCL = P3^2;
static S_BYTE idata I2C_Device_Addr = 0x07;//A0=1,A1=1;A2=1
S_VOID I2C_Start(S_VOID)
{
SCL = 0;
SDA = 1;
SCL = 1;
DelayUs(1);
SDA = 0;
SCL = 0;
}
S_VOID I2C_Stop(S_VOID)
{
SCL = 0;
SDA = 0;
SCL = 1;
DelayUs(1);
SDA = 1;
SCL = 0;
}
S_VOID I2C_MainAck(bit IsNeed)
{
SCL = 0;
SDA = !IsNeed;
SCL = 1;
DelayUs(1);
SCL = 0;
}
S_VOID I2C_SlaveAck(S_VOID)
{
SCL = 0;
SDA = 1;
SCL = 1;
while (SDA);
SCL = 0;
}
S_VOID I2C_SerialIn8Bits(S_BYTE ch)
{
S_BYTE cnt;
for (cnt = 0; cnt < 8; cnt++)
{
SCL = 0;
if ((ch<<cnt)&0x80)
SDA = 1;
else
SDA = 0;
SCL = 1;
DelayUs(1);
SCL = 0;
}
}
S_BYTE I2C_SerialOut8Bits(S_VOID)
{
S_BYTE ch = 0;
S_BYTE cnt;
SCL = 0;
SDA = 1;
for (cnt = 0; cnt < 8; cnt++)
{
SCL = 0;
SCL = 1;
ch <<= 1;
if (SDA)
ch += 1;
else
ch += 0;
SCL = 0;
}
return ch;
}
S_VOID I2C_SetI2CDeviceAddr(S_BYTE I2C_Addr)
{
I2C_Device_Addr = I2C_Addr & 0x0F;
}
S_VOID I2C_WriteChar(S_BYTE addr, S_BYTE dat)
{
I2C_Start();
I2C_SerialIn8Bits(0xA0 | (I2C_Device_Addr << 1));
I2C_SlaveAck();
I2C_SerialIn8Bits(addr);
I2C_SlaveAck();
I2C_SerialIn8Bits(dat);
I2C_SlaveAck();
I2C_Stop();
DelayMs(1);
}
S_BYTE I2C_ReadChar(S_BYTE addr)
{
S_BYTE idata dat;
I2C_Start();
I2C_SerialIn8Bits(0xA0 | (I2C_Device_Addr << 1));
I2C_SlaveAck();
I2C_SerialIn8Bits(addr);
I2C_SlaveAck();
I2C_Start();
I2C_SerialIn8Bits(0xA1 | (I2C_Device_Addr << 1));
I2C_SlaveAck();
dat = I2C_SerialOut8Bits();
I2C_MainAck(0);
I2C_Stop();
DelayMs(1);
return dat;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -