亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機IIC通信時序的詳細解釋
[打印本頁]
作者:
xzf586
時間:
2018-8-16 17:09
標題:
單片機IIC通信時序的詳細解釋
/*---------------------------------------------------------------------
IIC.C文件
作者:xzf586 創(chuàng)建日期:2018.8.16
----------------------------------------------------------------------*/
#include <reg52.h>
#include <intrins.h>
#include"IIC.H"
#define NOP4 {_nop_();_nop_();_nop_();_nop_();_nop_();}
/***********************************************************************
IIC起始信號
時 序: 1 SDA SCL高電平期間,持續(xù)時間>4.7us(實際上是總線空閑)
2 SDA下降沿后,持續(xù)時間>4us(線與,總線占用)
************************************************************************/
void I2CStart()
{
I2C_SDA = 1; //首先確保SDA、SCL都是高電平,總線空閑
I2C_SCL = 1;
NOP4
I2C_SDA = 0; //先拉低SDA
NOP4 //起始信號結(jié)束
I2C_SCL = 0; //再拉低SCL,為后續(xù)SDA數(shù)據(jù)變化做準備
}
/***********************************************************************
IIC結(jié)束通信信號
時 序: 1 SCL高電平期間,持續(xù)時間>4.7us
2 SDA上升沿后,持續(xù)時間>4.7us(總線釋放)
************************************************************************/
void I2CStop()
{
I2C_SDA = 0;
I2C_SCL = 1; //先拉高SCL
NOP4
I2C_SDA = 1; //再拉高SDA,釋放總線
NOP4
}
/***********************************************************************
IIC主機向從機寫一個字節(jié)
時 序: 1 SCL=0;上面起始信號已準備好
2 SDA=待傳輸位的值0或1
3 等待一段時間,數(shù)據(jù)穩(wěn)定
4 SCL=1,此時SDA上數(shù)據(jù)不可以變化,因為從機要讀取這個SDA值
5 等待一段時間,從機讀取這個SDA值
6 SCL=0,進行下一次SDA數(shù)據(jù)變化,再傳輸出去
返回值 從機應(yīng)答位的值
************************************************************************/
bit I2CWrite(unsigned char dat)
{
bit ack; //用于暫存應(yīng)答位的值
unsigned char temp; //用于探測字節(jié)內(nèi)某一位值的掩碼變量
for (temp=0x80; temp!=0; temp>>=1) //從高位到低位依次進行
{
if ((temp&dat) == 0) //該位的值輸出到SDA上
I2C_SDA = 0;
else
I2C_SDA = 1;
NOP4
I2C_SCL = 1; //拉高SCL
NOP4
I2C_SCL = 0; //再拉低SCL,完成一個位周期
} //8位數(shù)據(jù)發(fā)送完畢,
I2C_SDA = 1; //8位數(shù)據(jù)發(fā)送完后,主機釋放SDA,以檢測從機應(yīng)答
NOP4
I2C_SCL = 1; //拉高SCL,目的讓主機讀取應(yīng)答值
ack = I2C_SDA; //讀取此時的SDA值,即為從機的應(yīng)答值
NOP4
I2C_SCL = 0; //再拉低SCL完成應(yīng)答位,并保持住總線
return (~ack); //應(yīng)答值取反以符合通常的邏輯:
//0=不存在或忙或?qū)懭胧。?=存在且空閑或?qū)懭氤晒?注意ack取反
}
/***********************************************************************
主機從從機讀取最后一個字節(jié),發(fā)送非應(yīng)答信號
時 序: 1 SDA=1;余下SDA信號由從機控制
2 SCL=1;拉高SCL,此時SDA上已由從機寫上一位0或1,主機開始讀取
3 等待一段時間,讀取完畢
4 SCL=0,拉低SCL,以使從機發(fā)送出下一位到SDA上
************************************************************************/
unsigned char I2CReadNAK()
{
unsigned char temp;
unsigned char dat;
I2C_SDA = 1; //首先確保主機釋放SDA,即將SDA控制權(quán)交由從機
for (temp=0x80; temp!=0; temp>>=1) //從高位到低位依次進行
{
NOP4
I2C_SCL = 1; //拉高SCL
if(I2C_SDA == 0) //讀取SDA的值,此時SDA已由從機寫上一位0或1,
dat &= ~temp; //為0時,dat中對應(yīng)位清零
else
dat |= temp; //為1時,dat中對應(yīng)位置1
NOP4
I2C_SCL = 0; //再拉低SCL,以使從機發(fā)送出下一位
}
I2C_SDA = 1; //從機8位數(shù)據(jù)發(fā)送完后,主機拉高SDA,發(fā)送非應(yīng)答信號,這樣從機將SDA控制權(quán)轉(zhuǎn)交主機
NOP4
I2C_SCL = 1; //拉高SCL,讓從機讀到這個1,知道停止向主機發(fā)送數(shù)據(jù)
NOP4
I2C_SCL = 0; //再拉低SCL完成非應(yīng)答位,并保持住總線,因為停止信號還沒有發(fā)出,所以要保持總線
return dat;
}
/***********************************************************************
主機從從機讀取一個字節(jié)(非最后一個字節(jié)),發(fā)送應(yīng)答信號
時 序: 1 SDA=1;余下SDA信號由從機控制
2 SCL=1;拉高SCL,此時SDA上已由從機寫上一位0或1,主機開始讀取
3 等待一段時間,讀取完畢
4 SCL=0,拉低SCL,以使從機發(fā)送出下一位到SDA上
************************************************************************/
unsigned char I2CReadACK()
{
unsigned char temp;
unsigned char dat;
I2C_SDA = 1; //首先確保主機釋放SDA
for (temp=0x80; temp!=0; temp>>=1) //從高位到低位依次進行
{
NOP4
I2C_SCL = 1; //拉高SCL
if(I2C_SDA == 0) //讀取SDA的值
dat &= ~temp; //為0時,dat中對應(yīng)位清零
else
dat |= temp; //為1時,dat中對應(yīng)位置1
NOP4
I2C_SCL = 0; //再拉低SCL,以使從機發(fā)送出下一位
}
I2C_SDA = 0; //從機8位數(shù)據(jù)發(fā)送完后,主機拉低SDA,發(fā)送應(yīng)答信號,SDA控制權(quán)仍然在從機手里
NOP4
I2C_SCL = 1; //拉高SCL,讓從機讀到這個0,繼續(xù)向主機發(fā)送數(shù)據(jù)
NOP4
I2C_SCL = 0; //再拉低SCL完成應(yīng)答位,并保持住總線,SDA由從機確定
return dat;
}
作者:
lyMarvin
時間:
2018-8-17 06:21
謝謝分享!
后面若是有應(yīng)用示例就更好了
作者:
renzaijiangnan
時間:
2020-11-3 07:33
從編程上看,是宋師傅的忠實粉絲,一起學(xué)了。有應(yīng)用實例嗎
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1