我有一個PIC18f i2c主器件和一些其他器件作爲從器件。如何檢測i2c從器件不響應PIC18f上的主器件
我想檢測一個奴隸是不是在公交車上,或者他沒有迴應。
現在,通信主站< - >從站無法響應時,從站運行良好。發生這種情況時,PIC處於等待狀態,整個程序停止。
如何檢測並修復該問題? (以軟件方式)
有關信息,我正在研究PIC18f25k22。
我有一個PIC18f i2c主器件和一些其他器件作爲從器件。如何檢測i2c從器件不響應PIC18f上的主器件
我想檢測一個奴隸是不是在公交車上,或者他沒有迴應。
現在,通信主站< - >從站無法響應時,從站運行良好。發生這種情況時,PIC處於等待狀態,整個程序停止。
如何檢測並修復該問題? (以軟件方式)
有關信息,我正在研究PIC18f25k22。
我假設您正在使用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功能,以避免僅測試寄存器狀態值的環路。至於超時值,您需要通過實驗來查找值,具體取決於您的設備時鐘速度和外設響應時間。
謝謝。我使用XC8而不是C18,但我想它是一樣的。 – DouglasAdams 2013-05-09 12:39:19
我沒有使用XC8,但我會認爲它是相似的。 – 2013-05-09 15:31:14
請考慮詢問[electronics](http://electronics.stackexchange.com/)網站。當你這樣做時,解釋什麼是「出現問題」和「正在竊聽」的意思。 – 2013-05-08 15:42:32
感謝您的評論。但這是一個編程問題。我不想用電子手段解決這個問題(如果可能的話)。 我編輯了我的帖子。 – DouglasAdams 2013-05-08 17:19:56