單片機(jī)小白學(xué)習(xí)之路(二十八)---EEPROM-IIC總線理解(三)

目標(biāo):EEPROM-IIC總線理解(三)

代碼編寫(一):

//延時函數(shù),延時10us
void I2CDelay()   //誤差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}

//起始信號:SCL為高電平時SDA有個從高到底的跳變動作,之后才能進(jìn)行數(shù)據(jù)傳輸
void I2CStart()  //產(chǎn)生總線起始信號
{
    I2C_SDA = 1; //首先確保SDA腹忽、SCL都是高電平
    I2C_SCL = 1;
    I2CDelay();
    I2C_SDA = 0; //先拉低SDA
    I2CDelay();
    I2C_SCL = 0; //再拉低SCL
}

//終止信號:SCL為高電平時SDA有個從低到高的跳變動作猖败,之后停止數(shù)據(jù)傳輸
void I2CStop()   //產(chǎn)生總線停止信號
{
    I2C_SCL = 0; //首先確保SDA、SCL都是低電平
    I2C_SDA = 0;
    I2CDelay();
    I2C_SCL = 1; //先拉高SCL
    I2CDelay();
    I2C_SDA = 1; //再拉高SDA
    I2CDelay();
}
//注意:在SCL是高電平時不要亂改變SDA的狀態(tài)防止是停止信號使運(yùn)行失敗

//數(shù)據(jù)發(fā)送(寫):只有在SCL是高電平時SDA上的數(shù)據(jù)是有效的烹俗。編寫單片機(jī)向總線發(fā)送數(shù)據(jù)時爆侣,可以在SCL是低電平時把數(shù)據(jù)傳輸?shù)絊DA中(SCL在低電平時SDA才能改變數(shù)據(jù)),
//等一個字節(jié)傳輸完后幢妄,拉高SCL電平延時一段時間后再拉低SCL電平(在延時時間內(nèi)即SCL是高電平這段時間內(nèi)SDA不能發(fā)生變化)來使SDA中的而數(shù)據(jù)發(fā)送到從機(jī)
unsigned char I2cSendByte(unsigned char dat)
{
    unsigned char a=0;b=0; //最大255兔仰,一個機(jī)器周期為1us,最大延時255us蕉鸳。
    for(a=0;a<8;a++){
        SDA = dat>>7; //起始信號后SCL=0,所以可以直接改變SDA,因?yàn)閿?shù)據(jù)是先按高字節(jié)發(fā)送的所以向右移7位把最到位高位放到最低位的地方乎赴,此時數(shù)據(jù)雖然給力SDA但并每沒有發(fā)送到從機(jī)
        dat = dat<<1; //把次高位變?yōu)樽罡呶?        I2CDelay();   //上面幾行是數(shù)據(jù)變化的階段

        SCL=1;        //發(fā)送數(shù)據(jù)時SCL保持高電平,此時數(shù)據(jù)穩(wěn)定
        I2CDelay();
        SCL=0;         //再拉低SCL,完成一個位周期榕吼,scl一個位周期然后數(shù)據(jù)發(fā)送出去了饿序,準(zhǔn)確的說是在SCL是高電平的這段時間里發(fā)送出去了
        I2CDelay();//此上到SCL=1;是數(shù)據(jù)發(fā)送的條件
    
}
    SDA=1;//8位數(shù)據(jù)發(fā)送完后友题,主機(jī)釋放SDA嗤堰,以檢測從機(jī)應(yīng)答
    I2CDelay();

    SCL=1;//拉高SCL,來讀取SDA的狀態(tài)
    while(SDA) //等待應(yīng)答度宦,也就是等待從設(shè)備把SDA拉低
    {
        b++;
        if(b>200){  //如果超過2000us沒有應(yīng)答發(fā)送失敗踢匣,或者為非應(yīng)答,表示接收結(jié)束
            SCL=0;
            I2CDelay();
            return 0;   //未響應(yīng)
        }
    }
    SCL=0;    //時鐘線拉低
    I2CDelay();
    return 1;  //響應(yīng)了戈抄,說明b++還沒累加到200
}

FC總線每接收完一個字節(jié)(8個位)后离唬,在第9個時鐘信號時,會在SDA上回應(yīng)一個低電平的ACK應(yīng)答信號划鸽,以此表明當(dāng)前受控的器件已接收完一個字節(jié)输莺,可以開始下一個字節(jié)的傳送了。

編程時可以在傳送完一個字節(jié)后裸诽,把連接SDA的I/O口線設(shè)置回讀數(shù)據(jù)狀態(tài)嫂用,如使用51系列的單片機(jī)時就要把I/O口置高電平,然后在SCL.腳設(shè)置一個脈沖丈冬,在SCL為高電平時讀取SDA嘱函,如不為低電平就說明器件狀態(tài)不空閑或出錯。需要注意埂蕊,因?yàn)镾DA是雙向的I/O往弓,無論是接收還是器件接收,每個字節(jié)完成后蓄氧,接收方都可以發(fā)送一個ACK回應(yīng)給發(fā)送方函似。


//數(shù)據(jù)讀取:
unsigned char I2cReadByte()
{
    unsigned char a=0,dat=0; //dat用于接受單片機(jī)接受到的數(shù)據(jù)
    SDA=1;   //起始和發(fā)送一個字節(jié)之后SCL都是0
    I2CDelay();
    for(a=0;a<8;a++){
        SCL=1;  //只有在SCL電平是高電平時SDA數(shù)據(jù)才有效喉童,所以讀的時候先把SCL拉高再去讀SDA中的數(shù)據(jù)
        I2CDelay();
        dat<<=1;
        dat|=SDA; //dat來接受SDA中的數(shù)據(jù)
        I2CDelay();
        SCL=0; //拉低SCL
        I2CDelay(); 
    }
    return dat; //返回接收到的數(shù)據(jù)
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撇寞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堂氯,更是在濱河造成了極大的恐慌重抖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祖灰,死亡現(xiàn)場離奇詭異钟沛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)局扶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門恨统,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叁扫,“玉大人,你說我怎么就攤上這事畜埋∧澹” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵悠鞍,是天一觀的道長对室。 經(jīng)常有香客問我,道長咖祭,這世上最難降的妖魔是什么掩宜? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮么翰,結(jié)果婚禮上牺汤,老公的妹妹穿的比我還像新娘。我一直安慰自己浩嫌,他們只是感情好檐迟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著码耐,像睡著了一般追迟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骚腥,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天怔匣,我揣著相機(jī)與錄音,去河邊找鬼桦沉。 笑死,一個胖子當(dāng)著我的面吹牛金闽,可吹牛的內(nèi)容都是我干的纯露。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼代芜,長吁一口氣:“原來是場噩夢啊……” “哼埠褪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挤庇,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤钞速,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嫡秕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渴语,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年昆咽,在試婚紗的時候發(fā)現(xiàn)自己被綠了驾凶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牙甫。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖调违,靈堂內(nèi)的尸體忽然破棺而出窟哺,到底是詐尸還是另有隱情,我是刑警寧澤技肩,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布且轨,位于F島的核電站,受9級特大地震影響虚婿,放射性物質(zhì)發(fā)生泄漏旋奢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一雳锋、第九天 我趴在偏房一處隱蔽的房頂上張望黄绩。 院中可真熱鬧,春花似錦玷过、人聲如沸爽丹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粤蝎。三九已至,卻和暖如春袋马,著一層夾襖步出監(jiān)牢的瞬間初澎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工虑凛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碑宴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓桑谍,卻偏偏與公主長得像延柠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锣披,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容