如何检测i2c从器件不响应PIC18f上的主器件

时间:2013-05-08 15:13:15

标签: pic i2c

我有PIC18f i2c Master和其他一些设备作为奴隶。

我想检测一个奴隶是不在公共汽车上还是没有回应。

现在,通信Master< - > Slaves运行良好,除非奴隶没有响应。发生这种情况时,PIC保持等待状态,整个程序停止。

我如何检测并修复它? (以软件方式)

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

1 个答案:

答案 0 :(得分:0)

我假设您正在使用带有C18的MPLAB。可在以下位置找到所有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,并在成功时返回unsigned char值(0 - 255)。您需要以类似的方式修改您使用的其他I2C函数,以避免仅测试寄存器状态值的循环。至于超时值,您需要通过实验找到一个值,具体取决于您的设备时钟速度和外设响应时间。