发明内容
本发明实施例提供一种I2C总线故障处理方法及装置,提高了对于I2C总线故障的处理精度。
本申请实施例的第一方面提供了一种I2C总线故障处理方法,包括:
根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因;
当故障原因为SDA低电平挂死时,对主机进行自恢复处理;当故障原因为SCL挂死时,对通信从机进行自恢复处理;
对待处理I2C总线的状态进行判断,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
在第一方面的一种可能的实现方式中,当故障原因为SDA低电平挂死时,对主机进行自恢复处理,具体为:
控制主机模拟SCL时钟线的信号以恢复SDA数据线的信号。
在第一方面的一种可能的实现方式中,当故障原因为SCL挂死时,对通信从机进行自恢复处理,具体为:
根据通信地址,复位通信从机。
在第一方面的一种可能的实现方式中,对待处理I2C总线的状态进行判断,具体为:
当SDA数据线释放高电平信号或者SCL时钟线释放高电平信号时,判定待处理I2C总线的状态恢复正常;
当SCL时钟线释放低电平信号或者当SDA数据线释放低电平信号且模拟次数大于第一预设数值时,判定待处理I2C总线的状态未恢复正常;其中,模拟次数为主机模拟SCL时钟线的信号的次数。
在第一方面的一种可能的实现方式中,还包括:对待处理I2C总线进行初始化处理,具体为:
启动通信系统,当SDA数据线释放低电平信号时,控制主机在9个时钟周期内连续模拟SCL时钟线的信号,以恢复SDA数据线的信号;
当SDA数据线释放高电平信号时,判定待处理I2C总线的状态为正常状态,完成初始化处理。
在第一方面的一种可能的实现方式中,还包括:
监控第一I2C总线的状态,当第一I2C总线不处于IDLE状态时,记录第一I2C总线的通信从机地址;
当第一I2C总线的当前状态与上一个历史状态相同、且通信从机的确认应答时间大于第二预设数值时,将第一I2C总线作为待处理I2C总线并获取SDA数据线的状态和SCL时钟线的状态。
在第一方面的一种可能的实现方式中,当待处理I2C总线的状态恢复正常后,还包括:
更新错误日志数据。
本申请实施例的第二方面提供了一种I2C总线故障处理装置,包括:获取模块、自恢复处理模块和复位处理模块;
其中,获取模块用于根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因;
自恢复处理模块用于当故障原因为SDA低电平挂死时,对主机进行自恢复处理;当故障原因为SCL挂死时,对通信从机进行自恢复处理;
复位处理模块用于对待处理I2C总线的状态进行判断,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
在第二方面的一种可能的实现方式中,当故障原因为SDA低电平挂死时,对主机进行自恢复处理,具体为:
控制主机模拟SCL时钟线的信号以恢复SDA数据线的信号。
在第二方面的一种可能的实现方式中,当故障原因为SCL挂死时,对通信从机进行自恢复处理,具体为:
根据通信地址,复位通信从机。
相比于现有技术,本发明实施例提供的一种I2C总线故障处理方法及装置,所述方法包括:根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因;当故障原因为SDA低电平挂死时,对主机进行自恢复处理;当故障原因为SCL挂死时,对通信从机进行自恢复处理;对待处理I2C总线的状态进行判断,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
其有益效果在于:本发明实施例根据SDA数据线的状态和SCL时钟线的状态获取待处理I2C总线的故障原因,并根据不同的故障原因先初步进行相应的、针对性的自恢复处理;自恢复处理后,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。本发明实施例对故障的I2C总线,能够根据故障原因以及I2C总线的恢复情况进行有针对性的、多级处理,从而提高了对于I2C总线故障的处理精度。
同时,本发明实施例用多级自检的方式,在第一级策略中进行优先判断异常类型并进行相应的自恢复操作,在第二级策略下在进行系统复位操作,缩短时间成本,避免现有技术中在I2C总线发生异常的情况下,直接重新复位整个系统来恢复I2C总线而导致的恢复时长过长、恢复效率低下的问题。
最后,本发明实施例在多从机连接状态下能够判断当前是由于哪个从机运行异常并进行针对性恢复操作,捕获异常发生点并记录于日志数据,方便调试排查问题,保证I2C总线故障修复的安全性。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参照图1,是本发明一实施例提供的一种I2C总线故障处理方法的流程示意图,包括S101-S103:
S101:根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因。
在本实施例中,还包括:对所述待处理I2C总线进行初始化处理,具体为:
启动所述通信系统,当SDA数据线释放低电平信号时,控制所述主机在9个时钟周期内连续模拟SCL时钟线的信号,以恢复SDA数据线的信号;
当SDA数据线释放高电平信号时,判定所述待处理I2C总线的状态为正常状态,完成初始化处理。
在本实施例中,还包括:
监控第一I2C总线的状态,当所述第一I2C总线不处于IDLE状态时,记录所述第一I2C总线的通信从机地址;
当所述第一I2C总线的当前状态与上一个历史状态相同、且通信从机的确认应答时间大于第二预设数值时,将所述第一I2C总线作为所述待处理I2C总线并获取所述SDA数据线的状态和所述SCL时钟线的状态。
其中,IDLE状态即为空闲状态。
S102:当所述故障原因为SDA低电平挂死时,对主机进行自恢复处理;当所述故障原因为SCL挂死时,对通信从机进行自恢复处理。
在本实施例中,所述当所述故障原因为SDA低电平挂死时,对主机进行自恢复处理,具体为:
控制所述主机模拟SCL时钟线的信号以恢复SDA数据线的信号。
在本实施例中,述当所述故障原因为SCL挂死时,对通信从机进行自恢复处理,具体为:
根据通信地址,复位所述通信从机。
S103:对所述待处理I2C总线的状态进行判断,当判定所述待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
在本实施例中,所述对所述待处理I2C总线的状态进行判断,具体为:
当SDA数据线释放高电平信号或者SCL时钟线释放高电平信号时,判定所述待处理I2C总线的状态恢复正常;
当SCL时钟线释放低电平信号或者当SDA数据线释放低电平信号且模拟次数大于第一预设数值时,判定所述待处理I2C总线的状态未恢复正常;其中,所述模拟次数为所述主机模拟SCL时钟线的信号的次数。
在一具体实施例中,当所述待处理I2C总线的状态恢复正常后,还包括:
更新错误日志数据。
在一优选实施例中,本发明针对I2C总线多从机连接或单从机连接的情况下,采用多级自检的方式,在获取I2C总线异常类型的情况下(SCL挂死或者SDA挂死两种情况)模块适应性地做出恢复动作,在多从机连接情况下获取异常通信从机地址并单独复位异常通信从机,在从机异常自检恢复失败的情况下提供更高一级系统复位动作,最大化减少时间成本,同时通过日志方式记录异常从机地址、异常类型以及时间等错误信息,提高异常定位有效性。
其中,自检系统包括:采集检测模块,异常日志模块以及自检恢复模块。系统在启动之后,自检恢复模块进行初始化动作,为避免由于I2C主机由于上一次异常复位导致的SDA处于异常拉低状态,主机无法发起起始条件进行正常通信,自检恢复模块主动模拟9次连续的CLK以使从机释放SDA,在超出可配尝试次数之后,自检恢复模块通过复位通信系统以使I2C能够正常工作。
初始化过程如图2所示,图2是本发明一实施例提供的自检恢复模块初始化流程图。
由图2可得,本发明实施例在启动通信系统后,初次获取SDA数据线的状态,当SDA数据线释放高电平信号时,判定I2C总线已进入正常工作状态,完成初始化处理;当SDA数据线释放低电平信号时,控制所述主机在9个时钟周期内连续模拟SCL时钟线的信号,并持续获取SDA数据线的状态,直至SDA数据线释放高电平信号,判定I2C总线已进入正常工作状态,完成初始化处理;若SDA数据线仍释放低电平信号,则判断模拟次数是否大于第一预设数值,若大于,则进行通信系统复位处理;若小于,则继续控制所述主机在9个时钟周期内连续模拟SCL时钟线的信号。
采集检测模块通过检测I2C总线状态来确定当前工作状态并判断非空闲状态下是否异常超时,在捕获到异常超时的情况下启动自检恢复模块,进行下一步的自检恢复措施。如图3所示,图3是本发明一实施例提供的异常超时判断的流程示意图。
由图3可得,通过I2C状态机获取第一I2C总线的当前状态,并周期性地监控第一I2C总线的状态,更新状态机的状态,直至第一I2C总线不处于IDLE状态时,记录第一I2C总线的通信从机地址;并判断第一I2C总线的当前状态是否与上一个历史状态相同。
当第一I2C总线的当前状态与上一个历史状态不相同时,更新状态机的状态,复位计数器,并继续周期性地监控第一I2C总线的状态;当第一I2C总线的当前状态与上一个历史状态相同时,通过计数器判断通信从机的确认应答时间是否大于第二预设数值,若通信从机的确认应答时间大于第二预设数值,则判断第一I2C总线出现异常,自检恢复模块开始工作,将第一I2C总线作为待处理I2C总线,并获取SDA数据线的状态和SCL时钟线的状态。
其中,第二预设数值可根据实际需要进行设定,优选为10ms。
在自检恢复模块中,根据I2C异常状态初步判断是为主机异常复位导致的无法进入通信起始状态还是从机异常处理等待而导致的主动拉低SCL不释放的问题,并根据初步判断实行分级自恢复措施。第一级通过对从机或主机设备单独做恢复操作,判断总线是否恢复正常工作,在第一级自恢复失败的情况下再进行第二级别的通信系统复位,使I2C重新工作。请参照图4,图4是本发明一实施例提供的自检恢复模块的工作流程示意图。
由图4可得,自检恢复模块启动后,执行多级自检工作,记录错误日志,获取SDA数据线的状态和SCL时钟线的状态,并根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障/挂死原因。
当故障原因为异常掉电导致的SDA低电平挂死时,对主机进行自恢复处理,控制主机尝试模拟SCL时钟线的信号以恢复SDA数据线的信号,并判断SDA数据线的释放情况,当SDA数据线释放高电平信号时,判定待处理I2C总线的状态恢复正常,并更新错误日志;当SDA数据线释放低电平信号时,判断模拟次数是否大于第一预设数值,若模拟次数小于第一预设数值,则继续控制主机尝试模拟SCL时钟线的信号,若模拟次数大于第一预设数值,则进行通信系统复位处理,并更新错误日志。其中,第一预设数值可根据实际需要进行设定,优选为5。
当故障原因为从机未释放高电平信号而导致SCL挂死时,对通信从机进行自恢复处理,根据通信地址复位当前通信从机,并判断SCL时钟线的释放情况;当SCL时钟线释放高电平信号时,判定待处理I2C总线的状态恢复正常,并更新错误日志;当SDA数据线释放低电平信号时,则进行通信系统复位处理,并更新错误日志。
为了进一步说明I2C总线故障处理装置,请参照图5,图5是本发明一实施例提供的一种I2C总线故障处理装置的结构示意图,包括:获取模块501、自恢复处理模块502和复位处理503模块;
其中,所述获取模块501用于根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因;
所述自恢复处理模块502用于当所述故障原因为SDA低电平挂死时,对主机进行自恢复处理;当所述故障原因为SCL挂死时,对通信从机进行自恢复处理;
所述复位处理模块503用于对所述待处理I2C总线的状态进行判断,当判定所述待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
在本实施例中,所述当所述故障原因为SDA低电平挂死时,对主机进行自恢复处理,具体为:
控制所述主机模拟SCL时钟线的信号以恢复SDA数据线的信号。
在本实施例中,所述当所述故障原因为SCL挂死时,对通信从机进行自恢复处理,具体为:
根据通信地址,复位所述通信从机。
在本实施例中,所述对所述待处理I2C总线的状态进行判断,具体为:
当SDA数据线释放高电平信号或者SCL时钟线释放高电平信号时,判定所述待处理I2C总线的状态恢复正常;
当SCL时钟线释放低电平信号或者当SDA数据线释放低电平信号且模拟次数大于第一预设数值时,判定所述待处理I2C总线的状态未恢复正常;其中,所述模拟次数为所述主机模拟SCL时钟线的信号的次数。
在一具体实施例中,还包括:对所述待处理I2C总线进行初始化处理,具体为:
启动所述通信系统,当SDA数据线释放低电平信号时,控制所述主机在9个时钟周期内连续模拟SCL时钟线的信号,以恢复SDA数据线的信号;
当SDA数据线释放高电平信号时,判定所述待处理I2C总线的状态为正常状态,完成初始化处理。
在一具体实施例中,还包括:
监控第一I2C总线的状态,当所述第一I2C总线不处于IDLE状态时,记录所述第一I2C总线的通信从机地址;
当所述第一I2C总线的当前状态与上一个历史状态相同、且通信从机的确认应答时间大于第二预设数值时,将所述第一I2C总线作为所述待处理I2C总线并获取所述SDA数据线的状态和所述SCL时钟线的状态。
在一具体实施例中,所述待处理I2C总线的状态恢复正常后,还包括:
更新错误日志数据。
本发明实施例通过获取模块根据SDA数据线的状态和SCL时钟线的状态,获取待处理I2C总线的故障原因;通过自恢复处理模块当故障原因为SDA低电平挂死时,对主机进行自恢复处理;当故障原因为SCL挂死时,对通信从机进行自恢复处理;通过复位处理模块对待处理I2C总线的状态进行判断,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。
本发明实施例根据SDA数据线的状态和SCL时钟线的状态获取待处理I2C总线的故障原因,并根据不同的故障原因先初步进行相应的、针对性的自恢复处理;自恢复处理后,当判定待处理I2C总线的状态未恢复正常时,进行通信系统复位处理。本发明实施例对故障的I2C总线,能够根据故障原因以及I2C总线的恢复情况进行有针对性的、多级处理,从而提高了对于I2C总线故障的处理精度。
同时,本发明实施例用多级自检的方式,在第一级策略中进行优先判断异常类型并进行相应的自恢复操作,在第二级策略下在进行系统复位操作,缩短时间成本,避免现有技术中在I2C总线发生异常的情况下,直接重新复位整个系统来恢复I2C总线而导致的恢复时长过长、恢复效率低下的问题。
最后,本发明实施例在多从机连接状态下能够判断当前是由于哪个从机运行异常并进行针对性恢复操作,捕获异常发生点并记录于日志数据,方便调试排查问题,保证I2C总线故障修复的安全性。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。