會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





I2C的通訊問題(卡了一個禮拜)
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 66
等級: 7; EXP: 2
HP : 0 / 150
MP : 22 / 1416
離線
各位好,小弟正在寫一個程式,但是已經卡一個禮拜了,所有能debug的方式也都試過了,但還是寫不出來,故想把source code貼出來與大家討論。

程式的方向大概是,timer2 overflow時進入中斷,然後在中斷副程式執行I2C,如果通訊成功,LED1 OFF; LED2 ON。如果通訊失敗,LED1與LED2閃爍。

觀察到的現象:直接燒錄進去,觀察到LED1與LED2在閃爍(代表flag為1)。
flag為1代表I2C回傳的value是FAILURE,故接上示波器觀察波形。

觀察到的波形,發現:
問題1: repeat start不符合datasheet上面的波形(附圖1與附圖2)
問題2: 我在scope上面找不到stop condition,在第九個clock(Master發NACK)後,波形直接接start condition(跳過stop condition)
問題3:在第九個clock之前,有一個小突波,不曉得會不會誤判?

請各位大大幫我檢查程式碼是否有出錯,謝謝。
main.c:
https://pastebin.com/raw/QxjM63Mg

因為是測試程式,所以有部分的程式碼看起來不符合邏輯,比如在main裡面的while有檢查很多個flag,但這個測試版本只檢查一個(OTHER_FLAGbits.COMMUNICATION_FAILURE)

在全域變數方面,因為以防萬一所以把所有的全域變數設成volatile

在中斷副程式裡面,IOCIF不用理它。
I2C_Read最後一個參數為4(每顆電池的電壓要用兩個Byte存放,所以原本的參數是14(7顆電池)。為了測試把參數改為4)
大致上的概念是,對OZ8920這個device的Voltage command做讀取,並且將讀取到的資料分別放到adc_voltage_low與adc_voltage_high,總共放4筆資料。

I2C.c:
https://pastebin.com/raw/GFuVu9yk

I2C_Write()不用理它,沒用到。

System.c:
https://pastebin.com/raw/pfT7SkwV

內振4MHz,I2C頻率約95KHz,TMR2每1ms進一次中斷

ADC.c與PWM.c目前沒用到。

請各位幫我檢查一下,I2C的程式碼哪邊有問題or沒考慮到的。謝謝!

附加檔案:



jpg  I2C.jpg (168.93 KB)
45509_59fc2a82d13af.jpg 721X960 px

jpg  repeat_start.JPG (64.88 KB)
45509_59fc2a9344f89.jpg 1039X556 px

11月03日 16:28:39
轉換PDF檔 列印


Re: I2C的通訊問題(卡了一個禮拜)
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 186
等級: 12; EXP: 68
HP : 0 / 292
MP : 62 / 4802
離線
如下範例,有些該等待的動作要等,你可以拿附件I2C.zip的檔案去改

char Write_ISL94208_Conf(unsigned char RegAddr,unsigned char data)
{
IdleI2C();
StartI2C();
I2C_Done();
if(WriteI2C(ISL94208_Addr_Write) != ACK)
{
I2C_Done();
StopI2C();
I2C_Done();
return(-1);
}
I2C_Done();

if(WriteI2C(RegAddr) != ACK)
{
I2C_Done();
StopI2C();
I2C_Done();
return(-1);
}
I2C_Done();

if(WriteI2C(data) != ACK)
{
I2C_Done();
StopI2C();
return(-1);
}
I2C_Done();
StopI2C();
I2C_Done();
return(0);
}

附加檔案:


zip i2c.zip 大小: 1.43 KB; 下載次數: 20

11月03日 17:03:53
轉換PDF檔 列印


Re: I2C的通訊問題(卡了一個禮拜)
中級會員
註冊日期:
2014/09/29 12:04
所屬群組:
註冊會員
文章: 66
等級: 7; EXP: 2
HP : 0 / 150
MP : 22 / 1416
離線
您好,謝謝您的建議。
我已經把MidRange MCU manual的I2C章節的"每個流程圖"都看過好幾遍了,也配合著示波器bit by bit檢查波形,我很確定我該等的時候都有等,除非是我哪裡漏掉了。

想請大家幫我檢查一下,是否有東西確實是被我漏掉了,謝謝。

11月03日 17:13:04
轉換PDF檔 列印


Re: I2C的通訊問題(卡了一個禮拜)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14184
等級: 72; EXP: 56
HP : 1073 / 1789
MP : 4728 / 71280
離線
一個很重要的觀念 在中斷裡面去執行 I2C 的動作? 這有可能會造成 I2C Step Machine 的錯誤。

11月04日 11:36:58
轉換PDF檔 列印


Re: I2C的通訊問題(卡了一個禮拜)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14184
等級: 72; EXP: 56
HP : 1073 / 1789
MP : 4728 / 71280
離線
可以參考教育訓練 W301 ,其內部有一個 I2C 的 MCP9800 溫度器的一個 I2C 範例程式。

11月04日 11:41:20
轉換PDF檔 列印


Re: I2C的通訊問題(卡了一個禮拜)
新會員
註冊日期:
2016/03/08 11:01
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 271
離線
檢查一下你的電路,之前用APP01 Ver3 時因為把短路器接到JP13讓SCL跟電容相連結果波形跑來一直不對。在發現問題前我也是認為我該寫的該做的都已經做了。所以你試試看吧

11月06日 11:32:21
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project