我有PIC18f i2c Master和其他一些设备作为奴隶。
我想检测一个奴隶是不在公共汽车上还是没有回应。
现在,通信Master< - > Slaves运行良好,除非奴隶没有响应。发生这种情况时,PIC保持等待状态,整个程序停止。
我如何检测并修复它? (以软件方式)
有关信息,我正在研究PIC18f25k22。
答案 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函数,以避免仅测试寄存器状态值的循环。至于超时值,您需要通过实验找到一个值,具体取决于您的设备时钟速度和外设响应时间。