📄 i2c.c
字号:
/***************************************************
*函数原形:void function I2C_start(void);
*功 能:提供I2C总线工作时的启始位
*
**************************************************/
void function I2C_start(void)
{
SCL=HIGH;
delay_10us();
SDA=LOW;
delay_10us();
SCL=LOW;
delay_10us();
}
/***************************************************
*函数原形:void function I2C_stop(void);
*功 能:提供I2C总线工作时的结束位
*
**************************************************/
void function I2C_stop(void)
{
SDA=LOW;
delay_10us();
SCL=HIGH;
delay_10us();
SDA=HIGH;
delay_10us();
SCL=LOW;
delay_10us();
}
/***************************************************
*函数原形:void function I2C_init(void);
*功 能:I2C总线初始化,在main()函数中应首先调用
* 本函数,然后再调用其它函数。
**************************************************/
//void function I2C_init(void)
//{
// SCL=LOW;
// I2C_stop();
//}
/******************************************************************
*函数原形:bit function I2C_clock(void);
*功 能:提供I2C总线的时钟信号,并返回在时钟电平为高期间
* SDA信号线上状态。本函数可用于数据发送,也可用于数据接收
******************************************************************/
bit function I2C_clock(void)
{
bit sample1;
SCL=HIGH;
_nop_;
_nop_;
_nop_;
// delay_10us();
sample1=SDA;
_nop_;
SCL=LOW;
_nop_;
_nop_;
_nop_;
//0412 delay_10us();
return(sample1);
}
/****************************************************************
*函数原形:bit function I2C_send(byte I_data);
*功 能:向I2C总线发送8位数据,并请求一个应答信号ACK,如果收到
* ACK应答信号则返回1,否则返回FALSE(0)
*****************************************************************/
bit function I2C_send(byte I_data)
{
byte i;
/*发送8位数据*/
for (i=0;i<8;i++)
{
SDA=(bit)(I_data & 0x80);
I_data=I_data<<1;
I2C_clock();
}
/*请求应答信号ACK*/
SDA=HIGH;
return(~I2C_clock());
}
/****************************************************************
*函数原形:byte function I2C_receive(void);
*功 能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个
* 字节返回,不回送应答信号ACK。主函数在调用本函数之前应
* 保证SDA信号线处于浮置状态,即使8051的P1.7脚置1。
*****************************************************************/
byte function I2C_receive(void)
{
byte I_data=0;
byte i;
for(i=0;i<8;i++)
{
I_data*=2;
if (I2C_clock())
I_data++;
// endif
}
return(I_data);
}
/****************************************************************
*函数原形:void function I2C_ACK(void);
*功 能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。
*
*****************************************************************/
void function I2C_ACK(void)
{
SDA=LOW;
I2C_clock();
SDA=HIGH;
}
/*================================================================
=以上给出的是I2C总线基本的操作函数。
================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -