久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1661|回復: 14
收起左側

關于51單片機模擬串行通信協議波形的探討

[復制鏈接]
ID:884307 發表于 2022-1-23 22:23 | 顯示全部樓層 |閱讀模式
本帖最后由 Kituro 于 2022-1-25 01:17 編輯


  1. void I2C_SendOneByte(unsigned char TxValue)
  2. {
  3.         
  4.     unsigned char i, k;

  5.     for(i=0; i<8; i++)
  6.     {
  7.         TxValue <<= 1;               //Data is transferred with MSB first.
  8.         k = CY;
  9.         SDA = k;                         //If MSB is 1, the Carry Flag (CY) will be set to 1 after left logical shift, and vice versa.
  10.         delay();
  11.         SCL = 1;
  12.         delay();  
  13.         SCL = 0;
  14.     }
  15. }
復制代碼
使用以上程序發送數據, 波形如下:(端口懸空未連接設備, 探頭衰減10X)
單片機型號STC8A8K64S4A12, 輸出為準雙向口(傳統8051模式),啟用內部4.1K上拉電阻, IO模式圖:
Snipaste_2022-01-25_01-16-52.jpg


Snipaste_2022-01-25_01-17-04.jpg





可以看到, 波形有三個階梯(欠幅), 最下方的波形為0V, 中間的波形為約為2.5v, 最高的波形就是高電平5v
這是為什么? 為什么波形會欠幅?

我有想過可能是變量移位, 取數據等消耗了時間, 但如果這樣也不應該欠幅啊, 為什么會有一個2.5v的電壓出現?

為什么發送數據的波形會出現欠幅現象?
------------------------------------------------------------------------------------------------------------------------------------------
今天又用Keil的debug功能調試了一下程序, 發現一個問題:先上匯編程序:
Snipaste_2022-01-24_20-58-09.jpg
整個字節的發送過程太過繁瑣, 這里精簡一下, 只考慮發送一個bit的情況, 當發送"1"(即高電平)時
當程序運行到SDA = 1時, 輸出波形沒有預想中被拉高到5v, 反而處于2.5v左右的不確定狀態, 有較大波動
Snipaste_2022-01-24_21-05-41.jpg

51hei圖片_20220124210745.jpg
但當程序運行至"SCL = 0"處時, SDA才被穩定拉高至5V
Snipaste_2022-01-24_21-10-10.jpg


51hei圖片_20220124211152.jpg



整個發送中, 以上過程不斷循環, 最終導致了波形產生欠幅現象

綜上, 我最搞不清楚的一點是:為什么執行SDA = 1之后SDA管腳會處于不確定狀態? 而在執行完與SDA毫不相干的"SCL = 0"語句后SDA又被拉高?
是上拉電阻的原因嗎? 但如果是因為沒有上拉電阻的話, SDA又為什么能被拉高到5V呢?
本人百思不得其解, 如若得君相助, 定感激不盡!







51hei圖片_20220123222634.jpg
回復

使用道具 舉報

ID:884307 發表于 2022-1-24 11:26 | 顯示全部樓層
AAA_MCU 發表于 2022-1-24 01:03
法2 發送的數據不對的,需要先發送再移位

感謝, 這一點沒想到!
回復

使用道具 舉報

ID:884307 發表于 2022-1-24 11:26 | 顯示全部樓層
188610329 發表于 2022-1-24 00:06
首先,如果是發送  0xff
方法1 是正確發送的,
方法2 發送出去是0xfe

明白了! 學好匯編還是很重要的, 那為什么波形會呈現階梯狀呢?
回復

使用道具 舉報

ID:884307 發表于 2022-1-24 13:01 | 顯示全部樓層
c00156155 發表于 2022-1-24 12:15
你這個電路是什么樣子呢,I2C上有掛什么器件嗎

沒有, 我把SDA映射到P1.4, SCL映射到P1.5, 全部懸空沒有掛設備, 我示波器探頭開的1X, 輸入阻抗相對小, 直接測量P1.5管腳
回復

使用道具 舉報

ID:884307 發表于 2022-1-24 21:17 | 顯示全部樓層
188610329 發表于 2022-1-24 13:30
如果你是 89C51 的話, 模擬IIC通信, 應當接在P0總線,并且4.7K上拉。
如果是增強型51的話,應該開啟IO ...

非常感謝您的回復! 我的帖子更新了一下, 有更詳細的描述, 請您看一下, 謝謝!
回復

使用道具 舉報

ID:884307 發表于 2022-1-26 16:36 | 顯示全部樓層
188610329 發表于 2022-1-26 03:37
幾點,
首先,代碼過于復雜,
你不需要  k = CY; 然后  SDA = k;

非常感謝幫助, 這個變量k是我在調試的時候用來追蹤SDA狀態用的, 實際應用不會這么寫
使用P1.4口輸出波形
我啟用了上拉電阻和開漏模式后仍然輸出這個波形, 還有救么? Snipaste_2022-01-26_16-35-04.jpg


Snipaste_2022-01-26_16-32-53.jpg


Snipaste_2022-01-26_16-33-12.jpg



回復

使用道具 舉報

ID:884307 發表于 2022-1-26 19:29 | 顯示全部樓層
188610329 發表于 2022-1-26 18:07
IIC 通信,  SDA, SCL 兩個引腳都需要上拉,開漏驅動,不是說,設一個就可以的。
假如是控制 DS1307的話 ...

好吧, 謝謝您的指點!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩一区 | 欧美伊人影院 | 国产精品不卡一区 | 中文字幕一区在线 | 欧美在线一区二区三区 | 一区二区日本 | 一区| 亚洲精品性视频 | 免费精品国产 | 福利网址 | 日韩1区| www精品 | 精品亚洲一区二区三区 | www.日本在线 | 日日爱av| 午夜欧美a级理论片915影院 | 韩国主播午夜大尺度福利 | 亚洲精品第一国产综合野 | 日本一卡精品视频免费 | 最新中文字幕第一页视频 | 青青久草 | 精品中文字幕久久 | 久久久xxx| 免费看国产片在线观看 | 国产欧美精品一区二区 | 国产日韩欧美在线播放 | 午夜电影一区 | 色在线免费 | 欧美黑人又粗大 | 日本成人在线播放 | 欧美精品三区 | 日韩一区不卡 | 一区视频 | 一区二区三区视频 | 国产精品一区二区精品 | 色毛片| 亚洲色图第一页 | 欧美一区二区在线观看 | 91视视频在线观看入口直接观看 | 国产精品入口久久 | 国产精品久久久久永久免费观看 |