?? hi2csla_c51.c
字號:
/*****************************************************************
* 從方式的LPC932硬件I2C
* 1 使用I2C總線軟件包時P1.2,P1.3切勿寫為0,并要設(shè)置為開漏輸出。
* 2 總線定義為P1.2=SCL,P1.3=SDA,需外接上拉電阻2-10k。
* 3 相應(yīng)寄存器:
* 地址寄存器 I2ADR 用于存放自身從地址(從方式時才有用)
* 數(shù)據(jù)寄存器 I2DAT 接收/發(fā)送數(shù)據(jù)用
* 控制寄存器 I2CON 用于硬件I2C的設(shè)置、使能、啟動、結(jié)束,
* 應(yīng)答控制,中斷標志等。
* 狀態(tài)寄存器 I2STAT 指示I2C總線的操作狀態(tài)碼,高5位有效,
* 若I2C中斷志置位,可查詢此寄存器判斷
* 總線情況。
* SCL占空比寄存器 I2SCLH、I2SCLL 設(shè)置SCL的頻率發(fā)生。
* 設(shè)置最好與主機的SCL頻率基本一至。
* 使用:使用前要先開中斷:總中斷EA和I2C中斷允許EI2C,其中斷入口地址為33H;
* 在中斷里進行接收或發(fā)送數(shù)據(jù)操作,調(diào)用操作如下:
* 若是從接收,則循環(huán)調(diào)用RcvByte接收字節(jié)數(shù)據(jù),直至總線結(jié)束/重啟;
* 若是從發(fā)送,則循環(huán)調(diào)用SendByte發(fā)送數(shù)據(jù),直至接收到非應(yīng)答信號;
* 為了防止從器件因總線出錯而死機,可用定時器實現(xiàn)超時處理。
*****************************************************************/
#define uchar unsigned char
#define GENERATE_STOP 0x54 /* 置位 STO, 復(fù)位 STA 、 SI */
#define RELEASE_BUS_ACK 0x44 /* 復(fù)位 STO,STA,SI 并置位 AA (ack) */
#define RELEASE_BUS_NOACK 0x40 /* 復(fù)位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA 0x64 /* 起動總線/重新起動總線, 置位 STA */
/* 定義LPC932的I2C相關(guān)寄存器的定義 */
sfr I2ADR = 0xDB;
sfr I2DAT = 0xDA;
sfr I2CON = 0xD8;
sfr I2STAT = 0xD9;
sfr I2SCLH = 0xDD;
sfr I2SCLL = 0xDC;
sbit STA = I2CON^5;
sbit SI = I2CON^3;
/***************************************************************
* 接收字節(jié)函數(shù)
* 功能:讀取總線傳來的字節(jié)數(shù)據(jù)并發(fā)送應(yīng)答位,正常接收返回1。
* 入口參數(shù):c 此時讀入的數(shù)據(jù)變量的地址
* 出口參數(shù):接收到總線結(jié)束信號或重新啟動總線信號時返回0
***************************************************************/
bit RcvByte(uchar *c)
{ I2CON = RELEASE_BUS_ACK; /* 清除標志位 */
while( SI==0 ); /* 放開總線,等待接收 */
if( I2STAT==0xA0 ) /* 接收到停止位或重新啟動位 */
{ I2CON = RELEASE_BUS_ACK; /* 先放開總線,再返回0 */
return(0);
}
*c = I2DAT; /* 取數(shù)據(jù) */
return(1);
}
/***************************************************************
* 發(fā)送數(shù)據(jù)
* 功能:向總線發(fā)送數(shù)據(jù)
* 入口參數(shù):c 所要發(fā)送的數(shù)據(jù)
* 出口參數(shù):當接收到非應(yīng)答位時返回0,否則返回1
***************************************************************/
bit SendByte(uchar c)
{ if( I2STAT==0xC0 ) /* 上次發(fā)送數(shù)據(jù)后,接收到非應(yīng)答位 */
{ I2CON = RELEASE_BUS_ACK;
return(0);
}
I2DAT = c; /* 發(fā)送數(shù)據(jù) */
I2CON = RELEASE_BUS_ACK; /* 釋放總線 */
while( SI==0 ); /* 等待字節(jié)數(shù)據(jù)發(fā)送完成 */
return(1);
}
/****************************************************************
* 設(shè)置總線函數(shù)(設(shè)置為從機)
* 功能:用于設(shè)置I2C控制寄存器,包括總線時鐘選擇及從地址.不接受廣播地址。
* 入口參數(shù):addr 從地址
****************************************************************/
void SetBus(uchar addr)
{ I2ADR = addr&0xfe; /* 設(shè)置從地址不接收廣播地址 */
I2CON = RELEASE_BUS_ACK; /* 啟動硬件I2C */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -