會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客



(1) 2 »


I2C問題
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 272
等級: 15; EXP: 42
HP : 0 / 360
MP : 90 / 15486
離線
使用dsPIC33為Master,設定完成並與EEPROM通訊,通過寫WriteI2C命令後,再執行讀取動作,EEPROM回傳一byte,Master回ACK,此時當掉,請問這是EEPROM的問題,還是MCU的問題?
程式為下
.....
I2C1CONbits.ACKDT=0; //Master Set for ACK
I2C1CONbits.ACKEN=1; //Acknowledge Sequence Enable bit
while(I2C1CONbits.ACKEN); //MCU當機在此行,ACKEN無法清為0
.....

2月20日 19:54:54
轉換PDF檔 列印


Re: I2C問題
新會員
註冊日期:
2016/09/23 16:09
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 4
離線
建議先示波器勾一下,有圖有真相!可能是SCL被其中一端拉下來了。

2月21日 09:54:50
轉換PDF檔 列印


Re: I2C問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14652
等級: 73; EXP: 29
HP : 1084 / 1807
MP : 4884 / 78645
離線
我看了一下之前寫的 PIC18 I2C 的程式碼後跟您分享。

PIC18 I2C 的 Library:

/********************************************************************
*     Function Name:    NotAckI2C                                   *
*     Return Value:     void                                        *
*     Parameters:       void                                        *
*     Description:      Initiate NOT ACK bus condition.             *
********************************************************************/
#if defined (I2C_V1)
#undef NotAckI2C
void NotAckI2C( void )
{
  
SSPCON2bits.ACKDT = 1;          // set acknowledge bit for not ACK
  
SSPCON2bits.ACKEN = 1;          // initiate bus acknowledge sequence
}

********************************************************************
*     Function
Name:    AckI2C                                      *
*     Return
Value:     void                                        *
*     
Parameters:       void                                        *
*     
Description:      Initiate ACK bus condition.                 *
********************************************************************/
#if defined (I2C_V1)
#undef AckI2C
void AckI2C( void )
{
  
SSPCON2bits.ACKDT = 0;           // set acknowledge bit state for ACK
  
SSPCON2bits.ACKEN = 1;           // initiate bus acknowledge sequence
}


使用上述的ACK 程式通知 Slave 後在呼叫 I2C_Done 檢查 SSPIF 旗號是否完成工作了。

//***********************************************
//* Rendom Read a Byte from EEPROM *
//* - ctrl : Control Byte of EEPROM (Write) *
//* (Ctrl +1 ) : Read Command
//* - addr : Address Byte of EEPROM *
//* - Return : Read Data from EEPROM *
//***********************************************
unsigned char EE_READ(unsigned char ctrl,unsigned char addr)
{

IdleI2C(); // ensure module is idle
StartI2C(); // Start condition
I2C_Done(); // Wait Start condition completed

WriteI2C(ctrl); // Write Control to EEPROM
while(SSPCON2bits.ACKSTAT); // test for ACK condition, if received
I2C_Done(); // Clear SSPIF flag

#ifdef EEPROM_24LC32A
WriteI2C(0x00) ;
while(SSPCON2bits.ACKSTAT) ;
I2C_Done() ;
#endif

WriteI2C(addr); // Write Address to EEPROM
while(SSPCON2bits.ACKSTAT); // test for ACK condition, if received
I2C_Done(); // Clear SSPIF flag

RestartI2C(); // initiate Restart condition
I2C_Done();

WriteI2C(ctrl+1); // Write Control to EEPROM
while(SSPCON2bits.ACKSTAT); // test for ACK condition, if received
I2C_Done(); // Clear SSPIF flag

f=ReadI2C(); // Enable I2C Receiver & wait BF=1 until received data
I2C_Done(); // Clear SSPIF flag

NotAckI2C(); // Genarate Non_Acknowledge to EEPROM
I2C_Done();



StopI2C(); // send STOP condition
I2C_Done(); // wait until stop condition is over

return(f); // Return Data from EEPROM
}
//***********************************************
//* Check I2C action that is completed *
//***********************************************
void I2C_Done(void)
{
while (!PIR1bits.SSPIF); // Completed the action when the SSPIF is Hi.
PIR1bits.SSPIF=0; // Clear SSPIF
}

2月22日 11:42:20
轉換PDF檔 列印


Re: I2C問題
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1192
等級: 30; EXP: 11
HP : 0 / 727
MP : 397 / 31179
離線
I2C 需要完整的指令,在開發的過程中,經常人為中斷,造成 I2C 指令不完全,而 LOCK.,因此陷入DEBUG的無窮迴圈

在開發 I2C 發生問題,很多都是這樣造成(當你的CODE 都是抄來時)。

當 SLAVE 沒ACK回應時,要知道如何RESET

2月22日 12:05:02
轉換PDF檔 列印


Re: I2C問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14652
等級: 73; EXP: 29
HP : 1084 / 1807
MP : 4884 / 78645
離線
請參考一下底下的時序圖,ACK 傳完後是檢查 MI2CxIF 旗號。

附加檔案:



jpg  擷取.JPG (84.79 KB)
16_5c6f7fe5373b1.jpg 716X602 px

2月22日 12:51:49
轉換PDF檔 列印


Re: I2C問題
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 272
等級: 15; EXP: 42
HP : 0 / 360
MP : 90 / 15486
離線
今天借來示波器量訊號,程式完全沒動,電路板也沒改(也無法改了),反覆測試,一路順暢,跑了一整天,資料存取完全正確無誤,所以查不出原因.(反覆測試包含不斷地上電,關電)
回覆Eigen,不是slave沒回ACK,而是Master要回ACK給Slave時出問題.

2月22日 19:16:25

cct1210 於 2019年02月22日 19:49:00
cct1210 於 2019年02月22日 19:56:04
轉換PDF檔 列印


Re: I2C問題
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1192
等級: 30; EXP: 11
HP : 0 / 727
MP : 397 / 31179
離線
i2c 是拉低後不放開,是無法拉高的

你這種問題基本上大概就是 i2c 指令發到一半,mcu reset,然後 mcu 重新下指令,但 slave 卻卡在一半。

這種問題以前我們在做電源 on/off 測試時很容易再現

快速 on/off ,就有可能造成 mcu 控制 i2c 到一半被reset,但是 slave 卻沒有reset ,然後就 gg了

之後就學乖了,要會 reset slave。

2月23日 09:50:25
轉換PDF檔 列印


Re: I2C問題
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 272
等級: 15; EXP: 42
HP : 0 / 360
MP : 90 / 15486
離線
其實我的程式在始動I2C模組前,都有使用software reset,所以不存在SDA會在低位準,因為程式在連續送9個clock後,都會檢查SDA回到正常狀態,若沒回到高位準,則不可能會接下去的I2C模組設定,及接下來的Master送位置至Slave,而Slave也回ACK了,我的問題是出在Master送WriteI2C位址完成後(含Slave I2C位圵及接下來的RAM的位址),MCU讀取第1筆資料,回ACK給Slave時當機的.所以我的當機似乎與你提的不太一樣.

2月23日 11:17:50
轉換PDF檔 列印


Re: I2C問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14652
等級: 73; EXP: 29
HP : 1084 / 1807
MP : 4884 / 78645
離線
按前面所貼的 I2C ACN/NACK 的傳送及工作結束的偵測使直接看 ACKEN 位元完成後而變為 0,或直接偵測 MI2CxIF 的中斷旗號是否變成 1 了。依我以前的經驗,ACKEN 有時會偵測錯誤釘入死迴圈,建議還是偵測中斷旗號。

I2C 是 Step Machine 的模組,中間的動作需一步跟著一步做,一有出錯整個 I2C 就會卡住,這是就需充新關閉 I2C 在重新做 Initial 後重新啟動I2C。所以在寫 I2C 時不要太過於嚴謹的檢測。

2月25日 14:29:30
轉換PDF檔 列印


Re: I2C問題
資深會員
註冊日期:
2004/07/12 13:55
所屬群組:
註冊會員
文章: 272
等級: 15; EXP: 42
HP : 0 / 360
MP : 90 / 15486
離線
<I2C 是 Step Machine 的模組,中間的動作需一步跟著一步做,一有出錯整個 I2C 就會卡住,這是就需充新關閉 I2C 在重新做 Initial 後重新啟動I2C。所以在寫 I2C 時不要太過於嚴謹的檢測。>
那是否我在執行I2C時,要時時檢查傳輸狀態,而且我要將只有在程式初如時才做的software reset,要拿來再執行,這除了要計時外,還要知道執行到那個環節(讀取或寫入),好像很複雜,不知有沒有人這樣做?
另外我是根據如下的資料來使用ACKEN,按照型錄,ACKEN硬體應該自動清為0.

附加檔案:



jpg  i2c.JPG (80.01 KB)
400_5c7488f9533ee.jpg 1010X323 px

2月26日 08:31:58

cct1210 於 2019年02月26日 09:02:45
轉換PDF檔 列印



(1) 2 »



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

[進階搜尋]


搜尋
Microchip連結

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