|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
EEPROM初始狀態(tài)的值 |
| 作者:FZJ 欄目:單片機 |
大家都知道EEPROM初始狀態(tài)的值是不固定的,我想知道有沒有可能是個負數(shù)?謝謝! |
| 2樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/20 19:49:00 發(fā)布:
?? 我覺得不太可能, 我用的都是AT24系列的,從1K到256K,一般存儲器的初值都是FF。 |
|
| 3樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/20 20:13:00 發(fā)布:
我現(xiàn)在在初始狀態(tài)讀出的值做這么處理不知對不對? //讀到的4字節(jié)值放到S1_TEMP~S4_TEMP,然后進行上下限判斷, if ((s1_temp>10)||(s2_temp>6)||(s3_temp>10)||(s4_temp>10) ||(s1_temp<0)||(s2_temp<0)||(s3_temp<0)||(s4_temp<0))//負數(shù)判斷. s1_temp=s2_temp=s3_temp=s4_temp=0; |
|
| 4樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/20 20:24:00 發(fā)布:
? 什么意思,你為什么要讀沒有寫過的EE, |
|
| 5樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/20 20:45:00 發(fā)布:
因為我系統(tǒng)上電后就要還原S1_TEMP~S4_TEMP 上電-->初始化-->讀EEPROM到S1_TEMP~S4_TEMP-->結(jié)束-->寫EEPROM備份S1_TEMP~S4_TEMP. 請問有還有好的方法么? |
|
| 6樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/20 21:02:00 發(fā)布:
我的意見! 我做的系統(tǒng)都具有類似你的EE功能, 步驟是1:用自制的EE寫入器將預制值寫入新的EE,如AT24C01, 假設有4個備分值(每個都是1字節(jié)),分配在固定的地址00H--03H 2。第一次上電先讀入這4個值,關機前如果這些值會變化,想在下次開機后保持此狀態(tài),就將新值用程序?qū)慐E, 肯定要預先寫入的,而且不會有所謂的負數(shù),因為EE是按地址空間存的,一個地址村一個字節(jié),(0--OXFF)。 |
|
| 7樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/20 21:11:00 發(fā)布:
我有個問題想請教你,謝謝! 為什么連續(xù)寫8字節(jié)以上會出錯,書上說連續(xù)寫字節(jié)要延時,這句話怎么理解? 我寫4字節(jié)就不用延時,而且沒出錯而連續(xù)寫8字節(jié)以上就出錯,如果我把初試寫地址設為01H開始寫8字節(jié)也錯,不知道為什么?你知道么? 我用的EEPROM也是AT24XX,謝謝! |
|
| 8樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/20 22:05:00 發(fā)布:
不客氣! 寫入時間是有限制,寫入有兩種方式字節(jié)寫和 頁寫,DATASHEET有說寫入時間,要求5MS,或10ms。這和初始寫什么地址無關。 寫4字節(jié)可能與你的系統(tǒng)流程耗時有關, 假設為字節(jié)頁寫入的方式,先寫一字節(jié)寫入函數(shù)sWRByteEE,由此構(gòu)成一個寫8字節(jié)的頁寫函數(shù)sWRPageEE.入口為目標地址頁 EEPage(8字節(jié)為一頁,page0為00H---07H),寫入緩沖區(qū)paEEWRBuf(8字節(jié)) 那么要寫8個字節(jié)只要給paEEWRBuf 付值。 指定EEPage的頁數(shù),即EE地址。 在調(diào)用sWRPageEE,就完成了8字節(jié)寫入(一頁寫入) 如果要單字節(jié)寫入的話就要在字節(jié)連續(xù)寫入過程中加10ms左右的眼時(不要死等,要用無耗時等待,否則你的系統(tǒng)就脫死了。) |
|
| 9樓: | >>參與討論 |
| 作者: fzj 于 2006/1/21 9:15:00 發(fā)布:
多謝了。 字節(jié)寫就是單字節(jié)寫而且如果需要寫8個字節(jié)就需要在每個單字節(jié)寫完成后查詢ACK應答位,一般為5MS左右, 頁寫就是連續(xù)地址寫,在此期間不需要延時,EEPROM以內(nèi)部地址分配以8字節(jié)為一頁,如此分配,即00H-07H為一頁08H-0FH為一頁........... 不知道我理解的對不?? 為了使EEPROM提高抗干擾,我想在每次寫操作完成后將寫保護位使能,即在BSTOP后通過軟件查詢ACK位是否為低電平,如果是低電平我將WP(寫保護位打開),不過這樣處理我通過硬件仿真發(fā)現(xiàn),程序始終沒有執(zhí)行WP打開這一步,也就是ACK始終沒有被從器件(EEPROM)拉低,這一點難道證明EEPROM內(nèi)部寫完成后不再作寫完成應答????不知你怎么理解?謝謝! |
|
| 10樓: | >>參與討論 |
| 作者: fzj 于 2006/1/21 9:27:00 發(fā)布:
仔細想想覺得你下面的思路不可取,個人觀點. 我做的系統(tǒng)都具有類似你的EE功能, 步驟是1:用自制的EE寫入器將預制值寫入新的EE,如AT24C01, 假設有4個備分值(每個都是1字節(jié)),分配在固定的地址00H--03H 2。第一次上電先讀入這4個值,關機前如果這些值會變化,想在下次開機后保持此狀態(tài),就將新值用程序?qū)慐E, 如果每個新產(chǎn)品在開始使用之前都要先寫EEPROM后在裝到產(chǎn)品上,一來工序太復雜不說,好象也很不現(xiàn)實,我覺得軟件也必須要考慮到EEPROM所寫的錯誤信息,如果每次讀出EEPROM的值不加以判斷對不錯,這樣很危險,特別是系統(tǒng)在強干擾環(huán)境中使用,你能保證EEPROM每次寫的值都正確?我認為每次讀完后加以對錯判斷是不可少的,這樣至少能保證系統(tǒng)不受EEPROM約束.以上是我個人觀點,說的不對還請指正. |
|
| 11樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/21 20:52:00 發(fā)布:
回! 1.新產(chǎn)品寫入EE不足為奇,我做汽車電子和音響產(chǎn)品,性能要求的都很嚴格。一些配置信息均要防在EE里。 類似電腦主伴的BIOS,要先寫入的,做一個EE寫入器很簡單,一次性就把預制的數(shù)據(jù)寫進去(注意寫入程序要有規(guī)則,如校驗),比如車里的音響,由于車型的不同,操作面板就不同,但如果每一款都用一個單獨的程序,管理起來就不太方便,主MCU就要有多種版本(其實功能都一樣,表面不同),這時就可以在EE里做選項,上電讀到哪個就執(zhí)行響應功能,很方便的。還比如有許多功能實際生產(chǎn)時未比都用,只要做個選項就OK了, 2,EE的信息是否正確不是上層程序要考慮的,在地層讀取后是要校驗的,比如一次讀8字節(jié),事先認為規(guī)定好,寫如的時候就按一定規(guī)則,前7字節(jié)為數(shù)據(jù),第8個字節(jié)為前7字節(jié)的校驗碼。 干擾問題主要看硬件設計的怎么樣,還有讀取EE的時機要掌握好,如盡量不要頻繁讀取,注意上電,下電的時序關系。 3你說的不能讀到ACK,是你的程序有問題,參照EE的DATASHEET時序,AT24C的都是IIC的BUS,很簡單。 |
|
| 12樓: | >>參與討論 |
| 作者: fzj 于 2006/1/22 15:09:00 發(fā)布:
看看我這個思路對不對? EEPROM讀操作和寫操作都完成了,可是判斷ACK還是有點不明白, 在寫過程中ACK由從器件回應,主器件應該是查詢, 在讀過程中ACK由主接收器主動將其拉低,這一點應該沒有問題 就是寫判斷ACK,怎么程序中只要給它個ACK時鐘(稱第9個時鐘)也可以,從這一點可以說明,EEPROM在收到一個字節(jié)數(shù)據(jù)后能迅速作出ACK應答響應,我想軟件上是不是可以這樣處理:寫完一個字節(jié)后在第9個時鐘周期,主器件判斷有無應答信號,如果沒有就直接STOP錯誤處理,對應程序如下:不作任何延時! ............ if (sda) bstop(); //sda=1錯誤處理 return; |
|
| 13樓: | >>參與討論 |
| 作者: fzj 于 2006/1/22 15:19:00 發(fā)布:
怎么上傳PDF文件呀? |
|
| 14樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/23 8:51:00 發(fā)布:
再看看別人寫的覺得好象有問題 他在每次寫完一個字節(jié) 后判斷ACK是這樣的: while(sda) {;} ............. 意思是如果EEPROM沒有作ACK應答的話,程序在此死循環(huán),這樣的處理我覺得又有問題,如果EEPROM寫出錯或者本身就壞了,那好MCU執(zhí)行到這里就死了。而且如過開了狗后MCU一直處理復位,對此我想可不可以這樣處理: unsigned CHAR i=10; while (sda) { if (--i==0) { bstop(); //判斷應答信號為循環(huán)10次,如果沒有強行退出作錯誤處理。 break; } } 大家可否幫我分析分析,覺得哪種思路可行?我覺得還是直接判斷最有效,或者干脆不判斷,程序就給他個應答段的時鐘信號,這樣我也試過,可行,但就是不知道有沒有隱患存在??? |
|
| 15樓: | >>參與討論 |
| 作者: fzj 于 2006/1/23 18:31:00 發(fā)布:
請高手進來看看呀!謝謝了 EEPROM對我來講不太熟悉,DATASHEET看了好幾遍,心中還是有個疙瘩,希望高手能幫我出出主意,看我前面處理的方法是否合理?謝謝! 新年快到了,向大家拜個早年! |
|
| 16樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/26 8:57:00 發(fā)布:
頂一下。 |
|
| 17樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/26 16:25:00 發(fā)布:
fzj你是對的 應該檢查從器件回應的ACK,而且不應該死循環(huán)等待。 我的做法是設完SCL后,固定的1,2個nop,然后檢查ACK。 |
|
| 18樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/26 16:31:00 發(fā)布:
至于初值 新的EEPROM應該全為FF,一般理解為unsigned CHAR。至于說它代表什么看你的定義,可以是任何東西。 如果嫌事先寫好麻煩。保險起見,可以讓你的數(shù)據(jù)多一個校驗字節(jié)。讀出校驗不符,則寫入初值。 或者對每個數(shù)據(jù)作合法性檢查,如果不合法,則寫入初值。 * - 本貼最后修改時間:2006-1-26 16:36:39 修改者:楊工 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |