|
發(fā)布時間: 2022-1-23 22:23
正文摘要:本帖最后由 Kituro 于 2022-1-25 01:17 編輯 void I2C_SendOneByte(unsigned char TxValue) { unsigned char i, k; for(i=0; i<8; i++ ... |
| 你可以在輸出時把SDA設(shè)置成推挽模式;在讀取數(shù)據(jù)時設(shè)置成IO口模式(如果內(nèi)部上拉電阻足夠小的話);最好外部上拉電阻要接上 |
188610329 發(fā)表于 2022-1-26 18:07 好吧, 謝謝您的指點(diǎn)! |
Kituro 發(fā)表于 2022-1-26 16:36 IIC 通信, SDA, SCL 兩個引腳都需要上拉,開漏驅(qū)動,不是說,設(shè)一個就可以的。 假如是控制 DS1307的話,連SWQ引腳都需要上拉。 你雖然SDA的波跳動,但是,很大的可能是因為CLK的上拉不足。 另外,IIC器件的VCC入口一般需要 104電容濾波,如果是類似 TM系列的LED驅(qū)動 芯片, 還需要10uf以上的電解電容,不然都可能造成IIC 傳輸異常。 |
Kituro 發(fā)表于 2022-1-24 21:17 幾點(diǎn), 首先,代碼過于復(fù)雜, 你不需要 k = CY; 然后 SDA = k; 而是應(yīng)該直接 SDA = CY; 之前回復(fù)我已經(jīng)有說,準(zhǔn)雙向模式, 會在 弱上拉極弱上拉之間切換,所以,是不穩(wěn)定的,IIC器件都是有內(nèi)部下拉的,所以IO口,最好是開漏模式 + 4.7K上拉, 既然你用的是 STC8系列, 那么,你也不需要改電路,他是內(nèi)置有 4.7K上拉的。你翻一下手冊,把內(nèi)置4.7K上拉打開,然后,用開漏模式驅(qū)動,應(yīng)該就能解決這個問題了。 |
| 頂一下 |
188610329 發(fā)表于 2022-1-24 13:30 非常感謝您的回復(fù)! 我的帖子更新了一下, 有更詳細(xì)的描述, 請您看一下, 謝謝! |
Kituro 發(fā)表于 2022-1-24 13:01 如果你是 89C51 的話, 模擬IIC通信, 應(yīng)當(dāng)接在P0總線,并且4.7K上拉。 如果是增強(qiáng)型51的話,應(yīng)該開啟IO的開漏模式,并且4.7K上拉。 用準(zhǔn)雙向口驅(qū)動 IIC設(shè)備比較容易發(fā)生欠幅問題,因為準(zhǔn)雙向口的內(nèi)部弱上拉(約50K)和IIC器件內(nèi)部的弱下拉(約50K),剛好可以形成一個1/2分壓電壓。 |
c00156155 發(fā)表于 2022-1-24 12:15 沒有, 我把SDA映射到P1.4, SCL映射到P1.5, 全部懸空沒有掛設(shè)備, 我示波器探頭開的1X, 輸入阻抗相對小, 直接測量P1.5管腳 |
| 你這個電路是什么樣子呢,I2C上有掛什么器件嗎 |
188610329 發(fā)表于 2022-1-24 00:06 明白了! 學(xué)好匯編還是很重要的, 那為什么波形會呈現(xiàn)階梯狀呢? |
AAA_MCU 發(fā)表于 2022-1-24 01:03 感謝, 這一點(diǎn)沒想到! |
法2 發(fā)送的數(shù)據(jù)不對的,需要先發(fā)送再移位 |
|
首先,如果是發(fā)送 0xff 方法1 是正確發(fā)送的, 方法2 發(fā)送出去是0xfe 其次,哪種方法簡單,你是你以為你看上去覺得簡單,而是單片機(jī)實際運(yùn)行起來簡單。很明顯,單片機(jī)執(zhí)行方法1才是最簡單的。 最后, CY 是PSW里的一個位沒錯,但是就指令來講,他是直接操作的C寄存器。也是C語言方式下,操縱C寄存器的唯一方式。 從字節(jié)中提取位,無論如何都是避不開C寄存器的,所以,直接從C寄存器取值是最理想的一種方式,即便你把C語言代碼整的再怎么好看,最后還是要把位變量移到C寄存器然后再從C寄存器賦值給IO,你可以編譯后看看編譯后的指令,最終還是需要 MOV xxx,C 來給IO賦值。 |
Powered by 單片機(jī)教程網(wǎng)