欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 求指點:單片機向EEPROM內(nèi)寫入一個數(shù),然后再把他讀出來驗證寫入成功。但結(jié)果是255 [打印本頁]

作者: Amlee    時間: 2020-3-15 14:05
標題: 求指點:單片機向EEPROM內(nèi)寫入一個數(shù),然后再把他讀出來驗證寫入成功。但結(jié)果是255
求大神指點:我想向EEPROM內(nèi)寫入一個數(shù),然后再把他讀出來驗證寫入成功,以此來學習IIC通訊協(xié)議的用法。但是讀出來的結(jié)果是255,不管怎么調(diào)試都沒用。哪位高手有邏輯分析儀能幫我看看是哪里出錯了嗎?

單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define At24c02ADDR 0xa0                             //At24c02EEPROM地址宏定義
#define I2cWrite 0
#define I2cRead 1
sbit SCL=P2^1;
sbit SDA=P2^0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,                        //編碼表
                    0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71,0x00     };
bit AcKFlag;
uchar bai,shi,ge;
void delay(uint z)                   //定義 延時函數(shù)
{
uint x,y;
for(x=0;x<100;x++)
         for(y=0;y<z;y++);
}

void delay5us()                  //定義  延時函數(shù)
{
_nop_();
}

void I2Cstart()                 //定義  起始信號函數(shù)
{
SDA=1;
SCL=1;
delay5us();
SDA=0;
delay5us();
}

void I2Cstop()                 //定義  停止信號函數(shù)
{
SCL=0;
SDA=0;
SCL=1;
delay5us();
SDA=1;
delay5us();
}

bit ReadAck()                //定義  主機讀從機應答信號函數(shù)
{
SCL=0;
SCL=1;                           
delay5us();
if(SDA)
{                                         //非應答
          SCL=0;                         //拉低SCL(據(jù)波形圖)
        return(1);
}
else
{
  SCL=0;
  return(0);
}


}

void SendAck(bit i)          //定義  主機發(fā)送應答
{
SCL=0;
if(i)
         SDA=1;
else
         SDA=0;
SCL=1;                                  //SCL拉高,讀取數(shù)據(jù)
delay5us();                  //延時保持數(shù)據(jù)穩(wěn)定
SCL=0;                                  //SCL拉低占用總線繼續(xù)通信
SDA=1;                                  //釋放sda         ,否則主機會一直占用sda
}

void I2cSendByte(uchar DAT)        //定義 寫入數(shù)據(jù)操作邏輯函數(shù)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                 SCL=0;
                delay5us();
                if(DAT&0x80)
                        SDA=1;
                else
                        SDA=0;
                SCL=1;
                delay5us();
                DAT<<=1;
        }
        SCL=0;                                    //拉低時鐘總線,繼續(xù)通信
        SDA=1;                                   //釋放數(shù)據(jù)總線,允許其他設備傳遞數(shù)據(jù)
}

void At24c02write(uchar ADDR,DAT)        //定義  寫入函數(shù)
{
  I2Cstart();                                  //起始信號
  I2cSendByte(At24c02ADDR+I2cWrite);  //發(fā)送從機地址+寫信號
          if(ReadAck())
           AcKFlag=1;           //主機讀應答信號:結(jié)果為無應答
          else
           AcKFlag=0;           //主機讀應答信號:結(jié)果為有應答
  I2cSendByte(ADDR);           //調(diào)用寫入數(shù)據(jù)操作邏輯函數(shù):發(fā)送想要寫入的內(nèi)存地址
          if(ReadAck())
           AcKFlag=1;           
          else
           AcKFlag=0;           
  I2cSendByte(DAT);           //調(diào)用寫入數(shù)據(jù)操作邏輯函數(shù):發(fā)送要寫入的數(shù)據(jù)
             if(ReadAck())
           AcKFlag=1;           
          else
           AcKFlag=0;
  I2Cstop();                      //停止信號
}

uchar I2cReadByte()           //讀取從機內(nèi)存數(shù)據(jù)邏輯子函數(shù)
{
uchar i,DAT;
for(i=0;i<8;i++)
         {
          DAT<<=1;
          SCL=0;                   //讀數(shù)據(jù)時SDA由從機控制,主機只要控制scl時序,接收sda上的數(shù)據(jù)即可
          SCL=1;
          if(SDA)
                  DAT|=0x01;
          delay5us();
        }
return(DAT);
}

uchar At24c02Read(uchar ADDR)  //定義  讀出函數(shù)
{
  uchar DAT;
  I2Cstart();                                  //起始信號
  I2cSendByte(At24c02ADDR+I2cWrite);  //發(fā)送從機(EEPROM)地址+寫信號(此處發(fā)寫信號是為了發(fā)送想要讀取的內(nèi)存單元的地址)
          if(ReadAck())
           AcKFlag=1;           //主機讀應答信號:結(jié)果為無應答
          else
           AcKFlag=0;           //主機讀應答信號:結(jié)果為有應答
  I2cSendByte(ADDR);           //發(fā)送想要讀的內(nèi)存地址
  ReadAck();                             //主機讀應答信號(不管是否應答)
  I2Cstart();                   //重復起始信號
  I2cSendByte(At24c02ADDR+I2cRead);  //發(fā)送從機地址+讀信號
  if(ReadAck())                   //判斷應答信號
           AcKFlag=1;           
          else
           AcKFlag=0;
  DAT=I2cReadByte();   //調(diào)用 讀取從機內(nèi)存數(shù)據(jù)邏輯子函數(shù) 讀一個字節(jié)
  SendAck(1);                   //主機發(fā)送應答信號:非應答(非應答函數(shù)內(nèi)包括,占用總線繼續(xù)通信與釋放數(shù)據(jù)總線允許其他設備調(diào)用的信號,故調(diào)用的子函數(shù)內(nèi)部不必寫
  I2Cstop();                   //發(fā)送停止信號
  return(DAT);                   //返回函數(shù)值
}

void display(uchar num)
{

bai=num/100;
shi=num%100/10;
ge=num%10;

while(1)
{
                wela=1;
                P0=0xdf;
                wela=0;
        dula=1;
                P0=table[bai];
                dula=0;
                        P0=0xff;
                delay(3);

        
                dula=1;
                P0=table[shi];
                dula=0;
                        P0=0xff;
                wela=1;
                P0=0xbf;
                wela=0;
                delay(3);

        
                dula=1;
                P0=table[ge];
                dula=0;
                        P0=0xff;
                wela=1;
                P0=0x7f;
                wela=0;
                delay(3);
}
}
void main()
{
At24c02write(0x02,6);
delay5us();
delay5us();                           //延時一會,待從機將先前接收的數(shù)據(jù)處理完畢,否則可能會讀取失敗
display(At24c02Read(0x02));
while(1);

}


作者: csmyldl    時間: 2020-3-15 17:39
讀出是255,證明是數(shù)據(jù)未寫進去,重點檢查寫入程序
作者: eastjack    時間: 2020-3-16 08:31
用示波器看i2c時序?qū)崿F(xiàn)對不對
作者: 3ABC    時間: 2020-3-16 17:23
可能是讀寫時序沒處理好吧,建議換匯編語言來處理這部分程序,可能更精準些。
作者: xianming    時間: 2020-3-19 12:52
可能是應答出了問題
作者: hi毀人不倦    時間: 2020-3-19 14:01
數(shù)據(jù)超過了?
作者: Kingsely    時間: 2020-3-20 09:49
這個是時序不對,利用示波器/邏輯分析儀檢查波形,根據(jù)手冊說明調(diào)整時序即可
作者: cheney03    時間: 2020-9-17 13:58
有可能是時序有問題,時序必須嚴格對照數(shù)據(jù)手冊
作者: 飛天芭蕾    時間: 2021-8-13 14:40
時序問題,可采用示波器復現(xiàn)修正
作者: sustlixin    時間: 2021-8-14 09:30
這個讀寫函數(shù),我自己寫過,你按著時序?qū)懥耍缓笥檬静ㄆ骺匆幌拢杏X不是很難的
作者: 貴庚子    時間: 2021-9-2 09:37
你把時間多延遲一會,就是寫入數(shù)據(jù)后,延遲時間稍微長一點,再讀取數(shù)據(jù)
作者: 188610329    時間: 2021-9-2 14:54
首先IIC必須用上拉電阻,其次,Eeprom的寫保護,要確保關閉。最后,確認一下設備地址,是否正確?
作者: shumivan    時間: 2021-9-13 11:48
肯定是時序的問題了,
作者: sgd985437    時間: 2021-9-13 14:27
1、檢查IO口置高置低是否正常,萬用表量一下。
2、檢查IO口的讀是否正常,是否能讀到0   1  電平。
3、單片機如果不是準雙向,需要在讀之前設置為輸入,讀之后立刻設置為輸出。
4、還是不行  那就是時序不對  或者延時不對。
作者: 188610329    時間: 2021-9-13 14:36
sgd985437 發(fā)表于 2021-9-13 14:27
1、檢查IO口置高置低是否正常,萬用表量一下。
2、檢查IO口的讀是否正常,是否能讀到0   1  電平。
3、單 ...

此帖 樓主 于2020年 3 月 發(fā)的帖子,至今1年半,只有63黑幣。這種僵尸貼,就沒有必要翻出來回復了吧?而且也不是結(jié)論性的答復,也不會對其他壇友有任何參考價值。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1