2013-05-08 66 views
1

我有一個PIC18f i2c主器件和一些其他器件作爲從器件。如何檢測i2c從器件不響應PIC18f上的主器件

我想檢測一個奴隸是不是在公交車上,或者他沒有迴應。

現在,通信主站< - >從站無法響應時,從站運行良好。發生這種情況時,PIC處於等待狀態,整個程序停止。

如何檢測並修復該問題? (以軟件方式)

有關信息,我正在研究PIC18f25k22。

+0

請考慮詢問[electronics](http://electronics.stackexchange.com/)網站。當你這樣做時,解釋什麼是「出現問題」和「正在竊聽」的意思。 – 2013-05-08 15:42:32

+0

感謝您的評論。但這是一個編程問題。我不想用電子手段解決這個問題(如果可能的話)。 我編輯了我的帖子。 – DouglasAdams 2013-05-08 17:19:56

回答

0

我假設您正在使用MPLAB C18。所有I2C功能的來源可以在以下位置找到:C:\Program Files (x86)\Microchip\mplabc18\v3.46\src\pmc_common\i2c

接下來,您需要弄清楚哪些函數掛起,然後編寫自己的版本,如果從站沒有進入無限循環響應。最喜歡ReadI2C掛着等待奴隸迴應。所以你可以用myReadI2C代替它,它需要一個超時參數。 i2c_read.c中代碼的修改版本。

#if defined (I2C_V1) 
int myReadI2C(long timeout) 
{ 
if(((SSPCON1&0x0F)==0x08) || ((SSPCON1&0x0F)==0x0B)) //master mode only 
    SSPCON2bits.RCEN = 1;   // enable master for 1 byte reception 
    while (!SSPSTATbits.BF && timeout > 0) timeout--;  // wait until byte received 
    return timeout == 0 ? (-1) : (SSPBUF);    // return with read byte 
} 
#endif 

#if defined (I2C_V4) 
int myReadI2C(long timeout) 
{ 
    while (!SSPSTATbits.BF && timeout > 0) timeout--;  // wait until byte received 
    return timeout == 0 ? (-1) : (SSPBUF);    // return with read byte 
} 
#endif 

myReadI2C會在成功時返回-1和無符號字符值(0-255)。您需要以類似的方式修改您使用的其他I2C功能,以避免僅測試寄存器狀態值的環路。至於超時值,您需要通過實驗來查找值,具體取決於您的設備時鐘速度和外設響應時間。

+0

謝謝。我使用XC8而不是C18,但我想它是一樣的。 – DouglasAdams 2013-05-09 12:39:19

+0

我沒有使用XC8,但我會認爲它是相似的。 – 2013-05-09 15:31:14