|
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
討論一下24C01中數(shù)據(jù)出錯(丟失)的問題吧(HOTPOWER請進(jìn)。。 |
作者:程序匠人 欄目:單片機(jī) |
24C01讀寫,大多數(shù)情況下正常,但是在極偶然的時候,發(fā)生數(shù)據(jù)出錯的情況。 由于出現(xiàn)的概率太小,很難再現(xiàn)故障,所以給查找原因分析問題帶來困難。 雖然出錯的概率很小,但仍然是不可接受的,所以請大家一起,討論一下可能的原因。 匠人猜想過的幾中可能原因: 1、上拉電阻是采用CPU內(nèi)部上拉電阻,是否太大了? 2、快速頻繁地?cái)嚯?上電,是否會打亂讀寫的時序?并湊巧拼接出一個錯誤的讀寫命令? 3、中斷的打攪?(可能性不大吧?) HOTPOWER是此中忽悠高手了,快來忽悠一下吧。忽悠的深刻的話,匠人將贈送“尿童牌”開檔褲子一條,呵呵! |
2樓: | >>參與討論 |
作者: kasedy 于 2006/11/8 23:55:00 發(fā)布:
估計(jì)是在開關(guān)電源時電壓不穩(wěn)造成的 我也碰過幾次,程序運(yùn)行中不會出錯(系統(tǒng)為一個機(jī)械設(shè)備,頻繁電動機(jī)起停,現(xiàn)場電磁干擾較厲害,一般連續(xù)運(yùn)行四、五個小時),每次出錯都是在斷電后重新開機(jī),幸虧有了定值校驗(yàn),開機(jī)后能夠及時發(fā)現(xiàn)。我現(xiàn)在打算在其WP端跟地之間接一開關(guān),當(dāng)設(shè)定時使其接地,設(shè)定完后斷開,保證在開關(guān)電源時處于寫保護(hù)狀態(tài)(用MCU的一個IO口控制WP也不保險(xiǎn)?)。 |
3樓: | >>參與討論 |
作者: 程序匠人 于 2006/11/8 23:58:00 發(fā)布:
匠人的系統(tǒng)中沒有電動機(jī) 雖然我也懷疑是電源不穩(wěn)導(dǎo)致,但查無實(shí)據(jù)。 另外,WP端是直接接地了。 |
4樓: | >>參與討論 |
作者: 程序匠人 于 2006/11/9 0:01:00 發(fā)布:
大伙對于上拉電阻如何看 SCL和SDA線上的上拉電阻如果太大,是否會在偶然的干擾下不能保持晚節(jié),而導(dǎo)致問題呢? |
5樓: | >>參與討論 |
作者: diannaoza 于 2006/11/9 0:07:00 發(fā)布:
極偶然的時候,發(fā)生數(shù)據(jù)出錯 是呀,這類問題肯定是該高的沒高,該低的沒低就出現(xiàn)數(shù)據(jù)不對了,哈... |
6樓: | >>參與討論 |
作者: computer00 于 2006/11/9 0:15:00 發(fā)布:
寫完后立即讀回驗(yàn)證,判斷數(shù)據(jù)是否成功寫入, 這樣即可排除上拉電阻干擾問題. 系統(tǒng)在電壓較低時可能會亂跑,不知道你的系統(tǒng)中是否有相關(guān)電源的檢測(例如低電壓復(fù)位芯片),防止程序亂跑. 中斷中是否有對它寫操作的操作?可能誤入中斷也難說(我以前做掉電保護(hù)的時候,在上電時由于掉電保護(hù)部分還沒 工作起來,所以指示掉電,從而一上電就執(zhí)行掉電保護(hù)中斷,修改了數(shù)據(jù),吃了暗虧~~~~~). 寫保護(hù)最好在需要的時候再關(guān)掉,數(shù)據(jù)校驗(yàn)不可少(隨是廢話,還得要敲出來~~~~~) |
7樓: | >>參與討論 |
作者: coldra 于 2006/11/9 0:17:00 發(fā)布:
上拉電阻太大有可能偶然起不到作用 SCL和SDA的布線是不是太長或接近干擾源,讀寫時鐘頻率是不是太高 |
8樓: | >>參與討論 |
作者: IceAge 于 2006/11/9 0:53:00 發(fā)布:
同意 kasedy 的意見,電源應(yīng)該是罪魁禍?zhǔn)?br>應(yīng)與上拉電阻,中斷沒有太大關(guān)系,除非你的軟件有 bug. 把 EEPROM 的電源隔離開,如加電阻or二極管 + 電容,以減少電源沖擊. 或者是口線+三極管控制2401的電源,用電容之類吸收mcu 上電時的口線不穩(wěn)定,僅在必要時打開2401電源。 |
9樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2006/11/9 7:58:00 發(fā)布:
總線初始化很重要。90%和它相關(guān)。 I2C是串行的,幾乎很難發(fā)生寫意外。樓主的“快速頻繁地?cái)嚯?上電”過程中I2C寄存器還保持著原來數(shù)值,如果沒有總線初始化過程,肯定容易發(fā)生寫錯誤。 再一個就是盡量使用單字節(jié)寫。 盡量使用映射緩沖,可以相同的數(shù)據(jù)不寫入。 |
10樓: | >>參與討論 |
作者: 程序匠人 于 2006/11/9 8:28:00 發(fā)布:
答復(fù)前面各位 1、中斷中沒有操作I2C的動作。 2、關(guān)于農(nóng)民講習(xí)所 所說的總線初始化,是指STOP時序指令嗎?單字節(jié)寫要比多字節(jié)寫更可靠嗎?WHY? |
11樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2006/11/9 8:36:00 發(fā)布:
單字節(jié)是盡量減少操作時間,而且容易校驗(yàn)判斷出錯。 俺寫的通用I2C總線驅(qū)動程序。 C文件:51下用reg51.h(reg52.h)替代"..\works.h" //----------------------------------------------------------- //I2C驅(qū)動 //----------------------------------------------------------- #define _I2CBusH #include "..\works.h" struct InI2CBus{ unsigned int mDelay; void (*IO_SCK)(unsigned int bState ); //I2C的SCK unsigned CHAR (*IO_SDA)( unsigned int bState ); //I2C的SDA }; struct InI2CBus sInI2CBus; #define this sInI2CBus #define SDA(x) (*this.IO_SDA)(x) #define SCK(x) (*this.IO_SCK)(x) //----------------------------------------------------------- //內(nèi)部延時 //----------------------------------------------------------- void InI2CBus_Delay( unsigned int mDelay ) { while( mDelay-- ); } //----------------------------------------------------------- //內(nèi)部函數(shù),I2C開始 //----------------------------------------------------------- void InI2CBus_Start() { SDA(1); SCK(1); InI2CBus_Delay( this.mDelay ); SDA(0); InI2CBus_Delay( this.mDelay ); SCK(0); InI2CBus_Delay( this.mDelay ); } //----------------------------------------------------------- //內(nèi)部函數(shù),I2C結(jié)束 //----------------------------------------------------------- void InI2CBus_Stop() { SDA(0); SCK(1); InI2CBus_Delay( this.mDelay ); SDA(1); InI2CBus_Delay( this.mDelay ); } //----------------------------------------------------------- //內(nèi)部函數(shù),輸入ACK //----------------------------------------------------------- void InI2CBus_InputACK() { SCK(1); InI2CBus_Delay( this.mDelay ); SCK(0); InI2CBus_Delay( this.mDelay ); } //----------------------------------------------------------- //內(nèi)部函數(shù),輸出ACK //----------------------------------------------------------- void InI2C_OutputACK( unsigned CHAR mAck ) { SCK(1); SDA(mAck); InI2CBus_Delay( this.mDelay ); SCK(0); InI2CBus_Delay( this.mDelay ); } //----------------------------------------------------------- //寫數(shù)據(jù) //----------------------------------------------------------- void InI2CBus_WrData( unsigned CHAR mData ) { unsigned int i; for( i=0; i<8; i++ ) { SDA(mData&0x80); mData <<= 1; SCK(1); InI2CBus_Delay( this.mDelay ); SCK(0); InI2CBus_Delay( this.mDelay ); } InI2CBus_InputACK(); } //----------------------------------------------------------- //讀數(shù)據(jù) //----------------------------------------------------------- unsigned CHAR InI2CBus_RdData( void ) { unsigned int i; unsigned CHAR mData; for( i=0; i<8; i++ ) { SDA(1); //***重要 SCK(1); mData <<= 1; mData |= SDA(0xff) & 0x1; //讀數(shù)據(jù) InI2CBus_Delay( this.mDelay ); SCK(0); InI2CBus_Delay( this.mDelay ); } return mData; } //----------------------------------------------------------- //內(nèi)部函數(shù):寫的開始操作 //----------------------------------------------------------- void InI2CBus_WrStart( unsigned CHAR mDevice, unsigned int mLocation ) { InI2CBus_Start(); //寫DEVICE地址 InI2CBus_WrData( 0xa0 | (mDevice<<1) ); //寫地址 if( !(mDevice & 0x80) ){ InI2CBus_WrData( (unsigned CHAR)(mLocation>>8) ); //高位地址 } InI2CBus_WrData( (unsigned CHAR)(mLocation) ); //低位地址 } //----------------------------------------------------------- //內(nèi)部函數(shù):讀的開始操作 //----------------------------------------------------------- void InI2CBus_RdStart( unsigned CHAR mDevice, unsigned int mLocation ) { InI2CBus_WrStart( mDevice, mLocation ); InI2CBus_Start(); InI2CBus_WrData( 0xa1 | (mDevice<<1) ); //開始讀 } //======================================================================================== //----------------------------------------------------------- //讀字節(jié) //mDevice:器件地址,最高位=1表示8位地址,否則為16位地址 //----------------------------------------------------------- unsigned CHAR I2CBus_ReadByte( unsigned CHAR mDevice, unsigned int mLocation ) { unsigned CHAR i; InI2CBus_RdStart( mDevice, mLocation ); i = InI2CBus_RdData(); InI2C_OutputACK( 1 ); //讀結(jié)束 InI2CBus_Stop(); return i; } //----------------------------------------------------------- //讀半字 //mDevice:器件地址,最高位=1表示8位地址,否則為16位地址 //----------------------------------------------------------- |
12樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2006/11/9 8:41:00 發(fā)布:
一旦適用了映射緩沖,使用單字節(jié)寫還是多字節(jié)寫就不重要了 |
13樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2006/11/9 9:42:00 發(fā)布:
上面是通用I2C驅(qū)動程序,下面是I2C應(yīng)用部分,也提供大家參考 //----------------------------------------------------------- //I2C驅(qū)動 //使用了通用I2CBus模塊 //----------------------------------------------------------- #define _I2CH #include "..\works.h" //----------------------------------------------------------- //SCK回調(diào)函數(shù) //----------------------------------------------------------- void InI2C_SCK( unsigned int mData ) { if( mData ){ rGPEDAT |= (1<<14); } else { rGPEDAT &= ~(1<<14); } } //----------------------------------------------------------- //SDA回調(diào)函數(shù) //邏輯0、1輸出到IO口,0xff返回IO狀態(tài) //----------------------------------------------------------- unsigned CHAR InI2C_SDA( unsigned int mData ) { SWITCH( mData ){ case 0: rGPEDAT &= ~(1<<15); break; case 0xff: if( rGPEDAT&(1<<15) )mData = 1; else mData = 0; break; default: rGPEDAT |= (1<<15); break; } return mData; } //----------------------------------------------------------- //初始化 //----------------------------------------------------------- void I2C_Init(void) { //初始化IO口為OpenDrain InI2C_SCK(1); InI2C_SDA(1); rGPECON = (rGPECON & ~0xf0000000) | 0x50000000; I2CBus_Init( InI2C_SCK, InI2C_SDA, 200 ); } //----------------------------------------------------------- //析構(gòu) //----------------------------------------------------------- void I2C_Destory(void) { I2CBus_Destory(); rGPECON &= ~0xf0000000; } H文件: //----------------------------------------------------------- //EEPROM器件 //----------------------------------------------------------- #include "..\Universal\I2CBus.h" #define DEVICE0 0 //物理地址DEVICE #define AT24C128 #ifdef FM24CL16 #define EEPROM_ReadByte(addr) I2CBus_ReadByte( (addr>>8)|0x80, addr&0xff ) #define EEPROM_ReadShort(addr) I2CBus_ReadShort( (addr>>8)|0x80, addr&0xff ) #define EEPROM_ReadInt(addr) I2CBus_ReadInt( (addr>>8)|0x80, addr&0xff ) #define EEPROM_ReadToBuf(addr, p, Length) do{ I2CBus_ReadToBuf( (addr>>8)|0x80, addr&0xff, p, Length );}while(0) #define EEPROM_WriteByte(addr,data) do{ I2CBus_WriteByte( (addr>>8)|0x80, addr&0xff, data );}while(0) #define EEPROM_WriteShort(addr,data) do{ I2CBus_WriteShort( (addr>>8)|0x80, addr&0xff, data );}while(0) #define EEPROM_WriteInt(addr,data) do{ I2CBus_WriteInt( (addr>>8)|0x80, addr&0xff, data );}while(0) #define EEPROM_WriteFromBuf(addr, p, Length) do{ I2CBus_WriteFromBuf( (addr>>8)|0x80, addr&0xff, p, Length );}while(0) #endif #ifdef AT24C128 #define EEPROM_ReadByte(addr) I2CBus_ReadByte( DEVICE0, addr ) #define EEPROM_ReadShort(addr) I2CBus_ReadShort( DEVICE0, addr ) #define EEPROM_ReadInt(addr) I2CBus_ReadInt( DEVICE0, addr ) #define EEPROM_ReadToBuf(addr, p, Length) do{ I2CBus_ReadToBuf( DEVICE0, addr, p, Length );}while(0) #define EEPROM_WriteByte(addr,data) do{ I2CBus_WriteByte( DEVICE0, addr, data );}while(0) #define EEPROM_WriteShort(addr,data) do{ I2CBus_WriteShort( DEVICE0, addr, data );}while(0) #define EEPROM_WriteInt(addr,data) do{ I2CBus_WriteInt( DEVICE0, addr, data );}while(0) #define EEPROM_WriteFromBuf(addr, p, Length) do{ I2CBus_WriteFromBuf( DEVICE0, addr, p, Length );}while(0) #endif #ifndef _I2CH //----------------------------------------------------------- //初始化 //----------------------------------------------------------- extern void I2C_Init(void); //----------------------------------------------------------- //析構(gòu) //----------------------------------------------------------- extern void I2C_Destory(void); #endif * - 本貼最后修改時間:2006-11-9 9:44:29 修改者:農(nóng)民講習(xí)所 |
14樓: | >>參與討論 |
作者: IC1008 于 2006/11/9 9:48:00 發(fā)布:
學(xué)習(xí)了 我當(dāng)時用MEGA16L寫的程序上電老是發(fā)現(xiàn)24C02錯誤 最好啟動了 相關(guān)電源的檢測(例如低電壓復(fù)位芯片),防止程序亂跑 問題就沒有了 正如00大俠所說的 電源我覺得是很大的麻煩的 我公司的程序是按頁連續(xù)寫的 |
15樓: | >>參與討論 |
作者: wangshujun 于 2006/11/9 10:04:00 發(fā)布:
根本要確保電源狀態(tài)可以預(yù)知 1、檢測系統(tǒng)供電是否正常,當(dāng)供電中斷后不再開始新的寫入操作。 2、檢測mcu供電是否正常,當(dāng)過低時強(qiáng)制復(fù)位mcu保證不會誤操作。 3、系統(tǒng)供電停止信號產(chǎn)生后保障足夠的時間后再發(fā)生mcu復(fù)位(足夠完成已經(jīng)開啟的寫操作)。 |
16樓: | >>參與討論 |
作者: squarelook 于 2006/11/9 15:57:00 發(fā)布:
我是這樣用的 比如我保存A參數(shù)和B參數(shù),每次保存我的格式是ABAB,下次保存的時候在鄰居位置保存新的ABAB,然后把舊的ABAB擦掉,這樣怎么上下電折磨它都沒問題。不要單單考慮讀寫2401程序本身的問題,這種器件在單片機(jī)系統(tǒng)應(yīng)用中各種因素加起來不可能不發(fā)生數(shù)據(jù)紊亂,關(guān)鍵是怎么把紊亂的數(shù)據(jù)想辦法還原,實(shí)際應(yīng)用的經(jīng)驗(yàn)更重要的! * - 本貼最后修改時間:2006-11-9 16:01:55 修改者:squarelook |
17樓: | >>參與討論 |
作者: hotpower 于 2006/11/9 18:33:00 發(fā)布:
菜農(nóng)就為匠人忽悠幾句吧~~~ 匠人猜想過的幾中可能原因: 1、上拉電阻是采用CPU內(nèi)部上拉電阻,是否太大了? 2、快速頻繁地?cái)嚯?上電,是否會打亂讀寫的時序?并湊巧拼接出一個錯誤的讀寫命令? 3、中斷的打攪?(可能性不大吧?) 菜農(nóng)認(rèn)為1: 最好再外加上拉電阻,5V時在4.7K左右,3.3V在3.3K左右.這樣可加大驅(qū)動能力和加速邊沿的翻轉(zhuǎn). 菜農(nóng)認(rèn)為2: 這個是最關(guān)鍵的原因所在. 首先應(yīng)該提供電源的保護(hù)機(jī)制,即能及時知曉外部電源是否具備寫入EEPROM數(shù)據(jù)的能量. 如果有掉電中斷,那么在系統(tǒng)完全失去能量前會有一端時間的.這個時間與系統(tǒng)的電容存儲的電能等有關(guān).在此時間里只能寫入一部分的EEPROM數(shù)據(jù),若寫入的數(shù)據(jù)很小,可能全部寫入成功.所以在外部EEPROM的環(huán)境下,最好加大電容甚至要加法拉電容,以便增大寫入數(shù)據(jù)塊的長度. 在無掉電保護(hù)機(jī)制的環(huán)境下,可以采用迂回戰(zhàn)術(shù)來彌補(bǔ)無保護(hù)機(jī)制的問題.主要應(yīng)該做到以下考慮: 1.上電后不應(yīng)該立即對EEPROM進(jìn)行寫操作! 2.在EEPROM中找個空閑位置,寫入EEPROM正常標(biāo)志,一般為0x55aa. 這個標(biāo)志有很多的意義: 當(dāng)讀出不為0x55aa時,可認(rèn)為是掉電或EEPROM為空白片或EEPROM為盜版片.我們可以采取任何的手段進(jìn)行處理. 在其他外圍也不正常時,我們可認(rèn)為是真掉電而進(jìn)入休眠.否則,我們認(rèn)為是EEPROM空白即可對其初始化. 注意:必須對EEPROM初始化即寫入全部的默認(rèn)配置數(shù)據(jù)后,才能寫入0x55aa標(biāo)志!!!因?yàn)榭赡茉跊]初始化后又再次掉電!!! 這樣做后才能保證EEPROM初始化數(shù)據(jù)的完整及可靠(可信). 3.每次寫入前最好先讀出數(shù)據(jù),若與寫入數(shù)據(jù)相同就不要招惹EEPROM!!! 這樣在提高壽命的同時,也變相地把EEPROM當(dāng)RAM使用了. 最好在此再讀0x55aa標(biāo)志(可能老頭很煩人),以變相地確定電源沒掉電,至少能短期地保證后面數(shù)據(jù)寫入的安全. 4.寫入數(shù)據(jù)后應(yīng)該再次讀出,若寫入失敗就應(yīng)該再次重試3次以上,否則通知老板該EEPROM壞了. 5.在寫入前應(yīng)該設(shè)置一個全局的寫入成功標(biāo)志為假.在寫入和校驗(yàn)成功后,再設(shè)置其為真. 如果在寫入期間掉電,那么在啟動程序時就應(yīng)該處理其標(biāo)志,這樣可以"斷點(diǎn)續(xù)寫". 菜農(nóng)認(rèn)為3: 此點(diǎn)并不是太重要,因?yàn)橐话愕腎2C總線的SDA/SCL不會再被其他功能復(fù)用的,除非他是匠人~~~ 菜農(nóng)主張必須在一處操作硬件,數(shù)據(jù)都應(yīng)該放入緩沖區(qū)內(nèi)處理,各模塊無權(quán)操作I2C總線.必須由"專人負(fù)責(zé)"!!! 這在菜農(nóng)的設(shè)計(jì)中一直是這樣堅(jiān)持的,因?yàn)槠牌哦嗔丝隙▔氖? 就忽悠到這里吧,菜農(nóng)要喂肚子了~~~但認(rèn)為最重要的是: 0x55aa,法拉電容,上拉電阻,數(shù)據(jù)校驗(yàn),容錯處理.... * - 本貼最后修改時間:2006-11-9 18:36:15 修改者:hotpower |
18樓: | >>參與討論 |
作者: 程序匠人 于 2006/11/9 20:36:00 發(fā)布:
“尿童牌”開檔褲子已經(jīng)發(fā)放,請查收 “尿童牌”開檔褲已經(jīng)發(fā)放,請hotpower、所長、圈圈查收。 其實(shí)我覺得每篇回貼都講的不錯,恨不得為每人送一條“尿童牌”開檔褲。 但是那樣有以權(quán)謀私之嫌。無奈,只好選擇3個代表來穿“尿童牌”開檔褲了,呵呵。 |
19樓: | >>參與討論 |
作者: hotpower 于 2006/11/10 1:30:00 發(fā)布:
睡覺前要倒塌地說一句:“尿童牌”應(yīng)該要進(jìn)行商標(biāo)保護(hù)了~~~ "倒塌"估計(jì)也要申請了~~~ |
20樓: | >>參與討論 |
作者: HWM 于 2006/11/10 8:20:00 發(fā)布:
有這么復(fù)雜嗎 顯然是上拉電阻未加的原因拉,加兩個5.1K的上拉電阻,該用的就別省拉。 |
21樓: | >>參與討論 |
作者: xwj 于 2006/11/10 8:36:00 發(fā)布:
竟然不接上拉電阻~~~程序匠人犯這么低級的錯誤實(shí)在該打PiGu! |
22樓: | >>參與討論 |
作者: 程序匠人 于 2006/11/10 11:10:00 發(fā)布:
暈,我可是用了CPU內(nèi)部上拉電阻 |
23樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2006/11/10 11:15:00 發(fā)布:
不能相信CPU內(nèi)部上拉電阻 它的特性和電阻有區(qū)別 |
24樓: | >>參與討論 |
作者: hq_y 于 2006/11/10 11:18:00 發(fā)布:
很早以前記得,集成電路的電阻是等效電阻 |
25樓: | >>參與討論 |
作者: HWM 于 2006/11/10 11:22:00 發(fā)布:
一般51中的“上拉電阻”是非純線性的。 為了改善波形的上升沿,建議外加5.1K左右的上拉電阻。 |
26樓: | >>參與討論 |
作者: lyjian 于 2006/11/10 11:45:00 發(fā)布:
看來確實(shí)是“程序匠人” |
27樓: | >>參與討論 |
作者: NE5532 于 2006/11/10 12:37:00 發(fā)布:
如果離得近,內(nèi)建上拉也未嘗不可。 要看數(shù)據(jù)是錯成什么樣的,上拉、中斷、電源都得懷疑,如果是錯成0xFF,電源就很值得懷疑。 |
28樓: | >>參與討論 |
作者: binbinwb 于 2006/11/10 20:50:00 發(fā)布:
呵呵 功能還挺多 |
29樓: | >>參與討論 |
作者: kasedy 于 2006/11/10 23:22:00 發(fā)布:
WP直接接地很危險(xiǎn)! 24CXX系列芯片寫保護(hù)端(WP)直接接地,芯片被意外改寫的概率較大!因?yàn)檫@樣的話,芯片任何時候都暴露在“光天化日”之下,在開關(guān)電源是,數(shù)據(jù)很容易被意外改寫!我的做法是:1、WP接到MCU的一個IO口(實(shí)踐證明有較大改善,但仍有過被意外改寫);2、WP接在MCU的RST端(指8031等高電平復(fù)位的,效果比1好,特別在外接如MAX813等專用復(fù)位芯片情況下,還未發(fā)現(xiàn)被意外改寫);3、在WP與GND間接1個開關(guān),平時斷開,需寫操作時接通(效果最好,但實(shí)際使用存在一定局限,如MCU頻繁寫24cXX時不能用)。 要防止24CXX系列芯片被意外改寫,對電源的處理也非常重要,只要電源處理得好,再加上一些寫保護(hù)措施,被意外改寫會很少的!對了,提醒一句:對于運(yùn)行中的重要參數(shù),特別是那些會造成系統(tǒng)重大事故的參數(shù),應(yīng)該加上定值校驗(yàn)措施,并且在運(yùn)行程序中不斷進(jìn)行校驗(yàn)! 另:本人認(rèn)為,上拉電阻與本案關(guān)系不大,不加上拉電阻時,只要時鐘頻率(SCL端)低一點(diǎn)(如200KHZ以下),讀寫芯片應(yīng)該很少錯處的。 * - 本貼最后修改時間:2006-11-10 23:41:11 修改者:kasedy 凱思迪電子,編程器超市 |
30樓: | >>參與討論 |
作者: hotpower 于 2006/11/10 23:40:00 發(fā)布:
kasedy說得在理~~~ WP不用確實(shí)可惜,若IO缺少時,可將其與RST連接,當(dāng)然非51的RST估計(jì)要加個非門之類的. 有時也要采用多備份的手段. |
31樓: | >>參與討論 |
作者: IceAge 于 2006/11/10 23:49:00 發(fā)布:
咳,程序匠人沒有弱到不考慮上拉的地步。 即便是 8051 內(nèi)部上拉基本上夠了。 如果是 pic mcu,可以用 口線 充當(dāng) 24cxx 的電源, 51 得用三極管,基本上可以避免被改寫, 在配合校驗(yàn)+備份。 再次頂 kasedy。 |
32樓: | >>參與討論 |
作者: hotpower 于 2006/11/11 1:01:00 發(fā)布:
哈哈~~~匠人應(yīng)該在脫條褲頭,不知現(xiàn)在剩什么了~~~ 哈哈~~~ |
33樓: | >>參與討論 |
作者: computer00 于 2006/11/11 1:07:00 發(fā)布:
哈哈~~~偶的褲子收到了~~~ 這么容易就混到一條褲子呀~~~~希望匠人以后多弄幾個這樣得帖子~~~~ |
34樓: | >>參與討論 |
作者: tj_zhaozq 于 2006/11/11 2:01:00 發(fā)布:
看了幾位大蝦的,對I2C操作發(fā)表一下看法 菜人也發(fā)表一下看法: 1. 上拉電阻。hotpower說的這一點(diǎn)很重要,當(dāng)然不一定非得像hotpower說的那樣接,但一要能夠提供24C01足夠的能量進(jìn)行操作。只靠內(nèi)部上拉很容易造成24C01寫入電流不夠。 2. 電源,和SDA,SCL線上的抗干擾。當(dāng)有干擾存在的時候很容易造成讀寫錯誤,最好在SDA和SCL串幾十歐的電阻,同時加幾十pF的電容,這個很有用(菜人口吃過這樣的苦頭)。如果掉電時在寫的過程中,沒有STOP操作的話,24C01的數(shù)據(jù)是不會被寫入的。頻繁的上電可能造成數(shù)據(jù)丟失,這個不確定? 3. 寫入速度的控制,寫入速度太快有問題。當(dāng)使用連續(xù)操作模式時,要給有24C01足夠的時間,當(dāng)給24C01發(fā)送STOP后,數(shù)據(jù)并不能非?斓谋粚懭,之間是有時間差的?梢宰鰧(shí)驗(yàn)測試。 4. 一次連續(xù)寫入的數(shù)量不能超過24C01所能允許最大寫入數(shù)量,否則超過的部分會把前面的數(shù)據(jù)沖掉。 5. 非常同意hotpower說的第二,三點(diǎn)。 |
35樓: | >>參與討論 |
作者: delin17 于 2006/11/11 10:35:00 發(fā)布:
講得好復(fù)雜啊.. 應(yīng)該搞好定保護(hù)就行了吧 |
36樓: | >>參與討論 |
作者: river1972 于 2006/11/11 12:00:00 發(fā)布:
我遇到過 因?yàn)镸CU的內(nèi)部上拉電阻通常都為100K以上,如果PCB LAYOUT的時候不是很好,會出現(xiàn)寫數(shù)據(jù)出錯的情況!建議還是在外部加上10K的電阻,還沒發(fā)現(xiàn)有問題的情況 |
37樓: | >>參與討論 |
作者: hotpower 于 2006/11/12 0:28:00 發(fā)布:
長線通信最好用雙絞線(帶屏蔽最好),串并電阻及電容 頻率也要悠著點(diǎn)~~~ |
38樓: | >>參與討論 |
作者: NE5532 于 2006/11/12 10:16:00 發(fā)布:
I2C總線最好不要引出電路板,本來就是板上級的總線 單片機(jī)內(nèi)上拉是個范圍,不是定值。 |
39樓: | >>參與討論 |
作者: computer00 于 2006/11/12 10:20:00 發(fā)布:
我用電腦并口模擬I2C總線主機(jī), 通過并口延長線、三極管做的轉(zhuǎn)接板(將輸出口轉(zhuǎn)成OC,然后再連到輸入口),再用雙絞線連到開發(fā)板上,做成ISP燒寫器,照樣跑得很歡快~~~~~不會出錯。 |
40樓: | >>參與討論 |
作者: grad 于 2006/11/16 12:32:00 發(fā)布:
1 1 |
41樓: | >>參與討論 |
作者: f6906 于 2006/11/16 16:04:00 發(fā)布:
WP接在MCU的RST端----我四年前采用的方法 WP接在MCU的RST端(指8031等高電平復(fù)位的,效果比1好,特別在外接如MAX813等專用復(fù)位芯片情況下,還未發(fā)現(xiàn)被意外改寫); 外部上拉不一定有效,ATMEL還建議采用2.0--2.4K的電阻呢。 |
42樓: | >>參與討論 |
作者: winhiwang 于 2006/11/24 18:23:00 發(fā)布:
多半是由于程序在上下電時跑飛造成的 上下電時,當(dāng)電源在MCU工作的臨界狀態(tài)時,MCU會處于不穩(wěn)定狀態(tài),PC值可能會亂,造成EEPROM程序被非法執(zhí)行。 類似問題處理過,解決辦法: 1。硬件增加低電壓偵測電路(HT7030,HT7039),在電壓較低時可靠復(fù)位 2。軟件把寫保護(hù)允許控制和讀寫程序隔開,設(shè)備地址A0平時設(shè)置成其他數(shù)值等方法 3。EEPROM內(nèi)數(shù)據(jù)多份備份或者增加校驗(yàn)字節(jié) |
43樓: | >>參與討論 |
作者: allen920 于 2006/11/27 16:26:00 發(fā)布:
8*8Led+M07088A/B 和大家共享! |
44樓: | >>參與討論 |
作者: 電子塵埃 于 2006/11/27 20:46:00 發(fā)布:
hotpower高手果然不同凡響,當(dāng)然別的也是高手,服。 hotpower多多發(fā)發(fā)貼呀,像農(nóng)民大哥那樣搞幾篇教程上去呀,當(dāng)然能出本書最好不過了。高人高人,幾句話讓我進(jìn)步了不少。 |
45樓: | >>參與討論 |
作者: 電子塵埃 于 2006/11/27 20:47:00 發(fā)布:
絕對要為hotpower加精 |
46樓: | >>參與討論 |
作者: pigjiang 于 2006/11/27 21:33:00 發(fā)布:
盼望早日穿上屬于自己的開檔褲 |
47樓: | >>參與討論 |
作者: mbutterfly 于 2006/11/28 11:20:00 發(fā)布:
開襠褲是什么啊 |
48樓: | >>參與討論 |
作者: computer00 于 2006/11/28 12:03:00 發(fā)布:
不會吧……樓上被忽悠得不行了……找不到南北~~~開襠褲呀~~ |
49樓: | >>參與討論 |
作者: hunter01 于 2006/11/28 20:05:00 發(fā)布:
我也節(jié)約了兩個電阻,多少年來從未發(fā)現(xiàn)讀寫出錯呀 估計(jì)是匠人電源問題,不過各廠家驅(qū)動能力也不同.我用WINBOND和PHILIPS * - 本貼最后修改時間:2006-11-28 20:06:55 修改者:hunter01 |
50樓: | >>參與討論 |
作者: hq_y 于 2006/11/28 21:30:00 發(fā)布:
我想跟單片機(jī)有關(guān)系,不同廠家的單片機(jī)驅(qū)動能力和抗干擾能力 都不一樣; 但是在設(shè)計(jì)的時候還是加上去的好; |
51樓: | >>參與討論 |
作者: guojian6 于 2006/11/28 23:54:00 發(fā)布:
用鐵電吧,同樣的電路和程序,加了上拉,時序相當(dāng)?shù)?br> 鐵電沒有出過問題,AT24系列出過2次問題,原因不明,損失很大,再也不用了。 |
52樓: | >>參與討論 |
作者: John_light 于 2006/12/6 14:53:00 發(fā)布:
做個記號會不會有人鄙視? |
53樓: | >>參與討論 |
作者: lixun00 于 2006/12/6 15:47:00 發(fā)布:
學(xué)習(xí)了, |
54樓: | >>參與討論 |
作者: lijay 于 2007/1/8 9:20:00 發(fā)布:
收藏 |
55樓: | >>參與討論 |
作者: 小海米 于 2007/2/27 13:53:00 發(fā)布:
求助!ATT7022B及spi通訊 求助!! 有誰用過ATT7022B這個芯片?它與單片機(jī)的通訊方式為SPI,誰有調(diào)通的SPI接口源代碼?或者有調(diào)試此接口代碼方法也行?謝謝! |
56樓: | >>參與討論 |
作者: 毛毛蟲姑娘 于 2007/2/27 16:25:00 發(fā)布:
我以前也吃過24C的苦頭。用24C01A 也是在上電的時候,數(shù)據(jù)被改,主要是上電的時候電源抖動引起。 后來采用這樣的處理: 把A0、A1、A2和GND連接起來(只有一片24C)接CPU的IO口,用讀寫24C的時候給低電平。這樣就好了。 不過用了一段時間,還是改用93C芯片了,感覺這個要可靠得多,因?yàn)樗闹噶钣斜容^復(fù)雜的前導(dǎo)指令。 |
|
|
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |