久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7660|回復: 26
打印 上一主題 下一主題
收起左側

單片機EEPROM 24C02 不能寫入奇數,請高手解答

  [復制鏈接]
跳轉到指定樓層
樓主
在向EEPROM 24c02 寫數據時出現一個怪事,向一個地址寫入偶數如:2、4、6...,可以寫入,并且可以讀出,但是寫入奇數如:1、3、5...,則不能寫入,讀出的數還是以前的數據,不知為啥,請高手解答,謝謝!!!!

單片機程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit scl=P2^1;
sbit sda=P2^0;

void delay()
{;;}

void delay_ms(uint j)
{
        uint i;
        for(j;j>0;j--)
                for(i=110;i>0;i--);
}



void IIC_init()          //IIC初始化
{
        scl=1;
        sda=1;
}

void IIC_start()  //IIC開始信號
{
        scl=1;
        sda=1;
        delay();
        sda=0;
        delay();
}

void IIC_stop()                //IIC終止
{
        scl=1;
        sda=0;
        delay();
        sda=1;
        delay();
}

void IIC_check()                   //查看IIC器件是否應答
{
        scl=1;
        delay();
        while(sda);
        delay();  
        scl=0;        
}

void IIC_w_bite(uchar bite)                 //向IIC器件寫1比特數據
{
        uchar i;
        for(i=8;i>0;i--)
        {
                scl=0;
                delay();
                bite=bite<<1;
                sda=CY;               
                delay();
                scl=1;
                delay();
                scl=0;
        }
}

uchar IIC_r_bite()                 //讀取IIC器件1比特數據
{
        uchar i,dd;
        for(i=8;i>0;i--)
        {
                scl=1;
                delay();
                dd=dd<<1|sda;
                delay();
                scl=0;
                delay();                        
        }
        return dd;        
}

void main()
{
        IIC_init();
        IIC_start();
        IIC_w_bite(0xa0);                //尋址并發送給IIC器件準備寫數據
        IIC_check();                                //應答
        IIC_w_bite(0x1);                //發送存儲器存儲地址
        IIC_check();
        IIC_w_bite(0x2);                //發送要給IIC器寫入的數據
        IIC_check();
        IIC_stop();

        delay_ms(5);

        IIC_start();
        IIC_w_bite(0xa0);          //尋址并發送給IIC器件準備寫數據
        IIC_check();                          //應答
        IIC_w_bite(0x1);          //發送存儲器存儲地址
        IIC_check();
        IIC_start();
        IIC_w_bite(0xa1);          //發送信息給IIC準備讀數據
        IIC_check();
        P1=IIC_r_bite();          //讀數據到P1口
        IIC_stop();
        while(1);
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:111634 發表于 2018-3-18 16:04 | 只看該作者
換一片24c02試試
回復

使用道具 舉報

板凳
ID:293590 發表于 2018-3-18 16:11 | 只看該作者
24C02應該是很簡單的的,建議樓主不要自己寫,網上找一大堆例子
回復

使用道具 舉報

地板
ID:284522 發表于 2018-3-18 16:47 | 只看該作者
24c02是好的,用另一個程序就可以,兩個程序比較也沒找出問題
回復

使用道具 舉報

5#
ID:111634 發表于 2018-3-18 19:15 | 只看該作者
本帖最后由 zl2168 于 2018-3-18 19:20 編輯

實例49  讀寫AT24C02
Proteus仿真一下,確認有效。
實例49 讀寫IIC AT24C02.rar (38.96 KB, 下載次數: 22)

有關AT24Cxx頁寫緩沖的概念說明如下:
由于E2PROM的半導體工藝特性,對E2PROM的寫入時間需要5~10ms,但AT24Cxx系列串行E2PROM芯片內部設置了一個具有SRAM性質的輸入緩沖器,稱為頁寫緩沖器。CPU對該芯片寫操作時,AT24Cxx系列芯片先將CPU輸入的數據暫存在頁寫緩沖器內,然后,慢慢寫入E2PROM中。因此,CPU對AT24Cxx系列E2PROM一次寫入的字節數,受到該芯片頁寫緩沖器容量的限制。頁寫緩沖器的容量為16B,若CPU寫入字節數超過芯片頁寫緩沖器容量,應在一頁寫完后,隔5~10ms重新啟動一次寫操作。

以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

6#
ID:111634 發表于 2018-3-18 19:17 | 只看該作者
本帖最后由 zl2168 于 2018-3-18 19:19 編輯

實例50  非零地址讀寫AT24C02
上節已提到AT24Cxx頁寫緩沖的特性,需要補充說明的是,一次寫入AT24Cxx字節數不但不能超過芯片頁寫緩沖器容量,而且,若不是從頁寫緩沖器頁內零地址0000寫起,一次寫入地址不能超出頁內最大地址1111。例如,若從頁內地址0000寫起,一次最多可寫16字節;若從頁內地址0010寫起,一次最多只能寫16-2=14字節。若要寫16字節,超出頁內地址1111,將會引起地址翻卷,導致出錯。因此,本例16字節從AT24C02 5BH開始寫起,須分兩次寫入。第1次寫0x5b0x5f單元,第2次寫0x600x62單元,中間還必須有頁寫延時。
實例50 非零地址讀寫AT24C02.rar (39.09 KB, 下載次數: 28)

回復

使用道具 舉報

7#
ID:726437 發表于 2020-4-23 20:48 | 只看該作者
我也遇到了這樣的問題,剛解決,24c02寫入是需要時間的,叫寫入周期Twr,寫入的字節并沒有立即寫入儲存器,而是暫時儲存到了另一個地方,寫入存儲器還需要一段時間(即Twr),寫完一個字節后需延時Twr,這段時間是比較長的。
回復

使用道具 舉報

8#
ID:729164 發表于 2020-4-24 10:11 | 只看該作者
24C02是2K的i2c,看是模擬的還是外設的i2c,ARM的外設i2c操作起來有時會出問題,建議試試模擬i2c方式。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

9#
ID:423923 發表于 2021-3-31 13:59 | 只看該作者
不管讀寫,都要延時,不然導致波形不對,在寫完一字節后,馬上讀出也不行,我仿真搞了好久才明白,寫進后馬上讀出就出現問題

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:63304 發表于 2021-8-2 14:09 | 只看該作者
dsy5555 發表于 2021-3-31 13:59
不管讀寫,都要延時,不然導致波形不對,在寫完一字節后,馬上讀出也不行,我仿真搞了好久才明白,寫進后馬 ...

讀不需要延時,不要用仿真
回復

使用道具 舉報

11#
ID:973639 發表于 2021-10-20 18:00 | 只看該作者
banqiao 發表于 2018-3-18 16:47
24c02是好的,用另一個程序就可以,兩個程序比較也沒找出問題

我用24c02寫數據時也出現了一樣的問題(寫奇數寫無效,寫偶數正常,時延設的是10ms,應該不是時延的問題),樓主目前解決了嗎?望告知。另外,如果還有的話,能把成功寫奇數程序發我看一下嗎。
回復

使用道具 舉報

12#
ID:975089 發表于 2021-10-26 14:39 | 只看該作者
樓主解決了嗎,我也遇到了
回復

使用道具 舉報

13#
ID:517389 發表于 2021-11-1 18:31 | 只看該作者
void IIC_stop()                 //IIC終止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
把原來的IIC終止子程序改為這樣就行了。
回復

使用道具 舉報

14#
ID:976819 發表于 2021-11-1 21:06 | 只看該作者
不管讀寫,都要延時,不然導致波形不對,在寫完一字節后,馬上讀出也不行,我仿真搞了好久才明白,寫進后馬上讀出就出現問題
回復

使用道具 舉報

15#
ID:885453 發表于 2021-11-1 21:55 | 只看該作者
寫數據之前要先把以前的數據擦除,再寫新數據才不會出錯
回復

使用道具 舉報

16#
ID:399179 發表于 2021-11-29 20:55 來自手機 | 只看該作者
你們怎么解決的?我也遇到這樣的問題了,有的能寫入有的不能
回復

使用道具 舉報

17#
ID:365802 發表于 2021-11-30 13:41 | 只看該作者
我之前也遇到過這個問題, 后來發現時延時的問題.
http://www.zg4o1577.cn/bbs/dpj-151160-1.html
回復

使用道具 舉報

18#
ID:81196 發表于 2021-11-30 17:11 | 只看該作者
IIC操作,只要出了問題,肯定是IIC的時序不對,自己找問題就行了,對照時序表查看。
回復

使用道具 舉報

19#
ID:796012 發表于 2021-12-7 14:46 | 只看該作者
片內要提升電壓到20V左右
回復

使用道具 舉報

20#
ID:1004043 發表于 2022-2-4 00:31 | 只看該作者
ybftl 發表于 2021-11-1 18:31
void IIC_stop()                 //IIC終止
{
sda=0;

解決了我的問題謝謝
回復

使用道具 舉報

21#
ID:1031851 發表于 2022-6-2 20:55 | 只看該作者
ybftl 發表于 2021-11-1 18:31
void IIC_stop()                 //IIC終止
{
sda=0;

牛比牛比牛比
回復

使用道具 舉報

22#
ID:139866 發表于 2022-6-3 10:20 | 只看該作者
直接用示波器采集波形,對照時序圖分析,比在這讓人給你猜原因快得多
回復

使用道具 舉報

23#
ID:1031962 發表于 2022-6-3 13:30 | 只看該作者
AT24Cxx系列芯片先將CPU輸入的數據暫存在頁寫緩沖器內,然后,慢慢寫入E2PROM中。因此,CPU對AT24Cxx系列E2PROM一次寫入的字節數,受到該芯片頁寫緩沖器容量的限制。頁寫緩沖器的容量為16B,若CPU寫入字節數超過芯片頁寫緩沖器容量,應在一頁寫完后,隔5~10ms重新啟動一次寫操作。
回復

使用道具 舉報

24#
ID:1064915 發表于 2023-4-19 15:16 | 只看該作者
用Proteus仿真,不用買開發板了?
回復

使用道具 舉報

25#
ID:420836 發表于 2023-4-20 09:10 | 只看該作者
奇數與偶數對EEPROM芯片沒有區別,是否嘗試在代碼中將奇數與偶數切換?
回復

使用道具 舉報

26#
ID:1065084 發表于 2023-4-20 09:49 | 只看該作者

看看你寫的錯誤:
void IIC_stop()                //IIC終止
{
        scl=1;
        sda=0;
        delay();
        sda=1;
        delay();
}
如果你的數據為偶數 即最后一位為0,程序執行正常
如果,你數據為奇數,你最后一位為1 那 執行就是 sda=1;scl=1;sda=0;是不是和起始信號一樣?

讓你去學習,你就非要自己閉門造車,如果你自己寫的程序我敬你是個漢子,如果你抄的別人的我建議你給他一巴掌,如果是你照葫蘆畫瓢畫出來的,建議你給自己兩巴掌
回復

使用道具 舉報

27#
ID:996773 發表于 2023-4-20 13:25 | 只看該作者
看了一下要笑死,一個24c02基礎東西都玩的五花八門,有提高電壓的,有先擦后寫的

還有直接仿真的,難道你們的產品都是在仿真上想出來的嗎。還有抄的,這個程序

還要抄,以后還能做啥大工程,樓主的問題更離譜:非得去寫奇數或偶數,寫00000000

不行嗎,寫11111111不行嗎。我這個匯編兩年的新手要被你們笑死,不說了,送外賣了,要超時了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色一情一乱一伦一区二区三区 | 91免费看片 | 久久极品 | 精品一区二区三区四区外站 | www97影院| 欧美日韩国产精品激情在线播放 | 久久综合伊人一区二区三 | 欧美日韩视频在线第一区 | 亚洲视频在线观看 | 国内自拍视频在线观看 | 亚洲福利在线视频 | 久久91精品国产一区二区三区 | 久久久久国产一区二区三区四区 | 夜夜夜夜夜夜曰天天天 | av在线二区 | 一区二区三区国产 | 狠狠色香婷婷久久亚洲精品 | 欧美精品一区二区蜜桃 | 日韩在线观看精品 | 中文字幕在线视频免费视频 | 国产一区二区三区在线观看免费 | 中文字幕 国产 | 欧美日韩一区二区在线 | 久久久精品影院 | 精品久久久久久中文字幕 | 欧美在线视频一区二区 | 国产精品999| 手机在线观看 | 美日韩免费视频 | 亚洲天堂网站 | 亚洲国产精品99久久久久久久久 | 3级毛片| 国产一区不卡 | 国精产品一区一区三区免费完 | 亚洲精品电影 | 完全免费在线视频 | 国产一区二区在线免费观看 | 在线免费看黄 | 日韩在线国产 | 夜夜骚 | 国产欧美一区二区三区久久手机版 |