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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5906|回復(fù): 14
收起左側(cè)

I2C通訊主機(jī)隨便發(fā)個(gè)AT24C02的設(shè)備地址都能讀取數(shù)據(jù)是怎么回事?

[復(fù)制鏈接]
ID:467739 發(fā)表于 2019-7-25 15:37 | 顯示全部樓層 |閱讀模式
STC89C52和AT24C02進(jìn)行I2C通訊時(shí),STC89C52主機(jī)向從機(jī)AT24C02隨便發(fā)個(gè)設(shè)備地址,都能讀寫數(shù)據(jù),是怎么回事喔?
具體情況:我的AT24C02的設(shè)備地址線A0 A1 A2都接地了的,數(shù)據(jù)手冊(cè)上說(shuō)的AT24C02的設(shè)備地址格式:(前四位固定)1010 A2 A1 A0 R/W,由于AT24C02的A0 A1 A2引腳我都在硬件上接地了的,正常情況我在進(jìn)行讀寫數(shù)據(jù)時(shí),發(fā)送的設(shè)備地址應(yīng)該為(0xa0+R/W), 但是現(xiàn)在我在程序上隨意改變?cè)O(shè)備地址的值(也就是A2 A1 A0的值),都能讀寫數(shù)據(jù)成功。
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2019-7-25 21:58 | 顯示全部樓層
看看你程序里應(yīng)答部分是怎么寫的
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2019-7-26 09:18 | 顯示全部樓層
當(dāng)你序讀取每一位的時(shí)候,總會(huì)認(rèn)定的一個(gè)值,非0即1!
只不過(guò)讀到的0/1是不是“目標(biāo)設(shè)備”發(fā)出來(lái)的,就不好說(shuō)了。
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-7-30 14:05 | 顯示全部樓層
cjm82 發(fā)表于 2019-7-25 21:58
看看你程序里應(yīng)答部分是怎么寫的

/**
  * @brief  主機(jī)檢測(cè)從機(jī)應(yīng)答
  * @param  none
  * @retval return(1)應(yīng)答,return(0)非應(yīng)答
  */
bit Test_ACK()
{
        SCL=1;                         //拉高SCL線
        Delay_5us();
        if(SDA==1)                         //如果為1,則非應(yīng)答
        {
                SCL=0;                 //拉低SCL線,使SDA線可以發(fā)送停止信號(hào)
                _nop_();
                I2C_Stop();           //發(fā)送停止信號(hào)
                return (0);           //非應(yīng)答
        }
        else
        {
                SCL=0;                   //拉低SCL線
                _nop_();
                return (1);                //應(yīng)答
        }               
}
應(yīng)答程序部分就是這樣寫的,隨便發(fā)個(gè)設(shè)備地址(A0A1A2三個(gè)引腳都接地了的),發(fā)現(xiàn)SDA都會(huì)被拉低。
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-7-30 18:59 | 顯示全部樓層
yzwzfyz 發(fā)表于 2019-7-26 09:18
當(dāng)你序讀取每一位的時(shí)候,總會(huì)認(rèn)定的一個(gè)值,非0即1!
只不過(guò)讀到的0/1是不是“目標(biāo)設(shè)備”發(fā)出來(lái)的,就不 ...

不能確定是不是目標(biāo)設(shè)備發(fā)出的0/1, 我總線上就用了一個(gè)AT24C02芯片,這樣是不是可以懷疑是芯片有問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-7-31 08:41 | 顯示全部樓層
芯片有問(wèn)題的情況并不多
你得寫一個(gè)驗(yàn)證的程序,兩個(gè)按鍵:寫入并顯示,讀取并顯示,地址可以是固定的某個(gè)地址
先向一個(gè)地址寫入一個(gè)數(shù)據(jù)并顯示
然后,斷電,開機(jī),不要寫入,直接讀取,數(shù)據(jù)是對(duì)的話,你的IIC代碼就是對(duì)的
驗(yàn)證好程序之后,其它的再說(shuō)
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-3 10:07 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-7-31 08:41
芯片有問(wèn)題的情況并不多
你得寫一個(gè)驗(yàn)證的程序,兩個(gè)按鍵:寫入并顯示,讀取并顯示,地址可以是固定的某個(gè) ...

你好,我用程序驗(yàn)證時(shí),在I2C總線上只用一個(gè)AT24C02芯片,用的模擬I2C通訊;先寫入一個(gè)數(shù)據(jù)到一個(gè)固定的地址,然后讀取并顯示在數(shù)碼管上,下載運(yùn)行時(shí)發(fā)現(xiàn)讀取的結(jié)果正常,斷電再上電,結(jié)果依然正常,然后去掉寫入數(shù)據(jù)程序部分,只留下讀取數(shù)據(jù)程序部分,再下載到開發(fā)板,發(fā)現(xiàn)讀取的數(shù)據(jù)還是和之前寫入的一樣,斷電再上電,讀取結(jié)果依然正常,<<同時(shí)我又嘗試將發(fā)送的器件地址改變,僅改變A0/A1/A2三位的數(shù)值,使它和硬件上連接的地址不相同,我開發(fā)板上的AT24C02芯片的A0A1A2都接地了的,重復(fù)上面的驗(yàn)證過(guò)程,發(fā)現(xiàn)結(jié)果還是一樣,寫入的數(shù)據(jù)和讀取的數(shù)據(jù)相同, 但是 “將器件地址的高四位,也就是AT24C02固定的那四位1010,
1010 A0 A1 A2 R/W  也改變的話,就會(huì)讀取和寫入失敗。”   >>
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-3 10:09 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-7-31 08:41
芯片有問(wèn)題的情況并不多
你得寫一個(gè)驗(yàn)證的程序,兩個(gè)按鍵:寫入并顯示,讀取并顯示,地址可以是固定的某個(gè) ...

對(duì)了,我用的芯片型號(hào)是,ATMEL 711 24C02 PU27 D
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-8-3 16:22 | 顯示全部樓層
張松松 發(fā)表于 2019-8-3 10:09
對(duì)了,我用的芯片型號(hào)是,ATMEL 711 24C02 PU27 D

你能寫入和讀取,就說(shuō)明讀寫的函數(shù)是正確的了
A0 A1 A2 這幾個(gè)位在多個(gè)24C02并聯(lián)使用時(shí)才會(huì)用到的,在24C02中,你只能改動(dòng)R/W位,其它位是不能動(dòng)的,1010是固定不變的,A0 A1 A2 這個(gè)是和24C02三個(gè)引腳的邏輯對(duì)應(yīng)的,你接地了,就是000了,不能改,改了就找不到地址了
如果你是A0接了高電平,那么這三個(gè)應(yīng)該就是:100
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-8-3 16:24 | 顯示全部樓層
硬件電路上傳看一下了
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2019-8-4 02:32 | 顯示全部樓層
張松松 發(fā)表于 2019-7-30 14:05
/**
  * @brief  主機(jī)檢測(cè)從機(jī)應(yīng)答
  * @param  none

#define SCK_High GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define SCK_Low  GPIO_ResetBits(GPIOA,GPIO_Pin_1)

#define SDA_High GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define SDA_Low  GPIO_ResetBits(GPIOA,GPIO_Pin_3)

#define SCK_read      GPIOA->IDR  & GPIO_Pin_1  
#define SDA_read      GPIOA->IDR  & GPIO_Pin_3  
typedef enum
{
  FALSE = 0,
  TRUE = !FALSE
} bool;

void I2C_delay()  
{     
   u8 i=100;     
   while(i)   
   {   
     i--;   
   }   
}  

bool I2C_Start()  
{  
    SDA_High;  
    SCK_High;  
    I2C_delay();  
    if(!SDA_read)
    {
        return FALSE;   //SDA線為低電平則總線忙,退出  
    }
    SDA_Low;  
    I2C_delay();  
    if(SDA_read)
    {
        return FALSE;   //SDA線為高電平則總線出錯(cuò),退出  
    }
    SDA_Low;  
    I2C_delay();  
    return TRUE;  
}

void I2C_Stop()  
{  
    SCK_Low;  
    I2C_delay();  
    SDA_Low;  
    I2C_delay();  
    SCK_High;  
    I2C_delay();  
    SDA_High;  
    I2C_delay();  
}  

void I2C_Ack()  
{     
    SCK_Low;  
    I2C_delay();  
    SDA_Low;  
    I2C_delay();  
    SCK_High;  
    I2C_delay();  
    SCK_Low;  
    I2C_delay();  
}  

void I2C_NoAck()  
{     
    SCK_Low;  
    I2C_delay();  
    SDA_High;  
    I2C_delay();  
    SCK_High;  
    I2C_delay();  
    SCK_Low;  
    I2C_delay();  
}

bool I2C_WaitAck()   //返回TRUE有ACK,FALSE無(wú)ACK  
{  
    SCK_Low;  
    I2C_delay();  
    SDA_High;            
    I2C_delay();  
    SCK_High;  
    I2C_delay();  
    if(SDA_read)  
    {  
      SCK_Low;  
      return FALSE;  
    }  
    SCK_Low;  
    return TRUE;  
}

void I2C_SendByte(u8 SendByte) //數(shù)據(jù)從高位到低位//  
{  
    u8 i=8;  
    while(i--)  
    {  
      SCK_Low;  
      I2C_delay();  
      if(SendByte&0x80)
      {
        SDA_High;
      }
      else
      {
        SDA_Low;
      }
      SendByte<<=1;  
      I2C_delay();  
      SCK_High;  
      I2C_delay();  
    }  
    SCK_Low;  
}

u8 I2C_ReadByte(void)  //數(shù)據(jù)從高位到低位//  
{   
    u8 i=8;  
    u8 data=0;  
  
    SDA_High;               
    while(i--)  
    {  
      data<<=1;        
      SCK_Low;  
      I2C_delay();  
      SCK_High;  
      I2C_delay();   
      if(SDA_read)  
      {  
        data|=0x01;  
      }  
    }  
    SCK_Low;  
    return data;  
}
//===================24C02 讀寫程序===========================
bool AT24C02_WriteByte(u8 SendByte, u8 Address)  
{         
  if(!I2C_Start())
  {
    return FALSE;                                                           
  }
  I2C_SendByte(0xa0);     
  if(!I2C_WaitAck())  
  {  
    I2C_Stop();   
    return FALSE;  
  }  
  I2C_SendByte(Address);         
  I2C_WaitAck();      
  I2C_SendByte(SendByte);  
  I2C_WaitAck();     
  I2C_Stop();   
  Delay(15);                    //加個(gè)延時(shí)等待寫完

  return TRUE;  
}

bool AT24C02_ReadByte(u8* data,u8 Adress)  
{         
  if(!I2C_Start())                       //如果總線忙,則返回失敗.
    return FALSE;  
  I2C_SendByte(0xa0);            
  if(!I2C_WaitAck())                 //如果沒(méi)有得到應(yīng)答,則返回失敗.
  {  
    I2C_Stop();   
    return FALSE;  
  }  
  I2C_SendByte(Adress);      
  I2C_WaitAck();  
  I2C_Start();  
  I2C_SendByte(0xa1);  
  I2C_WaitAck();  
  *data = I2C_ReadByte();     
  I2C_Stop();  
  return TRUE;  
}  


這個(gè)是我以前學(xué)I2C時(shí)的程序,和24C02的程序,不過(guò)是32的,你稍微改下,用在51也很簡(jiǎn)單,24C02的兩個(gè)函數(shù)也就學(xué)習(xí)的時(shí)候用過(guò)下,后面基本沒(méi)碰過(guò).但前面的I2C程序我用過(guò)好幾次,沒(méi)發(fā)現(xiàn)問(wèn)題.你可以參考下.
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-5 21:58 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-8-3 16:24
硬件電路上傳看一下了

這是我開發(fā)板上的AT24C02電路圖
電路圖.png
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-5 22:30 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-8-3 16:22
你能寫入和讀取,就說(shuō)明讀寫的函數(shù)是正確的了
A0 A1 A2 這幾個(gè)位在多個(gè)24C02并聯(lián)使用時(shí)才會(huì)用到的,在24 ...

我在面包板上接了兩個(gè)AT24C02也試了下的,兩片AT24C02芯片的硬件地址A0A1A2設(shè)置為不同,我在程序上分別向兩塊芯片發(fā)送數(shù)據(jù),也是上面那種現(xiàn)象,A0A1A2隨意改變,都能向芯片正確寫入數(shù)據(jù),并且正確讀出。   
      同時(shí)我又發(fā)現(xiàn)一個(gè)詭異的現(xiàn)象,就是向第一塊芯片的一個(gè)固定地址(程序里我選的儲(chǔ)存地址是0x01,比如寫個(gè)數(shù)據(jù)為0x27)寫入數(shù)據(jù),但是我沒(méi)有向第二塊芯片的儲(chǔ)存地址0x01寫入數(shù)據(jù),接下來(lái)我直接讀第二塊芯片儲(chǔ)存地址0x01里的數(shù)據(jù),讀出來(lái)的數(shù)據(jù)居然和我剛剛向第一塊芯片儲(chǔ)存地址0x01寫入的數(shù)據(jù)相同(為了避免巧合我多次改變向第一塊芯片寫入的數(shù)據(jù),發(fā)現(xiàn)實(shí)驗(yàn)現(xiàn)象和上面相同),也就是在向一塊芯片寫入數(shù)據(jù)時(shí),兩塊芯片的相同儲(chǔ)存地址里的內(nèi)容都被寫入數(shù)據(jù)了(A0A1A2隨意改變也是這樣)。
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-5 22:31 | 顯示全部樓層
cjm82 發(fā)表于 2019-8-4 02:32
#define SCK_High GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define SCK_Low  GPIO_ResetBits(GPIOA,GPIO_Pin_1) ...

好的,thank you!!
回復(fù)

使用道具 舉報(bào)

ID:467739 發(fā)表于 2019-8-5 22:51 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-8-3 16:22
你能寫入和讀取,就說(shuō)明讀寫的函數(shù)是正確的了
A0 A1 A2 這幾個(gè)位在多個(gè)24C02并聯(lián)使用時(shí)才會(huì)用到的,在24 ...

感謝你的耐心回復(fù)喔!不準(zhǔn)備糾結(jié)這個(gè)問(wèn)題了,感覺(jué)還是我買的芯片有問(wèn)題,后面有機(jī)會(huì)再換換芯片試試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人在线观看中文字幕 | 欧美日韩在线成人 | 天天天久久久 | 成人h电影在线观看 | 午夜影院在线观看 | 免费一区二区三区 | 自拍偷拍第一页 | 嫩草一区二区三区 | 人操人人干人 | 国产精品久久在线观看 | 欧美日韩免费视频 | 天天射色综合 | 一区二区三区免费观看 | a视频在线观看 | 精品中文字幕一区二区三区 | 成人精品区 | 中文字幕免费在线 | 欧美黄色大片在线观看 | 欧美午夜视频 | 精品久久久久一区二区国产 | 欧美亚洲在线 | 成人在线不卡 | 精品久久久久久久人人人人传媒 | 精品欧美一区二区久久久伦 | 成人精品国产免费网站 | 天天爽综合网 | 婷婷国产一区 | 亚洲一区二区黄 | 美女艹b | 黑人一级片视频 | 91亚洲国产成人久久精品网站 | 国产欧美在线 | 狠狠色综合久久婷婷 | 在线精品一区 | 亚洲午夜精品一区二区三区他趣 | 怡红院成人在线视频 | 蜜桃黄网 | 国产欧美一区二区三区日本久久久 | 中文字幕一区二区三区四区五区 | 亚洲一区二区久久 | 欧美性受 |