?? i2c.c
字號:
/* =========================================================================
* I2C總線基本操作函數(shù)
* =========================================================================*/
/* 全局符號定義 */
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
#define uchar unsigned char
sbit SCL = 0x96 ;
sbit SDA = 0x97 ;
/****************************************************************************
* 函數(shù)原型: void delay(void);
* 功 能: 本函數(shù)實際上只有一條返回指令, 在具體應(yīng)用中可視具體要求增加延時
* 指令。
****************************************************************************/
void delay( void ) {
;
}
/****************************************************************************
* 函數(shù)原型: void I_start(void);
* 功 能: 提供I2C總線工作時序中的起始位。
****************************************************************************/
void I_start( void ) {
SCL = HIGH ;
delay() ;
SDA = LOW ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函數(shù)原型: void I_stop(void);
* 功 能: 提供I2C總線工作時序中的停止位。
****************************************************************************/
void I_stop( void ) {
SDA = LOW ;
delay() ;
SCL = HIGH ;
delay() ;
SDA = HIGH ;
delay() ;
SCL = LOW ;
delay() ;
}
/****************************************************************************
* 函數(shù)原型: void I_init(void);
* 功 能: I2C總線初始化。在main()函數(shù)中應(yīng)首先調(diào)用本函數(shù), 然后再調(diào)用
* 其它函數(shù)。
****************************************************************************/
void I_init( void ) {
SCL = LOW ;
I_stop() ;
}
/****************************************************************************
* 函數(shù)原型: bit I_clock(void);
* 功 能: 提供I2C總線的時鐘信號, 并返回在時鐘電平為高期間SDA 信號線上狀
* 態(tài)。本函數(shù)可用于數(shù)據(jù)發(fā)送, 也可用于數(shù)據(jù)接收。
****************************************************************************/
bit I_clock( void ) {
bit sample ;
SCL = HIGH ;
delay() ;
sample = SDA ;
SCL = LOW ;
delay() ;
return ( sample ) ;
}
/****************************************************************************
* 函數(shù)原型: bit I_send(uchar I_data);
* 功 能: 向I2C總線發(fā)送8位數(shù)據(jù), 并請求一個應(yīng)答信號ACK。如果收到ACK應(yīng)答
* 則返回1(TRUE), 否則返回0(FALSE)。
****************************************************************************/
bit I_send( uchar I_data ) {
uchar i ;
/* 發(fā)送8位數(shù)據(jù) */
for ( i=0 ; i<8 ; i++ ) {
SDA = (bit)( I_data & 0x80 ) ;
I_data = I_data << 1 ;
I_clock() ;
}
/* 請求應(yīng)答信號ACK */
SDA = HIGH ;
return ( ~I_clock() );
}
/****************************************************************************
* 函數(shù)原型: uchar I_receive(void);
* 功 能: 從I2C總線上接收8位數(shù)據(jù)信號, 并將接收到8位數(shù)據(jù)作為一個字節(jié)
* 返回, 不回送應(yīng)答信號ACK。主函數(shù)在調(diào)用本函數(shù)之前應(yīng)保證SDA信
* 號線處于浮置狀態(tài), 即使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 ) ;
}
/****************************************************************************
* 函數(shù)原型: void I_Ack(void);
* 功 能: 向I2C總線發(fā)送一個應(yīng)答信號ACK, 一般用于連續(xù)數(shù)據(jù)讀取時。
*****************************************************************************/
void I_Ack( void ) {
SDA = LOW ;
I_clock() ;
SDA = HIGH ;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -