正在流覽:
1 名訪客
|
I2C的通訊問題(卡了一個禮拜) |
|
---|---|---|
高級會員
![]() ![]() 註冊日期:
2014/09/29 12:04 所屬群組:
註冊會員 文章: 72
等級: 7; EXP: 40
HP : 0 / 160 MP : 24 / 2056 ![]() |
各位好,小弟正在寫一個程式,但是已經卡一個禮拜了,所有能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沒考慮到的。謝謝!
2017/11/03 16:28
|
|
![]() ![]() |
您無法在此發表文章
您可以在此觀看文章
您無法回覆文章
您無法編輯自己的文章
您無法刪除自己的文章
您無法發起投票調查
您無法在此投票
您無法上傳附加檔案
您無法不經審核直接發表文章