性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

掉電存儲(chǔ)EEPROM中的坑

我們?cè)谑褂脝纹瑱C(jī)存儲(chǔ)數(shù)據(jù)時(shí),經(jīng)常用到24c02

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

下面開始著重寫24c02:

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

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

按頁寫于單字節(jié)寫的最大區(qū)別在于,寫入數(shù)據(jù)的時(shí)序不同,單字節(jié)寫入是寫完一個(gè)字節(jié)之后就要主機(jī)停止信號(hào),然后進(jìn)行數(shù)據(jù)的擦寫周期,看按頁寫的時(shí)許圖可以知道,每次發(fā)送完一個(gè)字節(jié)之后只要跟一個(gè)應(yīng)答就可以繼續(xù)寫入下一個(gè)字節(jié),當(dāng)寫滿8字節(jié)之后才需要停止信號(hào)進(jìn)行數(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è)備地址+寫信號(hào) */
    
     if(i2c_WaitAck())
	{
		return 0;
	}
    i2c_SendByte(adr);   //設(shè)置起始地址 
	i2c_WaitAck();
  /* 
		寫串行EEPROM不像讀操作可以連續(xù)讀取很多字節(jié),每次寫操作只能在同一個(gè)page。
		對(duì)于24xx02,page size = 8
		簡(jiǎn)單的處理方法為:按字節(jié)寫操作模式,每寫1個(gè)字節(jié),都發(fā)送地址
		為了提高連續(xù)寫的效率: 本函數(shù)采用page wirte操作。
	*/
 for(i=0;i<nbyte;i++)
 {
//	 i2c_Start();     
//         
//     i2c_SendByte(I2C_DeviceAddress);	/* 發(fā)送設(shè)備地址+寫信號(hào) */
//    
//     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++;    //對(duì)24C08的操作地址加1 
//	 delay(5000);	
	if(adr%8==0)                //每頁8字節(jié)  //換頁
        {
			if(i==nbyte-1)
			{
			}
			else
			{
				i2c_Stop();  
				delay(5000);											//停止時(shí)間需超過5ms.
				i2c_Start();  											//地址為8倍數(shù)重新開始
				i2c_SendByte(I2C_DeviceAddress);	/* 發(fā)送設(shè)備地址+寫信號(hào) */
				 i2c_WaitAck();
				i2c_SendByte(adr);   //設(shè)置起始地址 
				i2c_WaitAck();
			}				
            
        }
//        i2c_Stop();
       delay(12000);		
  //注意:因?yàn)檫@里要等待EEPROMPROM寫完,可以采用查詢或延時(shí)方式(10ms)
//        DelayMs(12); //寫入延時(shí) 12ms  寫周期大于10ms即可
        
 }
     i2c_Stop();
// delay(5000);		
 return 1;
}

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

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 4
關(guān)注 210
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