找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4943|回復: 32
打印 上一主題 下一主題
收起左側

關于硬件I2C調(diào)試

[復制鏈接]
跳轉到指定樓層
樓主
ID:933803 發(fā)表于 2021-9-16 08:36 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
硬件I2C調(diào)試,在數(shù)據(jù)傳輸過程中,會周期性的發(fā)生主機給從機發(fā)送地址沒有停止位,造成通訊中斷,加入外部中斷,在沒有停止位的時候重啟I2C,加入外部中斷調(diào)試發(fā)現(xiàn),在從機向主機傳輸 數(shù)據(jù) 過程中,容易誤觸發(fā)外部中斷,所以加入定時器1,給外部中斷在從機向主機發(fā)送數(shù)據(jù)時 延時50 us后再開啟外部中斷,現(xiàn)在遇到的問題是加了很多中斷,程序短時間運行可以,長時間運行程序中斷會死機,所有中斷進不去。

51hei圖片_20210916082632.jpg (130.24 KB, 下載次數(shù): 101)

51hei圖片_20210916082632.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:624769 發(fā)表于 2021-9-16 12:39 | 只看該作者
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?
回復

使用道具 舉報

板凳
ID:959346 發(fā)表于 2021-9-16 14:36 | 只看該作者
1 你是主設備還是從設備出問題?2 你這個不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需要軟件處理,不會受中斷影響啊。
回復

使用道具 舉報

地板
ID:933803 發(fā)表于 2021-9-16 14:51 | 只看該作者
188610329 發(fā)表于 2021-9-16 12:39
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

你沒用過I2C嗎,STOP信號啊
回復

使用道具 舉報

5#
ID:933803 發(fā)表于 2021-9-16 14:53 | 只看該作者
Jiang_YY 發(fā)表于 2021-9-16 14:36
1 你是主設備還是從設備出問題?2 你這個不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需 ...

從設備出問題,從設備向主設備發(fā)送數(shù)據(jù),不會受其他中斷影響,那就是I2C中斷優(yōu)先級是最高的嗎
回復

使用道具 舉報

6#
ID:933803 發(fā)表于 2021-9-16 14:58 | 只看該作者
Jiang_YY 發(fā)表于 2021-9-16 14:36
1 你是主設備還是從設備出問題?2 你這個不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需 ...

我用的是硬件I2C,只不過這個芯片硬件I2C 可能有bug,從機向主機傳輸數(shù)據(jù)完成后,不產(chǎn)生停止位,所有加入外部中斷 重啟I2C,這種方法短時間程序可以運行,長時間所有中斷容易 掛,包括看門狗也失效
回復

使用道具 舉報

7#
ID:592807 發(fā)表于 2021-9-16 16:46 | 只看該作者
188610329 發(fā)表于 2021-9-16 12:39
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

I2C有開啟信號和終止信號和ACK,停止位STOP BIT不是串口通信的嗎
回復

使用道具 舉報

8#
ID:401564 發(fā)表于 2021-9-16 18:04 | 只看該作者
沒有啟動信號和停止信號就不叫IIC,只能是叫一種通訊方式,它能叫IIC就肯定是有啟動和停止信號的
如果是像你說的沒有信號,你怎么知道接收到的數(shù)據(jù)是第幾個位的?反正就是時鐘和高低電平而已
回復

使用道具 舉報

9#
ID:187802 發(fā)表于 2021-9-16 18:38 | 只看該作者
調(diào)整一下頻率吧
回復

使用道具 舉報

10#
ID:959346 發(fā)表于 2021-9-17 09:24 | 只看該作者
3346661547 發(fā)表于 2021-9-16 14:58
我用的是硬件I2C,只不過這個芯片硬件I2C 可能有bug,從機向主機傳輸數(shù)據(jù)完成后,不產(chǎn)生停止位,所有加入 ...

IIC的停止信號是由主設備產(chǎn)生的啊,從設備只產(chǎn)出ACK信號。
回復

使用道具 舉報

11#
ID:844772 發(fā)表于 2021-9-17 10:13 | 只看該作者
是不是適用的庫有問題,不可能不發(fā)停止信號,把程序貼點上來看看唄,用兩個中斷去處理停止問題,頻率上不來啊。
回復

使用道具 舉報

12#
ID:933803 發(fā)表于 2021-9-17 13:19 | 只看該作者
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號,把程序貼點上來看看唄,用兩個中斷去處理停止問題,頻率上不來 ...

用兩個中斷可以運行,只不過不能長時間運行,能運行4,5個小時
回復

使用道具 舉報

13#
ID:933803 發(fā)表于 2021-9-17 13:23 | 只看該作者
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號,把程序貼點上來看看唄,用兩個中斷去處理停止問題,頻率上不來 ...

通過示波器觀察,在從機向主機發(fā)送數(shù)據(jù)的時候,SDA數(shù)據(jù)變化不在時鐘低電平中間變化電平,在時鐘快要上升沿的時候才變化電平,容易造成誤判為停止信號,造成數(shù)據(jù)異常,加入定時器約束外部中斷判斷時間,在數(shù)據(jù)發(fā)送完成再判斷。
回復

使用道具 舉報

14#
ID:933803 發(fā)表于 2021-9-17 15:18 | 只看該作者
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號,把程序貼點上來看看唄,用兩個中斷去處理停止問題,頻率上不來 ...

主要問題是這個硬件I2C,在幾次通訊完成后,周期性的有一次,發(fā)送完數(shù)據(jù)后缺少應答位,主機直接發(fā)送停止位,但是I2C從機不進入空閑狀態(tài)。
回復

使用道具 舉報

15#
ID:624769 發(fā)表于 2021-9-17 15:29 | 只看該作者
3346661547 發(fā)表于 2021-9-16 14:51
你沒用過I2C嗎,STOP信號啊

STOP 終止信號,不是停止位,這兩個意思不能搞混。
串口發(fā)送8位數(shù)據(jù)后,有一個停止位,這個之所以叫停止位,是因為有個固定的位置。
而I2C, 發(fā)送 8位字節(jié)和接受1位ACK/NAK 應答位,這些位置是固定的,所以叫“位”
但是,任何時候,只要CLK高電平的時候,即兩個“位”的中間區(qū)域 拉高 IO 就產(chǎn)生了終止傳輸信號,這個不能叫做"位",你可以在ACK之后發(fā),也可以在數(shù)據(jù)傳輸一半的時候發(fā),所以,I2C是沒有停止"位"的,設計的時候,就沒有給終止信號,預留一個專門的"位"給他。
所以,事實上不該你問我用過I2C嗎? 而是你到底搞明白什么是 I2C了嗎?
回復

使用道具 舉報

16#
ID:933803 發(fā)表于 2021-9-17 15:45 | 只看該作者
188610329 發(fā)表于 2021-9-17 15:29
STOP 終止信號,不是停止位,這兩個意思不能搞混。
串口發(fā)送8位數(shù)據(jù)后,有一個停止位,這個之所以叫停止 ...

我就叫他停止位不行嗎,I2C是你發(fā)明的嗎,哪個不知道我說的I2C中的停止位就是STOP終止信號,還有其他意思嗎,我說了停止位你就關注到這幾個字了?也只有你在這扣字眼,天生杠精啊
回復

使用道具 舉報

17#
ID:624769 發(fā)表于 2021-9-17 16:06 | 只看該作者
3346661547 發(fā)表于 2021-9-17 15:45
我就叫他停止位不行嗎,I2C是你發(fā)明的嗎,哪個不知道我說的I2C中的停止位就是STOP終止信號,還有其他意思 ...

不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止“位”,所以,是硬件自己完成的。

而I2C是沒有停止“位”的,所以,不管你是不是用的硬件I2C, 沒有發(fā)送終止傳輸?shù)摹靶盘枴保?br /> 不是硬件有問題,只是你沒有讓他去發(fā)送這個終止傳輸?shù)摹靶盘枴保?br />
硬件的I2C 自身不會 自做主張 發(fā)送 停止“信號”, 因為它無法確定何時需要發(fā)停止“信號”,因為沒有專門發(fā)送停止信號的“位”。需要你自己在你認為適當?shù)臅r候,命令I2C硬件 發(fā)送 終止傳輸?shù)摹靶盘枴薄?/td>
回復

使用道具 舉報

18#
ID:933803 發(fā)表于 2021-9-17 16:06 | 只看該作者
188610329 發(fā)表于 2021-9-17 15:29
STOP 終止信號,不是停止位,這兩個意思不能搞混。
串口發(fā)送8位數(shù)據(jù)后,有一個停止位,這個之所以叫停止 ...

就顯的你很懂I2C了,我看你是很會扣字眼啊,自己上百度搜搜I2C停止位,看看有沒有人用I2C停止位這個詞提問,就算都叫錯了,難道大家就不知道這個就是STOP停止信號了?咋就顯的你很棒呢,鍵盤在手,天下我有?我看你不該叫高級工程師,應該叫高級扣字眼工程師。
回復

使用道具 舉報

19#
ID:933803 發(fā)表于 2021-9-17 16:20 | 只看該作者
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

什么叫適當?shù)奈恢妹領2C硬件硬件發(fā)送終止傳輸?shù)男盘?硬件I2C不都是傳輸完成后主機自動發(fā)送STOP信號的嗎,還要命令?你說的是軟件I2C吧,硬件I2C工作流程是只要把寄存器配置好了,自動發(fā)送START信號和STOP信號,第一步主機發(fā)出START信號+從機地址,第二步傳感器地址,第三步寄存器操作命令,寄存器讀還是寫,第四部是數(shù)據(jù)傳輸+主機發(fā)出STOP信號進入空閑狀態(tài)然后進入下一次傳輸,主機發(fā)出START...。什么叫適當?shù)牡胤桨l(fā)送STOP信號呢?
回復

使用道具 舉報

20#
ID:933803 發(fā)表于 2021-9-17 16:24 | 只看該作者
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

你到底懂不懂硬件I2C哦,
回復

使用道具 舉報

21#
ID:933803 發(fā)表于 2021-9-17 16:26 | 只看該作者
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

我看你只會糾結I2C的STOP信號不該叫停止位,你是只會這個吧,
回復

使用道具 舉報

22#
ID:624769 發(fā)表于 2021-9-17 16:30 | 只看該作者
3346661547 發(fā)表于 2021-9-17 16:20
什么叫適當?shù)奈恢妹領2C硬件硬件發(fā)送終止傳輸?shù)男盘?硬件I2C不都是傳輸完成后主機自動發(fā)送STOP信號的嗎 ...

你前面三步都對,
第四步錯了, 第四步只是數(shù)據(jù)傳輸,第五步才是發(fā)送 STOP 指令,因為數(shù)據(jù)可能會傳輸多次,會多次循環(huán)第四步。等到所有的數(shù)據(jù)都接受完畢,才會去發(fā)送 STOP 指令,終止傳輸。
回復

使用道具 舉報

23#
ID:624769 發(fā)表于 2021-9-17 16:46 | 只看該作者
3346661547 發(fā)表于 2021-9-17 16:26
我看你只會糾結I2C的STOP信號不該叫停止位,你是只會這個吧,

你要是覺得我不懂,你懂得話那么就這么覺得吧,反正我I2C用到現(xiàn)在沒出過任何問題,現(xiàn)在遇到問題的是你。

縱觀用到現(xiàn)在各種不同的的 硬件I2C,
全手動的,所有信號包括ACK/NAK都要自己發(fā)送和接收的用過,
半自動的,自動開始信號,自動ACK/NAK的也用過。
就是沒有見到過 自動 STOP 信號的。

一個單片機而已,又不是人工智能,它能知道你數(shù)據(jù)傳輸完了?然后就自動切斷鏈接了? 你查查手冊上,I2C的命令寄存器,里面的指令集,終止傳輸?shù)闹噶?到底是獨立的,還是會包含在其他指令里?
回復

使用道具 舉報

24#
ID:161164 發(fā)表于 2021-9-17 17:54 | 只看該作者
說了那么多還是沒有提及該有Bug的芯片的型號牌子
是不是特供需要保密的?
回復

使用道具 舉報

25#
ID:933803 發(fā)表于 2021-9-17 18:33 | 只看該作者
188610329 發(fā)表于 2021-9-17 16:46
你要是覺得我不懂,你懂得話那么就這么覺得吧,反正我I2C用到現(xiàn)在沒出過任何問題,現(xiàn)在遇到問題的是你。
...

我的I2C不是有問題,只是這個芯片的硬件I2C有bug,調(diào)試比較難,現(xiàn)在能持續(xù)運行幾個小時,中斷就掛了,所有中斷全部失效,包括看門狗也失效,程序其他沒用到中斷的地方還能繼續(xù)運行。不知道是什么原因,用示波器也抓不到最后傳輸過程中發(fā)生了什么導致中斷掛了,我也沒有邏輯分析儀。
回復

使用道具 舉報

26#
ID:624769 發(fā)表于 2021-9-17 19:23 | 只看該作者
3346661547 發(fā)表于 2021-9-17 18:33
我的I2C不是有問題,只是這個芯片的硬件I2C有bug,調(diào)試比較難,現(xiàn)在能持續(xù)運行幾個小時,中斷就掛了,所 ...

如果,你的單片機,連看門狗都掛了,那么就不是I2C,或者中斷的問題,

而是你單片機直接有問題,或者晶振直接停擺了。你反而應該在這方面去找原因了。因為,就算I2C有bug,也不可能擋住 看門狗 要重起的欲望。因為看門狗是逆向判斷,到時間了就重起,除非你不停的給看門狗喂時間。所以就算單片機因為你程序的問題,或者其它硬件的問題卡死了,時間一到看門狗就會重起。
回復

使用道具 舉報

27#
ID:933803 發(fā)表于 2021-9-17 19:43 | 只看該作者
188610329 發(fā)表于 2021-9-17 19:23
如果,你的單片機,連看門狗都掛了,那么就不是I2C,或者中斷的問題,

而是你單片機直接有問題,或者晶 ...

我現(xiàn)在做的是芯片代碼移植,之前的板子的芯片是ST的,現(xiàn)在改用ABOV的,用的是硬件I2C的100khz的傳輸速率,移植的是從機的代碼,從機檢測溫濕度發(fā)送主機,移植的代碼和原ST的代碼思路是一樣的,和ABOV官網(wǎng)I2C例程配置寄存器的方法都是一樣的,用這種方法周期性的通訊完成后,主機發(fā)送START+地址后缺少應答位,主機直接發(fā)送STOP信號了,但是I2C從機不進入空閑狀態(tài),所以我用外部中斷直接檢測STOP信號,在從機給主機發(fā)送數(shù)據(jù)開始的時候打開使能外部中斷,檢測到STOP信號直接重新初始化I2C,然后關閉外部中斷,這樣通訊就不會中斷,但是在傳輸傳感器數(shù)據(jù)過程中容易誤判為STOP信號,所以加了定時器延時外部中斷,等到數(shù)據(jù)要傳輸完成再打開外部中斷。
回復

使用道具 舉報

28#
ID:933803 發(fā)表于 2021-9-17 19:44 | 只看該作者
188610329 發(fā)表于 2021-9-17 19:23
如果,你的單片機,連看門狗都掛了,那么就不是I2C,或者中斷的問題,

而是你單片機直接有問題,或者晶 ...

我是把看門狗喂狗直接放在定時器中斷里面,中斷掛了看門狗也不會復位
回復

使用道具 舉報

29#
ID:933803 發(fā)表于 2021-9-17 19:51 | 只看該作者
3346661547 發(fā)表于 2021-9-17 19:44
我是把看門狗喂狗直接放在定時器中斷里面,中斷掛了看門狗也不會復位

會不會是因為中斷太頻繁造成的,因為外部中斷是在傳輸數(shù)據(jù)過程中就打開,SDA一個上升沿就進入外部中斷,應該會很頻繁,傳輸整個字節(jié)外部中斷都是打開的,大概20us進入一次外部中斷,最多能進入8次外部中斷
回復

使用道具 舉報

30#
ID:624769 發(fā)表于 2021-9-17 20:32 | 只看該作者
3346661547 發(fā)表于 2021-9-17 19:44
我是把看門狗喂狗直接放在定時器中斷里面,中斷掛了看門狗也不會復位

你是不是對看門狗有什么誤會?
你把喂狗放在定時器里,定時器中斷掛了,看門狗鐵定就會復位,而只要定時器中斷沒掛,看門狗就不會生效,那么,這看門狗還有什么意義?和沒開沒有任何區(qū)別。
另外,我不明白,你在SDA上設什么外部中斷,你如果是硬件I2C,你要中斷控制不是應該用I2C 中斷么?
就算是軟件模擬I2C, 做主機的話,不需要中斷,做從機的話,外部中斷也是壓在CLK上,沒有放在SDA上的,因為,時鐘變化了,SDA變化才有意義,時鐘沒有變化,SDA的變化沒有任何意義。
回復

使用道具 舉報

31#
ID:401564 發(fā)表于 2021-9-17 22:21 | 只看該作者
與其在這跟別人抬扛,不如把電路,單片機型號,IIC器件型號上傳,說不定有人用過,問題就能解決了也說不定
回復

使用道具 舉報

32#
ID:933803 發(fā)表于 2021-9-18 08:05 | 只看該作者
188610329 發(fā)表于 2021-9-17 20:32
你是不是對看門狗有什么誤會?
你把喂狗放在定時器里,定時器中斷掛了,看門狗鐵定就會復位,而只要定時 ...

外部中斷不是放在I2C的引腳上,用I2C引腳短接其他外部中斷引腳,用其他引腳監(jiān)控I2C引腳狀態(tài)。SDA變化沒意義????STOP信號是啥????我看的是假的I2C ???
回復

使用道具 舉報

33#
ID:1069203 發(fā)表于 2023-3-31 10:36 | 只看該作者
3346661547 發(fā)表于 2021-9-17 13:23
通過示波器觀察,在從機向主機發(fā)送數(shù)據(jù)的時候,SDA數(shù)據(jù)變化不在時鐘低電平中間變化電平,在時鐘快要上升 ...

這個波形的問題是咋回事呀,請問有解決嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表