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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關于I2C與EEPROM地址的問題

查看數: 8196 | 評論數: 18 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-6-23 21:30

正文摘要:

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

回復

ID:907706 發表于 2023-7-18 11:45
認真的去看這些文字,他講的是24C01的 地址是7位 其中高4位是固定的1010(A2 A1 A0) 我們需要補R/W位(是讀寫位),補0和補1是你自己決定的  補完后就是 1010 0000
ID:307020 發表于 2019-6-26 00:18
按DataSheet,讀為0xA1,寫為0xA0;理由是R/W

QQ截圖20190626001007.png (78.84 KB, 下載次數: 56)

QQ截圖20190626001007.png
ID:483407 發表于 2019-6-25 20:51
我的理解:沒有主機,沒有從機。這2個函數,從其名字上來理解,前者功能是向某總線上發送一個字節,后者為從總線上讀一個字節,如此而已(多好的程序呀,向這段代碼的作者致敬)。
建議:如果你要用這個函數,放到自己的程序中能夠實現功能,這就夠了,不必深究;如果你是學習,就想把這段代碼搞明白,那么你要做的有2個,一是把時序整明白,二是。。。。。。。(dat<<=1; dat|=SDA;//dat前移一位,讀總線,把結果放在dat的最后一位)
ID:18297 發表于 2019-6-25 20:11
這個只是一個認識上的問題。
其實很簡單,1)有人把0xa0(讀)和0Xa1(寫)當作地址,直接發送這兩個。
                  2)例外有人把0X50當成地址,但是發送前先左移一位,(0x50<<1+0)=0xa0(讀)
                      (0x50<<1+1)=0xa1(寫),再發送給EEPROM。
                  看吧,結果都是一樣的。
                 只是程序寫得不同而已。自己明白就好。到底你給發送的是什么?
                 如果你不移位,只發送0x50,就錯了。
ID:571958 發表于 2019-6-25 18:52
                 SDA=dat>>7;         //起始信號之后SCL=0,所以可以直接改變SDA信號 ,這是發送給slave的。

  那這一步dat<<=1; dat|=SDA  ,這樣一般是 數據左一位,SDA上狀態讀入 dat bit0
  這樣做八次剛好得到1 byte數據
ID:401564 發表于 2019-6-25 17:24
dat是一個變量,實際上就是一個地址,而SDA是一個位
l是按位或的運算,而不是或運算
按位或運算只會改變相對應該的位,其它位不變的
如果dat=0000 0000,SDA=1,按位或運算之后就是dat=0000 0001
ID:160500 發表于 2019-6-25 17:08
地址0x50是沒錯,你說的那個0xA0、0xA1是加上了讀寫位的。不是一回事
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:538271 發表于 2019-6-25 11:55
wangwing 發表于 2019-6-24 21:59
0xa0或0xa1,前7位為24C02的器件地址(前4位固定為1010,后3位取決于A2、A1、A0三個引腳在電路中的連接), ...

我有完整的程序  但有點長 您介意我單獨私聊你不
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: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: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: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:401564 發表于 2019-6-24 17:00
24C02是一個很常用的IIC器件,你隨便找一下24C02程序,大多都是0XA0  或者 0XA1的
ID:401564 發表于 2019-6-24 16:56
我說的是匯編上,你說是C里面,但編譯好像是通用的
他的程序應該是在寫入的時候是用到了位移了
你看一下輸入函數有沒有位移的語句
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 08:22
圖片上說的是錯的,或者是說不嚴謹,
24C02的讀寫的地址是:0A0H和0A1H
ID:10193 發表于 2019-6-24 07:45
讀地址是0Xa0,寫地址是0xa1。

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表