EEPROMI2C操作說明_第1頁(yè)
EEPROMI2C操作說明_第2頁(yè)
EEPROMI2C操作說明_第3頁(yè)
EEPROMI2C操作說明_第4頁(yè)
EEPROMI2C操作說明_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、I2C協(xié)議2條雙向串行線,一條數(shù)據(jù)線SDA一條時(shí)鐘線SCL.SDA傳輸數(shù)據(jù)是大端傳輸,每次傳輸8bit,即一字節(jié)。支持多主控(multimastering),任何時(shí)間點(diǎn)只能有一個(gè)主控.總線上每個(gè)設(shè)備都有自己的一個(gè)addr,共7個(gè)bit,廣播地址全0.系統(tǒng)中可能有多個(gè)同種芯片,為此addr分為固定部分和可編程部份,細(xì)節(jié)視芯片而定,看datasheet。1。1I2C位傳輸數(shù)據(jù)傳輸:SCL為高電平時(shí),SDA線若保持穩(wěn)定,那么SDA±是在傳輸數(shù)據(jù)bit;若SDAg生跳變,則用來表示一個(gè)會(huì)話的開始或結(jié)束(后面講)數(shù)據(jù)改變:SCL為低電平時(shí),SDAife才能改變傳輸?shù)腷it皿/i!II-/yL數(shù)

2、據(jù)有效I改變敷據(jù)III!1.2I2C開始和結(jié)束信號(hào)開始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)結(jié)束信號(hào):SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)1。3I2C應(yīng)答信號(hào)Master每發(fā)送完8bit數(shù)據(jù)后等待Slave的ACK即在第9個(gè)clock,若從IC發(fā)ACK,SD心被拉低。若沒有ACKSD心被置高,這會(huì)引起Master發(fā)生RESTARTSTOPW程,如下所示:SCLsda工五回:回回叵回回還回回回叵叵叵叵回叵叵J小 Calling addressSTART子 1 ARead/M在 AckData byte1。4 I2C寫流程寫寄存器的標(biāo)準(zhǔn)流程為:1。M

3、aster 發(fā)起 STARTMaster 發(fā)送 I2C addr (7bit )和 w操作 0 (1bit),等待 ACK2.3. Slave發(fā)送ACK4. Master發(fā)送regaddr(8bit),等待ACK5. Slave發(fā)送ACK6. Master發(fā)送data(8bit),即要寫入寄存器中的數(shù)據(jù),等待ACK7. Slave發(fā)送ACK8. 第6步和第7步可以重復(fù)多次,即順序?qū)懚鄠€(gè)寄存器9. Master發(fā)起STOP寫一個(gè)寄存器startDEVICEADDRESSWHITEWORDADDRESSDATASTOPSDALINEACKACKLSBMSBACKH/wLSBMSBFigure 2.

4、 ByteWriteSDA LINER DEVICET ADDRESSuumzMS BwriteDATA (n)WORD ADDRESS (n)ACKR/wLSBACKACKFigure 3. PageWrite1。5I2C讀流程讀寄存器的標(biāo)準(zhǔn)流程為:1。 Master發(fā)送I2Caddr(7bit)和w操作1(1bit),等待ACK2。 Slave發(fā)送ACK3。 Master發(fā)送regaddr(8bit),等待ACK4。 Slave發(fā)送ACK5。 Master發(fā)起START6。 Master發(fā)送I2Caddr(7bit)和r操作1(1bit),等待ACK7。 Slave發(fā)送ACK8。 Slav

5、e發(fā)送data(8bit),即寄存器里的值9。 Master發(fā)送ACK10。 第8步和第9步可以重復(fù)多次,即順序讀多個(gè)寄存器讀一個(gè)寄存器READDEVICEADDRESSSTARTWORDADDRESSnwriteDEVICEADDRESSSTARTrACKLSBnMSBACMLSBIIIIII1IIIIMSB1I*ACKHR/wLSBetuiMiSDALINEDUMMYWRITEFigure 5. RandomRead讀多個(gè)寄存器DEVICEADDRESSREADACKACKSDAUNERA/CWKDATAnDATAn+Figure 6. SequentialRead1 .刖日對(duì)于大多數(shù)工程

6、師而言,I2C永遠(yuǎn)是一個(gè)頭疼的問題。相比UART和SPI而言,I2C的時(shí)序要復(fù)雜一些,I2C組合變化也豐富一些。在這里以AT24C04為例說明I2C使用過程中的一些注意點(diǎn)。2 .AT24C04操作示意圖Wjd AddressDOUTNAard AddressDQUTX圖AT24C04操作示意圖示意圖說明:示意圖分闡述了 4種不同的操作方式,例如寫單個(gè)存儲(chǔ)單元,寫多個(gè)存儲(chǔ)單元,讀單個(gè)存儲(chǔ)單元和寫單個(gè)存儲(chǔ)單元。 對(duì)于單個(gè)操作而言,上部為MCU通過I2C輸出的相關(guān)指令,下部為I2C設(shè)備的響應(yīng)。例如寫單個(gè)存儲(chǔ)單元操作時(shí),MCU發(fā)出I2C啟動(dòng),設(shè)備地址,寫標(biāo)志位等,而I2C設(shè)備輸出多個(gè)ACK3.若干說明

7、3.1基本操作方式與單個(gè)存儲(chǔ)字節(jié)色廿盧Device AddressDeviceAddress7ord Ac dress寫多個(gè)存儲(chǔ)卡節(jié)讀單個(gè)存儲(chǔ)字節(jié)讀多個(gè)存儲(chǔ)字U教據(jù)寫入斂據(jù)從12DeviceAddressWjrd AddressDeviceD0UT1V門匚 Acdre ssD0UT130UT22c設(shè)備C設(shè)備說出DeviceAddss設(shè)備皿日應(yīng)答|馴志位存儲(chǔ)地址日無應(yīng)答日麟志位DeviceAddressI2C設(shè)備的操作可分為寫單個(gè)存儲(chǔ)字節(jié),寫多個(gè)存儲(chǔ)字節(jié),讀單個(gè)存儲(chǔ)字節(jié)和讀多個(gè)存儲(chǔ)字節(jié).相對(duì)于AT24C04而言,這些讀寫動(dòng)作相對(duì)于內(nèi)部的存儲(chǔ)單元而言,對(duì)于其他的具備I2C接口的AD或傳感器而言,存

8、儲(chǔ)單元變成了寄存器單元。雖然存在概念上的差別,但是其操作原理確實(shí)一樣的。3。2無應(yīng)答在以上4種情況中,無應(yīng)答為MCU發(fā)出,無應(yīng)答意為MCU不需要從機(jī)輸出數(shù)據(jù),MCU將會(huì)停止本次I2C操作。需要說明的是,無應(yīng)答并不是一種異常情況.3.3I2C設(shè)備并不只有一個(gè)設(shè)備地址這一點(diǎn)往往被忽略,一般情況下認(rèn)為在I2C啟動(dòng)信號(hào)之后的字節(jié)為I2C從機(jī)地址(7位).對(duì)于AT24C04而言,內(nèi)部具有4Kb存儲(chǔ)位,合計(jì)512字節(jié)。若需要訪問512字節(jié)內(nèi)容,總共需要9根地址線(8位寬度),那么上圖中的存儲(chǔ)地址(8位長(zhǎng)度)顯然還差了一位,那么就需要從設(shè)備地址中借"1位,這就使得AT24C04具有兩個(gè)I2C地址,

9、例如0x50和0x51。3。4存儲(chǔ)地址相對(duì)于AT24C04而言,存儲(chǔ)地址占1個(gè)字節(jié).若換成其他I2C設(shè)備,例如ADXL345,存儲(chǔ)地址被寄存器地址替代即可,其他操作方式相似。但是像AT24C32或AT24C64這樣的大容量EEPROM則存儲(chǔ)地址需要2字節(jié)描述,也就意味著需要連續(xù)發(fā)送兩個(gè)字節(jié)地址信息且高字節(jié)在前。其他像BH1750這樣的光照芯片,存儲(chǔ)地址被具體的操作命令替代,使用I2C設(shè)備時(shí)需要因地制宜,切不可照搬教條。3。5連續(xù)讀和連續(xù)寫限制AT24C04中存在頁(yè)的概念,一頁(yè)的大小為8字節(jié),若果在單頁(yè)的范圍內(nèi),存儲(chǔ)地址累加,若超過該頁(yè)的最大地址,存儲(chǔ)地址回到頁(yè)開始處.所以對(duì)于連續(xù)讀和連續(xù)寫而言

10、,最大的操作字節(jié)數(shù)為8。若需要操作的字節(jié)內(nèi)容超過8字節(jié),則需要進(jìn)行翻頁(yè)操作,即寫入下一頁(yè)的起始存儲(chǔ)地址。4總結(jié)I2C設(shè)備有很多種,若掌握基本原理,便可見招拆招,那是I2C總線就不那么難了。2. PowerPC的I2C實(shí)現(xiàn)Mpc8560的CCSFRH空制I2C的寄存器共有6個(gè)Table11-3.12CMemoryMapAddress12cRegisterAccessR«seiS0x0_300012CAORPCaddressregisterRMOxOD1OQ30MI2CFDR一l2Cfrequencydividerregi&terR/W0x001I2CCRPccontrolreg

11、isterRAVDxOO10xO_3OCCI2CSR-l2CstatusregisterRW0x811以。_3010I2CDR一l2CdataregisterRjWDxOO1OxO_3O14I2CDFSRR一2CdigitalfiltersamplingrateregisterR/W0x10T2。1I2CADR地址寄存器CPU&可以是I2C的Slave,CPU勺I2C地址有I2CADR指定口67RWResetOffsetADDRoooo_ooao0x0_3000Figure11212cAddressRegister(I2CADR)2.2 I2CFDR頻率設(shè)置寄存器FDR0000_000

12、00x0_3004RWResetOffset012Figure11-3.12CFrequencyDividerRegister(I2CFDR)TheserialbitclockfrequencyofSCLisequaltotheCCBclockdividedbythedivider。用來設(shè)置I2C總線頻率2.3 I2CCR控制寄存器0123456MENMIENMSTAMIXTXAKRSTABCST0CQ0Q00Q0x0_3008Figure11-4.12CControlRegister(I2CCR)MENModuleEnable。置1時(shí),I2C模塊使能MIENModuleInterruptEn

13、able。置1時(shí),I2C中斷使能。MSTAMaster/slavemode.1Mastermode,0Slavemode.當(dāng)10時(shí),CPUK起STOP言號(hào)當(dāng)0->1時(shí),CPU發(fā)起STARTS號(hào)MTXTransmit/receivemodeselect。0Receivemode,1TransmitmodeTXAKTransferacknowledge。置1時(shí),CPU9thclock發(fā)送ACKS低SDARSTARepeatSTART.置1時(shí),CPU發(fā)送REPEATSTARTBCST置1,CPU6收廣播信息、(信息的slaveaddr為7個(gè)0)2。4I2CSR狀態(tài)寄存器MCF0Bytetran

14、sferisinprocess1BytetransferiscompletedMAAS當(dāng)CPU乍為Slave時(shí),若I2CDR與會(huì)話中Slaveaddr匹配,止匕bit被置1MBB:0I2Cbusidle1I2CbusbusyMAL若置1,表示仲裁失敗BCSTMg置1,表示接收到廣播信息SRW:WhenMAASissqtSRWindicatesthevalueoftheR/Wcommandbitofthecallingaddress,whichissentfromthemaster.0Slavereceive,masterwritingtoslave1Slavetransmit,masterre

15、adingfromslaveMIF:Moduleinterrupt.TheMIFbitissetwhenaninterruptispending,causingaprocessorinterruptrequest(providedI2CCRMIENisset)RXAK若置1,表示收到了ACK2。5I2CDR數(shù)據(jù)寄存器這個(gè)寄存器儲(chǔ)存CPU等要傳輸?shù)臄?shù)據(jù)。3。PPCLinux中I2C的實(shí)現(xiàn)內(nèi)核代碼(linux2。6。24)中,通過I2C總線存取寄存器的函數(shù)都在文件drivers/i2c/busses/i2cmpGc中最重要的函數(shù)是mpc_xfer.18.if(time_after(jiffies,

16、orig_jiffies+HZ)9.30.31.n,8.n,i);9.pr_debug("I2C:n");if(readb(i2c-base+MPC_I2C_SR)=(CSR_MCF|CSR_MBB|CSR_RXAK)mpc_i2c_fixup(i2c);return-EIO;schedule();for(i=0;ret=0&&i<num;i+)pmsgpr_debug=&msgsi;""Doing%s%dbyt

17、esto0x%02x-%dof%pmsg->flagspmsglen,/根據(jù)消息里的flagif(pmsgflagsret=mpc_readelseret=mpc_write&I2C_M_RD?"read":“write”,pmsg甘addr,i+1,num);進(jìn)行讀操作或?qū)懖僮?amp;I2C_M_RD)(i2c,pmsg-addr,pmsgfbuf,pmsg(i2c,pmsgfaddr,pmsgbuf,甘len,i);pmsgflempc_i2c_stop(i2c);/保證為I2CCSRMSTA為0,保證能觸發(fā)STOPreturn(ret0)?retnum

18、;42.1.staticintmpc_write(structmpc_i2c*i2c,inttarget..10.11.RT信號(hào)12.s);constu8*data,intlengthintrestart)inti;unsignedu32flagstimeout=restart/*StartwithMENif(!restart)writeccr(i2c/*Startasmaster*/writeccr=i2c-adap。timeout?CCR_RSTA:0;/,CCR_MEN)(i2c,CCR_MIEN|以防萬一,保證I2C模塊使能起來/寫了I2CCRCCR_MST

19、A,觸發(fā)CPU發(fā)起STACCR_MEN|CCR_MSTA|CCR_MTX|flag13./*Writetargetbyte/CPU發(fā)送一個(gè)字節(jié),slaveI2Caddr.操彳bit)括regaddrwriteb(targeti2cbase+MPC_I2C_DR);ifi2cwaitreturn(i2c,timeout/等待slave發(fā)ACKfor(i/writeb和dataifreturn;i<lengthWritedatabyte(data+)(i2c_waitreturn(i2cng)i2cb

20、ase,timeout,+MPC_I2C_DR);/CPU接著發(fā)數(shù)據(jù),包/等待slave發(fā)ACstaticinti2c_wait(structmpc_i2c*i2c,unsignedtimeoutintwriti2.3.unsignedlongorig_jiffies=jiffies;4.u32x;5.intresult=0;6.7.if(i2cfirq=0)8./循環(huán)讀I2CSR,直到I2CSRMIF置19.while!(readb(i2c-base+MPC_I2C10.schedule();11.ifttime_after(jiffies,orig_jiffie12.pr_debug(n)

21、:13.writeccr(i2c,0);14.result=-EIO;15.break;16.17.18.x=readb(i2cfbase+MPC_I2C_SR);19.writeb(0,i2cfbase+MPC_I2C_SR);20.else21./*Interruptmode*/SR)&CSR_MIF)+timeout)22.result=wait_event_interruptible_timeout23.24.(i2cinterrupt&CSR_MIF),25.if(unlikely(result<0)26.pr_debug("I2C:27.writec

22、cr(i2c,0);28.elseif(unlikely(!(i2c-interrupt29.pr_debug("I2C:waittimeoutn")30.writeccr(i2c,0);31.result=-ETIMEDOUT;32.33.34.x=i2cinterrupt;35.i2cinterrupt=0;36.37.38.ifrresult<0)39.40.returnresult;41.if(!(x&CSR_MCF)42.pr_debug("I2C:n");43.return-EIO;44.45.46.if(x&CSR_M

23、AL)/仲裁失敗47.pr_debug""I2C:n");48.return-EIO;49.50.51.if(writing&&(x&CSR_RXAK)52.pr_debug("I2C:NoRXAKn);53./*generatestop*/54.writeccr(i2c,CCR_MEN);55.return-EIO;56.57.return0;58.n");timeout.5.(i2c->queue,*HZ);CSR_MIF)寫后沒收到ACKstaticintmpc_read(structmpc_i2c*i2c,inttarget,u8*data,intlengthintrestart)unsignedinti;timeout=i2c-adap.timeout;6.u32flags=restart?CCRRSTA:07.8./*StartwithMEN/以防萬一,保證I2C模塊使能9.if(!restart)10.writeccr(i2cCCR_MEN);11./*Switchtoread

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論