|
本帖最后由 Kituro 于 2022-1-25 01:17 編輯
- void I2C_SendOneByte(unsigned char TxValue)
- {
-
- unsigned char i, k;
- for(i=0; i<8; i++)
- {
- TxValue <<= 1; //Data is transferred with MSB first.
- k = CY;
- SDA = k; //If MSB is 1, the Carry Flag (CY) will be set to 1 after left logical shift, and vice versa.
- delay();
- SCL = 1;
- delay();
- SCL = 0;
- }
- }
復(fù)制代碼 使用以上程序發(fā)送數(shù)據(jù), 波形如下:(端口懸空未連接設(shè)備, 探頭衰減10X)
單片機(jī)型號STC8A8K64S4A12, 輸出為準(zhǔn)雙向口(傳統(tǒng)8051模式),啟用內(nèi)部4.1K上拉電阻, IO模式圖:
Snipaste_2022-01-25_01-16-52.jpg (35.18 KB, 下載次數(shù): 40)
下載附件
2022-1-25 01:17 上傳
Snipaste_2022-01-25_01-17-04.jpg (208.5 KB, 下載次數(shù): 34)
下載附件
2022-1-25 01:17 上傳
可以看到, 波形有三個(gè)階梯(欠幅), 最下方的波形為0V, 中間的波形為約為2.5v, 最高的波形就是高電平5v
這是為什么? 為什么波形會欠幅?
我有想過可能是變量移位, 取數(shù)據(jù)等消耗了時(shí)間, 但如果這樣也不應(yīng)該欠幅啊, 為什么會有一個(gè)2.5v的電壓出現(xiàn)?
為什么發(fā)送數(shù)據(jù)的波形會出現(xiàn)欠幅現(xiàn)象?
------------------------------------------------------------------------------------------------------------------------------------------
今天又用Keil的debug功能調(diào)試了一下程序, 發(fā)現(xiàn)一個(gè)問題:先上匯編程序:
Snipaste_2022-01-24_20-58-09.jpg (82.54 KB, 下載次數(shù): 36)
下載附件
2022-1-24 20:59 上傳
整個(gè)字節(jié)的發(fā)送過程太過繁瑣, 這里精簡一下, 只考慮發(fā)送一個(gè)bit的情況, 當(dāng)發(fā)送"1"(即高電平)時(shí)
當(dāng)程序運(yùn)行到SDA = 1時(shí), 輸出波形沒有預(yù)想中被拉高到5v, 反而處于2.5v左右的不確定狀態(tài), 有較大波動
Snipaste_2022-01-24_21-05-41.jpg (29.38 KB, 下載次數(shù): 33)
下載附件
2022-1-24 21:07 上傳
51hei圖片_20220124210745.jpg (146.19 KB, 下載次數(shù): 39)
下載附件
2022-1-24 21:08 上傳
但當(dāng)程序運(yùn)行至"SCL = 0"處時(shí), SDA才被穩(wěn)定拉高至5V
Snipaste_2022-01-24_21-10-10.jpg (28 KB, 下載次數(shù): 38)
下載附件
2022-1-24 21:12 上傳
51hei圖片_20220124211152.jpg (144.79 KB, 下載次數(shù): 45)
下載附件
2022-1-24 21:11 上傳
整個(gè)發(fā)送中, 以上過程不斷循環(huán), 最終導(dǎo)致了波形產(chǎn)生欠幅現(xiàn)象
綜上, 我最搞不清楚的一點(diǎn)是:為什么執(zhí)行SDA = 1之后SDA管腳會處于不確定狀態(tài)? 而在執(zhí)行完與SDA毫不相干的"SCL = 0"語句后SDA又被拉高?
是上拉電阻的原因嗎? 但如果是因?yàn)闆]有上拉電阻的話, SDA又為什么能被拉高到5V呢?
本人百思不得其解, 如若得君相助, 定感激不盡!
|
|