本帖最后由 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;
- }
- }
復制代碼 使用以上程序發送數據, 波形如下:(端口懸空未連接設備, 探頭衰減10X)
單片機型號STC8A8K64S4A12, 輸出為準雙向口(傳統8051模式),啟用內部4.1K上拉電阻, IO模式圖:
可以看到, 波形有三個階梯(欠幅), 最下方的波形為0V, 中間的波形為約為2.5v, 最高的波形就是高電平5v
這是為什么? 為什么波形會欠幅?
我有想過可能是變量移位, 取數據等消耗了時間, 但如果這樣也不應該欠幅啊, 為什么會有一個2.5v的電壓出現?
為什么發送數據的波形會出現欠幅現象?
------------------------------------------------------------------------------------------------------------------------------------------
今天又用Keil的debug功能調試了一下程序, 發現一個問題:先上匯編程序:
整個字節的發送過程太過繁瑣, 這里精簡一下, 只考慮發送一個bit的情況, 當發送"1"(即高電平)時
當程序運行到SDA = 1時, 輸出波形沒有預想中被拉高到5v, 反而處于2.5v左右的不確定狀態, 有較大波動
但當程序運行至"SCL = 0"處時, SDA才被穩定拉高至5V
整個發送中, 以上過程不斷循環, 最終導致了波形產生欠幅現象
綜上, 我最搞不清楚的一點是:為什么執行SDA = 1之后SDA管腳會處于不確定狀態? 而在執行完與SDA毫不相干的"SCL = 0"語句后SDA又被拉高?
是上拉電阻的原因嗎? 但如果是因為沒有上拉電阻的話, SDA又為什么能被拉高到5V呢?
本人百思不得其解, 如若得君相助, 定感激不盡!
|