I2C 通訊協議:(Inter-Integrated Circuit)是由Phiilps 公司開發的,由於它引腳少,硬件實現簡單,可擴展性強,不需要USART、CAN 等通訊協議的外部收發設備,現在被廣泛地使用在系統內多個集成電路(IC)間的通訊,其常用的連接方式如下:
物理層:
(1) 它是一個支持設備的總線。“總線”指多個設備共用的信號線。在一個I2C 通訊總線中,可連接多個I2C 通訊設備,支持多個通訊主機及多個通訊從機。
(2) 一個I2C 總線只使用兩條總線線路,一條雙向串行數據線(SDA) ,一條串行時鍾線(SCL)。數據線即用來表示數據,時鍾線用於數據收發同步。
(3) 每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備之間的訪問。
(4) 總線通過上拉電阻接到電源。當I2C 設備空閑時,會輸出高阻態,而當所有設備都空閑,都輸出高阻態時,由上拉電阻把總線拉成高電平。
(5) 多個主機同時使用總線時,為了防止數據沖突,會利用仲裁方式決定由哪個設備占用總線。
(6) 具有三種傳輸模式:標准模式傳輸速率為100kbit/s ,快速模式為400kbit/s ,高速模式下可達3.4Mbit/s,但目前大多I C 設備尚不支持高速模式。
(7) 連接到相同總線的IC 數量受到總線的最大電容400pF 限制
協議層:
- 起始信號:由主機的IIC接口產生的傳輸起始信號,這時連接到總線上的所有從機都會收到這個信號;
- 地址廣播:起始信號產生后,所有從機都會開始等待主機接下來廣播的從機地址信號,以選中從機設備,沒有被選中的將會忽略之后的數據信號;
- 傳輸方向:0表示主機向從機寫數據,1表示主機向從機讀數據;
- 應答信號:從機接收到匹配的地址之后,從機或主機會返回一個應答(ACK)或非應答(NACK)信號,只有接收到信號,主機才能繼續發送或接受數據;
- 寫數據/讀數據:主機每發送完一個數據包之后。都要重新等待從機的應答信號,並重復這個步驟;/從機每發送玩一個數據包之后,都會重新等待主機的應答信號,並重復這個步驟;
- 停止信號:數據傳輸完成后(得到NACK信號后),主機向從機發送一個停止傳輸信號,表示不再傳輸。/當主機希望停止接受數據時,就會返回一個NACK信號給從機,從機就會自動停止數據傳輸;
除了基本的讀寫,I2C通訊更常用的是復合格式,即第三幅圖的情況,該傳輸過程有兩次起始信號(S)。一般在第一次傳輸中,主機通過SLAVE_ADDRESS 尋找到從設備后,發送一段“數據”,這段數據通常用於表示從設備內部的寄存器或存儲器地址(注意區分它與 SLAVE_ADDRESS 的區別);在第二次的傳輸中,對該地址的內容進行讀或寫。也就是說,第一次通訊是告訴從機讀寫地址,第二次則是讀寫的實際內容。