思路其實蠻簡單的。 我們知道,I2C對時序要求是嚴(yán)格的,但對時間沒有要求,即每一個動作之間的時間間隔沒有要求,于是,我們可以把每一個動作放慢到我們利于肉眼可以觀測的速度,并用LED來顯示每一個步驟及端口的電位變化。 具體說來,就是將每一步SDA及SCL端口的電位,送入另外的兩個端口,這兩個端口分別接有LED,比如,我們用P1.0作為總線的SCL端口,用P1.2作為SDA端口,用P1.5作為SCL電位顯示的端口(標(biāo)記為LSCL),用P1.6作為SDA電位顯示的端口(標(biāo)記為LSDA);用P2作為發(fā)送或接收的數(shù)據(jù)的顯示端口,每發(fā)送一位或接收一位,就顯示在P2端口的LED上。 如果你自己搭建電路,需要注意的是,SDA和SCL端口一定要接上拉電阻。 每一步延時的時間,可以設(shè)為1s,看你自己喜歡。 編寫程序時,我們可以直接寫入器件尋址及寫入器件命令值10100000B值,最后通過觀測LSDA的亮滅來檢驗?zāi)愕某绦蚴欠裾_。 對于初練I2C的人來說,建議先一步步硬寫這段程序,程序流程如下: 置SDA高電位; SDA送入LSDA; 置SCL高電位; SCL送入LSDA; 延時; 置SDA低電位;取得總線控制權(quán) LSDA=SDA; 延時; 置SCL為0;為SDA上放數(shù)據(jù)作好準(zhǔn)備 LSCL=SCL; 延時; 置SDA為1;數(shù)據(jù)的第7位 LSDA=SDA; P2.7=SDA;送入數(shù)據(jù)顯示LED最高位 短延時;有幾個空操作就夠了 SCL=1; LSCL=SCL; DELAY1S; SCL=0; LSCL=SCL; DELAY1S; 以上第7位就發(fā)送完了,按上面從“置SDA為1”開始的程序,將剩下的7位全部發(fā)送完成,這樣就將10100000B發(fā)送完成。然后,運(yùn)行并觀測所有LED燈的顯示是否符合你的設(shè)計,最終LSDA應(yīng)處于滅狀態(tài)。如果你送入的是10100001B(讀)數(shù)值,則最后LSDA處于亮狀態(tài)。 沒問題后,再加寫三條程序 SDA=1; LSDA=SDA; DELAY1S; 再運(yùn)行,完成后LSDA應(yīng)處于滅狀態(tài)。 沒問題后,再加寫以下程序: SCL=1; LSCL=SCL; DELAY1S; LSDA=SDA; DELAY1S; 再運(yùn)行,完成后LSDA依然處于滅狀態(tài)。 再加寫以下程序: SCL=0; LSCL=SCL; DELAY1S; LSDA=SDA; DELAY1S; 再運(yùn)行,完成后LSDA處于亮狀態(tài)。說明從器件是在SCL的下降沿讀取SDA的值。 至此,我們的實驗基本就算達(dá)成了目的,后面的寫數(shù)據(jù)也好讀數(shù)據(jù)也好,在此基礎(chǔ)上編寫就是了。 此慢動作的方法,其實適用于任何數(shù)據(jù)傳輸協(xié)議的探究與學(xué)習(xí),無非是對于固定波特率的協(xié)議,在編程中進(jìn)行人為加個放大的時間倍率就是了。 前面有個貼子,說是教科書中有錯誤,而這個試驗,就是對其的論證。 另外說明一下,上面的流程,即不是C也不是匯編,你按這個流程,選擇你喜歡的語言來編程就是了。還有你可以輸入10100001B來一步一步地試驗。
|