久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > C51單片機模擬I2C總線驅動程序設計(2)

C51單片機模擬I2C總線驅動程序設計(2)

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


評論


技術專區

關閉