?? 668i2c.c
字號:
/*******************************************************************
P89C668單片機(jī)硬件I2C軟件包,668i2c.c(主方式)
668的硬件I2C接口定義在P1.6,P1.7上,分別為P1.6=SCL;P1.7=SDA;(開漏輸出)
相應(yīng)寄存器:地址寄存器 S1ADR 用于存放自身從地址(從方式時才有用)
數(shù)據(jù)寄存器 S1DAT 接收/發(fā)送數(shù)據(jù)用
控制寄存器 S1CON 用于硬件I2C的設(shè)置、使能、啟動、結(jié)束,
應(yīng)答控制,中斷標(biāo)志等。
狀態(tài)寄存器 S1STA 指示I2C總線的操作狀態(tài)碼,高5位有效,
若I2C中斷志置位,可查詢此寄存器判斷
總線情況。
此軟件包是以查詢方式完成各種總線操作的,在使用前應(yīng)對總線進(jìn)行檢查,并
使用看門狗,以防等待總線而造成死機(jī)。
2001-09-21
*******************************************************************/
#include "REG552.h" /*668的硬件I2C定義與552的一樣*/
#define uchar unsigned char
/*******************************************************************
申請總線
功能:進(jìn)行I2C總線的初始化--包括時鐘速率,I2C使能,發(fā)送起始信號等
等。
*******************************************************************/
void GetBus()
{
S1CON=0xc5; /*設(shè)置時鐘為100K(MCU主頻為12M),ENS1和AA置位*/
STA=1; /*申請成為主機(jī),起動總線*/
while(SI==0); /*等待起始位的發(fā)送*/
}
/*******************************************************************
發(fā)送數(shù)據(jù)函數(shù)
功能:用于向總線發(fā)送數(shù)據(jù)
*******************************************************************/
void SendByte(uchar c)
{
S1DAT=c;
S1CON=0XC5; /*清除SI位等等*/
while(SI==0); /*等待數(shù)據(jù)的發(fā)送*/
}
/*******************************************************************
向無子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit ISendByte(uchar sla,ucahr c);
功能: 從啟動總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過程,從器件地址sla,
待發(fā)送的數(shù)據(jù)c,如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
GetBus(); /*啟動總線*/
SendByte(sla); /*發(fā)送器件地址,若無應(yīng)答則返回*/
if(S1STA!=0X18){S1CON=0XD5;return(0);}
SendByte(c); /*發(fā)送數(shù)據(jù)*/
if(S1STA!=0X28){S1CON=0XD5;return(0);}
S1CON=0XD5; /*結(jié)束總線*/
return(1);
}
/*******************************************************************
向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程,從器件
地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。
如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
GetBus(); /*啟動總線*/
SendByte(sla); /*發(fā)送器件地址*/
if(S1STA!=0X18){S1CON=0XD5;return(0);}
SendByte(suba); /*發(fā)送器件子地址*/
if(S1STA!=0X28){S1CON=0XD5;return(0);}
for(i=0;i<no;i++)
{
SendByte(*s); /*發(fā)送數(shù)據(jù)*/
if(S1STA!=0X28){S1CON=0XD5;return(0);}
s++;
}
S1CON=0XD5; /*結(jié)束總線*/
return(1);
}
/*******************************************************************
向無子地址器件讀字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 從啟動總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
GetBus(); /*啟動總線*/
SendByte(sla+1); /*發(fā)送器件地址*/
if(S1STA!=0X40){S1CON=0XD5;return(0);}
S1CON=0XC1; /*接收一字節(jié)數(shù)據(jù)即發(fā)送非應(yīng)答位*/
while(SI==0); /*等待接收數(shù)據(jù)*/
if(S1STA!=0X58){S1CON=0XD5;return(0);}
*c=S1DAT; /*讀取數(shù)據(jù)*/
S1CON=0XD5; /*結(jié)束總線*/
return(1);
}
/*******************************************************************
向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 從啟動總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過程,從器件
地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲區(qū),讀no個字節(jié)。
如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
GetBus(); /*啟動總線*/
SendByte(sla); /*發(fā)送器件地址*/
if(S1STA!=0X18){S1CON=0XD5;return(0);}
SendByte(suba); /*發(fā)送器件子地址*/
if(S1STA!=0X28){S1CON=0XD5;return(0);}
S1CON=0XE5; /*重新啟動總線*/
while(SI==0);
SendByte(sla+1);
if(S1STA!=0X40){S1CON=0XD5;return(0);}
for(i=0;i<no-1;i++)
{
S1CON=0XC5; /*接收一字節(jié)數(shù)據(jù)并發(fā)送應(yīng)答位*/
while(SI==0); /*等待接收數(shù)據(jù)*/
if(S1STA!=0X50){S1CON=0XD5;return(0);}
*s=S1DAT; /*讀取數(shù)據(jù)*/
s++;
}
S1CON=0XC1; /*接收最后一字節(jié)數(shù)據(jù)并發(fā)送非應(yīng)答位*/
while(SI==0);
*s=S1DAT;
S1CON=0XD5; /*結(jié)束總線*/
return(1);
}
/*軟件包大?。?26字節(jié)*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -