找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2193|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

I2C總線之教科書中的一個(gè)錯(cuò)誤

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:266429 發(fā)表于 2020-1-30 12:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
應(yīng)該是這樣的:
      在主器件向從器件發(fā)送數(shù)據(jù)時(shí),一旦從器件收到一個(gè)有效完整字節(jié)后,則從器件立即將SDA拉低,根本不需要主器件再向從器件發(fā)送任何信號(hào) ,也就是說(shuō)應(yīng)答信號(hào)并不是在第9個(gè)時(shí)鐘位出現(xiàn)。這時(shí)SDA線將處于低電平狀態(tài),如果從器件的該端口一直處于低電平狀態(tài),則SDA線將一直處于低電平狀態(tài),主器件將無(wú)法操作SDA線,后面的事就做不成了,于是,主器件再發(fā)一次脈沖,從器件在該脈沖期讀取SDA狀態(tài),若為零,則判斷主器件已收到應(yīng)答信號(hào),于是,從器件向其SDA端口發(fā)送高電平信號(hào)以釋放對(duì)SDA線的控制權(quán),這樣才能繼續(xù)以后的工作。
    具體實(shí)驗(yàn),可以將SDA端口的電平送入另一接有LED指示燈的端口,在程序中先寫完發(fā)送一字節(jié)的程序,然后寫一條程序?qū)DA狀態(tài)送入LED端口,運(yùn)行程序以觀測(cè)LED的亮滅;然后再寫一條將SDA拉高的程序,再運(yùn)行并觀測(cè);然后再寫一段SCL的脈沖程序,然后再運(yùn)行觀測(cè),就很清楚了。
    這一做法,也可以拿來(lái)檢驗(yàn)?zāi)愕木幊淌欠裾_,第二次運(yùn)行后,LED應(yīng)該滅,第三次運(yùn)行后,應(yīng)該亮。
    程序運(yùn)行中,每一步,你都可以加1S的延時(shí),結(jié)合各端口用LED來(lái)觀測(cè)程序運(yùn)行過(guò)程。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:351097 發(fā)表于 2020-1-30 16:59 | 只看該作者
I2C通信,如果是主機(jī)發(fā)給從機(jī),從機(jī)一定會(huì)做接收回應(yīng)。主機(jī)在每輪數(shù)據(jù)通信都需要完整提供9個(gè)時(shí)鐘信號(hào),從機(jī)會(huì)在第8個(gè)時(shí)鐘信號(hào)下降沿之后拉低SDA,在第9個(gè)時(shí)鐘信號(hào)下降沿之后,從機(jī)會(huì)釋放SDA。如果從機(jī)一直沒(méi)有釋放SDA,應(yīng)該是主機(jī)提供時(shí)鐘信號(hào)不完整導(dǎo)致的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:266429 發(fā)表于 2020-1-31 16:05 | 只看該作者
I2C通訊時(shí),不管是主機(jī)還是從機(jī),數(shù)據(jù)接收方在收到完整的一字節(jié)數(shù)據(jù)后,都應(yīng)立即發(fā)出一個(gè)信號(hào),就是拉低SDA,而不是如教材中所說(shuō)“先要判斷SDA處于高電平后再去拉低SDA”,它不作這個(gè)判斷;發(fā)送方在發(fā)送完一字節(jié)數(shù)據(jù)后,則會(huì)拉高SDA然后檢測(cè)SDA是否處于低電平狀態(tài),如果檢測(cè)到是低電平,則認(rèn)為對(duì)方收到了這一字節(jié)。也就是雙方都要進(jìn)行確認(rèn)。
所以說(shuō),I2C的時(shí)序圖,應(yīng)該是六條線,主、從器件共四個(gè)端口每個(gè)端口一條線,然后是兩條線上的合成圖,F(xiàn)在的教材上面基本都只畫了合成圖。
所謂的應(yīng)答信號(hào)、非應(yīng)答信號(hào)之稱,并不合適?梢苑Q之為主機(jī)發(fā)應(yīng)答、主機(jī)收應(yīng)答、從機(jī)發(fā)應(yīng)答、從機(jī)收應(yīng)答。
回復(fù)

使用道具 舉報(bào)

地板
ID:266429 發(fā)表于 2020-1-31 16:09 | 只看該作者
本帖最后由 慢慢思考 于 2020-1-31 18:08 編輯
沒(méi)有你 發(fā)表于 2020-1-30 16:59
I2C通信,如果是主機(jī)發(fā)給從機(jī),從機(jī)一定會(huì)做接收回應(yīng)。主機(jī)在每輪數(shù)據(jù)通信都需要完整提供9個(gè)時(shí)鐘信號(hào),從機(jī) ...

從機(jī)在第8個(gè)時(shí)鐘下降沿才剛剛讀取SDA,所以,從機(jī)一定是在這個(gè)下降沿之后才拉低SDA。
回復(fù)

使用道具 舉報(bào)

5#
ID:266429 發(fā)表于 2020-1-31 16:53 | 只看該作者
這個(gè)驗(yàn)證試驗(yàn)蠻簡(jiǎn)單,先向從機(jī)發(fā)送10100001B,程序只寫到這里,不寫應(yīng)答程序,然后運(yùn)行,運(yùn)行完成后,如果這時(shí)從機(jī)沒(méi)有將SDA拉低,SDA將處于高電位,因?yàn)樽詈笠晃皇?。但實(shí)際上,如果我們檢測(cè)一下的話,會(huì)發(fā)現(xiàn)SDA是處于低電位的。
檢測(cè)方法可以用萬(wàn)用表,可以用邏輯分析儀。另外,也可以用我另外一個(gè)貼子里的方法,我用這個(gè)方法已經(jīng)檢測(cè)過(guò)了。
PS:象這種試驗(yàn),編程時(shí)建議有些數(shù)據(jù)不要用十六進(jìn)制十進(jìn)制神馬的,直接用二進(jìn)制,直觀且便于按你的意圖修改。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表