Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
實在是太感謝你了Eigen!!^_^
我試了一下果然是Reset的問題!! 雖然犯了粉白痴的錯誤不過這也再次證明了單晶片是沒有靈異事件的!!
發表於: 2008/9/12 10:17
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
I2C 需要 reset
我猜你該不會一下子用組語試,一下子用c 試,用c 試一直試不出來,然後就一直改,一直試 就是沒有 reset i2c
發表於: 2008/9/12 9:25
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
上面那張圖上面那組波形是用組合語言寫的有正確的ACK,下面那一組是用C語言寫的卻沒有ACK,SDA一直在hi.
到底是哪理出了錯呢?
發表於: 2008/9/11 13:58
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
拍下視波器的畫面了
Attach file: ![]()
發表於: 2008/9/11 11:28
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
時序圖來了
Attach file: ![]()
發表於: 2008/9/10 16:00
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
版主
![]() ![]() ![]() |
那在ACK訊號之前的訊號兩著比較起來有何不同?
Idle --> Start Conditional --> Command --> Slave ACK .... 有 Timming 嗎? PO 上來瞧瞧。
發表於: 2008/9/10 14:45
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
板主大大
我照著你說的做他還是不給我回應耶!! 我有對照過用組合語言寫的波形和用C語言寫的波形, 唯一不一樣的就是再ACK的時候組合語言是low, C語言卻是high..... 組合語言我是用MPLAB內建的 C語言我是用HI-TECH
發表於: 2008/9/10 14:23
|
|||
|
Re: 新手C語言求救~~急
|
||||
---|---|---|---|---|
版主
![]() ![]() ![]() |
I2C 是 Open Drain 的架構,如果你用一般的 I/O 方式去驅動時,當對方回 ACK 時此時 SDA 為輸入腳沒有 Pull up 電組要怎樣控制 I2C。
我想在使用I/O 去模擬 I2C 的功能時,須先將 SDA & SCL 先寫入0 後再設定成輸入模式。此時I2C 的 Hi-L0w 變化是直接控制TRIS的輸出入功能來讓 I2C bus 呈現 Hi/Low 的變化。也就是當SDA腳 TRIS 為輸入功能是會透過外面的 Pull-up 電阻拉成 Hi Level;當 SDA 設TRIS 為輸出時,原先寫入的 0 就會將 I2C bus 拉成 low 的。所以I/O 模擬 I2C 功能並不可以直接輸出 Hi/Low 的方式控制,這樣很容易將 Slave 短路的。 我相信 Timing 一定有錯,詳細用示波器分析一下 SDA 與 SCL 上下緣的關係,注意I2C規範裡 : 當SCL 為 Hi 時 SDA 試不能有任何變化的。
發表於: 2008/9/10 9:46
|
|||
|
新手C語言求救~~急
|
||||
---|---|---|---|---|
新會員
![]() ![]() ![]() |
各位大大麻煩幫我看一下下面那一段程式,我是使用16F876外接4M震盪,我用組合語言寫是會有ACK的可是換成C語言卻沒有,用視波器看波形也正常,可以告訴我為什麼嗎?
公司要求我一定要用軟體做!! /******I2C起始命令**************/ void I2cStart (void) { SDA = 1; SCL = 1; nop(); nop(); SDA = 0; nop(); nop(); nop(); nop(); SCL = 0; } /*******I2C 8bit 輸出***********/ void I2cBytOut (unsigned char data) { unsigned char i; for (i= 0; i< 8; i++) { SCL = 0; if(data & 0x80) { SDA = 1; } else { SDA = 0; } nop(); SCL = 1; nop(); nop(); nop(); nop(); SCL = 0; data <<= 1; } SDA = 0; } /******I2C ACK 回應信號判斷****/ void I2cAck(void) { SDA_pin = 1; //SDA腳設輸入 nop(); SCL =1; while (SDA == 1); SCL =0; SDA_pin = 0; //SDA腳設輸出 } /******I2C 寫入1Byt***********/ void I2cWrite(unsigned char data_buffer, unsigned char i2caddress) { unsigned char x; x =0x02; I2cStart(); I2cBytOut(x); I2cAck(); I2cBytOut(i2caddress); I2cAck(); I2cBytOut(data_buffer); I2cAck(); I2cStop(); }
發表於: 2008/9/10 8:41
|
|||
|