📄 i2c.c
字号:
/* =========================================================================
* I2C总线基本操作函数
* =========================================================================*/
/* 全局符号定义 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define uchar unsigned char
sbit SCL = 0x96 ;
sbit SDA = 0x97 ;
/****************************************************************************
* 函数原型: void delay(void);
* 功 能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时
* 指令。
****************************************************************************/
void delay( void ) {
;
}
/****************************************************************************
* 函数原型: void I_start(void);
* 功 能: 提供I2C总线工作时序中的起始位。
****************************************************************************/
void I_start( void ) {
SCL = HIGH ;
delay() ;
SDA = LOW ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函数原型: void I_stop(void);
* 功 能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void I_stop( void ) {
SDA = LOW ;
delay() ;
SCL = HIGH ;
delay() ;
SDA = HIGH ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函数原型: void I_init(void);
* 功 能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
* 其它函数。
****************************************************************************/
void I_init( void ) {
SCL = LOW ;
I_stop() ;
}
/****************************************************************************
* 函数原型: bit I_clock(void);
* 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
* 态。本函数可用于数据发送, 也可用于数据接收。
****************************************************************************/
bit I_clock( void ) {
bit sample ;
SCL = HIGH ;
delay() ;
sample = SDA ;
SCL = LOW ;
delay() ;
return ( sample ) ;
}
/****************************************************************************
* 函数原型: bit I_send(uchar I_data);
* 功 能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
* 则返回1(TRUE), 否则返回0(FALSE)。
****************************************************************************/
bit I_send( uchar I_data ) {
uchar i ;
/* 发送8位数据 */
for ( i=0 ; i<8 ; i++ ) {
SDA = (bit)( I_data & 0x80 ) ;
I_data = I_data << 1 ;
I_clock() ;
}
/* 请求应答信号ACK */
SDA = HIGH ;
return ( ~I_clock() );
}
/****************************************************************************
* 函数原型: uchar I_receive(void);
* 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
* 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
* 号线处于浮置状态, 即使8051的P1.7脚置1。
****************************************************************************/
uchar I_receive( void ) {
uchar I_data = 0 ;
register uchar i ;
for ( i=0 ; i<8 ; i++ ) {
I_data *= 2 ;
if (I_clock()) I_data++ ;
}
return ( I_data ) ;
}
/****************************************************************************
* 函数原型: void I_Ack(void);
* 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
*****************************************************************************/
void I_Ack( void ) {
SDA = LOW ;
I_clock() ;
SDA = HIGH ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -