Chinaunix首页 | 论坛 | 博客
  • 博客访问: 166027
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-27 09:43
个人简介

为兴趣挑灯夜战

文章分类
文章存档

2018年(4)

2017年(7)

2016年(9)

2015年(4)

2014年(49)

分类: 嵌入式

2016-11-08 23:26:51

用飞思卡尔的MPR121做触摸按键键盘,在调试的过程中被虐得很惨,MPR121的寄存器太多,把一个应该简单易用的做得那么复杂,有点让人郁闷。
下面是在官方网上找到的初始化代码:

点击(此处)折叠或打开

  1. #define TouchThre 10//15//30//10
  2. #define ReleaThre 8//8//25//8
  3. void MPR121_init(void)
  4. {
  5. //Reset MPR121 if not reset correctly
  6. IIC_ByteWrite(0x80,0x63); //Soft reset
  7. IIC_ByteWrite(0x5E,0x00); //Stop mode
  8. //touch pad baseline filter
  9. //rising
  10. IIC_ByteWrite(0x2B,0x01); //0xFF// MAX HALF DELTA Rising
  11. IIC_ByteWrite(0x2C,0x01); //0xFF// NOISE HALF DELTA Rising
  12. IIC_ByteWrite(0x2D,0x00); // //0 NOISE COUNT LIMIT Rising
  13. IIC_ByteWrite(0x2E,0x00); // DELAY LIMIT Rising
  14. //falling
  15. IIC_ByteWrite(0x2F,0x01); // MAX HALF DELTA Falling
  16. IIC_ByteWrite(0x30,0x01); // NOISE HALF DELTA Falling
  17. IIC_ByteWrite(0x31,0xFF); // NOISE COUNT LIMIT Falling
  18. IIC_ByteWrite(0x32,0x02); // //2//DELAY LIMIT Falling
  19. //touched
  20. IIC_ByteWrite(0x33,0x00); // Noise half delta touched
  21. IIC_ByteWrite(0x34,0x00); // Noise counts touched
  22. IIC_ByteWrite(0x35,0x00); //Filter delay touched
  23. //Touch pad threshold
  24. IIC_ByteWrite(0x41,TouchThre); // ELE0 TOUCH THRESHOLD
  25. IIC_ByteWrite(0x42,ReleaThre); // ELE0 RELEASE THRESHOLD
  26. IIC_ByteWrite(0x43,TouchThre); // ELE1 TOUCH THRESHOLD
  27. IIC_ByteWrite(0x44,ReleaThre); // ELE1 RELEASE THRESHOLD
  28. IIC_ByteWrite(0x45,TouchThre); // ELE2 TOUCH THRESHOLD
  29. IIC_ByteWrite(0x46,ReleaThre); // ELE2 RELEASE THRESHOLD
  30. IIC_ByteWrite(0x47,TouchThre); // ELE3 TOUCH THRESHOLD
  31. IIC_ByteWrite(0x48,ReleaThre); // ELE3 RELEASE THRESHOLD
  32. IIC_ByteWrite(0x49,TouchThre); // ELE4 TOUCH THRESHOLD
  33. IIC_ByteWrite(0x4A,ReleaThre); // ELE4 RELEASE THRESHOLD
  34. IIC_ByteWrite(0x4B,TouchThre); // ELE5 TOUCH THRESHOLD
  35. IIC_ByteWrite(0x4C,ReleaThre); // ELE5 RELEASE THRESHOLD
  36. IIC_ByteWrite(0x4D,TouchThre); // ELE6 TOUCH THRESHOLD
  37. IIC_ByteWrite(0x4E,ReleaThre); // ELE6 RELEASE THRESHOLD
  38. IIC_ByteWrite(0x4F,TouchThre); // ELE7 TOUCH THRESHOLD
  39. IIC_ByteWrite(0x50,ReleaThre); // ELE7 RELEASE THRESHOLD
  40. IIC_ByteWrite(0x51,TouchThre); // ELE8 TOUCH THRESHOLD
  41. IIC_ByteWrite(0x52,ReleaThre); // ELE8 RELEASE THRESHOLD
  42. IIC_ByteWrite(0x53,TouchThre); // ELE9 TOUCH THRESHOLD
  43. IIC_ByteWrite(0x54,ReleaThre); // ELE9 RELEASE THRESHOLD
  44. IIC_ByteWrite(0x55,TouchThre); // ELE10 TOUCH THRESHOLD
  45. IIC_ByteWrite(0x56,ReleaThre); // ELE10 RELEASE THRESHOLD
  46. IIC_ByteWrite(0x57,TouchThre); // ELE11 TOUCH THRESHOLD
  47. IIC_ByteWrite(0x58,ReleaThre); // ELE11 RELEASE THRESHOLD
  48. //AFE configuration
  49. IIC_ByteWrite(0x5D,0x00);
  50. IIC_ByteWrite(0x5C,0xC0);
  51. //Auto configuration
  52. IIC_ByteWrite(0x7B,0xCB);
  53. IIC_ByteWrite(0x7D,0xE4);
  54. IIC_ByteWrite(0x7E,0x94);
  55. IIC_ByteWrite(0x7F,0xCD);

  56. IIC_ByteWrite(0x5E,0x0C);
  57. }

代码的运行时正常,但是有几个问题:
1.感应距离太近,隔了一层亚克力板后感应就不灵敏了。
2.上面代码的配置不是低功耗模式,功耗达到300uA+,可以通过修改上面代码第49行IIC_ByteWrite(0x5D,0x00);中的第二个参数,改为IIC_ByteWrite(0x5D,0x06);时功耗降到11uA左右,第52到55行是配置为自动调节模式,在设置为自动模式时,对触摸阈值TouchThre  和释放阈值的ReleaThre设置没多少影响。
3.上电后,键盘有7-8秒的时间见内没有感应,这个问题在网上有很多都遇到了,有人在官网上提问题这个问题,也没看到有具体的回答。
官方的手册里也有明确讲到要则么设置芯片的这些寄存器。
由于上面那样的问题,我知道放弃使用MPR121触摸芯片的方案,而改用合泰的BS8116a-3,这个芯片的感应距离较远,只要键盘稍微大一点,5mm外就能感应到,但也会带来干扰问题,但可以通过减小键盘的尺寸和设置灵敏度来降低感应强度。




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

h20525192017-05-23 22:13:38

MPR121_ByteWrite(0x5B,0x02);
 MPR121_ByteWrite(0x5D,0xE1);
 MPR121_ByteWrite(0x5C,0x47);
 //Auto configuration
 MPR121_ByteWrite(0x7B,0xCB);
 MPR121_ByteWrite(0x7D,0xE4);
 MPR121_ByteWrite(0x7E,0x94);
 MPR121_ByteWrite(0x7F,0xCD);
 MPR121_ByteWrite(0x5E,0x10); 
示例

h20525192017-05-23 22:11:59

楼主瞎扯,MPR121 通过配置 5C,5D 寄存器,可以改变触摸灵敏度和反应时间的,反应时间是通过调整充放电周期来调整的

phoenix07152017-03-21 09:47:25

博主高手,我这两天也在stm32f0上调试MPR121,使用GPIO模拟IIC,读寄存器总是读出权零或全ff,其中固定值寄存器0x5c和0x5d也是
希望能和楼主请教。