1、為什么采用漏極開路?
????????首先,連接到 I2C 上的設(shè)備是開漏輸出的。以漏極開漏輸出(OD)為例,是指將輸出級(jí)電路結(jié)構(gòu)改為一個(gè)漏極開路輸出的 MOS 管。這樣做的好處在于:
- 防止短路。
- 可以實(shí)現(xiàn)“線與”邏輯,可以減少一個(gè)與門的使用,簡化電路。
結(jié)論:I2C支持多個(gè)主設(shè)備與多個(gè)從設(shè)備連接在同一根總線上,如果不開漏輸出,會(huì)出現(xiàn)短路現(xiàn)象。
2、為什么要加上拉電阻?
但是,采用開漏輸出時(shí),如果沒有上拉電阻的存在,只能輸出低電位,無法輸出高點(diǎn)位。
結(jié)論:連接上拉電阻后,才可以輸出高電位。
在驗(yàn)證 I2C 接口時(shí),我們同樣要對(duì)上拉電阻做處理。如下:以從端驅(qū)動(dòng) SDA 和 SCL 為例
從端對(duì)SDA/SCL線的驅(qū)動(dòng):
assign SCL = scl_slave === 0 ? 1'b0 : 1'bz ;
assign SDA = sda_slave === 0 ? 1'b0 : 1'bz ;
也就是說:
- 當(dāng)從端驅(qū)動(dòng) SDA/SCL 為低(0)時(shí),從端會(huì)直接給 SDA/SCL 一個(gè)0值;
- 如果從端驅(qū)動(dòng) SDA/SCL 不為低(0)時(shí),從端會(huì)給 SDA/SCL 一個(gè)高阻態(tài)值。
為什么是高阻態(tài)?而不是直接給高電位(1)呢?
因?yàn)楦咦钁B(tài)是一個(gè)無效驅(qū)動(dòng),而高電位(1)是一個(gè)有效驅(qū)動(dòng),如果置為1會(huì)跟其他的驅(qū)動(dòng)源造成多驅(qū)動(dòng)沖突。為了避免多重驅(qū)動(dòng)的問題,當(dāng) Slave 或者 Master 不打算驅(qū)動(dòng)任何一根線時(shí)(SDA/SCL),那必須把 SDA/SCL 給一個(gè)高阻態(tài)(z)值。
經(jīng)過上拉處理:
如果在整個(gè)總線上,master 和 slave 都沒有給 SDA/SCL 一個(gè)有效驅(qū)動(dòng)(即低電位),會(huì)通過上拉電阻將 SCL/SDA置為高電位(1)。
注意:這個(gè)給的高電位(1)是一個(gè)弱信號(hào),可以防止形成多驅(qū)動(dòng)源造成沖突。
assign (week0,week1) SCL = enable_pullup_registor ? 1: 0;
assign (week0,week1) SDA = enable_pullup_registor ? 1: 0;
舉個(gè)例子:
I2C支持多主設(shè)備與多個(gè)從設(shè)備,下面 master1 給 slave1 發(fā)送一個(gè)從地址(0110 011),master2 給 slave2 發(fā)送一個(gè)從地址(0110 001),
解釋上圖中的例子:
- 當(dāng) master1 發(fā)送最后一個(gè)R/W位 = 0 時(shí),此時(shí),會(huì)直接將SDA線拉低,slave1 可以看到SDA線為低。
- 當(dāng) master2 發(fā)送最后一個(gè)R/W位 = 1 時(shí),此時(shí),master2 會(huì)給 SDA一個(gè)高阻值(Z),表明 master1 不對(duì)總線SDA做驅(qū)動(dòng),此時(shí)上拉電阻會(huì)將SDA信號(hào)線置為1(弱信號(hào)),slave2 看到的是SDA為高。
3、為什么要線與?? ? ??
????????現(xiàn)在,我們已經(jīng)知道了 I2C 為什么要漏極開路和添加上拉電阻的目的了,那么又為什么要線與?I2C 支持多個(gè)主設(shè)備與多個(gè)從設(shè)備連接在同一根總線上,如果多個(gè)設(shè)備同時(shí)占用總線,怎么判斷誰先占用總線呢?所以就需要一種仲裁機(jī)制。I2C 沒有 Arbiter 直接的來處理仲裁,而是通過線與的邏輯實(shí)現(xiàn)仲裁。
仲裁過程:當(dāng)主設(shè)備A準(zhǔn)備占用I2C時(shí),需要在SCL為高時(shí),將SDA拉高,再拉低,滿足一個(gè)啟動(dòng)條件。當(dāng)主設(shè)備A將SDA拉高后,需要檢查SDA的電平:文章來源:http://www.zghlxwxcb.cn/news/detail-491948.html
- 如果此時(shí)SDA電平為高,說明主設(shè)備可以占用總線,然后主設(shè)備A會(huì)將SDA拉低,一次滿足啟動(dòng)條件,開始傳輸;
- 如果此時(shí)SDA電平為低,說明總線已經(jīng)被其他設(shè)備占用,主設(shè)備A會(huì)退出。
為什么SDA為低,就是被其他設(shè)備占用了呢?
因?yàn)榫€與邏輯的存在。只有總線上有其他的設(shè)備將SDA置為0,線與后,SDA線的電平為0。主設(shè)備A檢查SDA線的電平時(shí),會(huì)發(fā)現(xiàn)為低電平。所以仲裁時(shí),哪個(gè)設(shè)備更早地將SDA線拉低,誰就搶占了優(yōu)先權(quán)。文章來源地址http://www.zghlxwxcb.cn/news/detail-491948.html
4、總結(jié)全文
- 漏極開路是為了防止I2C上連接多個(gè)主設(shè)備與多個(gè)從設(shè)備時(shí)出現(xiàn)短路;
- 上拉電阻的存在是為了在使用漏極開路之后,可以輸出高電平;
- “線與”是為了在多個(gè)主設(shè)備同時(shí)占用總線時(shí),具有仲裁的能力。
?
到了這里,關(guān)于I2C中為什么線與?為什么要有上拉電阻?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!