I2c總線協(xié)議范本_第1頁
I2c總線協(xié)議范本_第2頁
I2c總線協(xié)議范本_第3頁
I2c總線協(xié)議范本_第4頁
I2c總線協(xié)議范本_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、輸?shù)腷it1.2 I2C開始和結(jié)束信號 開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。 結(jié)束信號:SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。1.3 I2C應(yīng)答信號 Master每發(fā)送完8bit數(shù)據(jù)后等待Slave的ACK。 即在第9個clock,若從IC發(fā)ACK,SDA會被拉低。 若沒有ACK,SDA會被置高,這會引起Master發(fā)生RESTART或STOP流程,如下所示:1.4 I2C寫流程寫寄存器的標準流程為:1. Master發(fā)起START2. Master發(fā)送I2C addr(7bit)和w操作0(1bit),等待ACK3. Slave發(fā)送AC

3、K4. Master發(fā)送reg addr(8bit),等待ACK5. Slave發(fā)送ACK6. Master發(fā)送data(8bit),即要寫入寄存器中的數(shù)據(jù),等待ACK7. Slave發(fā)送ACK8. 第6步和第7步可以重復多次,即順序?qū)懚鄠€寄存器9. Master發(fā)起STOP寫一個寄存器寫多個寄存器1.5 I2C讀流程讀寄存器的標準流程為:1. Master發(fā)送I2C addr(7bit)和w操作1(1bit),等待ACK2. Slave發(fā)送ACK3. Master發(fā)送reg addr(8bit),等待ACK4. Slave發(fā)送ACK5. Master發(fā)起START6. Master發(fā)送I2C

4、 addr(7bit)和r操作1(1bit),等待ACK7. Slave發(fā)送ACK8. Slave發(fā)送data(8bit),即寄存器里的值9. Master發(fā)送ACK10. 第8步和第9步可以重復多次,即順序讀多個寄存器讀一個寄存器讀多個寄存器2. PowerPC的I2C實現(xiàn)Mpc8560的CCSR中控制I2C的寄存器共有6個。2.1 I2CADR 地址寄存器CPU也可以是I2C的Slave,CPU的I2C地址有 I2CADR指定2.2 I2CFDR 頻率設(shè)置寄存器The serial bit clock frequency of SCL is equal to the CCB clock d

5、ivided by the divider.用來設(shè)置I2C總線頻率2.3 I2CCR 控制寄存器MEN: Module Enable. 置1時,I2C模塊使能MIEN:Module Interrupt Enable. 置1時,I2C中斷使能。MSTA:Master/slave mode. 1 Master mode,0 Slave mode. 當1-0時,CPU發(fā)起STOP信號 當0-1時,CPU發(fā)起START信號MTX:Transmit/receive mode select.0 Receive mode,1 Transmit modeTXAK:Transfer acknowledge. 置

6、1時,CPU在9th clock發(fā)送ACK拉低SDARSTA:Repeat START. 置1時,CPU發(fā)送REPEAT STARTBCST:置1,CPU接收廣播信息(信息的slave addr為7個0)2.4 I2CSR 狀態(tài)寄存器MCF:0 Byte transfer is in process 1 Byte transfer is completedMAAS:當CPU作為Slave時,若I2CDR與會話中Slaveaddr匹配,此bit被置1MBB:0 I2C bus idle 1 I2C bus busyMAL:若置1,表示仲裁失敗BCSTM:若置1,表示接收到廣播信息SRW:When

7、 MAAS is set, SRW indicates the value of the R/W command bit of the calling address, which is sent from the master. 0 Slave receive, master writing to slave 1 Slave transmit, master reading from slaveMIF:Module interrupt. The MIF bit is set when an interrupt is pending, causing a processor interrupt

8、 request(provided I2CCRMIEN is set)RXAK:若置1,表示收到了ACK2.5 I2CDR 數(shù)據(jù)寄存器這個寄存器儲存CPU將要傳輸?shù)臄?shù)據(jù)。3. PPC-Linux中I2C的實現(xiàn) 內(nèi)核代碼中,通過I2C總線存取寄存器的函數(shù)都在文件drivers/i2c/busses/i2c-mpc.c中 最重要的函數(shù)是mpc_xfer.staticintmpc_xfer(structi2c_adapter*adap,structi2c_msg*msgs,intnum)structi2c_msg*pmsg;inti;intret=0;unsignedlongorig_jiffies

9、=jiffies;structmpc_i2c*i2c=i2c_get_adapdata(adap);mpc_i2c_start(i2c);/ 設(shè)置I2CCRMEN, 使能I2C module/* Allow bus up to 1s to become not busy */一直讀I2CSRMBB,等待I2C總線空閑下來while(readb(i2c-base+MPC_I2C_SR)&CSR_MBB)if(signal_pending(current)pr_debug(I2C: Interruptedn);writeccr(i2c,0);return-EINTR;if(time_after(j

10、iffies,orig_jiffies+HZ)pr_debug(I2C: timeoutn);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&iflags&I2C_M_RD?read:write,pmsg-len,pmsg-addr,i+1,num);/根據(jù)消息里的flag進行讀操作或?qū)懖僮鱥f(pmsg-flags&I2C_M_RD)ret=mpc_read(i2c,pmsg-addr,pmsg-buf,pmsg-len

11、,i);elseret=mpc_write(i2c,pmsg-addr,pmsg-buf,pmsg-len,i);mpc_i2c_stop(i2c);/保證為I2CCSRMSTA為0,保證能觸發(fā)STOPreturn(retadap.timeout;u32 flags=restart?CCR_RSTA:0;/* Start with MEN */以防萬一,保證I2C模塊使能起來if(!restart)writeccr(i2c,CCR_MEN);/* Start as master */寫了I2CCRCCR_MSTA,觸發(fā)CPU發(fā)起START信號writeccr(i2c,CCR_MIEN|CCR_

12、MEN|CCR_MSTA|CCR_MTX|flags);/* Write target byte */CPU發(fā)送一個字節(jié),slave I2C addr和0 (寫操作bit)writeb(targetbase+MPC_I2C_DR);if(i2c_wait(i2c,timeout,1)0)/等待slave 發(fā)ACKreturn-1;for(i=0;ibase+MPC_I2C_DR);/CPU接著發(fā)數(shù)據(jù),包括reg addr和dataif(i2c_wait(i2c,timeout,1)irq=0)/循環(huán)讀I2CSR,直到I2CSRMIF置1while(!(readb(i2c-base+MPC_I2

13、C_SR)&CSR_MIF)schedule();if(time_after(jiffies,orig_jiffies+timeout)pr_debug(I2C: timeoutn);writeccr(i2c,0);result=-EIO;break;x=readb(i2c-base+MPC_I2C_SR);writeb(0,i2c-base+MPC_I2C_SR);else/* Interrupt mode */result=wait_event_interruptible_timeout(i2c-queue,(i2c-interrupt&CSR_MIF),timeout*HZ);if(un

14、likely(resultinterrupt&CSR_MIF)pr_debug(I2C: wait timeoutn);writeccr(i2c,0);result=-ETIMEDOUT;x=i2c-interrupt;i2c-interrupt=0;if(resultadap.timeout;inti;u32 flags=restart?CCR_RSTA:0;/* Start with MEN */以防萬一,保證I2C模塊使能if(!restart)writeccr(i2c,CCR_MEN);/* Switch to read - restart */注意這里,再次把CCR_MSTA置1,再觸發(fā) STARTwriteccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags);/* Write target address byte - this time with the read flag set */CPU發(fā)送slave I2C addr和讀操作1writeb(targetb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論