I2C總線發展史
怎么在一條串口線上連接多個設備呢?
由于速度同步線是由主機實時發出的,所以主機可以按需求修改通信速度,這樣在一條線上可以掛接不同速度的器件,單片機和性能差的器件通信,就輸出較慢的脈沖信號,和高性能芯片通信,就輸出高速脈沖信號。
這條速度同步線被稱為SCL時鐘線
原來的串口線被稱為SDA數據線
學習一種協議,用于所有I2C器件上
因為有地址保留所以只能連接111個器件
芯片的地址并不是由廠商隨意寫的,而是要得到飛利浦公司的授權
I2C硬件連接
還要為SCL和SDA線添加上拉電阻
I2C器件的所有接口必須是開漏模式(I2C器件的SCL和SDA必須是開漏模式),各自器件沒有上拉或下拉電阻,如果每個器件內部都添加上拉電阻,當把大量的器件連在一起,上拉電阻的阻值也會累加,就對單片機IO端口的電流輸出能力有很高的要求,最終也會影響到通信速度和穩定性。
事先將地址設置引腳連接到Vdd或GND上,這樣才能確定器件的地址編碼
各器件可以使用同一個電源也可以使用不同的電源
上拉電阻使無信號時線上為高電平
如何傳遞數據內容
SCL派上用場了
Hz變化頻率決定通信總速度
單片機可以利用這個休息時間把下一個要發送的數據準備好
單片機讓出控制權
如果是默認的高電平就代表無應答,從設備沒有收到數據,或者說收到了,但是數據是錯誤的
沒有問題的話,SDA就會連接到GND使SDA輸出低電平
總之就是誰接收誰應答
要確定第一個工作區間在哪?
在第一個工作期間之前加一個 (起始位),再在最后一個工作期間后面,加入一個(結束位),也叫停止位
想出這個起始位和停止位的人是天才
完整時序圖
來研究數據內容層面的東西
接下來是讀數據
如何標出本次通信是接收(讀)還是發送(寫)
讀操作是從設備將向單片機發送數據
寫操作是是單片機向從設備發送數據
下面是出現的一個新問題
像從設備每次讀/寫多個數據都要從第一個寄存器的盒子開始讀寫,假如我們想寫第四個寄存器中的數據,那也要從第一個寄存器開始寫,連續寫四個才行,這樣的操作是非常麻煩的,于是I2C協議規定了一個指針功能,英文是Pointer
指針功能就是利用一組數據中第二個DATA數據,當作指針來使用
如果要讀寫第四個寄存器,也可以表示從第四個寄存器開始讀寫
下次再讀時可以不使用指針了,直接讀取上一次指針指向的寄存器內容,這個指針在國內被翻譯成子地址/寄存器地址
如果一條總線上連接多個從設備,單片機要如何區分它們
不是此號碼的從設備將處在待機狀態
左邊7位二進制數就表示著器件地址