I2C的通訊問題(卡了一個禮拜)

作者 firststop0 於 2017年11月03日 16:28:39
各位好,小弟正在寫一個程式,但是已經卡一個禮拜了,所有能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

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=1&topic_id=21830&post_id=77102