📄 i2c.h
字号:
#define DLY1us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
#define BIT(x) (1 << (x))
#define SETBIT(x, y) (x |= y)
#define CLEARBIT(x, y) (x &= ~y)
#define CHECKBIT(x, y) (x & y)
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01
#define SDA BIT1
#define SCL BIT0
#define I2C_PORT PORTD
#define I2C_DIR DDRD
#define I2C_IN PIND
void Init_I2C(void);
void I2C_Start (void);
void I2C_Stop (void);
void I2C_Clock (void);
unsigned char Test_Ack(void);
void Send_Ack(void);
void Send_NoAck(void);
void Write_I2C_Control (unsigned char Code,unsigned char IsRead);
void Write_I2C_Byte(unsigned char c);
unsigned char Read_I2C_Byte(void);
void Init_I2C(void)
{
SETBIT(I2C_DIR,SCL);
SETBIT(I2C_DIR,SDA );
SETBIT(I2C_PORT,SCL);
SETBIT(I2C_PORT,SDA );
DLY1us();
}
void I2C_Start (void)
{
SETBIT(I2C_PORT,SCL);
SETBIT(I2C_PORT,SDA);
DLY1us();
SETBIT(I2C_DIR,SDA);
CLEARBIT(I2C_PORT,SDA);
}
void I2C_Stop (void)
{
SETBIT(I2C_DIR,SDA);
CLEARBIT(I2C_PORT,SDA);
CLEARBIT(I2C_PORT,SCL);
DLY1us();
SETBIT(I2C_PORT,SCL);
SETBIT(I2C_PORT,SDA);
}
void I2C_Clock (void)
{
SETBIT(I2C_PORT,SCL);
DLY1us();
CLEARBIT(I2C_PORT,SCL);
}
void Send_Ack(void)
{
SETBIT(I2C_DIR,SDA);
CLEARBIT(I2C_PORT,SDA);
DLY1us();
SETBIT(I2C_PORT,SCL);
DLY1us();
CLEARBIT(I2C_PORT,SCL);
}
void Send_NoAck(void)
{
SETBIT(I2C_DIR,SDA);
SETBIT(I2C_PORT,SDA);
DLY1us();
SETBIT(I2C_PORT,SCL);
DLY1us();
CLEARBIT(I2C_PORT,SCL);
}
void Write_I2C_Byte(unsigned char c)
{
unsigned char i;
SETBIT(I2C_DIR,SDA);
CLEARBIT(I2C_PORT,SCL);
DLY1us();
for (i = 0; i < 8; i++)
{
if((c & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
SETBIT(I2C_PORT,SCL);
c = c << 1;
DLY1us();
CLEARBIT(I2C_PORT,SCL);
}
while(Test_Ack()) WDR();
}
unsigned char Read_I2C_Byte(void)
{
unsigned char i,buff = 0;
for (i = 0; i < 8; i++)
{
buff = buff << 1;
CLEARBIT(I2C_DIR,SDA);
SETBIT(I2C_PORT,SCL);
if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01;
DLY1us();
CLEARBIT(I2C_PORT,SCL);
}
I2C_Clock();
return buff;
}
unsigned char Test_Ack(void)
{
unsigned char Ackn = 0;
CLEARBIT(I2C_PORT,SCL);
CLEARBIT(I2C_DIR,SDA);
DLY1us();
SETBIT(I2C_PORT,SCL);
if ( CHECKBIT( I2C_IN,SDA ) ) Ackn = 1;
DLY1us();
CLEARBIT(I2C_PORT,SCL);
return Ackn;
}
void Write_I2C_Control(unsigned char Code,unsigned char IsRead)
{
CLEARBIT(I2C_PORT,SCL);
if( (Code & 0x80) == 0x80) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x40) == 0x40) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x20) == 0x20) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x10) == 0x10) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x08) == 0x08) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x04) == 0x04) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if( (Code & 0x02) == 0x02) SETBIT(I2C_PORT, SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
if(IsRead) SETBIT(I2C_PORT,SDA);
else CLEARBIT(I2C_PORT,SDA);
I2C_Clock();
while(Test_Ack()) WDR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -