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