最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

I2C的非應答到底有多少意思?

作者:iC921 欄目:單片機
I2C的非應答到底有多少意思?
一直不是很清楚。請在行的說說。

另外,工作情況下,SCL是否都由主器件發(fā)出的?

2樓: >>參與討論
hotpower
暈菜~~~SCL主器件不發(fā)就成水罐了
I2C的非應答肯定是不愿意應答了...

3樓: >>參與討論
diannaoza
非應答的理解
我是這樣理解i2c非應答,
非應答由主機發(fā)送產(chǎn)生(如89C51,2051,,,)
主應答也由主機產(chǎn)生。
應答由從機產(chǎn)生。從機就是指24C02.....
一、單字節(jié)讀完,想停止讀,則送“非應答”再送停止位。
二、連讀多字節(jié),(為什么要送主應答?)要不在主機讀完24C02一個字節(jié)時,則從機(24C02)不知道主機讀到或讀正確否。每讀完一個字節(jié)送個“主應答”通知24C02我讀到一個字節(jié)了,24C02中的地址指針自動加一,也可以接下一個字節(jié)了。當連續(xù)完后,不想讀字節(jié)了,再送個非應答,再送停止讀。
三、非應答就是對應于一個時鐘周期內(nèi)sda保持高電平,SCL;;即低到4.7us后到高4us這期間內(nèi)。sda保持為高電平。
--     ----------  
  sda  
--          ----
  scl  -----    --   

* - 本貼最后修改時間:2006-3-25 18:24:24 修改者:diannaoza

4樓: >>參與討論
iC921
補個基本時序圖,另找個的非應答的圖看看
暈王老是打我的嘴。這可是技術環(huán)境咧。


 

* - 本貼最后修改時間:2006-3-16 0:19:32 修改者:iC921

5樓: >>參與討論
iC921
想不到圈圈沒發(fā)現(xiàn)我的帖子
嘿嘿,招惹他一下

6樓: >>參與討論
iC921
不知道什么回事,去論壇主頁問題沒登錄
放個鏈接在這試試

http://bbs.21ic.com/

7樓: >>參與討論
computer00
給個I2C總線協(xié)議你,慢慢看吧。
http://www.zlgmcu.com/philips/iic/xuanxing/I2Cgiufan.pdf

8樓: >>參與討論
iC921
暈,我會沒有協(xié)議?
 
9樓: >>參與討論
iC921
定義我明白了,但這段話不是很理解
單字節(jié)讀,想停止讀,則送“非應答”再送停止位。
>>什么情況要這樣做?

連讀多字節(jié)送“非應答”,要不在主機讀完24C02一個字節(jié)時,則不知道主機讀到或讀正確否。所以送個“非應答”通知24C02我讀到一個字節(jié)了,24C02中的地址指針自動加一,也可以接下一個字節(jié)了。
>>是不是要達到重新啟動總線時找到當時的下一個位置才使用非應答的?就象堆棧保護現(xiàn)場那樣?


* - 本貼最后修改時間:2006-3-16 1:16:22 修改者:iC921

10樓: >>參與討論
computer00
我沒用過這樣的。
 
11樓: >>參與討論
iC921
繼續(xù),非應答下的啟動
如果是非應答前同樣的尋址對象,是不是與正常情況下的啟動不同,目的也不一樣,這才叫做重啟動?不然叫做啟動(尋址對象不同)?

12樓: >>參與討論
iC921
我說暈王,俺是正經(jīng)的,要正面答復
錯了或讓我理解錯了都不好受。
---------------------------

hotpower 發(fā)表于 2006-3-15 00:10 侃單片機 ←返回版面    

暈菜~~~SCL主器件不發(fā)就成水罐了

I2C的非應答肯定是不愿意應答了...


***********************
謝謝圈圈,明天白天我不在,關照關照這個問題,相信你是明白我的意思了。象時鐘,雖然人家給了波形,可是沒有說是誰發(fā)出的。連何立民的書也沒有明確講,里面只有一個圖說是那樣,但意思不明確。要確認啊!


===========================
感謝diannaoza的解答,未能理解之處有勞您再做詳盡一點的解釋。這方面我比較差,幾乎是空白,可我現(xiàn)在要弄明白它們,請支持哦。

13樓: >>參與討論
computer00
引用協(xié)議中的原文。

在I2C 總線上產(chǎn)生時鐘信號通常是主機器件的責任當在總線上傳輸數(shù)據(jù)時每個主機產(chǎn)生自己的時
鐘信號主機發(fā)出的總線時鐘信號只有在以下的情況才能被改變慢速的從機器件控制時鐘線并延長時鐘
信號或者在發(fā)生仲裁時被另一個主機改變!

14樓: >>參與討論
hotpower
I2C總線忽悠記
一般串行數(shù)據(jù)通訊都有時鐘和數(shù)據(jù)之分,有異步和同步之別.
有單線,雙線和三線等.

I2C肯定是2線的(不算地線).

I2C協(xié)議確實很科學,比3/4線的SPI要好,當然線多通訊速率相對就快了.

I2C的原則是:

在SCL=1(高電平)時,SDA千萬別忽悠!!!

否則,SDA下跳則"判罰"為"起始信號S",SDA上跳則"判罰"為"停止信號P".

在SCL=0(低電平)時,SDA隨便忽悠!!!(可別忽悠過火到SCL跳高)

每個字節(jié)后應該由對方回送一個應答信號ACK做為對方在線的標志.

非應答信號一般在所有字節(jié)的最后一個字節(jié)后.一般要由雙方協(xié)議簽定.

SCL必須由主機發(fā)送,否則天下大亂.

首字節(jié)是"片選信號",即7位從機地址加1位方向(讀寫)控制.

從機收到(聽到)自己的地址才能發(fā)送應答信號(必須應答!!!)表示自己在線.

其他地址的從機不允許忽悠!!!(當然群呼可以忽悠但只能聽不許說話)

讀寫是站在主機的立場上定義的.

"讀"是主機接收從機數(shù)據(jù),"寫"是主機發(fā)送數(shù)據(jù)給從機.

重復位主要用于主機從發(fā)送模式到接收模式的轉(zhuǎn)換"信號",由于只有2線,

所以收發(fā)轉(zhuǎn)換肯定要比SPI復雜,因為SPI可用不同的邊沿來收發(fā)數(shù)據(jù),而I2C不行.

在硬件I2C模塊,特別是MCU/ARM/DSP等每個階段都會得到一個準確的狀態(tài)碼,

根據(jù)這個狀態(tài)碼可以很容易知道現(xiàn)在在什么狀態(tài)和什么出錯信息.

7位I2C總線可以掛接127個不同地址的I2C設備,0號"設備"作為群呼地址.

10位I2C總線可以掛接更多的10位I2C設備.

總之,只要掌握I2C的忽悠記,一般很容易掌控...

* - 本貼最后修改時間:2006-3-16 7:37:21 修改者:hotpower

I2C總線忽悠記(全集)

15樓: >>參與討論
楊工
共同探討
管理SCL的是主器件。
每傳送1字節(jié),接收方應該回答1個ACK通知發(fā)送方。
從器件不會發(fā)送NAK。
主器件接收完第n個字節(jié)后發(fā)送NAK是通知從器件停止發(fā)送。

16樓: >>參與討論
iC921
哈哈,暈起來了
這個“通常是....”如何理解?

-----------------
暈王(你寫得太寬了,照題作答多好)>>怎么出來個重復位?

讀寫是站在主機的立場上定義的.

"讀"是主機接收從機數(shù)據(jù),"寫"是主機發(fā)送數(shù)據(jù)給從機.

重復位主要用于主機從發(fā)送模式到接收模式的轉(zhuǎn)換"信號",由于只有2線,

所以收發(fā)轉(zhuǎn)換肯定要比SPI復雜,因為SPI可用不同的邊沿來收發(fā)數(shù)據(jù),而I2C不行.


17樓: >>參與討論
iC921
多謝楊工
從器件不會發(fā)送NAK,只發(fā)送AK,是嗎?

嘿嘿,好久不見你了。

---------------------------
楊工 發(fā)表于 2006-3-16 02:32 侃單片機 ←返回版面    

共同探討

管理SCL的是主器件。
每傳送1字節(jié),接收方應該回答1個ACK通知發(fā)送方。
從器件不會發(fā)送NAK。
主器件接收完第n個字節(jié)后發(fā)送NAK是通知從器件停止發(fā)送。



18樓: >>參與討論
hotpower
我暈菜~~~玩I2C不玩重復位這道暈菜~~~
 

19樓: >>參與討論
hotpower
楊工不說暈話
管理SCL的是主器件。
每傳送1字節(jié),接收方應該回答1個ACK通知發(fā)送方。(表示從機收到主機的數(shù)據(jù))
從器件不會發(fā)送NAK。
主器件接收完第n個字節(jié)后發(fā)送NAK是通知從器件停止發(fā)送。(因為主機已按預定計劃<雙方約定或從機發(fā)送序列中帶發(fā)送個數(shù)>接收完畢)---這就是那個"通常"



20樓: >>參與討論
hotpower
更暈菜~~~掉線了還能"通知"
IC921的下列語言讓我更暈菜~~~
所以送個“非應答”通知24C02我讀到一個字節(jié)了...

再引用楊工的不暈話:"主器件接收完第n個字節(jié)后發(fā)送NAK是通知從器件停止發(fā)送"

暈話:若主機發(fā)送了ACK則表示主機"違法亂紀"~~~(主機接收的從機發(fā)送序列中的發(fā)送個數(shù)錯誤<這個可能在通訊時有誤碼>或沒按約定<這個一般不可能>)


21樓: >>參與討論
hotpower
實際上主發(fā)模式的最后一個ACK是很不可靠的
再引用楊工的不暈話:"每傳送1字節(jié),接收方應該回答1個ACK通知發(fā)送方"

在實際中,當從機在收到最后一個字節(jié)后,送出的ACK不管主機能否接收,
從機有可能在不接收到停止信號就執(zhí)行主機命令了(假使本次主機是發(fā)送的命令序列).

如果約定從機在收到命令序列后必須再接收到停止信號后才能執(zhí)行主機命令,
這樣才能使命令安全執(zhí)行!!!

但這樣卻給主機出了一個"天大的難題",即收到ACK信號后立即發(fā)送停止信號,
否則不許發(fā)送停止信號!!!

如果主機沒有收到從機的ACK信號,則:
必須發(fā)送重復位(在發(fā)送啟動信號后沒有發(fā)送停止信號時再次發(fā)送啟動信號),
此時,從機清除(放棄)剛才接收的命令序列!!!

發(fā)送重復位后可再次發(fā)送被從機放棄的命令序列,或立即發(fā)送停止信號(從機因為已放棄命令,所以,在這種情況下才允許主機發(fā)送停止信號).

所以,一般主機發(fā)送的命令序列后要跟校驗碼,這樣從機就可在不等主機的停止信號就可立即執(zhí)行命令.(暈菜~~~主機可能會再次發(fā)送這個命令序列...不再說明了,再說就更暈菜了)


老鄉(xiāng),"重復位"的應用也有這個用處...

雞要叫了...夜貓子改回窩了...7:20還要耕作呀...

* - 本貼最后修改時間:2006-3-16 4:08:26 修改者:hotpower

22樓: >>參與討論
hotpower
暈菜~~~開工了...
 
23樓: >>參與討論
diannaoza
通知24C02我讀到一個字節(jié)了
通知24C02我讀到一個字節(jié)了?HE,,不好意思這個應是主應答。
--sda--
       -------
--scl     ----
     -----     
所以送個“主應答”通知24C02我讀到一個字節(jié)了,24C02中的地址指針自動加一,也可以接下一個字節(jié)了。

主應答,在一個時鐘內(nèi)保sda保持低電平。





24樓: >>參與討論
diannaoza
24C02我讀到一個字節(jié).
通知24C02我讀到一個字節(jié)了?HE,,不好意思這個應是主應答。
--sda--
       -------
--scl     ----
     -----     
所以送個“主應答”通知24C02我讀到一個字節(jié)了,24C02中的地址指針自動加一,也可以接下一個字節(jié)了。

主應答,在一個時鐘內(nèi)保sda保持低電平。


25樓: >>參與討論
yewuyi
樓主是誰??
 
26樓: >>參與討論
iC921
暈菜,你不玩這個就是答非所問了
hotpower 發(fā)表于 2006-3-16 02:52 侃單片機 ←返回版面    

我暈菜~~~玩I2C不玩重復位這道暈菜~~~


27樓: >>參與討論
iC921
一晚上了,明晚繼續(xù)
 
28樓: >>參與討論
diannaoza
I2C的非應答
上面我說了兩個應答位,一個是非應答,一個是主非應答。
今補上一個應答,從機的(ack)從應答。很多人會因從機的從應答,而把與主機發(fā)的非應答混在一起理解。所以對i2c很難理解透。

   說白了,其實從機的從應答,對時序上來說,只要從機24C02正確接收到了時序命令。則24C02的SDA在一個時鐘內(nèi)將接低sda。若無響應的話,因為主機在寫完一個字節(jié)后,都將釋放SDA(即SETB sda),這樣的話,SDA線一直為高。
           
--sda,,,,,,,,,(逗號為釋放SDA,若24C02沒響應,則就變成了高電位)
      ----
--scl     ----
     -----    (這樣的話就也就相當于非應答了)




29樓: >>參與討論
iC921
太麻煩了,可不專門寫一篇應答的文章?
具體地介紹各種應答的情況?


到時候暈可不要暈頭暈語了,強烈要求!

30樓: >>參與討論
iC921
這個明白了
目前的關鍵是非應答太讓人捉摸不透了....暈得化水了

31樓: >>參與討論
hotpower
這次走正道了,恭喜!!!(I2C的非應答有時間再忽悠)
這次走正道了,恭喜!!!

因為I2C為2線,故有4種不同的組合.

其中2種作為啟動(SDA=0<下跳>,SCL=1)和終止(SDA=1<上跳>,SCL=1)

故數(shù)據(jù)變化只能有2種,即SDA=0,SCL=0和SDA=1,SCL=0.

為了做出對控制信號(啟動/終止)的及時響應,硬件模塊一般采用中斷機制處理.

所以,在SCL=1時是嚴禁對SDA進行數(shù)據(jù)操作的!!!否則,對SDA的任何操作都會轉(zhuǎn)入控制處理.

這就是為何在SCL=1時不能忽悠的最直接的數(shù)學組合的說明.



* - 本貼最后修改時間:2006-3-19 2:56:49 修改者:hotpower

Q138.I2C時序嚴格為何?

32樓: >>參與討論
hotpower
菜農(nóng)不會習文只會弄武耍大刀
任何事物的存在必然有它建立和滅亡之生存道理.

在串行通訊中,線數(shù)的組合就是"硬道理".

2的N次方的真理是不可超越的,但應用中卻可用上跳和下跳來違背"真理".

串行通訊的筋骨是時鐘.

按理說單線協(xié)議只能流過數(shù)據(jù)0和1.但卻可以用數(shù)據(jù)的寬度再次超越"真理".

即下跳同步,低電平的寬度決定了復位,讀寫'1',讀寫'0'.

在雙線協(xié)議中,肯定要用其中一線的下跳作為同步(啟動)信號的,這必然要遵循串行通訊的規(guī)則.

在三/四線協(xié)議中,由于有片選信號,這樣就在很大程度上減輕了通訊協(xié)議的復雜度.

付出必有回報,但付出的方式不同,故收獲肯定不同.

在實際中,協(xié)議的制訂和選取要根據(jù)系統(tǒng)的要求選擇最佳的協(xié)議操作方式.

天色已晚,天亮還要耕作,以后在忽悠吧...

33樓: >>參與討論
楊工
re:從器件不會發(fā)送NAK,只發(fā)送ACK,是嗎?
是的,除非從器件是壞的。
重貼并加上注釋:
每傳送1字節(jié),接收方必須回答1個ACK通知發(fā)送方。(這里的接受方可以是主器件,也可以是從器件)
從器件不會發(fā)送NAK。(從器件收到一個字節(jié)必須發(fā)送一個ACK,否則主器件認為從器件是壞的)
主器件接收完第n個字節(jié)后發(fā)送NAK是通知從器件停止發(fā)送。(比如連續(xù)讀24Cxx,從器件不知道主器件想要多少個字節(jié),從器件總是準備要發(fā)送下一字節(jié),所以主器件收到第n個字節(jié)后發(fā)送NAK是通知從器件,我不要了)


34樓: >>參與討論
AIRWILL
起始,終止也只能由主機來控制
 
35樓: >>參與討論
cxd731
我倒……
樓主在21ic也算元老級人物了吧~~~~~  呵呵,開玩笑了
我02年畢業(yè)后剛工作時接觸I2C也是一頭霧水,下面是我當時的一點心得:
我對I2C讀寫確認信號的理解,與大家交流

  在此我只發(fā)表對I2C確認信號(即所謂應答信號)的看法,至于它的一整套時序就不多羅嗦了。
   1) MASTER向SLAVE發(fā)送數(shù)據(jù):
       MASTER沒向SLAVE端發(fā)送8位數(shù)據(jù)后,就會將SDA置1,等待SLAVE端的確認;SLAVE端如果正確接受到數(shù)據(jù),就會自動將SDA置0。我們程序員所能做的只能是檢測確認信號,即每發(fā)送完8位數(shù)據(jù)后就檢測一次SDA的狀態(tài),如果是0,則讓程序繼續(xù)往下執(zhí)行,如果是1則強迫MASTER將剛才的8位數(shù)據(jù)再發(fā)送一遍;當然,如果SDA一直是1,也就是SLAVE一直未能正確接受到數(shù)據(jù),我們也不能一直讓MASTER反復發(fā)送,要做TIMEOUT處理,以防系統(tǒng)死機!
   2) MASTER從SLAVE讀取數(shù)據(jù):
       MASTER從SLAVE端讀取數(shù)據(jù),情況與發(fā)送數(shù)據(jù)有所區(qū)別,在讀到最后8位數(shù)據(jù)時,要將SDA置1,也就是做UNACK動作,讓系統(tǒng)知道讀取數(shù)據(jù)到此結(jié)束;這個置1動作由程序員來做,而不是MASTER本身,因為數(shù)據(jù)讀到哪里結(jié)束,只有我們程序員知道!
   3) 說明:MASTER 指主控制端,在一般系統(tǒng)中就是我們常說的單片機了;SLAVE是指具備I2C協(xié)議的專用IC,比如ATMEL的24系列(24C16、14C32等)和PHILPS的SAA711X系列(VIDEO  DECODER)。
   以上我在寫I2C程式時的一點心得,與大家共同討論,如果有錯誤,懇請大家批評指正!但我寫的程式都是用的C51,也許用匯編寫可以忽略檢測確認信號(因為匯編代碼的傳送效率要比C高得多,我就見過有人用匯編寫的I2C,他就沒有檢測應答信號,但數(shù)據(jù)不會錯)。


* - 本貼最后修改時間:2006-3-21 16:43:20 修改者:cxd731

36樓: >>參與討論
zcplhh
關于I2C總線的一些問題
    總線的上拉電壓:總線的上拉電壓應確保在總線需要工作的時始終存在,并在系統(tǒng)中最先上電,最后掉電。因此,通常上拉至MCU的VCC,在多MCU系統(tǒng)中,應注意在STANDBY期間會掉電的MCU的總線I/O口是否有上拉的箝位二極管。確保STANDBY期間總線電平不受影響。
     總線的上拉電阻:總線的上拉電阻設計較小(1K-3.3K)時,低阻抗有利于抗干擾,但功耗大,對外干擾大,由DEVICE端返回的低電平較高,可能導致MCU無法獲得ACK。典型的例子就是PC打印口模擬的I2C總線常常無法讀回IC的ACK,忽略ACK時IC控制仍然可正常進行,示波器觀察IC得到的信號還可以,只是低電平太高,PC認為是高電平?偩的上拉電阻設計較大(>10K)時, 功耗小,但不利于抗干擾。另外由于分布電容等與上拉電阻形成充放電回路,過大的上拉電阻導致波形變差。因此,高速率(>100K)的I2C總線上拉電阻不能太大。因此一般推薦(4.7K-6.8K)之間,根據(jù)實際情況調(diào)整,應避免多份原理圖拼圖設計時忘記總線只需單點上拉,未刪除多余的上拉電阻,造成上拉電阻過小。
總線的串聯(lián)電阻和對地電容:每個IC的總線端口可串聯(lián)一小電阻(47-100歐),主要是提高總線的可驅(qū)動數(shù)量,因為I2C總線能驅(qū)動IC的個數(shù)理論上無限制,只受最大400pF的總線電容限制。一般不推薦IC的總線端口對地接電容,這顯然會降低了總線驅(qū)動能力,但若存在高頻輻射時,可接小于10PF的對地高頻濾波電容。
總線的切換:在某一器件需被兩條總線控制,又不希望將該兩條總線控制連接在一起(也許因為其它器件地址沖突或MASTER無法支持總線仲裁)時,可考慮用4052等模擬開關來切換該器件輪番掛在兩條總線上,但兩條總線的MASTER間要另加總線仲裁控制線。例如可以將其中一MASTER兼作仲裁控制器,管理總線的開關切換,并向另一MASTER發(fā)出已占用該器件的指示信號,在確保每次占用該器件后的釋放的時間有足夠長,則另一MASTER在操作前只要讀取指示信號判斷該器件是剛從忙轉(zhuǎn)入空閑即可。
      總線的驅(qū)動加強:在總線需在較高速度下工作或總線電容過大時,可用4066模擬開關來增強總線的驅(qū)動能力。


37樓: >>參與討論
gylgl
總結(jié)得很好,感謝
 
38樓: >>參與討論
ms
寫的有道理,可看這覺得酸溜溜的
 
39樓: >>參與討論
dengm
在系統(tǒng)reset時, 建議發(fā) 重復位信號,不要偷懶!
 
40樓: >>參與討論
maxking
迷迷糊糊明白了一些
謝謝楊工,看來要惡補一下了。

41樓: >>參與討論
pengk31
I2C總線最大的優(yōu)點就是它的多層主從式,方便!
I2C總線最大的優(yōu)點就是它的多層主從式,方便!

42樓: >>參與討論
pengk31
非常容易理解
 
43樓: >>參與討論
iC921
呵呵,我剛剛要找它出來就被頂上來了
在暈王的菜園里受到了水氣的“滋潤”,越來越不明白了……

44樓: >>參與討論
iC921
嘿嘿,咱總算比你長一個月
看你的分數(shù),為人民服務少了點,因此,想提高的,一定已經(jīng)提高的,我嘛,顧此失彼,能做人就做不了學問……

-------
cxd731 發(fā)表于 2006-3-21 16:30 侃單片機 ←返回版面    

我倒……

樓主在21ic也算元老級人物了吧~~~~~  呵呵,開玩笑了
...



45樓: >>參與討論
iC921
嚴重要求惡補
哪位愿意為我領航?

46樓: >>參與討論
twzh
好貼
感謝樓主

47樓: >>參與討論
testcode
暈...I2C器件間的干擾
遇到一個問題,I2C總線上有AT24CXXXX,ADS1100...
因為耗電的考慮,ADS1100發(fā)送完數(shù)據(jù),馬上關掉ADS1100的電源,MCU將處理后數(shù)據(jù)保存到AT24CXXXX中。系統(tǒng)工作出現(xiàn)異常,數(shù)據(jù)出錯...要在關掉ADS1100的電源后等待半秒鐘,再把數(shù)據(jù)保存到AT24CXXXX中。

48樓: >>參與討論
hotpower
暈菜~~~搞個鐵電玩玩...(是TWI???)
若是AVR的TWI,要注意每次通信都要先
  DDRC &= ~((1 << SCL) | (1 << SDA));//SCL、SDA 引腳內(nèi)部上拉電阻
  TWCR &= ~(1 << TWEN);
  PORTC |= (1 << SCL) | (1 << SDA);//SCL、SDA 引腳內(nèi)部上拉電阻
再在TWStart()內(nèi)TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);

我反復做過實驗...把我害苦了...助好友TestCode成功!!!

哈哈...以下程序在ouravr那里都沒舍得發(fā)...(非常好用)

inline
void TwiObj::WorkExec(void)
{
static unsigned CHAR Count = 0;
unsigned CHAR worknum;
  DDRC &= ~((1 << SCL) | (1 << SDA));//SCL、SDA 引腳內(nèi)部上拉電阻
  TWCR &= ~(1 << TWEN);
  PORTC |= (1 << SCL) | (1 << SDA);//SCL、SDA 引腳內(nèi)部上拉電阻
  if (Busy) {//主機忙
    TWStop();
  }
  else {
    MainCount = 0;//發(fā)送0個數(shù)據(jù)
    SubComm = 0;//不允許發(fā)送數(shù)據(jù)
    SubCount = 4;//接收4個數(shù)據(jù)
    Count &= 0x0f;//16個為一輪
    if ((Count & 1) == 0) {//偶數(shù)為1通道
      worknum = 0;
      SubAddr = UsiSlaveAddrRd1;//從機地址
    }
    else {//奇數(shù)為2通道
      worknum = 1;
      SubAddr = UsiSlaveAddrRd2;//從機地址
    }
//..................






inline
void TwiObj::TWStart(void)
{
  Busy = true;
  Status = 0;//主機準備發(fā)送啟始位
  Count = 0;//發(fā)送數(shù)據(jù)個數(shù)
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
}


inline
void TwiObj::TWREStart(void)
{
  Busy = true;
  Status = 0x55;//主機準備發(fā)送啟始位
  Count = 0;//接收數(shù)據(jù)個數(shù)
  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN) | (1 << TWIE);
}

inline
void TwiObj::TWStop(void)
{
  Busy = false;
//  Status = 0xaa;//pwy
  Count = 0;
  TWCR = (1 << TWINT) | (1 << TWSTO);//關閉TWIE//pwy
}

//inline(不敢加)
void TwiObj::Exec(void)
{
//  TW_Error = TW_STATUS;
//  if (!Busy) TWStop();//pwy
//  else {
  SWITCH(TW_STATUS) {
    case TW_START://主機收到自己發(fā)送的開始信號
          if (Status == 0) {//本次中斷應該接收TW_START信號//pwy
            TWDR = SubAddr & 0xfe;//發(fā)送子機地址(寫)
            Status = 1;//Status下次主發(fā)為1,主收為2
            TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);//發(fā)送出去
//::Uart.puts("TW_START");
//::Uart.putstr("Status=");
//::Uart.puthex(Status);
//::Uart.puts("");
          }
          else TWStop();
          break;
    case TW_REP_START://主機收到自己發(fā)送的重新開始信號
          if ((Status == 0x55) && (SubAddr & 0xfe)) {//本次中斷應該接收TW_START信號//pwy
            TWDR = SubAddr;//發(fā)送子機地址(讀)
            Status = 2;//Status下次主發(fā)為1,主收為2
            TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);//發(fā)送出去
          }
          else TWStop();
          break;
    case TW_MT_SLA_ACK://主發(fā)機接收到從機的地址應答信號后發(fā)送命令
          if (Status == 1) {//本次中斷應該接收TW_MT_SLA_ACK信號
            Status = 3;//Status下次應該收TW_MT_DATA_ACK
            TWDR = SubComm;//發(fā)送子機命令
/*-----------------------------------------------------------------------------
            以后可以復雜些
-----------------------------------------------------------------------------*/
            TxBuffer[0] = SubComm;//簡單命令校驗
            TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);//發(fā)送出去
//::Uart.puts("TW_MT_SLA_ACK");
//::Uart.putstr("Status=");
//::Uart.puthex(Status);
//::Uart.puts("");
          }
          else  TWStop();
          break;
    case TW_MR_SLA_ACK://主收機接收到從機的地址應答信號
          if (SubCount && (Status == 2)) {//本次中斷應該接收TW_MR_SLA_ACK信號
            Status = 4;//Status下次應該收TW_MR_DATA_ACK
            TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE) | (1 << TWEA);//主機轉(zhuǎn)入接收狀態(tài)
//::Uart.puts("TW_MT_SLA_ACK");
//::Uart.putstr("Status=");
//::Uart.puthex(Status);
//::Uart.puts("");
          }
          else TWStop();
          break;
    case TW_MT_DATA_ACK:
          if ((Count < MainCount) && (Status == 3) && ((SubAddr & 1) == 0)) {//本次中斷應該接收TW_MT_DATA_ACK信號
            TWDR = TxBuffer[Count ++];//發(fā)送子機數(shù)據(jù)
            TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWIE);//發(fā)送出去
          }
          else
            if ((Count == MainCount) && (Status == 3) && (SubAddr & 1)) {//本次中斷應該接收TW_MT_DATA_ACK信號
              TWREStart();//
            }
//            else if ((Count == MainCount) && (Status == 3) && ((SubAddr & 1) == 0)) {
//              TW_Error = 0xfe;//數(shù)據(jù)發(fā)送成功
//              TWStop();
// &
49樓: >>參與討論
hotpower
注意:TwiObj::Exec(void)是在TWI中斷里的
 
50樓: >>參與討論
testcode
收下了,謝謝hotpower!!!
AT24C1024
I2C總線錯亂的原因主要是,ADS1100調(diào)電后電壓還維持一段時間造成的。如果不考慮耗電,ADS1100不關掉也沒問題。

* - 本貼最后修改時間:2006-4-8 4:33:48 修改者:testcode

51樓: >>參與討論
hotpower
主機可以多發(fā)些TWStop()讓ADS1100老實AT24C1024聽話
哈哈,我在PWM和1.5米線下求生存,估計要比您的環(huán)境差多少...

以下的3行很關鍵,我沒法說明其"理論",如果沒有,則連主機也被拖死了!!!

  DDRC &= ~((1 << SCL) | (1 << SDA));//SCL、SDA 引腳內(nèi)部上拉電阻
  TWCR &= ~(1 << TWEN);
  PORTC |= (1 << SCL) | (1 << SDA);//SCL、SDA 引腳內(nèi)部上拉電阻


if (Busy) {//主機忙//主要是上次TWStart()后,從機沒應答或其他原因
  TWStop();//強行壓迫從機停止工作!!!
}
else {
//...............
  TWStart();//發(fā)送開始,主機現(xiàn)在自由活動...在中斷中由Twi.Exec()完成所有處理工作,直到TWStop()
}



現(xiàn)在我已將其移植到ARM上,工作表現(xiàn)非常好...

52樓: >>參與討論
testcode
再次感謝hotpower提示!!
等周一上班時再試一下。

53樓: >>參與討論
testcode
暈菜...
DDRC &= ~((1 << SCL) | (1 << SDA));//SCL、SDA 引腳內(nèi)部上拉電阻
TWCR &= ~(1 << TWEN);
PORTC |= (1 << SCL) | (1 << SDA);//SCL、SDA 引腳內(nèi)部上拉電阻
...
以上的設置應該是從機吧,SCL是輸入。
"SCL、SDA 引腳內(nèi)部上拉電阻"...估計hotpower在設計時偷工減料了,把外部的上拉電阻給省了,哈哈。



* - 本貼最后修改時間:2006-4-11 6:13:29 修改者:testcode

54樓: >>參與討論
testcode
別相信"0號"設備"作為群呼地址"
有的設備對"0號"設備"作為群呼地址"也置若罔聞...

55樓: >>參與討論
caitou2002
IIC
IIC的時鐘頻率多少比較適合?

56樓: >>參與討論
caitou2002
應答
呵呵。。

57樓: >>參與討論
zhaijun489
求救
   請問STC5410ADC能用I2C嗎????????

58樓: >>參與討論
chenlr217
辛苦了!
  

59樓: >>參與討論
青城明月
呵呵
用則真實!!!

60樓: >>參與討論
iC921
感謝暈王的奉獻!!
 
61樓: >>參與討論
su32fn2445
I2c主從哪位神人用過??熱盼中……
 
62樓: >>參與討論
feiwell
寫的好!!
 
63樓: >>參與討論
craig
寫得不怎么樣
 
64樓: >>參與討論
delli
恩,寫的一般,鼓勵發(fā)貼
 
65樓: >>參與討論
yuwei2005
總結(jié)的挺好
深入淺出,便于理解
謝謝

66樓: >>參與討論
woti
暈....感覺我被忽悠了 ...
越來越亂了

.....

我剛學的,不要見怪

67樓: >>參與討論
northerns
暈了
 
68樓: >>參與討論
nardoo
hehe,不錯啊,不過還是要認真對待,忽悠可不行的。
 
69樓: >>參與討論
rocqiu
I2C。裕希希蹋
如果想用PC做一個小的軟件,來監(jiān)聽I2C上的數(shù)據(jù).
請問該怎么設計呢?對于I2C的通訊協(xié)議是明白了,可是不知道怎么在PC上寫和運行程序呀!
就類似UART工具一樣.
先謝謝了!

70樓: >>參與討論
苦苦人
多謝!
 
71樓: >>參與討論
hikerpan
忽悠


72樓: >>參與討論
zfs1985

好!

73樓: >>參與討論
戰(zhàn)地記者
不解
還不太懂

74樓: >>參與討論
dlhjfeng
呵呵,暈~~
呵呵,暈~~

75樓: >>參與討論
解牛

寫的不錯 

76樓: >>參與討論
shihuzhen
LZ寫得真形象!
LZ講得真是形象呀,謝謝!

77樓: >>參與討論
hooyean
呵呵,佩服佩服,已經(jīng)理解到這份上了……
呵呵,佩服佩服,已經(jīng)理解到這份上了……

78樓: >>參與討論
ccf_2004
定一下
很好,協(xié)議的通俗易懂版

79樓: >>參與討論
曦如蘭心
一般判斷IIC是否正確是通過示波器?
可以通過示波器抓住IIC的時鐘和數(shù)據(jù),可以數(shù)數(shù)波形的個數(shù)來判斷數(shù)據(jù)是否正確。為了可以更便于觀察,一般把時鐘之間的延時變大一些。

80樓: >>參與討論
月光如水
我的IIC控制就是不能寫入,沒有應答信號!
我的IIC控制就是不能寫入,沒有應答信號!
郁悶ing。。。!

81樓: >>參與討論
sanantonio
被LZ忽悠了!
 
82樓: >>參與討論
dyfan
I2C總線中文規(guī)格下載
 
83樓: >>參與討論
xac123
關于電平
若總線上掛的器件有3.3V有5V供電的怎么辦?只能有MOS隔離?調(diào)整兩個上拉來滿足各自的電平要求是否可行?

84樓: >>參與討論
frontd
意思
 
85樓: >>參與討論
wjun
hao
 
86樓: >>參與討論
thunder_f
好,正要用I2C總線呢。
學習.....
以前自己整了段程序讀24C02

始終有點沒想明白,多主機同時想要獲取總線控制咋辦?

87樓: >>參與討論
芯行天下
不錯呀
 
88樓: >>參與討論
無悔
接受忽悠
 
89樓: >>參與討論
無悔
I2C
 
90樓: >>參與討論
iC921
時間長了,托上去看看
……

91樓: >>參與討論
ha_exit
好東西
真是好忽悠記

92樓: >>參與討論
wgj1981
哈哈忽悠的不錯
 
93樓: >>參與討論
hotpower
哈哈~~~這個是帶狀態(tài)機的忽悠記~~~
這種水底帖樓上也能翻出來~~~哈哈~~~

LPCARM之I2C中斷讀寫CAT1025C++程序祥解

94樓: >>參與討論
xiangliwei
有點忽悠!
太籠統(tǒng)

參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
問個基本的問題
一味追求速度帶來的問題
求聲音解碼芯片
一個關于單片機通信的問題(附圖)
麻煩高手解釋下程序
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號