




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、I2C協(xié)議2條雙向串行線,一條數(shù)據(jù)線SDA一條時鐘線SCL.SDA傳輸數(shù)據(jù)是大端傳輸,每次傳輸8bit,即一字節(jié)。支持多主控(multimastering),任何時間點只能有一個主控.總線上每個設備都有自己的一個addr,共7個bit,廣播地址全0.系統(tǒng)中可能有多個同種芯片,為此addr分為固定部分和可編程部份,細節(jié)視芯片而定,看datasheet。1。1I2C位傳輸數(shù)據(jù)傳輸:SCL為高電平時,SDA線若保持穩(wěn)定,那么SDA±是在傳輸數(shù)據(jù)bit;若SDAg生跳變,則用來表示一個會話的開始或結(jié)束(后面講)數(shù)據(jù)改變:SCL為低電平時,SDAife才能改變傳輸?shù)腷it皿/i!II-/yL數(shù)
2、據(jù)有效I改變敷據(jù)III!1.2I2C開始和結(jié)束信號開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)結(jié)束信號:SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)1。3I2C應答信號Master每發(fā)送完8bit數(shù)據(jù)后等待Slave的ACK即在第9個clock,若從IC發(fā)ACK,SD心被拉低。若沒有ACKSD心被置高,這會引起Master發(fā)生RESTARTSTOPW程,如下所示:SCLsda工五回:回回叵回回還回回回叵叵叵叵回叵叵J小 Calling addressSTART子 1 ARead/M在 AckData byte1。4 I2C寫流程寫寄存器的標準流程為: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步可以重復多次,即順序?qū)懚鄠€寄存器9. Master發(fā)起STOP寫一個寄存器startDEVICEADDRESSWHITEWORDADDRESSDATASTOPSDALINEACKACKLSBMSBACKH/wLSBMSBFigure 2.
4、 ByteWriteSDA LINER DEVICET ADDRESSuumzMS BwriteDATA (n)WORD ADDRESS (n)ACKR/wLSBACKACKFigure 3. PageWrite1。5I2C讀流程讀寄存器的標準流程為: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步可以重復多次,即順序讀多個寄存器讀一個寄存器READDEVICEADDRESSSTARTWORDADDRESSnwriteDEVICEADDRESSSTARTrACKLSBnMSBACMLSBIIIIII1IIIIMSB1I*ACKHR/wLSBetuiMiSDALINEDUMMYWRITEFigure 5. RandomRead讀多個寄存器DEVICEADDRESSREADACKACKSDAUNERA/CWKDATAnDATAn+Figure 6. SequentialRead1 .刖日對于大多數(shù)工程
6、師而言,I2C永遠是一個頭疼的問題。相比UART和SPI而言,I2C的時序要復雜一些,I2C組合變化也豐富一些。在這里以AT24C04為例說明I2C使用過程中的一些注意點。2 .AT24C04操作示意圖Wjd AddressDOUTNAard AddressDQUTX圖AT24C04操作示意圖示意圖說明:示意圖分闡述了 4種不同的操作方式,例如寫單個存儲單元,寫多個存儲單元,讀單個存儲單元和寫單個存儲單元。 對于單個操作而言,上部為MCU通過I2C輸出的相關(guān)指令,下部為I2C設備的響應。例如寫單個存儲單元操作時,MCU發(fā)出I2C啟動,設備地址,寫標志位等,而I2C設備輸出多個ACK3.若干說明
7、3.1基本操作方式與單個存儲字節(jié)色廿盧Device AddressDeviceAddress7ord Ac dress寫多個存儲卡節(jié)讀單個存儲字節(jié)讀多個存儲字U教據(jù)寫入斂據(jù)從12DeviceAddressWjrd AddressDeviceD0UT1V門匚 Acdre ssD0UT130UT22c設備C設備說出DeviceAddss設備皿日應答|馴志位存儲地址日無應答日麟志位DeviceAddressI2C設備的操作可分為寫單個存儲字節(jié),寫多個存儲字節(jié),讀單個存儲字節(jié)和讀多個存儲字節(jié).相對于AT24C04而言,這些讀寫動作相對于內(nèi)部的存儲單元而言,對于其他的具備I2C接口的AD或傳感器而言,存
8、儲單元變成了寄存器單元。雖然存在概念上的差別,但是其操作原理確實一樣的。3。2無應答在以上4種情況中,無應答為MCU發(fā)出,無應答意為MCU不需要從機輸出數(shù)據(jù),MCU將會停止本次I2C操作。需要說明的是,無應答并不是一種異常情況.3.3I2C設備并不只有一個設備地址這一點往往被忽略,一般情況下認為在I2C啟動信號之后的字節(jié)為I2C從機地址(7位).對于AT24C04而言,內(nèi)部具有4Kb存儲位,合計512字節(jié)。若需要訪問512字節(jié)內(nèi)容,總共需要9根地址線(8位寬度),那么上圖中的存儲地址(8位長度)顯然還差了一位,那么就需要從設備地址中借"1位,這就使得AT24C04具有兩個I2C地址,
9、例如0x50和0x51。3。4存儲地址相對于AT24C04而言,存儲地址占1個字節(jié).若換成其他I2C設備,例如ADXL345,存儲地址被寄存器地址替代即可,其他操作方式相似。但是像AT24C32或AT24C64這樣的大容量EEPROM則存儲地址需要2字節(jié)描述,也就意味著需要連續(xù)發(fā)送兩個字節(jié)地址信息且高字節(jié)在前。其他像BH1750這樣的光照芯片,存儲地址被具體的操作命令替代,使用I2C設備時需要因地制宜,切不可照搬教條。3。5連續(xù)讀和連續(xù)寫限制AT24C04中存在頁的概念,一頁的大小為8字節(jié),若果在單頁的范圍內(nèi),存儲地址累加,若超過該頁的最大地址,存儲地址回到頁開始處.所以對于連續(xù)讀和連續(xù)寫而言
10、,最大的操作字節(jié)數(shù)為8。若需要操作的字節(jié)內(nèi)容超過8字節(jié),則需要進行翻頁操作,即寫入下一頁的起始存儲地址。4總結(jié)I2C設備有很多種,若掌握基本原理,便可見招拆招,那是I2C總線就不那么難了。2. PowerPC的I2C實現(xiàn)Mpc8560的CCSFRH空制I2C的寄存器共有6個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頻率設置寄存器FDR0000_000
12、00x0_3004RWResetOffset012Figure11-3.12CFrequencyDividerRegister(I2CFDR)TheserialbitclockfrequencyofSCLisequaltotheCCBclockdividedbythedivider。用來設置I2C總線頻率2.3 I2CCR控制寄存器0123456MENMIENMSTAMIXTXAKRSTABCST0CQ0Q00Q0x0_3008Figure11-4.12CControlRegister(I2CCR)MENModuleEnable。置1時,I2C模塊使能MIENModuleInterruptEn
13、able。置1時,I2C中斷使能。MSTAMaster/slavemode.1Mastermode,0Slavemode.當10時,CPUK起STOP言號當0->1時,CPU發(fā)起STARTS號MTXTransmit/receivemodeselect。0Receivemode,1TransmitmodeTXAKTransferacknowledge。置1時,CPU9thclock發(fā)送ACKS低SDARSTARepeatSTART.置1時,CPU發(fā)送REPEATSTARTBCST置1,CPU6收廣播信息、(信息的slaveaddr為7個0)2。4I2CSR狀態(tài)寄存器MCF0Bytetran
14、sferisinprocess1BytetransferiscompletedMAAS當CPU乍為Slave時,若I2CDR與會話中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ù)寄存器這個寄存器儲存CPU等要傳輸?shù)臄?shù)據(jù)。3。PPCLinux中I2C的實現(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);進行讀操作或?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信號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ā)送一個字節(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鍍鋅層鈍化劑行業(yè)發(fā)展趨勢及投資戰(zhàn)略研究報告
- 2025-2030年中國鉛酸蓄電池行業(yè)市場現(xiàn)狀分析規(guī)劃研究報告
- 2025-2030年中國針織服裝市場市場運行動態(tài)及投資戰(zhàn)略研究報告
- 2025-2030年中國酮洛芬腸溶膠囊行業(yè)十三五規(guī)劃與發(fā)展趨勢分析報告
- 2025-2030年中國艾灸養(yǎng)生儀產(chǎn)業(yè)發(fā)展現(xiàn)狀及前景趨勢分析報告
- 2025-2030年中國美甲行業(yè)運行現(xiàn)狀及發(fā)展前景分析報告
- 2025年四川省建筑安全員C證考試(專職安全員)題庫及答案
- 皖北衛(wèi)生職業(yè)學院《時間序列分析》2023-2024學年第二學期期末試卷
- 中央財經(jīng)大學《商務智能》2023-2024學年第二學期期末試卷
- 天府新區(qū)航空旅游職業(yè)學院《廣播影視廣告設計與制作》2023-2024學年第二學期期末試卷
- 腫瘤患者特殊醫(yī)學用途配方食品使用指南
- 幼兒看圖填數(shù)
- 酒店項目精裝修工程施工組織設計
- 小學生研學旅行展示ppt模板
- 《思想道德與法治》第一章
- 新概念英語第2冊課文word版
- 大學生職業(yè)生涯規(guī)劃(高職)PPT完整全套教學課件
- 微信小程序開發(fā)實戰(zhàn)(第2版)全套PPT完整教學課件
- 部編版語文四年級下冊全冊大單元整體作業(yè)設計
- 重慶自然博物館
- 收養(yǎng)人撫養(yǎng)教育被收養(yǎng)人能力的證明
評論
0/150
提交評論