一般來說,I2C是一個只需要2支接腳,SCL和SDA2支腳就可以串接很多裝置,並且也可以連來擴充使用。雖然I2C很好用也很方便,只需要2支腳就可以搞定,但如果非生了不可預期的現象需要除錯,那可就不是一個好玩的事情了。因為裝置都接在一起,當發生問題時,要除錯就有一定的困難性,這時候實務的經驗就變得非常的重要了,只要遇到問題和解決的問題夠多,當有問題時,就不怕手忙腳亂了。
下圖是一個比較典型的I2C架構圖。只要把所有的裝置串接在SDA和SCL上,就可以做I2C的通訊了。
1個I2C的訊號,當SCL為HI時,而SDA由HIàLO時,這時為「Start」;而SDA由LOàHI時,這時後為「Stop」。記得。只有SCL為HI時,這2個protocol才為有效。SCL為LO時,這時候是一般訊號的切換。
一般有效的資料,必需是SCL為LO的時候,才可以做SDA的切換(每個BIT),假設你在SCL為HI的時候切換,會被判定為「Start」或是「Stop」的,這是一件很可怕的事情。一定要注意。
下圖是一個I2C在做通訊時,應該有Protocol,一般來說,要先有START, 接著7bit 的address 與1bit 的R/W,1bit的 ACK, 8bit 的data, 1bit 的ACK。 最後是STOP。 有沒有覺得很亂? 其實就是一定要有「頭(S)」、「尾(P)」和「資料(Data)」,事實上你可以把7bit 的address 與1bit 的R/W當成是一個8bit的資料,這樣想應該就會簡單一點。
一般來說,拿到Device,通常要看的就是slave address,記住,這個slave address其實就是每顆I2C Device的身分(ID),通常都是7-bit,記得,這是一個向右移1位的address。
至於整個I2C protocol的訊號,到底應該說host還是由slave來發動的,可以看下圖的幾個介紹,一般來說,「S」、「P」和「Salve address」都會由host 發動,其他的ACK和DATA就要看2造雙方的需求了,也就是不一定。
一般來說,有時候會遇到準位不同的I2C,這時候就需要一個「中間人(BUFFER)」來幫忙解決訊號準位上的問題,一般我們會稱為「level shift」這樣就可以很安心的使用I2C介面了。
這就是一個比較複雜且多組的I2C使用方式。
當你了解I2C時,其實I2C 並不可怕,而且還挺好用的,畢竟硬體上只需要2支腳就可以搞定很多事。但相對的,在程式上就需要下非常多的功夫了,哈,這時候就是証明台上十分鐘,台下十年功的好機會了。祝大家使用I2C愉快。
下一章:SPI介紹
沒有留言:
張貼留言