我有一个 PIC18f i2c 主设备和一些其他设备作为从设备。
我想检测从站是否不在总线上,或者他是否没有响应。
现在,通信 Master<->Slaves 运行良好,除非从机没有响应。发生这种情况时,PIC 保持等待状态,整个程序停止。
我该如何检测和修复它?(以软件方式)
有关信息,我正在研究 PIC18f25k22。
我假设您正在使用带有 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 函数,以避免仅测试寄存器状态值的循环。至于超时值,您需要根据您的设备时钟速度和外围设备响应时间通过实验找到一个值。