📄 i2c.c
字号:
#include <reg52.h>
#include <intrins.h>
#include "i2c.h"
bit SCL,SDA ; //用于切换两个I2C存储器
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE 1
/*********************************
* 功 能:
* 播入5个NOP指令,用于延时
**********************************/
void delay_5us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/**********************************
* 功 能:
* 提供I2C总线工作时序中的起始位
* SCL 为高时 SDA 由高变低时为启动信号
**********************************/
void i_start()
{
SCL = HIGH;
SDA = HIGH;
delay_5us();
SDA = LOW ;
delay_5us();
SCL = LOW ;
delay_5us();
}
/**********************************
* 功 能:
* 提供I2C总线工作时序中的停止位
* SCL 为高时 SDA 由低变高停止信号
**********************************/
void i_stop()
{
SCL = HIGH;
SDA = LOW;
delay_5us();
SDA = HIGH;
delay_5us();
SCL = LOW;
delay_5us();
}
/*************************************
* 功 能:
* 提供I2C总线初始化
***************************************/
void i_init()
{
SCL = LOW;
i_stop();
}
/***************************************
* 功 能:
* 提供I2C总线的时钟信号,并返回在时钟
* 电平为高期间SDA信号线上状态。
* 本函数可用于数据发送,也可用于数据接收
*****************************************/
bit i_clock()
{
SCL = HIGH;
delay_5us();
if(SDA)
{
SCL = LOW;
delay_5us();
return(1);
}
SCL = LOW;
delay_5us();
return (0);
}
/**********************************
* 功 能:
* 向I2C总线发送8位数据,并请求一个应答信号ACK,
* 如果接到ACK应答则返回TURE,否则返回FALSE
**********************************/
bit i_send( uchar i_data )
{
uchar i;
for( i = 0; i<8; i++ )
{
SDA = (bit)(i_data&0x80);
i_data <<= 1 ;
i_clock();
}
SDA = HIGH;
return ( ~i_clock() );
}
/**********************************
* 功 能:
* 从I2C总线接收8位数据,并将接收到的数据做为1B返回
* 不回送应答信号ACK。主函数在调用本函数前应保证SDA
* 信号线处于浮置状态,高电平
**********************************/
uchar i_receive(void)
{
uchar i,i_data = 0;
for( i = 0; i<8; i++ )
{
i_data <<=1;
if( i_clock() )
{
i_data++;
}
}
return ( i_data );
}
/**********************************
* 功 能:
* 向I2C总线发送一个应答信号ACK,
* 一般用于连续读取时
**********************************/
void i_ack()
{
SDA = LOW;
i_clock();
SDA = HIGH;
}
/*****************************************
*功能:向24C04写入器件地址和一个指定的字节
******************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -