當初接這份工作時,剛到公司沒多久,就得用C實作出軟體的SPI介面。說實話,用軟體實做SPI和I2C通訊介面不難,只要照著spec的 timing圖動作,就不會錯了,用硬體來做更是簡單。比較常出問題的地方,反而是硬體周邊設計不良(如I2C pull high電阻阻值不恰當),layout不遵照spec建議,或寫軟體的人未完全遵照spec定義的protocol作動。有時候也會遇到IC本身的硬體 介面有bug(例如PIC16F877A的早期版本,詳細內容可google “PIC16F MSSP errata”),不過和前述的錯誤比起來,IC本身錯誤的出現機率低很多。
有關I2C的詳細介紹請參照 http://en.wikipedia.org/wiki/I²C
這裡就不多廢話,直接舉例
以寫入I2C的EEPROM(24LC02B)為例,這裡取datasheet 中 figure 7-2 和邏輯分析儀的波形圖做比對:
從EEPROM的datasheet得知,command 0xA0可以為write commmad,0xA1可以為read command,故假設系統需要對memory address 0×10的位置做寫入,可遵循以下步驟:
- 檢查bus上是否為idle狀態,Yes則執行步驟2,No則跳出
- 啟始固定為傳送start bit
- 傳送write command 0xA0,並偵測EEPROM是否回應ACK bit(若無回應,視為傳輸失敗)
- 傳輸指定的memory address 0×10,並偵測EEPROM是否回應ACK bit(若無回應,視為傳輸失敗)
- 傳送要儲存的memory data(這裡是儲存數值0x1A),並偵測EEPROM是否回應ACK bit(若無回應,視為傳輸失敗)
- 結尾固定為傳送stop bit,完成後SDA與SCL皆為high狀態
再來是讀取的對照圖,我就不多說讓讀者自己思考看看
如果對於I2C的timing還是不夠瞭解,可以參考Microchip網站的PIC24FJ Reference Manual – Sec24 Inter Integrated Circuit,裡面提供的timing圖有把master和slave的訊號分開來解說,非常淺顯易懂。
No comments:
Post a Comment