先來點題外話~網(wǎng)上說STM32F103的IIC有瑕疵!就當是有些短板吧,個人覺得,用起來肯定沒問題,只是不好用。人家說ST公司考慮到專利問題,沒按飛利浦的標準來。導致STM32的IIC使用起來非常繁雜。下面就講講用STM32 IO口模擬IIC的注意問題:
IIC總線時序:
我就因為沒理解好應答,吃了虧。講一講IIC的幾個重要狀態(tài):
1、空閑狀態(tài):當IIC總線空閑時,SDA和SCL兩條線均為高電平,由于連接到總線上的器件必須是漏級和集電極開路(至于威為什么請讀者自己搜索),只要有一個器件任意時刻輸出低電平,都將使總線上的信號變低,即各器件的SDA和SCL是線與的關系。由于各器件輸出端是漏級開路,故必須通過上拉電阻接正電源,以保證SDA和SCL在空閑時被拉為高電平。
2、起始信號S和終止信號P(注意起始和終止信號中的延時,嚴格按照數(shù)據(jù)手冊來,快一點,慢一點都不行?。?br/>起始信號S:在SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號,只有在起始信號以后,其他命令才有效。
終止信號P:在SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號,隨著終止信號的出現(xiàn),所有外部操作都結(jié)束。如圖:
3、數(shù)據(jù)的傳送:一句話:低電平變化,高電平穩(wěn)定。
IIC總線在進行數(shù)據(jù)傳送時,每一位數(shù)據(jù)位的傳送都與時鐘脈沖相對應。時鐘脈沖為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定;只有在時鐘線為低電平期間,數(shù)據(jù)線上的電平狀態(tài)才允許變化。即:數(shù)據(jù)在SCL的上升沿來之前就需準備好,并在下降沿來之前必須穩(wěn)定。如圖:
4、(易錯)應答信號ACK、非應答信號NACK、終止信號P:
應答信號ACK:該信號是由從器件產(chǎn)生的,IIC總線在傳送一字節(jié)(8位)數(shù)據(jù)后都必須有應答信號A,下面是易錯點:對于反饋有效應答位ACK的要求是,接收器在第九個時鐘脈沖之前得低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。表示其已經(jīng)收到一個8位的數(shù)據(jù)了。如圖:
非應答信號NACK:該信號是由主器件產(chǎn)生的。當主器件接收來自從機的數(shù)據(jù)時,接收到最后一個數(shù)據(jù)字節(jié)后,必須給從器件發(fā)送一個非應答信號,使從機釋放數(shù)據(jù)總線,以便主機發(fā)送一個終止信號,從而結(jié)束數(shù)據(jù)的傳送。
終止信號P:主機發(fā)送終止信號有兩種情況:1、當數(shù)據(jù)傳輸完成后,主器件發(fā)送終止信號。2、由于某種原因,接收方不對主器件尋址信號應答時,例如接收方正在進行其他處理而無法接收總線上的數(shù)據(jù)時,必須釋放總線,將數(shù)據(jù)線置為高電平,而由主器件產(chǎn)生一個終止信號以結(jié)束總線的數(shù)據(jù)傳送。
從上文中可以看出:
1、無論何種數(shù)據(jù)傳輸格式(主發(fā)從收,主收從發(fā),主機收發(fā)),尋址字節(jié)都由主器件發(fā)出,數(shù)據(jù)字節(jié)的傳送方向則由尋址字節(jié)中的方向為來決定。
2、尋址字節(jié)只表明了從器件的地址及數(shù)據(jù)傳送方向。從器件內(nèi)部的n個數(shù)據(jù)地址,由器件設計者在該器件的IIC總線數(shù)據(jù)操作格式中,指定第1個數(shù)據(jù)字節(jié)作為器件內(nèi)的單元地址指針,并且設置地址自動加減功能,以減少從器件的尋址操作。
3、每個字節(jié)傳送都必須有應答信號相隨。
4、從器件在接收到起始信號后都必須釋放數(shù)據(jù)總線,使其處于高電平(最后一個圖),以便主器件發(fā)送從機地址。