指纹锁密码锁
(STM32F103+MPR121+BLH3001+NY3P087+...)改板电路及代修改。记录备忘。
一、问题描述
修改后的指纹锁电路新焊的几块板子,没有一块板子能跑起来。经过一翻查找虚焊点补焊,洗板水清除锡渣,加去耦电容稳定供电等等折腾之后,总算是跑起来了,功能正常。不过其中一块板会发生死机现象。
机械按键、指纹传感器BLH3001和触摸传感器MPR121都不能让板子工作
二、处理过程
死机异常蹊跷:
此板子使用外部信号触发电子开关接通电源,进入稳定工作状态后,MCU通过一个引脚输出稳定的高电平,使电源持续供电……完成任务后,撤掉此高电平信号即可断开电源,一个工作周期就此结束了。其中的MPR121是常供电感应触摸信号,BLH3001也有一条线是常供电的,。设计构思认为,只要完成一个工作周期后STM32F103断电,就不可能死机的。
但是,操作中多次发生工作完成退出后,机械按键、指纹传感器BLH3001和触摸传感器MPR121发出的高电平信号都不能让STM32F103再次工作的情况。概率高达10%。
1、查晶振信号,查复位电路,没发现异常。示波器查各点电压,没发现供电异常。
2、想不出有什么原因了,将能撤掉的部件撤掉看看有什么现象发生。当撤掉MPR121工作的触摸板子后,板子上的LED开始不正常的闪烁,再接上MPR121工作的触摸板后,整个板子又可以正常工作了。
3、似乎是MPR121工作的触摸板有故障,然而大多次情况下能够正常工作。下一步该怎么办?
4、硬着头皮查查还有什么地方有不正常的信号。当死机发生时,只要STM32F103的供电正常,示波器测得对应的复位引脚nRST每隔280ms会发出32us的低电平脉冲,如下图。无语,只听说过复位引脚是输入的,没听说过还可以输出信号。难道是芯片坏了。
5、查芯片的datasheet,找复位电路部分,发现STM32F103的nRST是可以作为信号输出的。
6、联想到代码中开启的IWDG,仔细计算其中的时间设置,约280ms,与nRST的低脉冲周期一致。猜测可能是IWDG复位了。
7、将IWDG的复位时间调整为原来的8倍约2.2秒,再次查死机时STM32F103的nRST输出,果然检测到每隔2.2s会发出32us的低电平脉冲。无语。几乎可以确定是IWDG引起复位了。哪里跑飞了?死机现象只发生在一次工作周期结束后
8、查看代码。可能长时间停止喂狗的地方只有IIC对MPR121的读写。查IIC的读写,发现在写数据之前都有检查总线忙标志,在此等待直到总线空闲。另外,发送过程中还有等待其它标志出现,作为下一步动作的条件。如下:
点击(
此处)折叠或打开
-
u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value)
-
{
-
-
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); //!!!写数据前,查总线忙标志
-
-
I2C_GenerateSTART(I2Cx, ENABLE);
-
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
-
-
I2C_Send7bitAddress(I2Cx, I2C_Addr << 1, I2C_Direction_Transmitter);
-
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
-
-
I2C_SendData(I2Cx, addr);
-
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
-
I2C_SendData(I2Cx, value);
-
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
-
I2C_GenerateSTOP(I2Cx, ENABLE);
-
I2C_AcknowledgeConfig(I2Cx, DISABLE);
-
-
return 0;
-
}
9、偿试将写数据前的“忙等待”循环注释掉。死机现象没有再出现。由于死机概率低,还不能认为故障就此完全解除。
10、将
“忙等待”循环重新加入后,再次发生死机现象。这时用示波器测量IIC的SCK信号,板子立即活过来了,播放语音,同时SCK上检测到密集整齐的电平变化。
11、根据以上试验过程及现象似乎可以认为,stm32f103与mpr121之间的IIC接口不稳定。
12、考虑到此IIC总线上只有
stm32f103和mpr121,不存在第三者干扰其它两者之间通信的问题,暂以注释掉“忙等待”循环的方式规避此问题。
到目前为此,死机问题没有再发生。但总觉得,故障的根本原因并没有找到,其它可能的原因也只是猜测而已。如果多个芯片接在此IIC总线上,并且有多个主机master多个从机slave的情况下,不检测IIC总线忙状态就开始发送过程,会造成通信过程的混乱。再查查资料,看看同行们有无遇到此问题,或寻求其它技术支持!
阅读(2246) | 评论(0) | 转发(0) |