最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ù)據(jù)出錯(丟失)的問題吧(HOTPOWER請進(jìn)。。
24C01讀寫,大多數(shù)情況下正常,但是在極偶然的時候,發(fā)生數(shù)據(jù)出錯的情況。

由于出現(xiàn)的概率太小,很難再現(xiàn)故障,所以給查找原因分析問題帶來困難。

雖然出錯的概率很小,但仍然是不可接受的,所以請大家一起,討論一下可能的原因。

匠人猜想過的幾中可能原因:

1、上拉電阻是采用CPU內(nèi)部上拉電阻,是否太大了?
2、快速頻繁地?cái)嚯?上電,是否會打亂讀寫的時序?并湊巧拼接出一個錯誤的讀寫命令?
3、中斷的打攪?(可能性不大吧?)


HOTPOWER是此中忽悠高手了,快來忽悠一下吧。忽悠的深刻的話,匠人將贈送“尿童牌”開檔褲子一條,呵呵!

2樓: >>參與討論
kasedy
估計(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樓: >>參與討論
程序匠人
匠人的系統(tǒng)中沒有電動機(jī)
雖然我也懷疑是電源不穩(wěn)導(dǎo)致,但查無實(shí)據(jù)。
另外,WP端是直接接地了。

4樓: >>參與討論
程序匠人
大伙對于上拉電阻如何看
SCL和SDA線上的上拉電阻如果太大,是否會在偶然的干擾下不能保持晚節(jié),而導(dǎo)致問題呢?

5樓: >>參與討論
diannaoza
極偶然的時候,發(fā)生數(shù)據(jù)出錯
是呀,這類問題肯定是該高的沒高,該低的沒低就出現(xiàn)數(shù)據(jù)不對了,哈...

6樓: >>參與討論
computer00
寫完后立即讀回驗(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
上拉電阻太大有可能偶然起不到作用
SCL和SDA的布線是不是太長或接近干擾源,讀寫時鐘頻率是不是太高

8樓: >>參與討論
IceAge
同意 kasedy 的意見,電源應(yīng)該是罪魁禍?zhǔn)?br>應(yīng)與上拉電阻,中斷沒有太大關(guān)系,除非你的軟件有 bug.
EEPROM 的電源隔離開,如加電阻or二極管 + 電容,以減少電源沖擊.
或者是口線+三極管控制2401的電源,用電容之類吸收mcu 上電時的口線不穩(wěn)定,僅在必要時打開2401電源。


9樓: >>參與討論
農(nóng)民講習(xí)所
總線初始化很重要。90%和它相關(guān)。
I2C是串行的,幾乎很難發(fā)生寫意外。樓主的“快速頻繁地?cái)嚯?上電”過程中I2C寄存器還保持著原來數(shù)值,如果沒有總線初始化過程,肯定容易發(fā)生寫錯誤。

再一個就是盡量使用單字節(jié)寫。
盡量使用映射緩沖,可以相同的數(shù)據(jù)不寫入。

10樓: >>參與討論
程序匠人
答復(fù)前面各位
1、中斷中沒有操作I2C的動作。
2、關(guān)于農(nóng)民講習(xí)所 所說的總線初始化,是指STOP時序指令嗎?單字節(jié)寫要比多字節(jié)寫更可靠嗎?WHY?

11樓: >>參與討論
農(nóng)民講習(xí)所
單字節(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í)所
一旦適用了映射緩沖,使用單字節(jié)寫還是多字節(jié)寫就不重要了
 
13樓: >>參與討論
農(nóng)民講習(xí)所
上面是通用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
學(xué)習(xí)了
我當(dāng)時用MEGA16L寫的程序上電老是發(fā)現(xiàn)24C02錯誤
最好啟動了 相關(guān)電源的檢測(例如低電壓復(fù)位芯片),防止程序亂跑
問題就沒有了 正如00大俠所說的
電源我覺得是很大的麻煩的
我公司的程序是按頁連續(xù)寫的

