|
發布時間: 2019-6-23 21:30
正文摘要:圖一 為啥說地址為0x50 1010000 如果原型是0101 0000 那最后一位的讀寫位不就沒有了嗎 那如果有讀寫位 A0~A2都接地 應該 位 0xA0 啊 |
| 認真的去看這些文字,他講的是24C01的 地址是7位 其中高4位是固定的1010(A2 A1 A0) 我們需要補R/W位(是讀寫位),補0和補1是你自己決定的 補完后就是 1010 0000 |
|
按DataSheet,讀為0xA1,寫為0xA0;理由是R/W |
QQ截圖20190626001007.png (78.84 KB, 下載次數: 56)
|
我的理解:沒有主機,沒有從機。這2個函數,從其名字上來理解,前者功能是向某總線上發送一個字節,后者為從總線上讀一個字節,如此而已(多好的程序呀,向這段代碼的作者致敬)。 建議:如果你要用這個函數,放到自己的程序中能夠實現功能,這就夠了,不必深究;如果你是學習,就想把這段代碼搞明白,那么你要做的有2個,一是把時序整明白,二是。。。。。。。(dat<<=1; dat|=SDA;//dat前移一位,讀總線,把結果放在dat的最后一位) |
|
這個只是一個認識上的問題。 其實很簡單,1)有人把0xa0(讀)和0Xa1(寫)當作地址,直接發送這兩個。 2)例外有人把0X50當成地址,但是發送前先左移一位,(0x50<<1+0)=0xa0(讀) (0x50<<1+1)=0xa1(寫),再發送給EEPROM。 看吧,結果都是一樣的。 只是程序寫得不同而已。自己明白就好。到底你給發送的是什么? 如果你不移位,只發送0x50,就錯了。 |
|
SDA=dat>>7; //起始信號之后SCL=0,所以可以直接改變SDA信號 ,這是發送給slave的。 那這一步dat<<=1; dat|=SDA ,這樣一般是 數據左一位,SDA上狀態讀入 dat bit0 這樣做八次剛好得到1 byte數據 |
|
dat是一個變量,實際上就是一個地址,而SDA是一個位 l是按位或的運算,而不是或運算 按位或運算只會改變相對應該的位,其它位不變的 如果dat=0000 0000,SDA=1,按位或運算之后就是dat=0000 0001 |
| 地址0x50是沒錯,你說的那個0xA0、0xA1是加上了讀寫位的。不是一回事 |
Y_G_G 發表于 2019-6-25 11:28 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 ?, |
wangwing 發表于 2019-6-24 21:59 我有完整的程序 但有點長 您介意我單獨私聊你不 |
zzh985514474 發表于 2019-6-24 21:50 我就說他有位移的語句了,沒見過這么扯的 本來讀寫24C02就已經要用位移了,生怕位移多了數據可能會對不上號,他可好,生拉硬扯的搞個0X50這玩意出來 |
zzh985514474 發表于 2019-6-24 10:49 0x50是24c02地址沒錯,但需要在讀寫操作時<<1,讀地址(0x50<<1),寫地址 (0x50<<1|0x01) |
|
0xa0或0xa1,前7位為24C02的器件地址(前4位固定為1010,后3位取決于A2、A1、A0三個引腳在電路中的連接),后1位為讀寫方向。 此圖中,把24C02的地址描述為0x50,沒毛病。讀寫位加到后面,0x50要左移1位,就成了0xa0或0xa1。 至于0x50和0x62,是尋到的什么器件,沒圖,天知道。不過可以確定,決對不是本圖中的24C02。 |
Y_G_G 發表于 2019-6-24 17:00 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); //尋址器件,后續為讀操作 有左移的 但是我看不懂什么意思 |
| 24C02是一個很常用的IIC器件,你隨便找一下24C02程序,大多都是0XA0 或者 0XA1的 |
|
我說的是匯編上,你說是C里面,但編譯好像是通用的 他的程序應該是在寫入的時候是用到了位移了 你看一下輸入函數有沒有位移的語句 |
Y_G_G 發表于 2019-6-24 08:22 0A0H是什么= = 不應該是0XA0 或者 0XA1嗎 關鍵這個人寫程序的時候 用了0X50 還尋到了 |
|
圖片上說的是錯的,或者是說不嚴謹, 24C02的讀寫的地址是:0A0H和0A1H |
| 讀地址是0Xa0,寫地址是0xa1。 |