當前位置:編程學習大全網 - 編程語言 - 串行通訊方式 spi和 i2c各有何優點(適合在何種場合使用),兩單片機板上相連,采用何種方式好.

串行通訊方式 spi和 i2c各有何優點(適合在何種場合使用),兩單片機板上相連,采用何種方式好.

1,SPI總線就是三根。 片選CS壹根,這個由各自芯片決定,有高平或者低平的。這個其實是必須的,因為只有片選到了才能找到。和我用的總線74HC573(或者74LS373)鎖存器壹個道理。如果片選成功,就上第二根線SCL,這個上面就是時鐘,這個時鐘完全可以模擬,當然時鐘上面是有時序的,用程序延時把時序調整好,模擬就沒問題。最後就是I/O口,如果是三線的SPI,那麽這根線就是數據雙向傳輸的,如果是四根的SPI,這個我現在還沒用過,就是壹方入壹方出,不過我覺得完全沒必要,壹根線數據來去就挺好。由於是壹根或者兩根線,那麽數據就靠串行來去。2,I2C總線就是兩根。 就是壹根SCL時鐘,另壹個根SDA傳數據,就兩根,沒有了I2C的那個片選CS端。因此在這個上面傳輸數據,必須靠I2C這兩根唯二的的線表示啟動、傳輸和停止等。電平就只有高低了,那麽還能利用什麽呢,就是上升沿和下降沿,總之,在這麽兩個線上其實好好多組合。第壹類,電平組合類SCL和SDA的配合四種:高平+高平、高平+低平、低平+高平、低平+低平;第二類,電平SCKL和邊沿SDA組合類:高平+上升沿、高平+下降沿、地平+上升沿、低平+下降沿。可以看出就這麽兩根線上可以利用的東西也不少,用這些組合就可以表示起動、停止等等,甚至根本就用不了這麽多。退壹萬步講,即使全部都用了,還可以串行繼續組合麽,還可以先SDA再SCL麽,總之兩根線都能被挖掘這麽深,我不得不佩服那些飛利浦工程師們的創造力。從上面就明白了,如何表示所選擇的芯片的啟動,就靠這些組合。例如:SCL上高平上SDA上的上升沿或者下降沿,證明主機發送了芯片的啟動要求。還有壹個問題就是,如果I2C上掛了多個I2C器件,那麽怎麽知道啟動那壹個呢,因為它們又沒有SPI的片選CS那個管腳,這個管腳可以通過類似三八譯碼器那樣找到類型相同但是不同的芯片,I2C上又沒有怎麽辦呢?I2C的器件上有幾個管腳接地或者掛高(AT24C02就是,叫可編程管腳)就是地址,還有就是器件廠商也規定了I2C上發送的第壹個字節就是芯片地址,前四個位0000~11111,這個最多可以表示16個不同類型的I2C器件(實際I2C器件根本沒有這麽多,而且0000和1111不能用,所以只剩下14個了。這個國際統壹的規定,就是I2C的協議,《全國大學生電子設計競賽——單片機應用技能》P171有說明,“I2C總線委員會”的規定)。剩下的3個位就是器件的地址,這個地址和I2C上發的地址對上了,就找到了,剩下最後壹位是讀寫。然後在I2C上的兩根線上寫數據,先寫芯片地址,再寫找到的芯片內部的地址,最後是讀或者是寫這個地址,而且每發送壹個字節必須從機給個應答,也就是鏈接的I2C器件給主機(壹般是單片機或者是I2C接口)發送回來壹個應答,而且應答是必須是收壹個字節接壹個應答那麽交替。因此從這點上看來,I2C協議實現起來其實挺復雜的,就為了少壹根線,做了多種協議,還有就是程序比SPI變得復雜。更重要的壹點是,I2C總線上所接的器件,壹種I2C最多可以接8個(因為控制字前四位是種類,最後壹位是讀寫,只有三位留給地址了),如果不同種類的I2C都算進去,總***I2C上接的器件就是14*8=112個,盡管已經很多了,但至少說明了I2C總線上能掛的器件是有限的。3、但是和SPI比較壹下就會發現,盡管I2C復雜壹點,器件有限,但是優點還是非常多的,因為三線SPI總線上只有SCK和I/O才是真正的總線,可以公用,但是CS片選信號可是壹對壹的,如果SPI總線上接112個SPI器件,SCK和I/O總線可以***用,但是112的CS片選如何處理,難道用CPLD擴展邏輯門門麽,顯然是不現實的。而且各個器件的CS片選有的是高有的是低,也是個麻煩。這點看來,SPI編程比I2C盡管簡單,但是硬件麻煩,I2C軟件復雜,但是硬件會簡單。總體來說還是I2C有更多好處,因為軟件總比硬件問題好處理。4、***同的問題,如果在壹些簡單的單片機例如AT89S51上模擬I2C或者SPI總線的時候,時序中高低電平長短和晶振有關,因此當換用不同的晶振或者單片機時候,要改變時序中控制高低電平的延時因子。

I2C具有以下優點:1. 硬件簡單,資源消耗少。只有時鐘和數據線。2. 時鐘同步和仲裁的實現原理也很簡單,以開漏/集電極開路門以線路邏輯簡單實現。3. 協議設計精巧、易用、靈活。數據、地址、指令都可以傳。4. 使用廣泛,現在幾乎所有的IC廠商都在芯片上集成了I2C。5. Philips 對I2C協議的IP已經過期,license上幾乎不用考慮。

  • 上一篇:在公司的自我介紹通用10篇
  • 下一篇:C語言編程:輸入某年某月某日,判斷這壹天是這壹年的第幾天?
  • copyright 2024編程學習大全網