15樓: >>參與討論
wangshujun
根本要確保電源狀態(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
我是這樣用的
比如我保存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
菜農(nóng)就為匠人忽悠幾句吧~~~
匠人猜想過的幾中可能原因:

1、上拉電阻是采用CPU內(nèi)部上拉電阻,是否太大了?
2、快速頻繁地?cái)嚯?上電,是否會打亂讀寫的時序?并湊巧拼接出一個錯誤的讀寫命令?
3、中斷的打攪?(可能性不大吧?)

菜農(nóng)認(rèn)為1:
    最好再外加上拉電阻,5V時在4.7K左右,3.3V3.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樓: >>參與討論
程序匠人
“尿童牌”開檔褲子已經(jīng)發(fā)放,請查收
“尿童牌”開檔褲已經(jīng)發(fā)放,請hotpower、所長、圈圈查收。

其實(shí)我覺得每篇回貼都講的不錯,恨不得為每人送一條“尿童牌”開檔褲。

但是那樣有以權(quán)謀私之嫌。無奈,只好選擇3個代表來穿“尿童牌”開檔褲了,呵呵。

19樓: >>參與討論
hotpower
睡覺前要倒塌地說一句:“尿童牌”應(yīng)該要進(jìn)行商標(biāo)保護(hù)了~~~
"倒塌"估計(jì)也要申請了~~~

20樓: >>參與討論
HWM
有這么復(fù)雜嗎
顯然是上拉電阻未加的原因拉,加兩個5.1K的上拉電阻,該用的就別省拉。

21樓: >>參與討論
xwj
竟然不接上拉電阻~~~程序匠人犯這么低級的錯誤實(shí)在該打PiGu!
 
22樓: >>參與討論
程序匠人
暈,我可是用了CPU內(nèi)部上拉電阻
 
23樓: >>參與討論
農(nóng)民講習(xí)所
不能相信CPU內(nèi)部上拉電阻
它的特性和電阻有區(qū)別

24樓: >>參與討論
hq_y
很早以前記得,集成電路的電阻是等效電阻
 
25樓: >>參與討論
HWM
一般51中的“上拉電阻”是非純線性的。
為了改善波形的上升沿,建議外加5.1K左右的上拉電阻。

26樓: >>參與討論
lyjian
看來確實(shí)是“程序匠人”
 
27樓: >>參與討論
NE5532
如果離得近,內(nèi)建上拉也未嘗不可。
要看數(shù)據(jù)是錯成什么樣的,上拉、中斷、電源都得懷疑,如果是錯成0xFF,電源就很值得懷疑。

28樓: >>參與討論
binbinwb
呵呵
功能還挺多

29樓: >>參與討論
kasedy
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
kasedy說得在理~~~
WP不用確實(shí)可惜,若IO缺少時,可將其與RST連接,當(dāng)然非51的RST估計(jì)要加個非門之類的.
有時也要采用多備份的手段.

31樓: >>參與討論
IceAge
咳,程序匠人沒有弱到不考慮上拉的地步。
即便是 8051 內(nèi)部上拉基本上夠了。
如果是 pic mcu,可以用 口線 充當(dāng) 24cxx 的電源, 51 得用三極管,基本上可以避免被改寫, 在配合校驗(yàn)+備份。

再次頂 kasedy。 

32樓: >>參與討論
hotpower
哈哈~~~匠人應(yīng)該在脫條褲頭,不知現(xiàn)在剩什么了~~~
哈哈~~~

33樓: >>參與討論
computer00
哈哈~~~偶的褲子收到了~~~
這么容易就混到一條褲子呀~~~~希望匠人以后多弄幾個這樣得帖子~~~~

34樓: >>參與討論
tj_zhaozq
看了幾位大蝦的,對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
講得好復(fù)雜啊..
應(yīng)該搞好定保護(hù)就行了吧

36樓: >>參與討論
river1972
我遇到過
因?yàn)镸CU的內(nèi)部上拉電阻通常都為100K以上,如果PCB LAYOUT的時候不是很好,會出現(xiàn)寫數(shù)據(jù)出錯的情況!建議還是在外部加上10K的電阻,還沒發(fā)現(xiàn)有問題的情況

37樓: >>參與討論
hotpower
長線通信最好用雙絞線(帶屏蔽最好),串并電阻及電容
頻率也要悠著點(diǎn)~~~

38樓: >>參與討論
NE5532
I2C總線最好不要引出電路板,本來就是板上級的總線
單片機(jī)內(nèi)上拉是個范圍,不是定值。

39樓: >>參與討論
computer00
我用電腦并口模擬I2C總線主機(jī),
通過并口延長線、三極管做的轉(zhuǎn)接板(將輸出口轉(zhuǎn)成OC,然后再連到輸入口),再用雙絞線連到開發(fā)板上,做成ISP燒寫器,照樣跑得很歡快~~~~~不會出錯。

40樓: >>參與討論
grad
1
1

41樓: >>參與討論
f6906
WP接在MCU的RST端----我四年前采用的方法
WP接在MCU的RST端(指8031等高電平復(fù)位的,效果比1好,特別在外接如MAX813等專用復(fù)位芯片情況下,還未發(fā)現(xiàn)被意外改寫);

外部上拉不一定有效,ATMEL還建議采用2.0--2.4K的電阻呢。

42樓: >>參與討論
winhiwang
多半是由于程序在上下電時跑飛造成的
   上下電時,當(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
8*8Led+M07088A/B
和大家共享!

http://bbs.21ic.com/upfiles/img/200611/2006112716268698.rar

44樓: >>參與討論
電子塵埃
hotpower高手果然不同凡響,當(dāng)然別的也是高手,服。
hotpower多多發(fā)發(fā)貼呀,像農(nóng)民大哥那樣搞幾篇教程上去呀,當(dāng)然能出本書最好不過了。高人高人,幾句話讓我進(jìn)步了不少。

45樓: >>參與討論
電子塵埃
絕對要為hotpower加精
 
46樓: >>參與討論
pigjiang
盼望早日穿上屬于自己的開檔褲
 
47樓: >>參與討論
mbutterfly
開襠褲是什么啊
 
48樓: >>參與討論
computer00
不會吧……樓上被忽悠得不行了……找不到南北~~~開襠褲呀~~
 
49樓: >>參與討論
hunter01
我也節(jié)約了兩個電阻,多少年來從未發(fā)現(xiàn)讀寫出錯呀
估計(jì)是匠人電源問題,不過各廠家驅(qū)動能力也不同.我用WINBONDPHILIPS

* - 本貼最后修改時間:2006-11-28 20:06:55 修改者:hunter01

50樓: >>參與討論
hq_y
我想跟單片機(jī)有關(guān)系,不同廠家的單片機(jī)驅(qū)動能力和抗干擾能力
都不一樣;
但是在設(shè)計(jì)的時候還是加上去的好;

51樓: >>參與討論
guojian6
用鐵電吧,同樣的電路和程序,加了上拉,時序相當(dāng)?shù)?br>   鐵電沒有出過問題,AT24系列出過2次問題,原因不明,損失很大,再也不用了。

52樓: >>參與討論
John_light
做個記號會不會有人鄙視?
 
53樓: >>參與討論
lixun00
學(xué)習(xí)了,
 
54樓: >>參與討論
lijay
收藏
 
55樓: >>參與討論
小海米
求助!ATT7022B及spi通訊
求助!!
有誰用過ATT7022B這個芯片?它與單片機(jī)的通訊方式為SPI,誰有調(diào)通的SPI接口源代碼?或者有調(diào)試此接口代碼方法也行?謝謝!

56樓: >>參與討論
毛毛蟲姑娘
我以前也吃過24C的苦頭。用24C01A
也是在上電的時候,數(shù)據(jù)被改,主要是上電的時候電源抖動引起。
后來采用這樣的處理:
把A0、A1、A2和GND連接起來(只有一片24C)接CPU的IO口,用讀寫24C的時候給低電平。這樣就好了。
不過用了一段時間,還是改用93C芯片了,感覺這個要可靠得多,因?yàn)樗闹噶钣斜容^復(fù)雜的前導(dǎo)指令。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
LPC2138問題
有關(guān)ds18b20的應(yīng)用
請問存儲器翻頁和進(jìn)程切換有沖突怎么避免?
一個單片機(jī)的中斷問題,提醒大家注意。
關(guān)于CPU發(fā)熱問題
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號