娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

EEPROM可以隨機訪問和修改其中的任何一個字節,可以往每個bit中寫入0或者1,掉電后數據不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路復雜/成本也高。因此目前的EEPROM都是幾十千字節到幾百千字節的,絕少有超過512K的,常用來保存用戶數據,運行過程中可以改變。


下面在MSP430平臺下以AT24C02為例說明該類可擦除ROM的使用。AT24C02的存儲容量為2K bits,內容分成32頁,每頁8 bytes,共256 bytes。


AT24C02對外以I2C總線形式傳輸數據,外觀如下圖所示:

430平臺下實現AT24C02的讀寫操作

A0、A1和A2三個引腳作尋址用;SDA和SCL即I2C總線的數據與時鐘引腳;WP作寫保護用,即WP在保持高電平時,MCU對AT24C02 的讀寫操作無效;VCC和GND分別接電源和接地。


MCU在掛載多片AT24C02時,其器件地址由8位構成,除A0、A1和A2三位外,其他位都被鎖定為如下所示:

說明: C:Users38AppDataLocalTemp1509088227(1).png

最低位為R/W,進行讀操作時,該位 = 1,寫操作時,該位 = 0。地址寫入正確時,AT24C02將會應答以”0”。


AT24C02的讀寫遵循I2C總線的相關規范,所以有傳輸的開始條件和停止條件。每一次正常的讀寫均以開始條件開始,停止條件結束,這兩者的時序如下圖所示:

說明: C:Users38AppDataLocalTemp1509087542(1).png

其軟件模擬的實現為:


void start(void)

{

      SCL_H;

      SDA_H;

      _NOP();

      SDA_L;

      _NOP();

      SCL_L;

      _NOP();

}

void stop(void)

{

      SDA_L;

      _NOP();

      SCL_H;

      _NOP();

      SDA_H;

      _NOP();   

}





SCL_H、SDA_H、SDA_L和SCL_L均為宏定義,分別表示MCU向AT24C02相應引腳輸出高電平和低電平。


AT24C02的寫操作分兩種模式,分別為字節寫入和頁寫入兩種。


1、字節寫入


該寫操作需要以MCU寫入開始條件開始,繼以器件地址,收到AT24C02的應答后繼續寫入要進行寫操作的字地址(即要將數據寫入該AT24C02的什么位置),收到應答后才正式寫入一個字節的數據,收到應答后寫入停止條件,一個完整的字節寫入才算完成。

說明: C:Users38AppDataLocalTemp1509089110(1).png

其軟件模擬的實現為:


uchar Write_1Byte(uchar wdata,uchar dataaddress)

{

     start();

     write1byte(deviceaddress);

     if(check())

        write1byte(dataaddress);

     else

        return 0;

     if(check())

        write1byte(wdata);

     else

        return 0;

     if(check())         stop();

     else            return 0;

  delay_10ms();       //等待EEPROM完成內部寫入

     return 1;

}



delay_10ms()是因為AT24C02的每兩次寫操作之間存在一個寫入時間周期tWR,其最大值為5 ms。check()檢查AT24C02的應答操作,收到AT24C02回復的0,則應答正確,其軟件模擬實現為:


uchar check(void)

{

      uchar slaveack;

      SDA_H;

      _NOP(); _NOP();

      SCL_H;

      _NOP(); _NOP();

   SDA_in;

   _NOP(); _NOP();

      slaveack = SDA_val;   //讀入SDA數值

      SCL_L;

      _NOP();

    SDA_out;

    if(slaveack)    return FALSE;

    else          return TRUE;

}



SDA_in和SDA_out分別表示MCU(MSP430)連接AT24C02的I/O引腳方向改為輸入或輸出,此處SDA_in的作用是為MCU接收AT24C02的應答信號做準備,接收完成后改回SDA_out。SDA_val = P2IN&BIT5,P2.5連接AT24C02的SDA引腳,接收應答信號。


write1byte()向I2C總線寫一個字節的數據,其軟件模擬實現為:


void write1byte(uchar wdata)

{

    uchar i;

    for(i = 8;i > 0;i--)

    {

           if(wdata & 0x80)     write1();

           else                         write0();

           wdata <<= 1;

    }                  

    SDA_H;

    _NOP();  

}



write1()向I2C總線寫一位“1”的數據,其軟件模擬實現為:


void write1(void)

{

      SDA_H;

      _NOP();

      SCL_H;

      _NOP();

      SCL_L;                        

      _NOP();

}



write0()向I2C總線寫一位“0”的數據,其軟件模擬實現為:


void write0(void)

{

      SDA_L;

      _NOP();

      SCL_H;

      _NOP();              

      SCL_L;                        

      _NOP();

}



2、頁寫入


AT24C02可以實現8位的頁寫入操作。頁寫入的形式大體和字節寫入類似,只是在MCU寫入第一個字節的數據后將會繼續寫入第二個數據,而不會像字節寫入一樣寫入停止條件。如果寫入AT24C02的數據超過8位,超過的數據將會覆蓋已被寫入的部分。

說明: C:Users38AppDataLocalTemp1509090891(1).png

其軟件模擬的實現為:


uchar Write_NByte(uchar * outbuf,uchar n,uint dataaddress)

{

     uchar  flag,dataaddressl,dataaddressh;

        dataaddressl = dataaddress;

        dataaddressh = dataaddress>>8;

   

     start();

     write1byte(deviceaddress);                  //寫入器件地址

     if(check() == 1)

        write1byte(dataaddressh);                //寫入數據字地址

     else

        return 0;

   if(check())

        write1byte(dataaddressl);

   else

        return 0;

     if(check())

        flag=writeNbyte(outbuf,n);

     else

       return 0;

       delay_10ms();       //等待EEPROM完成內部寫入

       

     if(flag)   

       return 1;

     else       

       return 0;

}



writeNbyte()向I2C總線寫N個字節(對于AT24C02,N = 8)的數據,其軟件模擬實現為:


uchar writeNbyte(uchar * outbuffer,uchar n)

{

     uchar i;

     for(i = 0;i < n;i++)

     {

            write1byte(* outbuffer);

            if(check())     

            {

                   outbuffer++;              

            }

            else

            {

                   stop();

                   return FALSE;

            }

     }

     stop();

     return TRUE;                    

}



AT24C02的讀操作分三種模式,分別為當前地址讀取、隨機讀取和順序讀取。


1、當前地址讀取


上一次讀寫操作完成后,數據地址計數器加1,并停留在當前位置。這一位置只要不掉電就會一直有效。當R/W = 1時,就可以將當前地址位置的數據讀出。

說明: C:Users38AppDataLocalTemp1509092086(1).png

其軟件模擬的實現為:


uchar Read_1Byte_currentaddress(void)

{

     uchar temp;

     start();

     write1byte((deviceaddress|0x01));

     if(check())    

        temp = read1byte();

     else

        return 0;

     mnack();

     stop();

     return temp;

}

uchar Read_NByte_currentaddress(uchar * readbuf,uchar n)

{  

    start();

     write1byte((deviceaddress|0x01));

     if(check())

        readNbyte(readbuf,n);

     else

        return 0;

   

     return  1;

}



read1byte()從I2C總線讀取一個字節,其軟件模擬的實現為:


uchar read1byte(void)

{

     uchar  rdata = 0x00,i;

   uchar flag;

     for(i = 0;i < 8;i++)

     {

            SDA_H;

            _NOP();

            SCL_H;

        SDA_in;

            _NOP();

            flag = SDA_val;

            rdata <<= 1;

            if(flag)   rdata |= 0x01;

        SDA_out;

            SCL_L;

            _NOP();

     }

     return rdata;

}



readNbyte()從I2C總線讀取一個字節,其軟件模擬的實現為:


void readNbyte(uchar * inbuffer,uchar n)

{

     uchar i;

   

     for(i = 0;i < n;i++)

     {

            inbuffer[i] = read1byte();

            if(i < (n-1))    mack();

            else            mnack();

     }

      

     stop();

}



mack()完成I2C的MCU應答操作,其軟件模擬的實現為:


void mack(void)

{

     SDA_L;

     _NOP(); _NOP();

     SCL_H;

     _NOP();

     SCL_L;

     _NOP();_NOP();

     SDA_H;    

     _NOP();

 

}



mnack()完成I2C的MCU無應答操作,其軟件模擬的實現為:


void mnack(void)

{

     SDA_H;

     _NOP(); _NOP();

     SCL_H;

     _NOP();

     SCL_L;

     _NOP(); _NOP();

     SDA_L;  

     _NOP();      

}



2、隨機讀取


從AT24C02的指定地址讀取1個字節的數據。隨機讀取的操作先發送一個寫操作來騙過AT24C02器件,使其內部的數據地址值修改,但是發送完畢數據地址后并不發送數據,而是發送一個開始信號,此時AT24C02中的數據地址值已經被修改了,然后通過“當前地址讀取”去讀取此地址上的數據。如下圖所示:

說明: C:Users38AppDataLocalTemp1509093395(1).png

其軟件模擬的實現為:


uchar Read_1Byte_Randomaddress(unsigned int dataaddress)

{

     uchar temp,dataaddressh,dataaddressl;

        dataaddressl = dataaddress;

        dataaddressh = dataaddress>>8;

   

     start();

     write1byte(deviceaddress);

     if(check())    

        write1byte(dataaddressh);

     else

        return 0;

        if(check())      

        write1byte(dataaddressl);

     else

        return 0;

     if(check())

     {

            start();

            write1byte((deviceaddress|0x01));

     }

     else   

        return 0;

     if(check())    

[1] [2]
關鍵字:MSP430平臺  AT24C02  讀寫操作 引用地址:MSP430平臺下實現AT24C02的讀寫操作

上一篇:MSP430F249EEprom讀寫
下一篇:調試MFRC522時遇到的問題記錄

推薦閱讀

集微網消息(文/羅明)大家都知道周鴻祎跟雷軍是一對老冤家,雖然同為湖北老鄉,但是沒有“老鄉見老鄉,相見淚汪汪”的感慨,而是劍拔弩張。在PC互聯網時代,360戰金山;移動互聯網時代,360戰小米;隨著360借殼江南嘉捷上市成功,周鴻祎可以無所顧忌地與雷軍再戰了。圖片來源:新浪微博首先出場的是360的周鴻祎。2月3日,周鴻祎發微博稱自己獲得了中國計算...
  1月22日上午,京東集團在達沃斯現場宣布,京東物流成功實現在印尼首次飛行,值得注意的是,這是中國物流無人機在海外的首次成功飛行。 ?   據悉,今年達沃斯主題是“全球化4.0,打造第四次工業革命時代的全球架構”。而此次京東無人機首飛是基于世界經濟論壇“第四次工業革命中心”、印尼政府、京東集團的三方合作。   無人機配送有著廣闊的...
單片機通過 PCF8574T 模塊驅動 1602/2004 LCD,有需要的朋友看看。//-------------------------------------------------------------------------------------------------------------------------------------------------------#include <reg52.h>#include "intrins.h"#define uchar unsigned char#define uint unsigned int //#define ...
蘋果公司最近和韓國政府達成了一項和解協議,以解除后者對前者濫用市場主導地位的指控。 蘋果公司需要在韓國投入 1000 億韓元(約 8960 萬美元),以支持小型企業、教育和消費者市場。1000 億韓元投入中,400 億韓元將用于建設本地小型企業的研發中心,250 億韓元用于 iPhone 維修的 10% 折扣,250 億韓元用于 ICT 開發人員的教育中心,最后...

史海拾趣

問答坊 | AI 解惑

msp430與ARM7比較

mcu選型指南 方向比努力更重要…

查看全部問答∨

Pmos管電流流向的問題

在附件中Q1使用P溝道的MOS管,主要是為了防止電池反接。 利用mos管的寄生二極管,造成VGS大于柵源閾值而導通。 電流流向是由MOS管的D流向S,對于PMOS管一般的電流都是從S流向D, 對于襯底電平和源極連一起的PMOS管來說,一般不建議這么用吧。 對 ...…

查看全部問答∨

一個小問題困惑了我,求高手指點(反映打不開電路圖,再發一次)

大家好 我是想從手機的耳機孔取信號,來推動一個單穩態電路  (看不到電路圖的話,附件中也有) 從左往右把門電路分別稱為門1、門2、門3、門4. 門3、門4.組成的單穩態電路,很成功 ,用手指碰門2的輸入端可使單穩態翻轉。  門1組成 ...…

查看全部問答∨

鍵盤防抖問題

8個獨立中斷按鍵。 在中斷后,先進行延時防抖,然后進行檢查哪個按鍵被按下。當按鍵檢查完后,判斷按鍵是否釋放,若釋放,則返回。程序如下所示。 但是運行的時候,發現有時候按鍵后,按鍵次數加2 ,也就是說進入中斷兩次。難道判斷按鍵釋放的程 ...…

查看全部問答∨

高薪聘Windows Mobile 底層驅動開發工程師(深圳南山)

高薪聘Windows   Mobile  底層驅動開發工程師 公司網址:www.bitland.com.cn ,偶QQ549503575 ;E-mail:yangsq@bitland.com.cn   有興趣的可以加我細聊           待 ...…

查看全部問答∨

VHDL的一個小小問題

--有如下語句: ... ... GENERIC(CONSTANT BUS_WIDTH: INTEGER := 15);        --總線寬度定義 ... ... po1: INOUT         STD_LOGIC_VECTOR(BUS_WIDTH DOWNTO 0); ... ... po1 <= "1111111111 ...…

查看全部問答∨

請問:如何在用C語言寫的程序中加入CPL和EFLAGS這兩個關鍵字

編譯的時候總是說CPL和EFLAGS是undeclared identifier.是不是應該Link什么庫? 謝謝!…

查看全部問答∨

高人指點一下

asm(\\" BCLR INTM\\"請問這句話是什么意思?Bclr指令是什么意思?謝謝 …

查看全部問答∨

NXP-LPC1788官方評估板(包郵)

本帖最后由 ddllxxrr 于 2016-1-7 16:55 編輯 大四了,倒騰了三年,這塊NXP幾乎還是新的,低價出了吧,有愿意的可以聊聊.QQ:990678775 資料不像ST那么多,但功能非常強大,源碼啥的都有,資料比較齊。 概述 EK-LPC178 8 是萬利電子有限公司為 ...…

查看全部問答∨

求教msp430g2553 DTC配置

配置ADC10DTC進行雙通道AD轉換時數據只能采樣n次,傳送一次。請問如何配置DTC才能實現每次按鍵輸入控制時,AD都能進行采樣n次,并且都能通過DTC傳送??…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 同江市| 龙岩市| 广州市| 辽源市| 桃园县| 深圳市| 渝北区| 永清县| 太仓市| 英德市| 大竹县| 涡阳县| 弥渡县| 东兴市| 毕节市| 呼和浩特市| 武安市| 土默特左旗| 巴中市| 六枝特区| 马尔康县| 新河县| 临沭县| 凤凰县| 宣武区| 哈尔滨市| 沛县| 丹东市| 香格里拉县| 通化市| 林甸县| 军事| 浙江省| 长泰县| 波密县| 鸡东县| 阿坝县| 伽师县| 桓台县| 皋兰县| 政和县|