專利名稱:一種防止i2c讀寫(xiě)錯(cuò)誤的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種防止I2C讀寫(xiě)錯(cuò)誤的方法,特別是涉及一種防止I2C握手失敗的方法。
背景技術(shù):
2C協(xié)議規(guī)定,在數(shù)據(jù)傳輸過(guò)程中,如果從設(shè)備要完成一些其他功能后才能接收或發(fā)送下一個(gè)完整的數(shù)據(jù)字節(jié),此時(shí)從設(shè)備可以通過(guò)一個(gè)握手協(xié)議強(qiáng)行將時(shí)鐘線SCL拉低, 迫使主機(jī)進(jìn)入等待狀態(tài),當(dāng)從設(shè)備準(zhǔn)備好接收或發(fā)送下一個(gè)數(shù)據(jù)字節(jié)并釋放SCL后,數(shù)據(jù)傳輸繼續(xù)。當(dāng)從設(shè)備強(qiáng)行拉低SCL時(shí),理論上說(shuō)應(yīng)該把SCL拉到一個(gè)穩(wěn)定的低電平,但是當(dāng) I2C接口為推挽方式時(shí),如果總線上有串聯(lián)電阻或設(shè)備I2C內(nèi)部設(shè)計(jì)有保護(hù)電阻時(shí),SCL可能會(huì)被拉到一個(gè)中間電平,驅(qū)動(dòng)電流越大。中間電平會(huì)影響時(shí)鐘SCL的低電平判斷,很可能會(huì)導(dǎo)致握手失敗,從而造成時(shí)鐘不同步,影響總線的數(shù)據(jù)傳輸,甚至使數(shù)據(jù)傳輸出錯(cuò)。本發(fā)明的意圖就是解決類似這種握手過(guò)程中CLK被拉到一個(gè)中間電平,進(jìn)而影響握手,造成時(shí)鐘不同步的問(wèn)題。從而保證I2C總線數(shù)據(jù)傳輸?shù)姆€(wěn)定性、可靠性。眾所周知,I2C總線是PHILIPS公司開(kāi)發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn),具有接口線少,控制方式簡(jiǎn)單,器件封裝小,通信速率較高等優(yōu)點(diǎn)。正因?yàn)镮2C總線的這些優(yōu)點(diǎn),現(xiàn)在越來(lái)越多的外圍設(shè)備都采用I2C控制方式。正是由于外圍I2C設(shè)備多,通常一個(gè)I2C總線上會(huì)掛接幾個(gè)I2C設(shè)備。I2C協(xié)議雖然支持一個(gè)總線上掛接多個(gè)設(shè)備,但是其數(shù)量也要受到總線最大電容400pF的限制,因此有時(shí)在HOST端I2C接口有限的情況下,不得不用GPIO模擬I2C 的方式。我們知道,I2C總線一般都是開(kāi)漏輸出,因此可以保證高低電平的穩(wěn)定。但是當(dāng)使用GPIO模擬I2C時(shí),有時(shí)只能采用推挽輸出方式,這時(shí),由于總線上串聯(lián)電阻或設(shè)備I2C內(nèi)部保護(hù)電阻的存在,就會(huì)出現(xiàn)圖一的問(wèn)題。從SCL波形看雖然影響到CLK低電平的判斷,但還沒(méi)有影響到數(shù)據(jù)的傳輸。有時(shí)甚至?xí)苯佑绊憯?shù)據(jù)傳輸。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種防止I2C讀寫(xiě)錯(cuò)誤的方法,保證I2C總線數(shù)據(jù)傳輸?shù)姆€(wěn)定性,可靠性,且結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn)。為了達(dá)到上述目的,本發(fā)明采用的技術(shù)方案是,一種防止I2C讀寫(xiě)錯(cuò)誤的方法,其步驟如下
步驟1、確定I2C速率,確定時(shí)鐘周期T ; 步驟2、將高電平與低電平時(shí)鐘的持續(xù)時(shí)間均設(shè)定為T(mén)/2 ; 步驟3、產(chǎn)生高電平與低電平時(shí)鐘信號(hào); 步驟4、判斷SCL總線為高電平或低電平;
步驟5、SCL總線為高電平,則將GPIO配置為input no pull模式;SCL總線為低電平, 則將GPIO配置為push-pull模式;
3步驟6、判斷時(shí)鐘信號(hào)的高電平是否被設(shè)備拉低;
步驟7、被設(shè)備拉低則使時(shí)鐘信號(hào)停止,達(dá)成與設(shè)備握手,直到設(shè)備釋放時(shí)鐘信號(hào)的下拉,使得時(shí)鐘信號(hào)上產(chǎn)生高電平; 步驟8、時(shí)鐘信號(hào)與設(shè)備同步。所述的input no pull模式為GPIO輸入模式;所述的push-pull模式為推挽模式。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是保證I2C總線數(shù)據(jù)傳輸?shù)姆€(wěn)定性,可靠性,且結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn)。
圖1為本發(fā)明的方法流程圖; 圖2為本發(fā)明的具體實(shí)施圖3為從設(shè)備強(qiáng)制拉低SCL時(shí)握手過(guò)程的流程圖; 圖4為本發(fā)明的標(biāo)準(zhǔn)的I2C總線結(jié)構(gòu)圖; 圖5為本發(fā)明的主機(jī)端為推挽方式的I2C總線結(jié)構(gòu)圖; 圖6為本發(fā)明的實(shí)際使用中主機(jī)端為推挽方式的I2C總線結(jié)構(gòu)圖。
具體實(shí)施例方式下面結(jié)合實(shí)施例參照附圖進(jìn)行詳細(xì)說(shuō)明,以便對(duì)本發(fā)明的技術(shù)特征及優(yōu)點(diǎn)進(jìn)行更深入的詮釋。圖4所示的是標(biāo)準(zhǔn)的I2C總線結(jié)構(gòu),可見(jiàn)主機(jī)和設(shè)備的內(nèi)部都是開(kāi)漏輸出,這樣就可以保證高低狀態(tài)的穩(wěn)定。然而實(shí)際使用中,有時(shí)我們不得不用推挽方式,例如用軟件模擬 I2C時(shí),其內(nèi)部結(jié)構(gòu)如圖5所示??梢?jiàn)此時(shí)主機(jī)端是推挽方式的,而設(shè)備端是開(kāi)漏方式的。由于推挽方式驅(qū)動(dòng)時(shí),總線上會(huì)有較大的驅(qū)動(dòng)電流產(chǎn)生,同時(shí),一般出于降噪的考慮會(huì)在I2C 總線上串小電阻(0-300歐),現(xiàn)在很多的I2C器件在芯片內(nèi)部出于保護(hù)芯片的考慮也會(huì)串一個(gè)小電阻。因此實(shí)際使用中的I2C總線結(jié)構(gòu)如圖6所示。如圖6所示,一種I2C總線電路結(jié)構(gòu),包括I2C總線及通過(guò)I2C總線連接的主機(jī)和設(shè)備,I2C總線為串行數(shù)據(jù)線SDA及串行時(shí)鐘線SCL,串行數(shù)據(jù)線SDA上串聯(lián)有電阻R1,且通過(guò)上拉電阻R3連接電源VDD,串行時(shí)鐘線SCL上串聯(lián)有電阻R2,且通過(guò)上拉電阻R4連接電源VDD,所述的主機(jī)為推挽輸出結(jié)構(gòu),設(shè)備為開(kāi)漏輸出結(jié)構(gòu)。主機(jī)與串行時(shí)鐘線SCL相連的推挽輸出結(jié)構(gòu)的場(chǎng)效應(yīng)管為Ql、Q2,主機(jī)與串行數(shù)據(jù)線SDA相連的推挽輸出結(jié)構(gòu)的場(chǎng)效應(yīng)管為Q3、Q4,Ql與Q2、Q3與Q4分別為一對(duì)放大性能相同、導(dǎo)電極性相反的場(chǎng)效應(yīng)管。在場(chǎng)效應(yīng)管Ql的源極串聯(lián)一電阻R5后接電源VDD,場(chǎng)效應(yīng)管Q2的源極接地,場(chǎng)效應(yīng)管Q1、Q2的漏極相互連接并組成推挽輸出;在場(chǎng)效應(yīng)管Q3的源極串聯(lián)一電阻R6后接電源VDD,場(chǎng)效應(yīng)管Q4的源極接地,場(chǎng)效應(yīng)管Q3、Q4的漏極相互連接組成推挽輸出。電阻R5與R6的阻值相等,設(shè)置為R。設(shè)備與串行時(shí)鐘線SCL相連的開(kāi)漏輸出結(jié)構(gòu)的場(chǎng)效應(yīng)管為Q5,Q5的源極串聯(lián)一電阻R7后接地;設(shè)備與串行數(shù)據(jù)線SDA相連的開(kāi)漏輸出結(jié)構(gòu)的場(chǎng)效應(yīng)管為Q6,Q6的源極串聯(lián)一電阻R8后接地,電阻R7與R8的阻值相等,設(shè)置為Rs,場(chǎng)效應(yīng)管Q5、Q6的漏極輸出。
設(shè)總線驅(qū)動(dòng)電流為I,SCL總線上串聯(lián)電阻R2兩端的電壓分別為U1、U2,近似的計(jì)算出Ul,U2
Ul= (Rs+R2)*I ;U2=Rs*I 推挽輸出時(shí),I2C總線上會(huì)產(chǎn)生比較大的驅(qū)動(dòng)電流,I近似等于VDD除以總線上的電阻, 場(chǎng)效應(yīng)管的導(dǎo)通電阻很小,電阻R1、R2、器件內(nèi)部的保護(hù)電阻R5、R6、R7、R8都是小電阻。假設(shè)VDD是1. 8V,線上總電阻為225歐,可算得總線上電流可達(dá)8ma,假設(shè)Rs為60歐R2為 100歐,通過(guò)上面的公式可近似得到Ul= (60+100) *8ma=U80mV,此時(shí)必然會(huì)導(dǎo)致握手失敗, 進(jìn)而會(huì)造成時(shí)鐘數(shù)據(jù)不同步,使得數(shù)據(jù)傳輸錯(cuò)誤。由此可見(jiàn),導(dǎo)致SCL被拉到一個(gè)中間電平的原因在于兩點(diǎn)一是推挽方式時(shí)總線上有較大的驅(qū)動(dòng)電流;二是總線上靠近設(shè)備有串聯(lián)電阻,包括內(nèi)部保護(hù)電阻。本發(fā)明的方法流程圖如圖1所示,一種防止I2C讀寫(xiě)錯(cuò)誤的方法,其步驟如下 步驟1、確定I2C速率,確定時(shí)鐘周期T ;
步驟2、將高電平與低電平時(shí)鐘的持續(xù)時(shí)間均設(shè)定為T(mén)/2 ; 步驟3、產(chǎn)生高電平與低電平時(shí)鐘信號(hào); 步驟4、判斷SCL總線為高電平或低電平;
步驟5、SCL總線為高電平,則將GPIO配置為input no pull模式;SCL總線為低電平, 則將GPIO配置為push-pull模式;
步驟6、判斷時(shí)鐘信號(hào)的高電平是否被設(shè)備拉低;
步驟7、被設(shè)備拉低則使時(shí)鐘信號(hào)停止,達(dá)成與設(shè)備握手,直到設(shè)備釋放時(shí)鐘信號(hào)的下拉,使得時(shí)鐘信號(hào)上產(chǎn)生高電平; 步驟8、時(shí)鐘信號(hào)與設(shè)備同步。所述的input no pull模式為GPIO輸入模式;所述的push-pull模式為推挽模式。本發(fā)明的具體實(shí)施圖如圖2所示,在push-pull方式下輸出低電平T/2后,將GPIO 轉(zhuǎn)換為input no pull模式,此時(shí),由于外部上拉的存在,SCL會(huì)被拉為高電平,且此時(shí)GPIO 是輸入狀態(tài),host可以檢測(cè)到該高電平狀態(tài),持續(xù)T/2,再轉(zhuǎn)換狀態(tài),產(chǎn)生低電平,依此類推。本發(fā)明的推挽輸出流程圖如圖3所示,假設(shè)CLK在第二個(gè)高電平時(shí)被device強(qiáng)行拉低,從圖示上可以看出,拉低時(shí)GPIO配置狀態(tài)已經(jīng)由push-pull轉(zhuǎn)換成input no pull, 此時(shí)的GPIO作為輸入引腳,對(duì)于正常的時(shí)鐘信號(hào)來(lái)說(shuō),在這個(gè)階段檢測(cè)到的仍然是高電平,可以繼續(xù)計(jì)時(shí)直到高電平計(jì)時(shí)結(jié)束再進(jìn)入Push-pull的狀態(tài),但是當(dāng)從設(shè)備拉低elk信號(hào)時(shí),此時(shí)檢測(cè)到的是低電平,軟件上可以通過(guò)一定方式的處理,使得時(shí)鐘信號(hào)停止,達(dá)成與從設(shè)備的握手,直到從設(shè)備釋放elk信號(hào)的下拉,使得elk總線上產(chǎn)生高電平,此時(shí)GPIO 作為輸入檢測(cè)到CLK高的狀態(tài),繼續(xù)按前面所述的方式產(chǎn)生時(shí)鐘以使得從設(shè)備同步。由于, 在握手的過(guò)程中,GPIO是input no pull的,因此,此時(shí)總線上只有很微弱的電流,可忽略不計(jì),這樣便破壞了問(wèn)題產(chǎn)生的第一個(gè)條件,所以,此時(shí)CLK不會(huì)被拉到一個(gè)中間電平。本發(fā)明的具體實(shí)現(xiàn)方式為當(dāng)SCL總線要輸出低電平時(shí),將主機(jī)的GPIO配置為推挽輸出,當(dāng)SCL總線為高電平時(shí),將主機(jī)的GPIO配置為GPIO輸入模式,此時(shí)總線被外部上拉拉到一個(gè)穩(wěn)定的高電平。在實(shí)際的應(yīng)用中,當(dāng)I2C的速率確定后,其時(shí)鐘周期T確定,因
5此將高低時(shí)鐘的持續(xù)時(shí)間均設(shè)定為T(mén)/2,產(chǎn)生一定時(shí)間的高低時(shí)鐘信號(hào),即產(chǎn)生一定周期的時(shí)鐘。將信號(hào)的正半周和負(fù)半周分別有兩個(gè)場(chǎng)效應(yīng)管來(lái)完成,當(dāng)信號(hào)正半周到來(lái)時(shí),由一個(gè)場(chǎng)效應(yīng)管完成放大,當(dāng)負(fù)半周到來(lái)時(shí),又由另一個(gè)場(chǎng)效應(yīng)管完成放大,放大完后,最后合成一個(gè)完整的信號(hào)。保證I2C總線數(shù)據(jù)傳輸?shù)姆€(wěn)定性,可靠性,且結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn)。
以上所述僅為本發(fā)明的較佳實(shí)施例,凡依本發(fā)明權(quán)利要求范圍所做的均等變化與修飾,皆應(yīng)屬本發(fā)明權(quán)利要求的涵蓋范圍。
權(quán)利要求
1.一種防止I2C讀寫(xiě)錯(cuò)誤的方法,其步驟如下 步驟1、確定I2C速率,確定時(shí)鐘周期T ;步驟2、將高電平與低電平時(shí)鐘的持續(xù)時(shí)間均設(shè)定為T(mén)/2 ; 步驟3、產(chǎn)生高電平與低電平時(shí)鐘信號(hào); 步驟4、判斷SCL總線為高電平或低電平;步驟5、SCL總線為高電平,則將GPIO配置為input no pull模式;SCL總線為低電平, 則將GPIO配置為push-pull模式;步驟6、判斷時(shí)鐘信號(hào)的高電平是否被設(shè)備拉低;步驟7、被設(shè)備拉低則使時(shí)鐘信號(hào)停止,達(dá)成與設(shè)備握手,直到設(shè)備釋放時(shí)鐘信號(hào)的下拉,使得時(shí)鐘信號(hào)上產(chǎn)生高電平; 步驟8、時(shí)鐘信號(hào)與設(shè)備同步。
2.根據(jù)權(quán)利要求1所述的防止I2C讀寫(xiě)錯(cuò)誤的方法,其特征在于所述的inputno pull模式為GPIO輸入模式;所述的push-pull模式為推挽模式。
全文摘要
本發(fā)明公開(kāi)了一種防止I2C讀寫(xiě)錯(cuò)誤的方法,其步驟如下步驟1、確定I2C速率,確定時(shí)鐘周期T;步驟2、將高電平與低電平時(shí)鐘的持續(xù)時(shí)間均設(shè)定為T(mén)/2;步驟3、產(chǎn)生高電平與低電平時(shí)鐘信號(hào);步驟4、判斷SCL總線為高電平或低電平;步驟5、SCL總線為高電平,則將GPIO配置為inputnopull模式;SCL總線為低電平,則將GPIO配置為push-pull模式;步驟6、判斷時(shí)鐘信號(hào)的高電平是否被設(shè)備拉低;步驟7、被設(shè)備拉低則使時(shí)鐘信號(hào)停止,達(dá)成與設(shè)備握手,直到設(shè)備釋放時(shí)鐘信號(hào)的下拉,使得時(shí)鐘信號(hào)上產(chǎn)生高電平;步驟8、時(shí)鐘信號(hào)與設(shè)備同步。本發(fā)明保證I2C總線數(shù)據(jù)傳輸?shù)姆€(wěn)定性,可靠性,且結(jié)構(gòu)簡(jiǎn)單,易于實(shí)現(xiàn)。
文檔編號(hào)G06F13/42GK102298564SQ20111026026
公開(kāi)日2011年12月28日 申請(qǐng)日期2011年9月5日 優(yōu)先權(quán)日2011年9月5日
發(fā)明者曾元清 申請(qǐng)人:廣東歐珀移動(dòng)通信有限公司