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

QQ登錄

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

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

I2C時(shí)序相關(guān)代碼不理解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
I2C對(duì)應(yīng)的時(shí)序?qū)懘a:
延時(shí)函數(shù):I2CDelay() {_nop_();_nop_();_nop_();_nop_();}

1.stop函數(shù)
void I2CStop()
{
    I2C_SCL = 0;
    I2C_SDA = 0;
    I2CDelay();
    I2C_SCL = 1;
    I2CDelay();
    I2C_SDA = 1;
    I2CDelay();
}


SCL和SDA都是高電平了,不理解最后一行還使用I2CDelay()的原因 ?

2.wrtie函數(shù)
  1. bit I2CWrite(unsigned char dat)
  2. {
  3.     bit ack = 0;

  4.     unsigned char mask ;

  5.     for (mask = 0x80; mask != 0; mask >>= 1)
  6.     {
  7.     1.根據(jù)時(shí)序圖,覺(jué)得SDA這里應(yīng)該加I2CDelay() ?
  8.         if ((mask & dat) == 0)
  9.         {
  10.             I2C_SDA = 0;
  11.         }
  12.         else
  13.         {
  14.             I2C_SDA = 1;
  15.         }
  16.         I2CDelay();
  17.         I2C_SCL = 1;
  18.         I2CDelay();
  19.         I2C_SCL = 0;
  20.     }
  21. 2.時(shí)序圖這里也沒(méi)有說(shuō)I2C_SDA是高電平?不知道是干嘛的?
  22.     I2C_SDA = 1;
  23.     I2CDelay();
  24.     I2C_SCL = 1;
  25.     ack = I2C_SDA;
  26.     I2CDelay();
  27.     I2C_SCL = 0;

  28.     return ack;
  29. }
復(fù)制代碼
個(gè)人對(duì)I2C時(shí)序的總結(jié):
寫(xiě)過(guò)程::SCL電平主導(dǎo)了SDA的變化,SCL為高電平的時(shí)候,單片機(jī)讀取SDA信號(hào),SCL為低電平的時(shí)候,SDA變化。
開(kāi)始過(guò)程::SDA影響SCL變化。





Snipaste_2023-06-11_21-46-26.jpg (18.7 KB, 下載次數(shù): 75)

Snipaste_2023-06-11_21-46-26.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2023-6-12 08:00 | 只看該作者
I2C總線的位傳輸 起始條件:SCL為高電平時(shí),SDA由高電平向低電平切換;表示開(kāi)始傳送數(shù)據(jù)。 停止條件:SCL為高電平時(shí),SDA由低電平向高電平跳變;表示結(jié)束傳送數(shù)據(jù)。 空閑條件:I2C總線的SDA和SCL兩條信號(hào)線同時(shí)處于高電平時(shí);表示空閑狀態(tài)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:230500 發(fā)表于 2023-6-12 09:58 | 只看該作者
SCL和SDA都是高電平了,不理解最后一行還使用I2CDelay()的原因 ?

IIC通信速度一般都不快好像最快400K吧,單片機(jī)的速度一般遠(yuǎn)遠(yuǎn)大于IIC從設(shè)備;比如在調(diào)用程序里,發(fā)送Stop函數(shù)后 馬上又發(fā)Start函數(shù),就會(huì)有類(lèi)似 SCL=0;馬上又SCL=1;從設(shè)備會(huì)反應(yīng)不過(guò)來(lái); 加delay能夠讓通信更加穩(wěn)定, 如果主機(jī)時(shí)鐘頻率和通信速率不高, 不加也是可以的;  個(gè)人習(xí)慣, 我一般會(huì)加幾個(gè)Nop的延時(shí)時(shí)間!  程序本身就是邊寫(xiě)邊調(diào)試;剛開(kāi)始能跑起來(lái)?赡艿搅撕竺婺憔蜁(huì)發(fā)現(xiàn),噢,這個(gè)地方加個(gè)微妙級(jí)延時(shí)更穩(wěn)定; 慢慢的這就成為經(jīng)驗(yàn)吧!
回復(fù)

使用道具 舉報(bào)

地板
ID:1034262 發(fā)表于 2023-6-12 10:51 | 只看該作者
因?yàn)镾TOP之后要一定時(shí)間才能發(fā)起START,避免你發(fā)了STOP后馬上發(fā)起START,所以加了延時(shí),這個(gè)延時(shí)根據(jù)你的器件的時(shí)序而定,有的器件要幾個(gè)us。而現(xiàn)代的單片機(jī)大部分速度都很快,如果發(fā)出STO跑步加延時(shí)馬上發(fā)START,間隔可能在1us以內(nèi)。
回復(fù)

使用道具 舉報(bào)

5#
ID:1078938 發(fā)表于 2023-6-12 13:21 | 只看該作者
寫(xiě)時(shí)序該如何理解了??
回復(fù)

使用道具 舉報(bào)

6#
ID:332444 發(fā)表于 2023-6-12 16:00 | 只看該作者
哈蘭德 發(fā)表于 2023-6-12 13:21
寫(xiě)時(shí)序該如何理解了??

只要注意啟動(dòng)和停止那2段間隔符合即可,如1602開(kāi)始的地址建立時(shí)間符合要求即可。
回復(fù)

使用道具 舉報(bào)

7#
ID:1064915 發(fā)表于 2023-6-12 17:29 | 只看該作者
哈蘭德 發(fā)表于 2023-6-12 13:21
寫(xiě)時(shí)序該如何理解了??

I2C_SDA = 1;是釋放總線
回復(fù)

使用道具 舉報(bào)

8#
ID:1045628 發(fā)表于 2023-6-12 17:46 | 只看該作者
第9行,也就是你提出的問(wèn)題,沒(méi)有必要,函數(shù)進(jìn)來(lái)默認(rèn)scl是低電平,這時(shí)候可以立馬拉低對(duì)sda進(jìn)行操作
第18行延時(shí),這是為了給從機(jī)時(shí)間,并且延時(shí)使時(shí)鐘達(dá)到從機(jī)要求
第20行延時(shí),給從機(jī)讀數(shù)據(jù)的時(shí)間
第24行,將sda恢復(fù)到高電平并在25行做延時(shí)是為了給從機(jī)操作sda,作為ask,防止發(fā)送字節(jié)最后一位為低電平產(chǎn)生誤判
I2C一般也就400k最大,你這4個(gè)空操作的時(shí)間夠嗎,這芯片頻率也太低了吧
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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