標(biāo)題: 關(guān)于硬件I2C調(diào)試 [打印本頁]

作者: 3346661547    時(shí)間: 2021-9-16 08:36
標(biāo)題: 關(guān)于硬件I2C調(diào)試
硬件I2C調(diào)試,在數(shù)據(jù)傳輸過程中,會(huì)周期性的發(fā)生主機(jī)給從機(jī)發(fā)送地址沒有停止位,造成通訊中斷,加入外部中斷,在沒有停止位的時(shí)候重啟I2C,加入外部中斷調(diào)試發(fā)現(xiàn),在從機(jī)向主機(jī)傳輸 數(shù)據(jù) 過程中,容易誤觸發(fā)外部中斷,所以加入定時(shí)器1,給外部中斷在從機(jī)向主機(jī)發(fā)送數(shù)據(jù)時(shí) 延時(shí)50 us后再開啟外部中斷,現(xiàn)在遇到的問題是加了很多中斷,程序短時(shí)間運(yùn)行可以,長時(shí)間運(yùn)行程序中斷會(huì)死機(jī),所有中斷進(jìn)不去。

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

51hei圖片_20210916082632.jpg

作者: 188610329    時(shí)間: 2021-9-16 12:39
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?
作者: Jiang_YY    時(shí)間: 2021-9-16 14:36
1 你是主設(shè)備還是從設(shè)備出問題?2 你這個(gè)不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需要軟件處理,不會(huì)受中斷影響啊。
作者: 3346661547    時(shí)間: 2021-9-16 14:51
188610329 發(fā)表于 2021-9-16 12:39
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

你沒用過I2C嗎,STOP信號(hào)啊
作者: 3346661547    時(shí)間: 2021-9-16 14:53
Jiang_YY 發(fā)表于 2021-9-16 14:36
1 你是主設(shè)備還是從設(shè)備出問題?2 你這個(gè)不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需 ...

從設(shè)備出問題,從設(shè)備向主設(shè)備發(fā)送數(shù)據(jù),不會(huì)受其他中斷影響,那就是I2C中斷優(yōu)先級(jí)是最高的嗎
作者: 3346661547    時(shí)間: 2021-9-16 14:58
Jiang_YY 發(fā)表于 2021-9-16 14:36
1 你是主設(shè)備還是從設(shè)備出問題?2 你這個(gè)不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需 ...

我用的是硬件I2C,只不過這個(gè)芯片硬件I2C 可能有bug,從機(jī)向主機(jī)傳輸數(shù)據(jù)完成后,不產(chǎn)生停止位,所有加入外部中斷 重啟I2C,這種方法短時(shí)間程序可以運(yùn)行,長時(shí)間所有中斷容易 掛,包括看門狗也失效
作者: 黃youhui    時(shí)間: 2021-9-16 16:46
188610329 發(fā)表于 2021-9-16 12:39
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

I2C有開啟信號(hào)和終止信號(hào)和ACK,停止位STOP BIT不是串口通信的嗎
作者: Y_G_G    時(shí)間: 2021-9-16 18:04
沒有啟動(dòng)信號(hào)和停止信號(hào)就不叫IIC,只能是叫一種通訊方式,它能叫IIC就肯定是有啟動(dòng)和停止信號(hào)的
如果是像你說的沒有信號(hào),你怎么知道接收到的數(shù)據(jù)是第幾個(gè)位的?反正就是時(shí)鐘和高低電平而已
作者: xllin    時(shí)間: 2021-9-16 18:38
調(diào)整一下頻率吧
作者: Jiang_YY    時(shí)間: 2021-9-17 09:24
3346661547 發(fā)表于 2021-9-16 14:58
我用的是硬件I2C,只不過這個(gè)芯片硬件I2C 可能有bug,從機(jī)向主機(jī)傳輸數(shù)據(jù)完成后,不產(chǎn)生停止位,所有加入 ...

IIC的停止信號(hào)是由主設(shè)備產(chǎn)生的啊,從設(shè)備只產(chǎn)出ACK信號(hào)。
作者: glinfei    時(shí)間: 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號(hào),把程序貼點(diǎn)上來看看唄,用兩個(gè)中斷去處理停止問題,頻率上不來啊。
作者: 3346661547    時(shí)間: 2021-9-17 13:19
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號(hào),把程序貼點(diǎn)上來看看唄,用兩個(gè)中斷去處理停止問題,頻率上不來 ...

用兩個(gè)中斷可以運(yùn)行,只不過不能長時(shí)間運(yùn)行,能運(yùn)行4,5個(gè)小時(shí)
作者: 3346661547    時(shí)間: 2021-9-17 13:23
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號(hào),把程序貼點(diǎn)上來看看唄,用兩個(gè)中斷去處理停止問題,頻率上不來 ...

通過示波器觀察,在從機(jī)向主機(jī)發(fā)送數(shù)據(jù)的時(shí)候,SDA數(shù)據(jù)變化不在時(shí)鐘低電平中間變化電平,在時(shí)鐘快要上升沿的時(shí)候才變化電平,容易造成誤判為停止信號(hào),造成數(shù)據(jù)異常,加入定時(shí)器約束外部中斷判斷時(shí)間,在數(shù)據(jù)發(fā)送完成再判斷。
作者: 3346661547    時(shí)間: 2021-9-17 15:18
glinfei 發(fā)表于 2021-9-17 10:13
是不是適用的庫有問題,不可能不發(fā)停止信號(hào),把程序貼點(diǎn)上來看看唄,用兩個(gè)中斷去處理停止問題,頻率上不來 ...

主要問題是這個(gè)硬件I2C,在幾次通訊完成后,周期性的有一次,發(fā)送完數(shù)據(jù)后缺少應(yīng)答位,主機(jī)直接發(fā)送停止位,但是I2C從機(jī)不進(jìn)入空閑狀態(tài)。
作者: 188610329    時(shí)間: 2021-9-17 15:29
3346661547 發(fā)表于 2021-9-16 14:51
你沒用過I2C嗎,STOP信號(hào)啊

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

我就叫他停止位不行嗎,I2C是你發(fā)明的嗎,哪個(gè)不知道我說的I2C中的停止位就是STOP終止信號(hào),還有其他意思嗎,我說了停止位你就關(guān)注到這幾個(gè)字了?也只有你在這扣字眼,天生杠精啊
作者: 188610329    時(shí)間: 2021-9-17 16:06
3346661547 發(fā)表于 2021-9-17 15:45
我就叫他停止位不行嗎,I2C是你發(fā)明的嗎,哪個(gè)不知道我說的I2C中的停止位就是STOP終止信號(hào),還有其他意思 ...

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

而I2C是沒有停止“位”的,所以,不管你是不是用的硬件I2C, 沒有發(fā)送終止傳輸?shù)摹靶盘?hào)”,
不是硬件有問題,只是你沒有讓他去發(fā)送這個(gè)終止傳輸?shù)摹靶盘?hào)”,

硬件的I2C 自身不會(huì) 自做主張 發(fā)送 停止“信號(hào)”, 因?yàn)樗鼰o法確定何時(shí)需要發(fā)停止“信號(hào)”,因?yàn)闆]有專門發(fā)送停止信號(hào)的“位”。需要你自己在你認(rèn)為適當(dāng)?shù)臅r(shí)候,命令I(lǐng)2C硬件 發(fā)送 終止傳輸?shù)摹靶盘?hào)”。
作者: 3346661547    時(shí)間: 2021-9-17 16:06
188610329 發(fā)表于 2021-9-17 15:29
STOP 終止信號(hào),不是停止位,這兩個(gè)意思不能搞混。
串口發(fā)送8位數(shù)據(jù)后,有一個(gè)停止位,這個(gè)之所以叫停止 ...

就顯的你很懂I2C了,我看你是很會(huì)扣字眼啊,自己上百度搜搜I2C停止位,看看有沒有人用I2C停止位這個(gè)詞提問,就算都叫錯(cuò)了,難道大家就不知道這個(gè)就是STOP停止信號(hào)了?咋就顯的你很棒呢,鍵盤在手,天下我有?我看你不該叫高級(jí)工程師,應(yīng)該叫高級(jí)扣字眼工程師。
作者: 3346661547    時(shí)間: 2021-9-17 16:20
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強(qiáng)調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

什么叫適當(dāng)?shù)奈恢妹領(lǐng)2C硬件硬件發(fā)送終止傳輸?shù)男盘?hào)?硬件I2C不都是傳輸完成后主機(jī)自動(dòng)發(fā)送STOP信號(hào)的嗎,還要命令?你說的是軟件I2C吧,硬件I2C工作流程是只要把寄存器配置好了,自動(dòng)發(fā)送START信號(hào)和STOP信號(hào),第一步主機(jī)發(fā)出START信號(hào)+從機(jī)地址,第二步傳感器地址,第三步寄存器操作命令,寄存器讀還是寫,第四部是數(shù)據(jù)傳輸+主機(jī)發(fā)出STOP信號(hào)進(jìn)入空閑狀態(tài)然后進(jìn)入下一次傳輸,主機(jī)發(fā)出START...。什么叫適當(dāng)?shù)牡胤桨l(fā)送STOP信號(hào)呢?
作者: 3346661547    時(shí)間: 2021-9-17 16:24
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強(qiáng)調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

你到底懂不懂硬件I2C哦,
作者: 3346661547    時(shí)間: 2021-9-17 16:26
188610329 發(fā)表于 2021-9-17 16:06
不是我扣字眼,是你鉆牛角尖了。
我之所以跟你強(qiáng)調(diào),沒有停止“位”,就是讓你明白,  串口有專屬的停止 ...

我看你只會(huì)糾結(jié)I2C的STOP信號(hào)不該叫停止位,你是只會(huì)這個(gè)吧,
作者: 188610329    時(shí)間: 2021-9-17 16:30
3346661547 發(fā)表于 2021-9-17 16:20
什么叫適當(dāng)?shù)奈恢妹領(lǐng)2C硬件硬件發(fā)送終止傳輸?shù)男盘?hào)?硬件I2C不都是傳輸完成后主機(jī)自動(dòng)發(fā)送STOP信號(hào)的嗎 ...

你前面三步都對(duì),
第四步錯(cuò)了, 第四步只是數(shù)據(jù)傳輸,第五步才是發(fā)送 STOP 指令,因?yàn)閿?shù)據(jù)可能會(huì)傳輸多次,會(huì)多次循環(huán)第四步。等到所有的數(shù)據(jù)都接受完畢,才會(huì)去發(fā)送 STOP 指令,終止傳輸。
作者: 188610329    時(shí)間: 2021-9-17 16:46
3346661547 發(fā)表于 2021-9-17 16:26
我看你只會(huì)糾結(jié)I2C的STOP信號(hào)不該叫停止位,你是只會(huì)這個(gè)吧,

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

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

一個(gè)單片機(jī)而已,又不是人工智能,它能知道你數(shù)據(jù)傳輸完了?然后就自動(dòng)切斷鏈接了? 你查查手冊(cè)上,I2C的命令寄存器,里面的指令集,終止傳輸?shù)闹噶?到底是獨(dú)立的,還是會(huì)包含在其他指令里?
作者: lkc8210    時(shí)間: 2021-9-17 17:54
說了那么多還是沒有提及該有Bug的芯片的型號(hào)牌子
是不是特供需要保密的?
作者: 3346661547    時(shí)間: 2021-9-17 18:33
188610329 發(fā)表于 2021-9-17 16:46
你要是覺得我不懂,你懂得話那么就這么覺得吧,反正我I2C用到現(xiàn)在沒出過任何問題,現(xiàn)在遇到問題的是你。
...

我的I2C不是有問題,只是這個(gè)芯片的硬件I2C有bug,調(diào)試比較難,現(xiàn)在能持續(xù)運(yùn)行幾個(gè)小時(shí),中斷就掛了,所有中斷全部失效,包括看門狗也失效,程序其他沒用到中斷的地方還能繼續(xù)運(yùn)行。不知道是什么原因,用示波器也抓不到最后傳輸過程中發(fā)生了什么導(dǎo)致中斷掛了,我也沒有邏輯分析儀。
作者: 188610329    時(shí)間: 2021-9-17 19:23
3346661547 發(fā)表于 2021-9-17 18:33
我的I2C不是有問題,只是這個(gè)芯片的硬件I2C有bug,調(diào)試比較難,現(xiàn)在能持續(xù)運(yùn)行幾個(gè)小時(shí),中斷就掛了,所 ...

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

而是你單片機(jī)直接有問題,或者晶振直接停擺了。你反而應(yīng)該在這方面去找原因了。因?yàn),就算I2C有bug,也不可能擋住 看門狗 要重起的欲望。因?yàn)榭撮T狗是逆向判斷,到時(shí)間了就重起,除非你不停的給看門狗喂時(shí)間。所以就算單片機(jī)因?yàn)槟愠绦虻膯栴},或者其它硬件的問題卡死了,時(shí)間一到看門狗就會(huì)重起。
作者: 3346661547    時(shí)間: 2021-9-17 19:43
188610329 發(fā)表于 2021-9-17 19:23
如果,你的單片機(jī),連看門狗都掛了,那么就不是I2C,或者中斷的問題,

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

我現(xiàn)在做的是芯片代碼移植,之前的板子的芯片是ST的,現(xiàn)在改用ABOV的,用的是硬件I2C的100khz的傳輸速率,移植的是從機(jī)的代碼,從機(jī)檢測溫濕度發(fā)送主機(jī),移植的代碼和原ST的代碼思路是一樣的,和ABOV官網(wǎng)I2C例程配置寄存器的方法都是一樣的,用這種方法周期性的通訊完成后,主機(jī)發(fā)送START+地址后缺少應(yīng)答位,主機(jī)直接發(fā)送STOP信號(hào)了,但是I2C從機(jī)不進(jìn)入空閑狀態(tài),所以我用外部中斷直接檢測STOP信號(hào),在從機(jī)給主機(jī)發(fā)送數(shù)據(jù)開始的時(shí)候打開使能外部中斷,檢測到STOP信號(hào)直接重新初始化I2C,然后關(guān)閉外部中斷,這樣通訊就不會(huì)中斷,但是在傳輸傳感器數(shù)據(jù)過程中容易誤判為STOP信號(hào),所以加了定時(shí)器延時(shí)外部中斷,等到數(shù)據(jù)要傳輸完成再打開外部中斷。
作者: 3346661547    時(shí)間: 2021-9-17 19:44
188610329 發(fā)表于 2021-9-17 19:23
如果,你的單片機(jī),連看門狗都掛了,那么就不是I2C,或者中斷的問題,

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

我是把看門狗喂狗直接放在定時(shí)器中斷里面,中斷掛了看門狗也不會(huì)復(fù)位
作者: 3346661547    時(shí)間: 2021-9-17 19:51
3346661547 發(fā)表于 2021-9-17 19:44
我是把看門狗喂狗直接放在定時(shí)器中斷里面,中斷掛了看門狗也不會(huì)復(fù)位

會(huì)不會(huì)是因?yàn)橹袛嗵l繁造成的,因?yàn)橥獠恐袛嗍窃趥鬏敂?shù)據(jù)過程中就打開,SDA一個(gè)上升沿就進(jìn)入外部中斷,應(yīng)該會(huì)很頻繁,傳輸整個(gè)字節(jié)外部中斷都是打開的,大概20us進(jìn)入一次外部中斷,最多能進(jìn)入8次外部中斷
作者: 188610329    時(shí)間: 2021-9-17 20:32
3346661547 發(fā)表于 2021-9-17 19:44
我是把看門狗喂狗直接放在定時(shí)器中斷里面,中斷掛了看門狗也不會(huì)復(fù)位

你是不是對(duì)看門狗有什么誤會(huì)?
你把喂狗放在定時(shí)器里,定時(shí)器中斷掛了,看門狗鐵定就會(huì)復(fù)位,而只要定時(shí)器中斷沒掛,看門狗就不會(huì)生效,那么,這看門狗還有什么意義?和沒開沒有任何區(qū)別。
另外,我不明白,你在SDA上設(shè)什么外部中斷,你如果是硬件I2C,你要中斷控制不是應(yīng)該用I2C 中斷么?
就算是軟件模擬I2C, 做主機(jī)的話,不需要中斷,做從機(jī)的話,外部中斷也是壓在CLK上,沒有放在SDA上的,因?yàn)椋瑫r(shí)鐘變化了,SDA變化才有意義,時(shí)鐘沒有變化,SDA的變化沒有任何意義。
作者: Y_G_G    時(shí)間: 2021-9-17 22:21
與其在這跟別人抬扛,不如把電路,單片機(jī)型號(hào),IIC器件型號(hào)上傳,說不定有人用過,問題就能解決了也說不定
作者: 3346661547    時(shí)間: 2021-9-18 08:05
188610329 發(fā)表于 2021-9-17 20:32
你是不是對(duì)看門狗有什么誤會(huì)?
你把喂狗放在定時(shí)器里,定時(shí)器中斷掛了,看門狗鐵定就會(huì)復(fù)位,而只要定時(shí) ...

外部中斷不是放在I2C的引腳上,用I2C引腳短接其他外部中斷引腳,用其他引腳監(jiān)控I2C引腳狀態(tài)。SDA變化沒意義????STOP信號(hào)是啥????我看的是假的I2C ???
作者: mingpc    時(shí)間: 2023-3-31 10:36
3346661547 發(fā)表于 2021-9-17 13:23
通過示波器觀察,在從機(jī)向主機(jī)發(fā)送數(shù)據(jù)的時(shí)候,SDA數(shù)據(jù)變化不在時(shí)鐘低電平中間變化電平,在時(shí)鐘快要上升 ...

這個(gè)波形的問題是咋回事呀,請(qǐng)問有解決嗎




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1