?? hi2c_c51.c
字號:
/*******************************************************************
* P89LPC932硬件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ā)生。
*
* 此軟件包是以查詢方式完成各種總線操作的,在使用前應(yīng)對總線進行檢查,并
* 使用看門狗,以防等待總線而造成死機。
* 文件名:HI2C_C51.C
* 更新時間:2002.11.05
*******************************************************************/
/* 定義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;
#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 */
/*******************************************************************
* 申請總線
* 功能:進行I2C總線的初始化--包括時鐘選擇,I2C使能,發(fā)送起始信號等等。
* I2EN為1,設(shè)置為主機;CRSEL位為0,使用內(nèi)部SCL發(fā)生器。
*******************************************************************/
void GetBus()
{ I2SCLH = 15; /* 設(shè)置SCL高電平的PCLK周期數(shù) */
I2SCLL = 15; /* 設(shè)置SCL低電平的PCLK周期數(shù),6MHz時為100Kbit/S */
/* 申請成為主機,起動總線。使用內(nèi)部SCL發(fā)生器,I2EN和AA置位。 */
I2CON = RELEASE_BUS_STA;
while( SI==0 ); /* 等待起始位的發(fā)送 */
}
/*******************************************************************
* 發(fā)送數(shù)據(jù)函數(shù)
* 功能:用于向總線發(fā)送數(shù)據(jù)
* 入口參數(shù):ACC 待發(fā)送的數(shù)據(jù)
*******************************************************************/
void SendByte(uchar c)
{ I2DAT = c;
I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */
while( SI==0 ); /* 等待數(shù)據(jù)的發(fā)送 */
}
/*******************************************************************
* 向無子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)
* 功能:從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程。
* 入口參數(shù):sla 從器件地址
* c 待發(fā)送的數(shù)據(jù)
* 出口參數(shù):返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla, uchar c)
{ GetBus(); /* 啟動總線 */
SendByte(sla); /* 發(fā)送器件地址,并接收應(yīng)答位 */
if( I2STAT!=0X18 ) /* 無從機應(yīng)答則退出操作 */
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(c); /* 發(fā)送數(shù)據(jù) */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = GENERATE_STOP; /* 結(jié)束總線 */
return(1);
}
/*******************************************************************
* 向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)
* 功能:從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程。
* 入口參數(shù);sla 從器件地址
* suba 子地址
* s 發(fā)送內(nèi)容的指針
* no 發(fā)送字節(jié)數(shù)
* 出口參數(shù):返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
{ uchar i;
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發(fā)送器件地址 */
if( I2STAT!=0X18 )
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 發(fā)送器件子地址 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no; i++)
{ SendByte(*s); /* 發(fā)送數(shù)據(jù) */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
s++;
}
I2CON = GENERATE_STOP; /* 結(jié)束總線 */
return(1);
}
/*******************************************************************
* 向無子地址器件讀字節(jié)數(shù)據(jù)函數(shù)
*功能:從啟動總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過程。
*入口參數(shù):sla 從器件地址
* c 讀出的數(shù)據(jù)(地址傳送)
* 出口參數(shù):函數(shù)返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla, uchar *c)
{ GetBus(); /* 啟動總線 */
SendByte(sla+1); /* 發(fā)送器件地址 */
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_NOACK; /* 接收一字節(jié)數(shù)據(jù)即發(fā)送非應(yīng)答位 */
while( SI==0 ); /* 等待接收數(shù)據(jù) */
if( I2STAT!=0X58 )
{ I2CON = GENERATE_STOP;
return(0);
}
*c = I2DAT; /* 讀取數(shù)據(jù) */
I2CON = GENERATE_STOP; /* 結(jié)束總線 */
return(1);
}
/*******************************************************************
* 向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)
*功能:從啟動總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程。
*入口參數(shù):sla 從器件地址
* suba 子地址
* s 讀出的內(nèi)容存儲區(qū)的指針
* no 讀no個字節(jié)。
*出口參數(shù):函數(shù)返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{ uchar i;
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發(fā)送器件地址 */
if( I2STAT!=0X18)
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 發(fā)送器件子地址 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_STA; /* 重新啟動總線 */
while( SI==0 );
SendByte(sla+1);
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no-1; i++)
{ I2CON = RELEASE_BUS_ACK; /* 接收一字節(jié)數(shù)據(jù)并發(fā)送應(yīng)答位 */
while( SI==0 ); /* 等待接收數(shù)據(jù) */
if( I2STAT!=0X50 )
{ I2CON = GENERATE_STOP;
return(0);
}
*s = I2DAT; /* 讀取數(shù)據(jù) */
s++;
}
I2CON = RELEASE_BUS_NOACK; /* 接收最后一字節(jié)數(shù)據(jù)并發(fā)送非應(yīng)答位 */
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; /* 結(jié)束總線 */
return(1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -