99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

掉電存儲EEPROM中的坑

我們在使用單片機存儲數(shù)據(jù)時,經(jīng)常用到24c02

24C02是一個2Kbit的串行EEPROM存儲芯片,可存儲256個字節(jié)數(shù)據(jù)。工作電壓范圍為1.8V到6.0V,具有低功耗CMOS技術(shù),自定時擦寫周期,1000000次編程/擦除周期,可保存數(shù)據(jù)100年。24C02有一個16字節(jié)的頁寫緩沖器和一個寫保護功能。通過I2C總線通訊讀寫芯片數(shù)據(jù),通訊時鐘頻率可達(dá)400KHz。

可以通過存儲IC的型號來計算芯片的存儲容量是多大,比如24C02后面的02表示的是可存儲2Kbit的數(shù)據(jù),轉(zhuǎn)換為字節(jié)的存儲量為21024/8 = 256byte;有比如24C04后面的04表示的是可存儲4Kbit的數(shù)據(jù),轉(zhuǎn)換為字節(jié)的儲存量為41024/8 = 512byte;以此來類推其它型號的存儲空間。

芯片的尋址:AT24C設(shè)備地址為如下,前四位固定為1010,A2~A0為由管腳電平。AT24CXX EEPROM Board模塊中默認(rèn)為接地。A2-A0=000,最后一位表示讀寫操作。所以AT24Cxx的讀地址為0xA1,寫地址為0xA0。

也就是說如果是寫24C02的時候,從器件地址為10100000(0xA0);讀24C02的時候,從器件地址為10100001(0xA1)。

片內(nèi)地址尋址:

芯片尋址可對內(nèi)部256B中的任一個進行讀/寫操作,其尋址范圍為00~FF,共256個尋址單位。具體解釋:由于24C02只有256個字節(jié)的存儲空間,所以只需要1個字節(jié)就可以尋址完24C02的存儲空間,但是無法尋址完更大容量的存儲IC,比如24C04的存儲容量是512字節(jié),需要9個bit的地址位才能尋址完。由上圖可以看到,24C04的設(shè)備地址內(nèi)是沒有A0參數(shù)的,被a8代替了,這個a8就是24C04的第9個bit的地址位,也就是說24C04的A0引腳是不起作用的,這樣也就造成了在I2C總線上只能同時掛載4個24C04芯片。其它存儲器如24C08、24C16也可以這么類推。

24C02的WP引腳是寫保護引腳,當(dāng)WP引腳接高電平的時,24C02只能進行讀取操作,不能進行寫操作。只有當(dāng)WP引腳懸空或接低電平時,24C02才能進行寫操作。  IIC 主設(shè)備/從設(shè)備:簡單介紹一下主從機區(qū)分,對于新手來說老是區(qū)分不開主從機還是很有利的,通常我們?yōu)榱朔奖惆袸IC設(shè)備分為主設(shè)備和從設(shè)備,基本上誰控制時鐘線(即控制SCL的電平高低變換)誰就是主設(shè)備。

IIC主設(shè)備功能:主要產(chǎn)生時鐘,產(chǎn)生起始信號和停止信號

IIC從設(shè)備功能:可編程的IIC地址檢測,停止位檢測

IIC的協(xié)議層I2C 總線在傳送數(shù)據(jù)過程中共有三種類型信號, 它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。

開始信號:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數(shù)據(jù)。結(jié)束信號:SCL 為高電平時,SDA 由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。應(yīng)答信號:接收數(shù)據(jù)的 IC 在接收到 8bit 數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的 IC 發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU 向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,CPU 接收到應(yīng)答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。

在SCL的高電平期間,SDA是不允許變化的;而只有在時鐘線SCL的低電平期間,SDA才能夠出現(xiàn)變化;

應(yīng)答信號每當(dāng)主機向從機發(fā)送完一個字節(jié)的數(shù)據(jù),主機總是需要等待從機給出一個應(yīng)答信號,以確認(rèn)從機是否成功接收到了數(shù)據(jù),

應(yīng)答信號:主機SCL拉高,讀取從機SDA的電平,為低電平表示產(chǎn)生應(yīng)答

應(yīng)答信號為低電平時,規(guī)定為有效應(yīng)答位(ACK,簡稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號為高電平時,規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。

Start: IIC開始信號,表示開始傳輸。DEVICE_ADDRESS:: 從設(shè)備地址,就是7位從機地址R/W: W(write)為寫,R(read)為讀ACK: 應(yīng)答信號WORD_ADDRESS : 從機中對應(yīng)的寄存器地址 比方說訪問 OLED中的 某個寄存器DATA: 發(fā)送的數(shù)據(jù)STOP: 停止信號。結(jié)束IIC

主機要向從機寫數(shù)據(jù)時:

主機首先產(chǎn)生START信號然后緊跟著發(fā)送一個從機地址,這個地址共有7位,緊接著的第8位是數(shù)據(jù)方 向位(R/W),0表示主機發(fā)送數(shù)據(jù)(寫),1表示主機接收數(shù)據(jù)(讀)主機發(fā)送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,若相同,則認(rèn)為自己正在被主機尋址,根據(jù)R/T位將自己確定為發(fā)送器和接收器這時候主機等待從機的應(yīng)答信號(A)當(dāng)主機收到應(yīng)答信號時,發(fā)送要訪問從機的那個地址, 繼續(xù)等待從機的應(yīng)答信號當(dāng)主機收到應(yīng)答信號時,發(fā)送N個字節(jié)的數(shù)據(jù),繼續(xù)等待從機的N次應(yīng)答信號,主機產(chǎn)生停止信號,結(jié)束傳送過程。

主機要從從機讀數(shù)據(jù)時

主機首先產(chǎn)生START信號然后緊跟著發(fā)送一個從機地址,注意此時該地址的第8位為0,表明是向從機寫命令,這時候主機等待從機的應(yīng)答信號(ACK)當(dāng)主機收到應(yīng)答信號時,發(fā)送要訪問的地址,繼續(xù)等待從機的應(yīng)答信號,當(dāng)主機收到應(yīng)答信號后,主機要改變通信模式(主機將由發(fā)送變?yōu)榻邮眨瑥臋C將由接收變?yōu)榘l(fā)送)所以主機重新發(fā)送一個開始start信號,然后緊跟著發(fā)送一個從機地址,注意此時該地址的第8位為1,表明將主機設(shè) 置成接收模式開始讀取數(shù)據(jù),這時候主機等待從機的應(yīng)答信號,當(dāng)主機收到應(yīng)答信號時,就可以接收1個字節(jié)的數(shù)據(jù),當(dāng)接收完成后,主機發(fā)送非應(yīng)答信號,表示不在接收數(shù)據(jù)主機進而產(chǎn)生停止信號,結(jié)束傳送過程。

向AT24C02中寫數(shù)據(jù)

MCU先發(fā)送一個開始信號(START)啟動總線接著跟上首字節(jié),發(fā)送器件寫操作地址(DEVICE ADDRESS)+寫數(shù)據(jù)(0xA0)等待應(yīng)答信號(ACK)發(fā)送數(shù)據(jù)的存儲地址。24C02一共有256個字節(jié)的存儲空間,地址從0x00~0xFF,想把數(shù)據(jù)存儲>在哪個位置,此刻寫的就是哪個地址。發(fā)送要存儲的數(shù)據(jù)第一字節(jié)、第二字節(jié)、…注意在寫數(shù)據(jù)的過程中,E2PROM每個字節(jié)都會>回應(yīng)一個“應(yīng)答位0”,老告訴我們寫E2PROM數(shù)據(jù)成功,如果沒有回應(yīng)答位,說明寫入不成功。發(fā)送結(jié)束信號(STOP)停止總線注意:在寫數(shù)據(jù)的過程中,每成功寫入一個字節(jié),E2PROM存儲空間的地址就會自動加1,當(dāng)加到0xFF后,再寫一個字節(jié),地址就會溢出又變成0x00。

寫數(shù)據(jù)的時候需要注意,E2PROM是先寫到緩沖區(qū),然后再“搬運到”到掉電非易失區(qū)。所以這個過程需要一定的時間,AT24C02這個過程是不超過5ms!所以,當(dāng)我們在寫多個字節(jié)時,寫入一個字節(jié)之后,再寫入下一個字節(jié)之前,必須延時5ms才可以

讀隨機地址的數(shù)據(jù)

1、MCU先發(fā)送一個開始信號(START)啟動總線2、接著跟上首字節(jié),發(fā)送器件寫操作地址(DEVICE ADDRESS)+寫數(shù)據(jù)(0xA0)注意:這里寫操作是為了要把所要讀的數(shù)據(jù)的存儲地址先寫進去,告訴E2PROM要讀取哪個地址的數(shù)據(jù)。3、發(fā)送要讀取內(nèi)存的地址(WORD ADDRESS),通知E2PROM讀取要哪個地址的信息。4、重新發(fā)送開始信號(START)5、發(fā)送設(shè)備讀操作地址(DEVICE ADDRESS)對E2PROM進行讀操作 (0xA1)6、E2PROM會自動向主機發(fā)送數(shù)據(jù),主機讀取從器件發(fā)回的數(shù)據(jù),在讀一個字節(jié)后,MCU會回應(yīng)一個應(yīng)答信號(ACK)后, E2PROM會繼續(xù)傳輸下一個地址的數(shù)據(jù),MCU不斷回應(yīng)應(yīng)答信號可以不斷讀取內(nèi)存的數(shù)據(jù)7、如果不想讀了,告訴E2PROM不想要數(shù)據(jù)了,就發(fā)送一個“非應(yīng)答位NAK(1)”。發(fā)送結(jié)束信號(STOP)停止總線

連續(xù)讀數(shù)據(jù)

E2PROM支持連續(xù)寫操作,操作和單個字節(jié)類似,先發(fā)送設(shè)備寫操作地址(DEVICE ADDRESS),然后發(fā)送內(nèi)存起始地址(WORD ADDRESS),MCU會回應(yīng)一個應(yīng)答信號(ACK)后,E2PROM會繼續(xù)傳輸下一個地址的數(shù)據(jù),MCU不斷回應(yīng)應(yīng)答信號可以不斷讀取內(nèi)存的數(shù)據(jù)。E2PROM的地址指針會自動遞增,數(shù)據(jù)會依次保存在內(nèi)存中。不應(yīng)答發(fā)送結(jié)束信號后終止傳輸。

下面開始著重寫24c02:

24C02有兩種工作模式:(1)、字節(jié)寫入模式:結(jié)合技術(shù)文檔我認(rèn)為該模式是這樣工作的:首先是可以再任意的地址(0x00~0xFF)寫入一個字節(jié),也可以在某一地址連續(xù)的寫入N字節(jié),而且不需要翻頁,從技術(shù)手冊得知,答題時說字節(jié)寫入模式下,頁指針根寫入數(shù)據(jù)的多少來自動增加實現(xiàn)翻頁功能,不用自己在程序里邊實現(xiàn);(2)、頁寫入模式:頁寫入模式下,手冊上寫著,一頁可以存8字節(jié),當(dāng)存儲的數(shù)據(jù)大于8時,則會覆蓋先前保存的數(shù)據(jù),例如,有16個數(shù)據(jù) uchar data[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},從24C02的0x00地址開始存放,當(dāng)存完一頁(8個)時,第9個數(shù)據(jù)會保存在0x00,覆蓋掉開始保存的1,后邊的數(shù)據(jù)一次類推,這樣的現(xiàn)象叫做“翻轉(zhuǎn)”,如果想寫完一頁后將剩余的數(shù)據(jù)保存在下一頁,頁指針需要自己來設(shè)定。

這個是多字節(jié)寫入,注意程序中注釋

按頁寫于單字節(jié)寫的最大區(qū)別在于,寫入數(shù)據(jù)的時序不同,單字節(jié)寫入是寫完一個字節(jié)之后就要主機停止信號,然后進行數(shù)據(jù)的擦寫周期,看按頁寫的時許圖可以知道,每次發(fā)送完一個字節(jié)之后只要跟一個應(yīng)答就可以繼續(xù)寫入下一個字節(jié),當(dāng)寫滿8字節(jié)之后才需要停止信號進行數(shù)據(jù)的擦寫。

uint8_t I2C_EEPROM_BufferWrite(uint8_t *psrc_data,uint8_t adr,uint8_t nbyte)
{
   uint8_t i;
	i2c_Start();     
         
     i2c_SendByte(I2C_DeviceAddress);	/* 發(fā)送設(shè)備地址+寫信號 */
    
     if(i2c_WaitAck())
	{
		return 0;
	}
    i2c_SendByte(adr);   //設(shè)置起始地址 
	i2c_WaitAck();
  /* 
		寫串行EEPROM不像讀操作可以連續(xù)讀取很多字節(jié),每次寫操作只能在同一個page。
		對于24xx02,page size = 8
		簡單的處理方法為:按字節(jié)寫操作模式,每寫1個字節(jié),都發(fā)送地址
		為了提高連續(xù)寫的效率: 本函數(shù)采用page wirte操作。
	*/
 for(i=0;i<nbyte;i++)
 {
//	 i2c_Start();     
//         
//     i2c_SendByte(I2C_DeviceAddress);	/* 發(fā)送設(shè)備地址+寫信號 */
//    
//     if(i2c_WaitAck())
//	{
//		return 0;
//	}
//    i2c_SendByte(adr);   //設(shè)置起始地址 
//	i2c_WaitAck();
	 i2c_SendByte(psrc_data[i]);           //寫數(shù)據(jù)
	  if(i2c_WaitAck())
	{
		return 0;
	}
//	  psrc_data++;    //指向待寫數(shù)據(jù)的指針加1
        adr++;    //對24C08的操作地址加1 
//	 delay(5000);	
	if(adr%8==0)                //每頁8字節(jié)  //換頁
        {
			if(i==nbyte-1)
			{
			}
			else
			{
				i2c_Stop();  
				delay(5000);											//停止時間需超過5ms.
				i2c_Start();  											//地址為8倍數(shù)重新開始
				i2c_SendByte(I2C_DeviceAddress);	/* 發(fā)送設(shè)備地址+寫信號 */
				 i2c_WaitAck();
				i2c_SendByte(adr);   //設(shè)置起始地址 
				i2c_WaitAck();
			}				
            
        }
//        i2c_Stop();
       delay(12000);		
  //注意:因為這里要等待EEPROMPROM寫完,可以采用查詢或延時方式(10ms)
//        DelayMs(12); //寫入延時 12ms  寫周期大于10ms即可
        
 }
     i2c_Stop();
// delay(5000);		
 return 1;
}

在向 EEPROM 連續(xù)寫入多個字節(jié)的數(shù)據(jù)時,如果每寫一個字節(jié)都要等待的話,整體上的寫入效率就太低了。因此 EEPROM 的廠商就想了一個辦法,把 EEPROM 分頁管理。24C01.24C02 這兩個型號是8 字節(jié)一個頁,而 24C04、24C08、24C16是16 個字節(jié)一頁。例如AT24C02,一共是 256 個字節(jié),8 個字節(jié)一頁,那么就一共有 32 頁分配好頁之后,如果我們在同一個頁內(nèi)連續(xù)寫入幾個字節(jié)后,最后再發(fā)送停止位的時席.EEPROM 檢測到這個停止位后,就會一次性把這一頁的數(shù)據(jù)寫到非易失區(qū)域,就不需要像上節(jié)課那樣寫一個字節(jié)檢測一次了,并且頁寫入的時間也不會超過 5ms。如果我們寫入的數(shù)據(jù)跨頁了,那么寫完了一頁之后,我們要發(fā)送一個停止位,然后等待并且檢測 EEPROM 的空閑模式,一直等到把上一頁數(shù)據(jù)完全寫到非易失區(qū)域后,再進行下一頁的寫入,這樣就可以在很大程度上提高數(shù)據(jù)的寫入效率

聲明:本內(nèi)容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 4
關(guān)注 212
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 成人国产一区二区三区精品麻豆 | 无人高清视频免费观看在线 | 4399理论片午午伦夜理片 | 国产第3页| 久久久www免费人成—看片 | 91嫩草欧美久久久九九九 | 欧美成人精品A∨在线观看 成人毛片视频在线观看 | 综合自拍偷拍 | 性刺激的大陆三级视频 | 在线观看亚洲欧美视频免费 | 亚洲欧洲日韩淙合久久 | 亚洲欧洲一区二区三区 | 亚洲一区三区在线观看 | 中文字幕无码乱码人妻系列蜜桃 | 国产成熟人妻换╳╳╳╳ | 国内自产拍自拍A免费毛片 无码人妻精品一区二区三区久久 | 亚洲精品欧美精品日韩精品 | 国内精品一区二区 | 国产成人一级在线观看 | 久久夜色精品国产噜噜亚洲AV | 国产女同一区二区在线 | 中文字幕免费一区二区 | 久久久久久久久888 久久国产a级久久美女毛片 | 成人精品福利视频 | 国产一区二区丁香婷婷 | 免费AV网在线观看 | 国产欧美日韩精品一区 | 亚洲欧洲专线一区 | 日韩经典在线观看 | 正能量免费网站WWW正能量免费 | 免费黄在线看 | 99久久精品免费看国产 | 国产一区二区精品久久岳 | 精品区一区二区三 | 亚洲av无码久久寂寞少妇 | 成本人在线观看视频网站 | 亚洲影院在线 | 美国av一区二区 | 国产精品午夜无码A体验区 国产精品无码AV不卡 | 久久久久国产精品一区二区三区 | 亚洲国产精品成人天堂 |