?? hi2c_c51.c
字號:
/*******************************************************************
* P89LPC932硬件I2C軟件包(主)
* 1 使用I2C總線軟件包時P1.2,P1.3切勿寫為0,并要設置為開漏輸出。
* 2 總線定義為P1.2=SCL,P1.3=SDA,需外接上拉電阻2-10k。
* 3 相應寄存器:
* 地址寄存器 I2ADR 用于存放自身從地址(從方式時才有用)
* 數據寄存器 I2DAT 接收/發送數據用
* 控制寄存器 I2CON 用于硬件I2C的設置、使能、啟動、結束,
* 應答控制,中斷標志等。
* 狀態寄存器 I2STAT 指示I2C總線的操作狀態碼,高5位有效,
* 若I2C中斷志置位,可查詢此寄存器判斷
* 總線情況。
* SCL占空比寄存器 I2SCLH、I2SCLL 設置SCL的頻率發生。
*
* 此軟件包是以查詢方式完成各種總線操作的,在使用前應對總線進行檢查,并
* 使用看門狗,以防等待總線而造成死機。
* 文件名:HI2C_C51.C
* 更新時間:2002.11.05
*******************************************************************/
/* 定義LPC932的I2C相關寄存器的定義 */
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, 復位 STA 、 SI */
#define RELEASE_BUS_ACK 0x44 /* 復位 STO,STA,SI 并置位 AA (ack) */
#define RELEASE_BUS_NOACK 0x40 /* 復位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA 0x64 /* 起動總線/重新起動總線, 置位 STA */
/*******************************************************************
* 申請總線
* 功能:進行I2C總線的初始化--包括時鐘選擇,I2C使能,發送起始信號等等。
* I2EN為1,設置為主機;CRSEL位為0,使用內部SCL發生器。
*******************************************************************/
void GetBus()
{ I2SCLH = 15; /* 設置SCL高電平的PCLK周期數 */
I2SCLL = 15; /* 設置SCL低電平的PCLK周期數,6MHz時為100Kbit/S */
/* 申請成為主機,起動總線。使用內部SCL發生器,I2EN和AA置位。 */
I2CON = RELEASE_BUS_STA;
while( SI==0 ); /* 等待起始位的發送 */
}
/*******************************************************************
* 發送數據函數
* 功能:用于向總線發送數據
* 入口參數:ACC 待發送的數據
*******************************************************************/
void SendByte(uchar c)
{ I2DAT = c;
I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */
while( SI==0 ); /* 等待數據的發送 */
}
/*******************************************************************
* 向無子地址器件發送字節數據函數
* 功能:從啟動總線到發送地址,數據,結束總線的全過程。
* 入口參數:sla 從器件地址
* c 待發送的數據
* 出口參數:返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla, uchar c)
{ GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址,并接收應答位 */
if( I2STAT!=0X18 ) /* 無從機應答則退出操作 */
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(c); /* 發送數據 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
/*******************************************************************
* 向有子地址器件發送多字節數據函數
* 功能:從啟動總線到發送地址,子地址,數據,結束總線的全過程。
* 入口參數;sla 從器件地址
* suba 子地址
* s 發送內容的指針
* no 發送字節數
* 出口參數:返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
{ uchar i;
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址 */
if( I2STAT!=0X18 )
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 發送器件子地址 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no; i++)
{ SendByte(*s); /* 發送數據 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
s++;
}
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
/*******************************************************************
* 向無子地址器件讀字節數據函數
*功能:從啟動總線到發送地址,讀數據,結束總線的全過程。
*入口參數:sla 從器件地址
* c 讀出的數據(地址傳送)
* 出口參數:函數返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla, uchar *c)
{ GetBus(); /* 啟動總線 */
SendByte(sla+1); /* 發送器件地址 */
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_NOACK; /* 接收一字節數據即發送非應答位 */
while( SI==0 ); /* 等待接收數據 */
if( I2STAT!=0X58 )
{ I2CON = GENERATE_STOP;
return(0);
}
*c = I2DAT; /* 讀取數據 */
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
/*******************************************************************
* 向有子地址器件讀取多字節數據函數
*功能:從啟動總線到發送地址,子地址,讀數據,結束總線的全過程。
*入口參數:sla 從器件地址
* suba 子地址
* s 讀出的內容存儲區的指針
* no 讀no個字節。
*出口參數:函數返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{ uchar i;
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址 */
if( I2STAT!=0X18)
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 發送器件子地址 */
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; /* 接收一字節數據并發送應答位 */
while( SI==0 ); /* 等待接收數據 */
if( I2STAT!=0X50 )
{ I2CON = GENERATE_STOP;
return(0);
}
*s = I2DAT; /* 讀取數據 */
s++;
}
I2CON = RELEASE_BUS_NOACK; /* 接收最后一字節數據并發送非應答位 */
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -