C51單片機模擬I2C總線(xiàn)驅動(dòng)程序設計(1)
模塊名:I2C 總線(xiàn)驅動(dòng) 型號:I2C
功能描述:
此模塊包括發(fā)送數據及接收數據,應答位發(fā)送,并提供了幾個(gè)直接面對器件的操作函數,能
很方便的與用戶(hù)程序進(jìn)行連接并擴展。需要注意的是,函數是采用延時(shí)方法產(chǎn)生 SCL 脈沖,
對高晶振頻率要做一定的修改??!在寫(xiě) E2PROM 的時(shí)候一定要延時(shí)?。?!
說(shuō)明:
1us機器周期,晶振頻率要小于12MHz
返回1:則操作成功,返回0:則操作失敗。
sla為器件從地址,suba為器件子地址。
*******************************************************************************
#i nclude "AT89X52.h"
#i nclude
#define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();} //定義空指令
sbit SDA = P1^3; //模擬 I2C 數據傳輸位
sbit SCL = P1^2; //模擬 I2C 時(shí)鐘控制位
bit bdata I2C_Ack; //應答標志位
/************************************ I2C_Start *******************************
函數名:void I2C_Start()
入口:
出口:
功能描述:?jiǎn)?dòng) I2C 總線(xiàn),即發(fā)送 I2C 初始條件
解釋: 在 I2C 總線(xiàn)協(xié)議中規定的起始位格式是:在 SCL 高電平期間,SDA 發(fā)生從高到低的電平
跳變.它與其它數據格式的區別在于,協(xié)議中規定有效的數據必須在 SCL 的高電平期間保持
不變,只有在 SCL 的低電平期間才能發(fā)生跳變.所以這一有別與其它格式的數據才能做為起
始位.
調用函數:
全局變量:
*******************************************************************************
void I2C_Start()
{
}
/************************************ I2C_Stop ********************************
函數名:void I2C_Stop()
入口:
出口:
功能描述:結束 I2C 總線(xiàn),即發(fā)送 I2C 結束條件
解釋:同起始條件的格式類(lèi)似,結束條件的格式是在 SCL 高電平期間,SDA 由低電平向高電平
跳變.
調用函數:
全局變量:
*******************************************************************************
void I2C_Stop()
{
}
/************************************ I2C_CheckAck ****************************
函數名:bit I2C_CheckAck(void)
入口:
出口:0(無(wú)應答),1(有應答)
功能描述:
檢驗 I2C 總線(xiàn)應答信號,有應答則返回 1,否則返回 0,超時(shí)值取 255.
解釋:I2C 總線(xiàn)協(xié)議中規定傳輸的每個(gè)字節之后必須跟一個(gè)應答位,所以從器件在接收到每
個(gè)字節之后必須反饋一個(gè)應答信號給主控制器,而主控制器就需要檢測從器件回傳的應答信
號,根據其信息做出相應的處理.另外,主從之別是相對的,接收數據的即為從,發(fā)送數據的及
為主.
再看看應答信號的格式:在由發(fā)送器產(chǎn)生的時(shí)鐘響應周期里,發(fā)送器先釋放 SDA(置高),然后
由接受器將 SDA 拉低,并在這個(gè)時(shí)鐘脈沖周期的高電平期間保持穩定的低電平.即表示從器
件做出了應答.
調用函數:void I2C_Stop()
全局變量:
*******************************************************************************
bit I2C_CheckAck(void)
{
}
/************************************ I2C_SendB *******************************
函數名:void I2C_SendB(uchar c)
入口:uchar 型數據
出口:
功能描述:
字節數據傳送函數,將數據 c 發(fā)送出去,可以是地址,也可以是數據,發(fā)完后等待應答,
并對
此狀態(tài)位進(jìn)行操作
注意:在傳送數據時(shí),數據(SDA)的改變只能發(fā)生在SCL的低電平期間,在SCL的高電平期間保
持不變
調用函數:bit I2C_CheckAck()
全局變量:I2C_Ack
*******************************************************************************
void I2C_SendB(uchar c)
{
}
評論