📄 i2c.c
字号:
#include "I2C.h"
unsigned char data I2C_Delay_t;
#define I2C_Delay()\
{\
I2C_Delay_t = (I2C_DELAY_VALUE);\
while ( --I2C_Delay_t != 0 );\
}
void I2C_Init()
{
I2C_SCL = 1;
I2C_Delay();
I2C_SDA = 1;
I2C_Delay();
}
void I2C_Start()
{
I2C_SDA = 1;
I2C_Delay();
I2C_SCL = 1;
I2C_Delay();
I2C_SDA = 0;
I2C_Delay();
I2C_SCL = 0;
I2C_Delay();
}
char I2C_Read()
{
char dat;
unsigned char t = 8;
I2C_SDA = 1; //在读取数据之前,要把SDA拉高
do
{
I2C_SCL = 1;
I2C_Delay();
dat <<= 1;
if ( I2C_SDA ) dat |= 0x01;
I2C_SCL = 0;
I2C_Delay();
} while ( --t != 0 );
return dat;
}
void I2C_Write(char dat)
{
unsigned char t = 8;
do
{
I2C_SDA = (bit)(dat & 0x80);
dat <<= 1;
I2C_SCL = 1;
I2C_Delay();
I2C_SCL = 0;
I2C_Delay();
} while ( --t != 0 );
}
bit I2C_GetAck()
{
bit ack;
I2C_SDA = 1;
I2C_Delay();
I2C_SCL = 1;
I2C_Delay();
ack = I2C_SDA;
I2C_SCL = 0;
I2C_Delay();
return ack;
}
void I2C_PutAck(bit ack)
{
I2C_SDA = ack;
I2C_Delay();
I2C_SCL = 1;
I2C_Delay();
I2C_SCL = 0;
I2C_Delay();
}
void I2C_Stop()
{
unsigned int t = I2C_STOP_WAIT_VALUE;
I2C_SDA = 0;
I2C_Delay();
I2C_SCL = 1;
I2C_Delay();
I2C_SDA = 1;
I2C_Delay();
while ( --t != 0 ); //在下一次产生Start之前,要加一定的延时
}
bit I2C_Gets
(
unsigned char SlaveAddr,
unsigned int SubAddr,
unsigned char SubMod,
char *dat,
unsigned int Size
)
{
unsigned char i;
char a[3];
if ( Size == 0 ) return 0;
a[0] = (SlaveAddr << 1);
if ( SubMod > 2 ) SubMod = 2;
if ( SubMod != 0 )
{
if ( SubMod == 1 )
{
a[1] = (char)(SubAddr);
}
else
{
a[1] = (char)(SubAddr >> 8);
a[2] = (char)(SubAddr);
}
SubMod++;
I2C_Start();
for ( i=0; i<SubMod; i++ )
{
I2C_Write(a[i]);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
}
}
I2C_Start();
I2C_Write(a[0]+1);
if ( I2C_GetAck() )
{
I2C_Stop();
return 1;
}
for (;;)
{
*dat++ = I2C_Read();
if ( --Size == 0 )
{
I2C_PutAck(1);
break;
}
I2C_PutAck(0);
}
I2C_Stop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -