![]() |
發布時間: 2021-9-16 08:36
正文摘要:硬件I2C調試,在數據傳輸過程中,會周期性的發生主機給從機發送地址沒有停止位,造成通訊中斷,加入外部中斷,在沒有停止位的時候重啟I2C,加入外部中斷調試發現,在從機向主機傳輸 數據 過程中,容易誤觸發外部中斷 ... |
3346661547 發表于 2021-9-17 13:23 這個波形的問題是咋回事呀,請問有解決嗎 |
188610329 發表于 2021-9-17 20:32 外部中斷不是放在I2C的引腳上,用I2C引腳短接其他外部中斷引腳,用其他引腳監控I2C引腳狀態。SDA變化沒意義????STOP信號是啥????我看的是假的I2C ??? |
與其在這跟別人抬扛,不如把電路,單片機型號,IIC器件型號上傳,說不定有人用過,問題就能解決了也說不定 |
3346661547 發表于 2021-9-17 19:44 你是不是對看門狗有什么誤會? 你把喂狗放在定時器里,定時器中斷掛了,看門狗鐵定就會復位,而只要定時器中斷沒掛,看門狗就不會生效,那么,這看門狗還有什么意義?和沒開沒有任何區別。 另外,我不明白,你在SDA上設什么外部中斷,你如果是硬件I2C,你要中斷控制不是應該用I2C 中斷么? 就算是軟件模擬I2C, 做主機的話,不需要中斷,做從機的話,外部中斷也是壓在CLK上,沒有放在SDA上的,因為,時鐘變化了,SDA變化才有意義,時鐘沒有變化,SDA的變化沒有任何意義。 |
3346661547 發表于 2021-9-17 19:44 會不會是因為中斷太頻繁造成的,因為外部中斷是在傳輸數據過程中就打開,SDA一個上升沿就進入外部中斷,應該會很頻繁,傳輸整個字節外部中斷都是打開的,大概20us進入一次外部中斷,最多能進入8次外部中斷 |
188610329 發表于 2021-9-17 19:23 我是把看門狗喂狗直接放在定時器中斷里面,中斷掛了看門狗也不會復位 |
188610329 發表于 2021-9-17 19:23 我現在做的是芯片代碼移植,之前的板子的芯片是ST的,現在改用ABOV的,用的是硬件I2C的100khz的傳輸速率,移植的是從機的代碼,從機檢測溫濕度發送主機,移植的代碼和原ST的代碼思路是一樣的,和ABOV官網I2C例程配置寄存器的方法都是一樣的,用這種方法周期性的通訊完成后,主機發送START+地址后缺少應答位,主機直接發送STOP信號了,但是I2C從機不進入空閑狀態,所以我用外部中斷直接檢測STOP信號,在從機給主機發送數據開始的時候打開使能外部中斷,檢測到STOP信號直接重新初始化I2C,然后關閉外部中斷,這樣通訊就不會中斷,但是在傳輸傳感器數據過程中容易誤判為STOP信號,所以加了定時器延時外部中斷,等到數據要傳輸完成再打開外部中斷。 |
3346661547 發表于 2021-9-17 18:33 如果,你的單片機,連看門狗都掛了,那么就不是I2C,或者中斷的問題, 而是你單片機直接有問題,或者晶振直接停擺了。你反而應該在這方面去找原因了。因為,就算I2C有bug,也不可能擋住 看門狗 要重起的欲望。因為看門狗是逆向判斷,到時間了就重起,除非你不停的給看門狗喂時間。所以就算單片機因為你程序的問題,或者其它硬件的問題卡死了,時間一到看門狗就會重起。 |
188610329 發表于 2021-9-17 16:46 我的I2C不是有問題,只是這個芯片的硬件I2C有bug,調試比較難,現在能持續運行幾個小時,中斷就掛了,所有中斷全部失效,包括看門狗也失效,程序其他沒用到中斷的地方還能繼續運行。不知道是什么原因,用示波器也抓不到最后傳輸過程中發生了什么導致中斷掛了,我也沒有邏輯分析儀。 |
說了那么多還是沒有提及該有Bug的芯片的型號牌子 是不是特供需要保密的? |
3346661547 發表于 2021-9-17 16:26 你要是覺得我不懂,你懂得話那么就這么覺得吧,反正我I2C用到現在沒出過任何問題,現在遇到問題的是你。 縱觀用到現在各種不同的的 硬件I2C, 全手動的,所有信號包括ACK/NAK都要自己發送和接收的用過, 半自動的,自動開始信號,自動ACK/NAK的也用過。 就是沒有見到過 自動 STOP 信號的。 一個單片機而已,又不是人工智能,它能知道你數據傳輸完了?然后就自動切斷鏈接了? 你查查手冊上,I2C的命令寄存器,里面的指令集,終止傳輸的指令 到底是獨立的,還是會包含在其他指令里? |
3346661547 發表于 2021-9-17 16:20 你前面三步都對, 第四步錯了, 第四步只是數據傳輸,第五步才是發送 STOP 指令,因為數據可能會傳輸多次,會多次循環第四步。等到所有的數據都接受完畢,才會去發送 STOP 指令,終止傳輸。 |
188610329 發表于 2021-9-17 16:06 我看你只會糾結I2C的STOP信號不該叫停止位,你是只會這個吧, |
188610329 發表于 2021-9-17 16:06 你到底懂不懂硬件I2C哦, |
188610329 發表于 2021-9-17 16:06 什么叫適當的位置命令I2C硬件硬件發送終止傳輸的信號?硬件I2C不都是傳輸完成后主機自動發送STOP信號的嗎,還要命令?你說的是軟件I2C吧,硬件I2C工作流程是只要把寄存器配置好了,自動發送START信號和STOP信號,第一步主機發出START信號+從機地址,第二步傳感器地址,第三步寄存器操作命令,寄存器讀還是寫,第四部是數據傳輸+主機發出STOP信號進入空閑狀態然后進入下一次傳輸,主機發出START...。什么叫適當的地方發送STOP信號呢? |
188610329 發表于 2021-9-17 15:29 就顯的你很懂I2C了,我看你是很會扣字眼啊,自己上百度搜搜I2C停止位,看看有沒有人用I2C停止位這個詞提問,就算都叫錯了,難道大家就不知道這個就是STOP停止信號了?咋就顯的你很棒呢,鍵盤在手,天下我有?我看你不該叫高級工程師,應該叫高級扣字眼工程師。 |
3346661547 發表于 2021-9-17 15:45 不是我扣字眼,是你鉆牛角尖了。 我之所以跟你強調,沒有停止“位”,就是讓你明白, 串口有專屬的停止“位”,所以,是硬件自己完成的。 而I2C是沒有停止“位”的,所以,不管你是不是用的硬件I2C, 沒有發送終止傳輸的“信號”, 不是硬件有問題,只是你沒有讓他去發送這個終止傳輸的“信號”, 硬件的I2C 自身不會 自做主張 發送 停止“信號”, 因為它無法確定何時需要發停止“信號”,因為沒有專門發送停止信號的“位”。需要你自己在你認為適當的時候,命令I2C硬件 發送 終止傳輸的“信號”。 |
188610329 發表于 2021-9-17 15:29 我就叫他停止位不行嗎,I2C是你發明的嗎,哪個不知道我說的I2C中的停止位就是STOP終止信號,還有其他意思嗎,我說了停止位你就關注到這幾個字了?也只有你在這扣字眼,天生杠精啊 |
3346661547 發表于 2021-9-16 14:51 STOP 終止信號,不是停止位,這兩個意思不能搞混。 串口發送8位數據后,有一個停止位,這個之所以叫停止位,是因為有個固定的位置。 而I2C, 發送 8位字節和接受1位ACK/NAK 應答位,這些位置是固定的,所以叫“位” 但是,任何時候,只要CLK高電平的時候,即兩個“位”的中間區域 拉高 IO 就產生了終止傳輸信號,這個不能叫做"位",你可以在ACK之后發,也可以在數據傳輸一半的時候發,所以,I2C是沒有停止"位"的,設計的時候,就沒有給終止信號,預留一個專門的"位"給他。 所以,事實上不該你問我用過I2C嗎? 而是你到底搞明白什么是 I2C了嗎? |
glinfei 發表于 2021-9-17 10:13 主要問題是這個硬件I2C,在幾次通訊完成后,周期性的有一次,發送完數據后缺少應答位,主機直接發送停止位,但是I2C從機不進入空閑狀態。 |
glinfei 發表于 2021-9-17 10:13 通過示波器觀察,在從機向主機發送數據的時候,SDA數據變化不在時鐘低電平中間變化電平,在時鐘快要上升沿的時候才變化電平,容易造成誤判為停止信號,造成數據異常,加入定時器約束外部中斷判斷時間,在數據發送完成再判斷。 |
glinfei 發表于 2021-9-17 10:13 用兩個中斷可以運行,只不過不能長時間運行,能運行4,5個小時 |
是不是適用的庫有問題,不可能不發停止信號,把程序貼點上來看看唄,用兩個中斷去處理停止問題,頻率上不來啊。 |
3346661547 發表于 2021-9-16 14:58 IIC的停止信號是由主設備產生的啊,從設備只產出ACK信號啊? |
調整一下頻率吧 |
沒有啟動信號和停止信號就不叫IIC,只能是叫一種通訊方式,它能叫IIC就肯定是有啟動和停止信號的 如果是像你說的沒有信號,你怎么知道接收到的數據是第幾個位的?反正就是時鐘和高低電平而已 |
188610329 發表于 2021-9-16 12:39 I2C有開啟信號和終止信號和ACK,停止位STOP BIT不是串口通信的嗎 |
Jiang_YY 發表于 2021-9-16 14:36 我用的是硬件I2C,只不過這個芯片硬件I2C 可能有bug,從機向主機傳輸數據完成后,不產生停止位,所有加入外部中斷 重啟I2C,這種方法短時間程序可以運行,長時間所有中斷容易 掛,包括看門狗也失效 |
Jiang_YY 發表于 2021-9-16 14:36 從設備出問題,從設備向主設備發送數據,不會受其他中斷影響,那就是I2C中斷優先級是最高的嗎 |
188610329 發表于 2021-9-16 12:39 你沒用過I2C嗎,STOP信號啊 |
1 你是主設備還是從設備出問題?2 你這個不是硬件IIC,是軟件模擬的IIC吧?硬件IIC只要配置完成,中間不需要軟件處理,不會受中斷影響啊。 |
停止位? 你確定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么? |