Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698981
  • 博文数量: 193
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(193)

文章存档

2024年(9)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: 其他平台

2015-07-22 21:19:15

指纹锁密码锁(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的读写,发现在写数据之前都有检查总线忙标志,在此等待直到总线空闲。另外,发送过程中还有等待其它标志出现,作为下一步动作的条件。如下:
    点击(此处)折叠或打开
  1. u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value)
  2. {

  3.     while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); //!!!写数据前,查总线忙标志

  4.     I2C_GenerateSTART(I2Cx, ENABLE);
  5.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

  6.     I2C_Send7bitAddress(I2Cx, I2C_Addr << 1, I2C_Direction_Transmitter);
  7.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  8.     I2C_SendData(I2Cx, addr);
  9.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  10.     I2C_SendData(I2Cx, value);
  11.     while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  12.     I2C_GenerateSTOP(I2Cx, ENABLE);
  13.     I2C_AcknowledgeConfig(I2Cx, DISABLE);

  14.     return 0;
  15. }
  9、偿试将写数据前的“忙等待”循环注释掉。死机现象没有再出现。由于死机概率低,还不能认为故障就此完全解除。
 10、将“忙等待”循环重新加入后,再次发生死机现象。这时用示波器测量IIC的SCK信号,板子立即活过来了,播放语音,同时SCK上检测到密集整齐的电平变化。
 11、根据以上试验过程及现象似乎可以认为,stm32f103与mpr121之间的IIC接口不稳定。
 12、考虑到此IIC总线上只有stm32f103和mpr121,不存在第三者干扰其它两者之间通信的问题,暂以注释掉“忙等待”循环的方式规避此问题。

到目前为此,死机问题没有再发生。但总觉得,故障的根本原因并没有找到,其它可能的原因也只是猜测而已。如果多个芯片接在此IIC总线上,并且有多个主机master多个从机slave的情况下,不检测IIC总线忙状态就开始发送过程,会造成通信过程的混乱。再查查资料,看看同行们有无遇到此问题,或寻求其它技术支持!


  
  
阅读(2246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~