4分鐘看懂!I2C通訊協(xié)議 最簡(jiǎn)單的總線通訊!

百科全書:關(guān)于IIC的一些特殊問題
讀“I(ai)2(er)C”還是“I(ai)2(fang)C”?
準(zhǔn)確來說,IIC在英文讀法上會(huì)簡(jiǎn)化為“I2C”,但由于書寫問題加上一些人不會(huì)在Word文檔打出上標(biāo),漸漸寫成也讀成了“I2(er)C”,后來NXP的MIPI協(xié)會(huì)知道此問題之后,推出“I2C加強(qiáng)版總線”也叫作“IIIC”之后,規(guī)定簡(jiǎn)單寫法是“I3C”。
謬誤/IIC的物理層
準(zhǔn)確來說,IIC是由來自電源線的一個(gè)上拉電阻分別為SCL和SDA提供電源的,每個(gè)參與IIC通訊的芯片管腳普遍采用“開漏輸出/輸入”。因?yàn)樾酒庋b特性,地線一般在晶圓最底層,電源一般在晶圓最頂層,所以灌電流(端口→GND)往往比拉電流(+VCC→端口)大。如果總線上的設(shè)備太多,光靠哪一個(gè)芯片給+VCC都是不夠電荷(電流)維持電平的,但是總線上的正電壓容易被任意一個(gè)芯片拉到0V水平,所以IIC總線上的每一個(gè)芯片端口都會(huì)工作在開漏輸出模式,并由分立元件為總線提供上拉電流。
UP主為了方便大家理解,將總線上的高電平解釋成“邏輯1”,其實(shí)不符合約定俗成的叫法。
通常我們會(huì)將芯片導(dǎo)通開漏三極管,把總線電壓拉到低電平的時(shí)刻,表示為“置1”,可以理解為“活動(dòng)位”。(此筆記后續(xù)都使用該表示法)
IIC的從機(jī)地址怎么看?
IIC設(shè)備都有一個(gè)7位數(shù)的從機(jī)地址和1位讀寫地址,讀寫地址為1時(shí),數(shù)據(jù)由從機(jī)發(fā)送至主機(jī)。
值得注意的是,起初設(shè)立IIC總線的飛利浦(后合并至恩智浦也就是NXP)規(guī)定,任意芯片可自由使用IIC,但是從機(jī)地址需要向飛利浦買授權(quán),所以芯片廠商只能用一套通用地址結(jié)構(gòu)制造同型號(hào)芯片。然而一些放在不同位置芯片會(huì)響應(yīng)相同地址,就會(huì)造成數(shù)據(jù)沖突,為避免此類情況,一些芯片還會(huì)有外接引腳控制其中幾位從機(jī)地址(如E2PROM 24C02)。
IIC的時(shí)序
IIC有兩個(gè)特殊位:起始位和停止位,它們都有一個(gè)共同點(diǎn),SCL線未被任何芯片拉低,動(dòng)的是SDA線(起始位是拉低,停止位是拉高),這就規(guī)定了在數(shù)據(jù)傳輸時(shí)的以下特性:
SCL線拉低時(shí),SDA線電平可任意變化,但SCL線拉高時(shí),SDA線電平必須保持穩(wěn)定(否則會(huì)錯(cuò)誤識(shí)別為起/止位)。
由于芯片內(nèi)建的電平穩(wěn)定器(如施密特觸發(fā)器或者結(jié)電容),芯片需要一段時(shí)間完成對(duì)總線電平的采樣,所以IIC的速度不能太快。IIC以100kbps為標(biāo)稱速度,400kbps為高速,1.2Mbps為特高速,其余速度范圍只能通過軟件端口(GPIO)模擬實(shí)現(xiàn)。
IIC的字節(jié)控制
每傳輸8個(gè)位,就會(huì)留下一個(gè)位用于監(jiān)聽,這個(gè)位由接受數(shù)據(jù)的芯片返回“是否應(yīng)答成功”。
寫數(shù)據(jù)到從機(jī)時(shí),從機(jī)應(yīng)答;由從機(jī)讀數(shù)據(jù)時(shí),主機(jī)應(yīng)答。
如果應(yīng)答成功,傳輸將繼續(xù);未及時(shí)返回應(yīng)答,將重置通信進(jìn)度,下一次傳輸將從頭開始。所以你會(huì)看到一個(gè)奇葩要求,由從機(jī)發(fā)送數(shù)據(jù)到主機(jī)之后,主機(jī)要在最后一個(gè)字節(jié)回復(fù)“應(yīng)答失敗”。
因?yàn)閺臋C(jī)芯片的IIC控制器是保存內(nèi)存指針的,根據(jù)不同芯片/工作模式,會(huì)出現(xiàn)“每次傳輸下一內(nèi)存地址”或者“每次傳輸固定內(nèi)存地址”其中一種工作模式,如果讀了最后一個(gè)字節(jié)還是“應(yīng)答成功”,從機(jī)就不會(huì)重置內(nèi)存指針,認(rèn)定下一個(gè)寫進(jìn)去的字節(jié)不是地址而是數(shù)據(jù)。
芯片讀寫數(shù)據(jù)流向
寫入:主機(jī)發(fā)起始位→主機(jī)發(fā)設(shè)備地址→從機(jī)應(yīng)答→主機(jī)發(fā)內(nèi)存地址→從機(jī)應(yīng)答→主機(jī)發(fā)數(shù)據(jù)1→從機(jī)應(yīng)答→數(shù)據(jù)2→應(yīng)答……→數(shù)據(jù)n→應(yīng)答→主機(jī)發(fā)停止位
從首內(nèi)存讀?。?/span>主機(jī)發(fā)起始位→主機(jī)發(fā)設(shè)備地址(讀?。鷱臋C(jī)應(yīng)答→從機(jī)發(fā)數(shù)據(jù)1→主機(jī)應(yīng)答→……→從機(jī)發(fā)數(shù)據(jù)n→主機(jī)發(fā)應(yīng)答失敗→主機(jī)發(fā)停止位
從指定內(nèi)存讀?。?/span>主機(jī)發(fā)起始位→主機(jī)發(fā)設(shè)備地址→從機(jī)應(yīng)答→主機(jī)發(fā)內(nèi)存地址→從機(jī)應(yīng)答↓
……主機(jī)發(fā)停止位→主機(jī)發(fā)起始位(又叫“重復(fù)起始”)→主機(jī)發(fā)設(shè)備地址(讀?。鷱臋C(jī)應(yīng)答→從機(jī)發(fā)數(shù)據(jù)1→……從機(jī)發(fā)數(shù)據(jù)n→主機(jī)發(fā)應(yīng)答失敗→主機(jī)發(fā)停止位
完成一次傳輸(發(fā)完停止位)之后,還需要插入延時(shí)等候從機(jī)芯片初始化完成。
多主機(jī)仲裁
理論上IIC會(huì)工作在“單主多從”模式,但一些特殊設(shè)計(jì)共用從機(jī)芯片,就會(huì)出現(xiàn)“多主多從”結(jié)構(gòu),這是每一個(gè)串行數(shù)據(jù)總線都無(wú)法避免的問題(如IIC/CAN/LIN/485)。
每個(gè)芯片的端口既有開漏三極管用于驅(qū)動(dòng),又有輸入電平采樣器,上文提出的“開漏輸出/輸入”端口結(jié)構(gòu),既為了識(shí)別來自其他芯片的應(yīng)答信號(hào),也為了識(shí)別來自其他芯片的活動(dòng)造成的干擾。
IIC總線會(huì)使用“線與機(jī)制”識(shí)別來自其他芯片的活動(dòng)(搶答),一般不會(huì)在開漏三極管導(dǎo)通的時(shí)候檢查仲裁,而是在開漏三極管截止的時(shí)候檢查總線是否被其他芯片拉到低電平,如果檢測(cè)到總線被其他芯片拉到低電平,就要立即退出通信并向軟件報(bào)告“仲裁失利”,等待其他芯片傳輸完成。
主機(jī)A請(qǐng)求地址0b01001001→退出通信
主機(jī)B請(qǐng)求地址0b01011001→繼續(xù)傳輸