# [I~2~C](https://zh.wikipedia.org/wiki/I%C2%B2C) https://magicjackting.pixnet.net/blog/post/173061691# ###### tags: `I2C` ## 一、觀念 I~2~C(Inter-Integrated Circuit)字面上的意思是積體電路之間,它其實是I~2~C Bus簡稱,所以中文應該叫積體匯流排電路,它是一種串列通訊匯流排,使用多主從架構\ \ ==ACK是由接收端所產生的,例如MASTER讀SLAVE的資料,接收端就為MASTER==\ \ SDA=Serial Data Line:資料線\ SCL=Serial Clock Line:時脈線\ \ 所有裝置的SCL和SDA都是Wired-AND,只要一個是0,全部都為0\ \ 在SCL=0時,SDA可變\ 在SCL=1時,SLAVE讀取SDA\ \ If SCL=1\ SDA: 1→0 =START\ SDA: 0→1 =STOP ## 二、傳輸格式 | START | bit7~bit1 | bit0 |$\bar{ACK}/NACK$ | bit7 ~bit0 | $\bar{ACK}$ | bit7 ~bit0 | $\bar{ACK}/NACK$ | STOP | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | SCL=1<BR>SDA: 1→0 | 7位slave的ID | $R/\bar{W}$<br>讀=1;寫=0 | 0為ACK,讓SDA拉為0<BR>1為NACK<br>如果這位為NACK會直接結束 | DATA<BR>SCL=1時<br>接收端接收SDA | 0為ACK,讓SDA拉為0 | DATA<BR>SCL=1時<br>SLAVE接收SDA | 在STOP前的這位兩種都有可能 | SCL=1<BR>SDA: 0→1 | ## 三、如何傳資料 #### 與SLAVE交握成功:  \ \  黃色波型為SDA\ 藍色波型為SCL\ \ 左邊紅色框為START(SCL=1;SDA=1->0)\ 右邊紅色框為STOP(SCL=1;SDA=0->1)\ 橘色框為SLAVE的ID(SLAVE在SCL=1時讀資料)\ 綠色框為$R/ \bar{W}$(讀=1;寫=0)\ 紫色框為$NACK/ \bar{ACK}$(NACK=1;ACK=0)\ 白色框為DATA #### 與SLAVE交握失敗:  \ \  黃色波型為SDA\ 藍色波型為SCL\ \ 左邊紅色框為START(SCL=1;SDA=1->0)\ 右邊紅色框為STOP(SCL=1;SDA=0->1)\ 橘色框為SLAVE的ID(SLAVE在SCL=1時讀資料)\ 綠色框為$R/ \bar{W}$(讀=1;寫=0)\ 紫色框為$NACK/ \bar{ACK}$(NACK=1;ACK=0)\ 因為是NACK,所以跟SLAVE交握失敗,無法傳接下來要傳的DATA ## 四、ACK/NACK Clock Stretching \ ==SCL上的 High/Low 訊號主要是由Master的CLK產生==\ \ ==重點在3~5,通常SLAVE不能掌權SCL,但因為SLAVE要傳送的資料還沒準備好,所以將SCL拉為0來通知MASTER==\ \ 發送端準備傳送下一筆資料(2)\ 如果接收端需要時間處理,就要把SCL維持在0(3)\ 讓SCL不隨著Master的CLK變化(4)\ 等接收端處理好,放開SCL回到1(5)\ 再繼續接收資料,且跟隨Master的CLK ## 五、時脈同步(SCL的競爭)用在多主 \ 因為訊號都是Wire-AND在一起的,且SCL上的 High/Low 訊號主要是由Master的CLK產生的,一個Master要發出起時訊號時SCL(CLK)會為0,就會將所有的Master和SCL都拉成0,開始記數SCL為0的時間\ 等所有Master的CLK都回到1後,SCL才會回到1\ \ 而在第一個Master的CLK從1降到0後會經過一個delay,SCL才會反應,再影響其他Master的CLK降為0\ \ 在這樣的循環下所有參與競爭權的Master的CLK就會公同創造出一個同步的SCL訊號\ \ 0的部份由所有參與競爭控制權的Master的CLK中 Low period 最長的一個所控制,1的部份則由High period 最短的一個所控制
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up