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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7418|回復: 18
收起左側

關于I2C與EEPROM地址的問題

  [復制鏈接]
ID:538271 發表于 2019-6-23 21:30 | 顯示全部樓層 |閱讀模式
QQ圖片20190623212543.png

AT24c02地址

AT24c02地址

圖一 為啥說地址為0x50   1010000  如果原型是0101 0000   那最后一位的讀寫位不就沒有了嗎
那如果有讀寫位  A0~A2都接地 應該 位 0xA0 啊
回復

使用道具 舉報

ID:10193 發表于 2019-6-24 07:45 | 顯示全部樓層
讀地址是0Xa0,寫地址是0xa1。
回復

使用道具 舉報

ID:401564 發表于 2019-6-24 08:22 | 顯示全部樓層
圖片上說的是錯的,或者是說不嚴謹,
24C02的讀寫的地址是:0A0H和0A1H
回復

使用道具 舉報

ID:538271 發表于 2019-6-24 10:49 | 顯示全部樓層
Y_G_G 發表于 2019-6-24 08:22
圖片上說的是錯的,或者是說不嚴謹,
24C02的讀寫的地址是:0A0H和0A1H

0A0H是什么= =    不應該是0XA0  或者 0XA1嗎      關鍵這個人寫程序的時候  用了0X50 還尋到了
回復

使用道具 舉報

ID:401564 發表于 2019-6-24 16:56 | 顯示全部樓層
我說的是匯編上,你說是C里面,但編譯好像是通用的
他的程序應該是在寫入的時候是用到了位移了
你看一下輸入函數有沒有位移的語句
回復

使用道具 舉報

ID:401564 發表于 2019-6-24 17:00 | 顯示全部樓層
24C02是一個很常用的IIC器件,你隨便找一下24C02程序,大多都是0XA0  或者 0XA1的
回復

使用道具 舉報

ID:538271 發表于 2019-6-24 21:50 | 顯示全部樓層
Y_G_G 發表于 2019-6-24 17:00
24C02是一個很常用的IIC器件,你隨便找一下24C02程序,大多都是0XA0  或者 0XA1的

void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
{
    do {                       //用尋址操作查詢當前是否可進行讀寫操作
        I2CStart();
        if (I2CWrite(0x50<<1)) //應答則跳出循環,非應答則進行下一次查詢
        {
            break;
        }
        I2CStop();
    } while(1);
    I2CWrite(addr);            //寫入起始地址
    I2CStart();                //發送重復啟動信號
    I2CWrite((0x50<<1)|0x01);  //尋址器件,后續為讀操作
有左移的  但是我看不懂什么意思  
回復

使用道具 舉報

ID:483407 發表于 2019-6-24 21:59 | 顯示全部樓層
0xa0或0xa1,前7位為24C02的器件地址(前4位固定為1010,后3位取決于A2、A1、A0三個引腳在電路中的連接),后1位為讀寫方向。
此圖中,把24C02的地址描述為0x50,沒毛病。讀寫位加到后面,0x50要左移1位,就成了0xa0或0xa1。
至于0x50和0x62,是尋到的什么器件,沒圖,天知道。不過可以確定,決對不是本圖中的24C02。
回復

使用道具 舉報

ID:418269 發表于 2019-6-25 11:05 | 顯示全部樓層
zzh985514474 發表于 2019-6-24 10:49
0A0H是什么= =    不應該是0XA0  或者 0XA1嗎      關鍵這個人寫程序的時候  用了0X50 還尋到了

0x50是24c02地址沒錯,但需要在讀寫操作時<<1,讀地址(0x50<<1),寫地址 (0x50<<1|0x01)
回復

使用道具 舉報

ID:401564 發表于 2019-6-25 11:28 | 顯示全部樓層
zzh985514474 發表于 2019-6-24 21:50
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
{
    do {                ...

我就說他有位移的語句了,沒見過這么扯的
本來讀寫24C02就已經要用位移了,生怕位移多了數據可能會對不上號,他可好,生拉硬扯的搞個0X50這玩意出來
回復

使用道具 舉報

ID:538271 發表于 2019-6-25 11:55 | 顯示全部樓層
wangwing 發表于 2019-6-24 21:59
0xa0或0xa1,前7位為24C02的器件地址(前4位固定為1010,后3位取決于A2、A1、A0三個引腳在電路中的連接), ...

我有完整的程序  但有點長 您介意我單獨私聊你不
回復

使用道具 舉報

ID:538271 發表于 2019-6-25 15:47 | 顯示全部樓層
Y_G_G 發表于 2019-6-25 11:28
我就說他有位移的語句了,沒見過這么扯的
本來讀寫24C02就已經要用位移了,生怕位移多了數據可能會對不 ...

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一個機器周期為1us,最大延時255us。               
        for(a=0;a<8;a++)//要發送8位,從最高位開始
        {
                SDA=dat>>7;         //起始信號之后SCL=0,所以可以直接改變SDA信號
                dat=dat<<1;
                Delay10us();
                SCL=1;
                Delay10us();//建立時間>4.7us
                SCL=0;
                Delay10us();//時間大于4us               
        }

unsigned char I2cReadByte()
        unsigned char a=0,dat=0;
        SDA=1;                        //起始和發送一個字節之后SCL都是0
        Delay10us();
        for(a=0;a<8;a++)//接收8個字節
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();


請問這發送的過程是不是 主機發送DAT這個數據 然后通過SDA的數據線給到從機,那這時不用像讀取函數那樣先給SDA=1嗎?
讀取函數這個的過程 是不是從機通SDA給到主機數據DATA 那這一步dat<<=1; dat|=SDA;什么意思 將data 0000 0000  變為1111 1111 ?,
回復

使用道具 舉報

ID:160500 發表于 2019-6-25 17:08 | 顯示全部樓層
地址0x50是沒錯,你說的那個0xA0、0xA1是加上了讀寫位的。不是一回事
回復

使用道具 舉報

ID:401564 發表于 2019-6-25 17:24 | 顯示全部樓層
dat是一個變量,實際上就是一個地址,而SDA是一個位
l是按位或的運算,而不是或運算
按位或運算只會改變相對應該的位,其它位不變的
如果dat=0000 0000,SDA=1,按位或運算之后就是dat=0000 0001
回復

使用道具 舉報

ID:571958 發表于 2019-6-25 18:52 | 顯示全部樓層
                 SDA=dat>>7;         //起始信號之后SCL=0,所以可以直接改變SDA信號 ,這是發送給slave的。

  那這一步dat<<=1; dat|=SDA  ,這樣一般是 數據左一位,SDA上狀態讀入 dat bit0
  這樣做八次剛好得到1 byte數據
回復

使用道具 舉報

ID:18297 發表于 2019-6-25 20:11 | 顯示全部樓層
這個只是一個認識上的問題。
其實很簡單,1)有人把0xa0(讀)和0Xa1(寫)當作地址,直接發送這兩個。
                  2)例外有人把0X50當成地址,但是發送前先左移一位,(0x50<<1+0)=0xa0(讀)
                      (0x50<<1+1)=0xa1(寫),再發送給EEPROM。
                  看吧,結果都是一樣的。
                 只是程序寫得不同而已。自己明白就好。到底你給發送的是什么?
                 如果你不移位,只發送0x50,就錯了。
回復

使用道具 舉報

ID:483407 發表于 2019-6-25 20:51 | 顯示全部樓層
我的理解:沒有主機,沒有從機。這2個函數,從其名字上來理解,前者功能是向某總線上發送一個字節,后者為從總線上讀一個字節,如此而已(多好的程序呀,向這段代碼的作者致敬)。
建議:如果你要用這個函數,放到自己的程序中能夠實現功能,這就夠了,不必深究;如果你是學習,就想把這段代碼搞明白,那么你要做的有2個,一是把時序整明白,二是。。。。。。。(dat<<=1; dat|=SDA;//dat前移一位,讀總線,把結果放在dat的最后一位)
回復

使用道具 舉報

ID:307020 發表于 2019-6-26 00:18 | 顯示全部樓層
按DataSheet,讀為0xA1,寫為0xA0;理由是R/W
QQ截圖20190626001007.png
回復

使用道具 舉報

ID:907706 發表于 2023-7-18 11:45 | 顯示全部樓層
認真的去看這些文字,他講的是24C01的 地址是7位 其中高4位是固定的1010(A2 A1 A0) 我們需要補R/W位(是讀寫位),補0和補1是你自己決定的  補完后就是 1010 0000
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97人人澡人人爽91综合色 | 欧美专区在线视频 | 久久国内| 精品久久久久久亚洲综合网 | cao在线| 免费av在线 | www.久草.com | 日韩精品在线看 | 中文字幕av网站 | 久久久精品一区 | 亚洲成人午夜在线 | 精品一区二区免费视频 | 亚洲高清视频在线观看 | 一区二区三区视频免费观看 | 欧美日韩国产精品一区 | 日本精品久久久久久久 | 中文字幕在线一区二区三区 | 亚洲综合色视频在线观看 | 男人阁久久 | 天天射影院 | 最新中文字幕第一页视频 | 亚洲 欧美 在线 一区 | 日韩电影一区二区三区 | 中文字幕一区二区三区不卡在线 | 日韩欧美久久精品 | 网络毛片 | 久久精品一二三影院 | 国产一区二区三区免费观看视频 | 国产欧美视频一区二区 | 国产在线中文字幕 | 国产二区视频 | 国产精品观看 | 国产成人在线看 | 成人精品福利 | 91亚洲精品久久久电影 | 久久久久久国产精品久久 | 国产东北一级毛片 | 一级国产精品一级国产精品片 | 欧美精品久久久久 | 午夜久草 | 中文字幕第一页在线 |