?? i2c.c
字號:
#include <io.h>
#define uchar unsigned char
//extern void delay(unsigned int n);
//extern void delay(uchar t_ms);
///------------------------------------------------------------------------- I2C 底層函數(shù)
//-------------------------------------------------------------------------------------
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 + -