新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C51單片機(jī)模擬I2C總線驅(qū)動(dòng)程序設(shè)計(jì)(2)

C51單片機(jī)模擬I2C總線驅(qū)動(dòng)程序設(shè)計(jì)(2)

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
/************************************ I2C_RcvB ********************************
函數(shù)名:uchar I2C_RcvB()
入口:
出口:uchar 型數(shù)據(jù)
功能描述:
接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),收完后需要調(diào)用應(yīng)答函數(shù)。
調(diào)用函數(shù):
全局變量
*******************************************************************************
uchar I2C_RcvB()
{
uchar retc;
uchar BitCnt; //位
retc = 0;
SDA = 1; //置數(shù)據(jù)總線為輸入方式,作為接收方要釋放 SDA.
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL = 0; //置時(shí)鐘線為低準(zhǔn)備接收數(shù)據(jù)位
SomeNOP(); //時(shí)鐘低電平周期大于 4.7us
SCL = 1; //置時(shí)鐘線為高使數(shù)據(jù)有效
_nop_();
_nop_();
retc = retc<<1;
if(SDA==1)
{
retc = retc + 1;//讀數(shù)據(jù)位,接收的數(shù)據(jù)放入 retc 中
}
_nop_();
_nop_();
}
SCL = 0;
_nop_();
_nop_();
return(retc);
}
/************************************ I2C_Ackn ********************************
函數(shù)名:void I2C_Ackn(bit a)
入口:0 或 1
出口:
功能描述:主控制器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào))
說明:作為接收方的時(shí)候,必須根據(jù)當(dāng)前自己的狀態(tài)向發(fā)送器反饋應(yīng)答信號(hào)
調(diào)用函數(shù):
全局變量:
*******************************************************************************
void I2C_Ackn(bit a)
{
if(a==0) //在此發(fā)送應(yīng)答或非應(yīng)答信號(hào)
{
SDA = 0;
}
else
{
SDA = 1;
}
SomeNOP();
SCL = 1;
SomeNOP(); //時(shí)鐘電平周期大于 4 us
SCL = 0; //清時(shí)鐘線鉗住 I2C 總線以便繼續(xù)接收
_nop_();
_nop_();
}
/******************************** I2C_ISendB **********************************
函數(shù)名:bit I2C_ISendB(uchar sla, uchar suba,uchar c)
入口:從器件地址 sla,子地址 suba, 發(fā)送字節(jié) c
出口:0(操作有誤),1(操作成功)
功能描述:從啟動(dòng)總線到發(fā)送地址、數(shù)據(jù),結(jié)束總線的全過程,
如果返回1:表示操作成功,否則操作有誤。
調(diào)用函數(shù):I2C_Start(),I2C_SendB(uchar c),I2C_Stop()
全局變量:I2C_Ack
*******************************************************************************
bit I2C_ISendB(uchar sla, uchar suba, uchar c)
{
I2C_Start(); //啟動(dòng)總線
I2C_SendB(sla); //發(fā)送器件地址
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(suba); //發(fā)送器件子地址
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(c); //發(fā)送數(shù)據(jù)
if(!I2C_Ack)
{
return(0);
}
I2C_Stop(); //結(jié)束總線
return(1);
}
/********************************** I2C_IRcvB *********************************
函數(shù)名:bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
入口:從器件地址 sla, 子地址 suba, 收到的數(shù)據(jù)在 c
出口:1(操作成功),0(操作有誤)
功能描述:從啟動(dòng)總線到發(fā)送地址、讀數(shù)據(jù),結(jié)束總線的全過程。
調(diào)用函數(shù):
I2CS_tart(),
I2C_SendB(uchar c),
I2C_RcvB(),
I2C_Ackn(bit a),
I2C_Stop()
全局變量:I2C_Ack
*******************************************************************************
bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
{
I2C_Start(); //啟動(dòng)總線
I2C_SendB(sla);
if(!I2C_Ack)
{
return(0);
}
I2C_SendB(suba); //發(fā)送器件子地址
if(!I2C_Ack)
{
return(0);
}
I2C_Start(); //重復(fù)起始條件
I2C_SendB(sla+1); //發(fā)送讀操作的地址
if(!I2C_Ack)
{
return(0);
}
*c = I2C_RcvB(); //讀取數(shù)據(jù)
I2C_Ackn(1); //發(fā)送非應(yīng)答位
I2C_Stop(); //結(jié)束總線
return(1);
}


評(píng)論


技術(shù)專區(qū)

關(guān)閉