当前位置: 首页 > news >正文

STM32F103硬件IIC对MPR121的初始化

    关于MPR121,论坛可用的资料太少,大量的都是要花C币下载的资源。作为菜鸟,搞来搞去主要就是初始化配置棘手,主要就是可配置的寄存器实在太多了。根据官方MPR技术文档及网页搜索一些信息得出以下初始化函数,实测采用3mm亚克力板稳定可用。

    说明:芯片为STM32F103C8T6,采用硬件IIC,管脚定义:
    PB6=SCL
    PB7=SDA
    PB8=IRQ,中断输出。

    我在IIC总线上还接了一个OLED屏。需要特别注意的是,OLED屏和MPR121对硬件IIC都有速度要求,实测必须在240K~290K之间才能正常运行,太快OLED屏会死机,太慢MPR121会死机。

MPR初始化函数如下:

void MPR121_Init(void)
{
    //复位 MPR121
    MPR121Write(0x80, 0x63);    //软复位,官方指定写入0x63值。   
    MPR121Write(0x5E, 0x00);    //停止模式
   
    // Section A  // 该组控制过滤。 data is > baseline.
    MPR121Write(MHD_R, 0x01);
    MPR121Write(NHD_R, 0x01);
    MPR121Write(NCL_R, 0x00);
    MPR121Write(FDL_R, 0x00);

    // Section B  // 该组控制过滤。data is < baseline.
    MPR121Write(MHD_F, 0x01);
    MPR121Write(NHD_F, 0x01);
    MPR121Write(NCL_F, 0xFF);
    MPR121Write(FDL_F, 0x00);
    
    //基线过滤控制寄存器
    MPR121Write(0x33, 0x00);    //noise half delta touched
    MPR121Write(0x34, 0x00);    //noise counts touched
    MPR121Write(0x35, 0x00);    //filter delay touched

    MPR121Write(0x36, 0x0F);
    MPR121Write(0x37, 0x0F);
    MPR121Write(0x38, 0x00);
    MPR121Write(0x39, 0x00);
    MPR121Write(0x3A, 0x01);
    MPR121Write(0x3B, 0x01);
    MPR121Write(0x3C, 0xFF);
    MPR121Write(0x3D, 0xFF);
    MPR121Write(0x3E, 0x00);
    MPR121Write(0x3F, 0x00);
    MPR121Write(0x40, 0x00);
        
    // Section C  // 该组为每个电极设置触摸和释放阈值
    MPR121Write(ELE0_T, TOU_THRESH);
    MPR121Write(ELE0_R, REL_THRESH);
    MPR121Write(ELE1_T, TOU_THRESH);
    MPR121Write(ELE1_R, REL_THRESH);
    MPR121Write(ELE2_T, TOU_THRESH);
    MPR121Write(ELE2_R, REL_THRESH);
    MPR121Write(ELE3_T, TOU_THRESH);
    MPR121Write(ELE3_R, REL_THRESH);
    MPR121Write(ELE4_T, TOU_THRESH);
    MPR121Write(ELE4_R, REL_THRESH);
    MPR121Write(ELE5_T, TOU_THRESH);
    MPR121Write(ELE5_R, REL_THRESH);
    MPR121Write(ELE6_T, TOU_THRESH);
    MPR121Write(ELE6_R, REL_THRESH);
    MPR121Write(ELE7_T, TOU_THRESH);
    MPR121Write(ELE7_R, REL_THRESH);
    MPR121Write(ELE8_T, TOU_THRESH);
    MPR121Write(ELE8_R, REL_THRESH);
    MPR121Write(ELE9_T, TOU_THRESH);
    MPR121Write(ELE9_R, REL_THRESH);
    MPR121Write(ELE10_T, TOU_THRESH);
    MPR121Write(ELE10_R, REL_THRESH);
    MPR121Write(ELE11_T, TOU_THRESH);
    MPR121Write(ELE11_R, REL_THRESH);

    MPR121Write(0x59, 0x02);
    MPR121Write(0x5A, 0x01);
    MPR121Write(0x5B, 0x00);
    MPR121Write(0x5C, 0x10);
    MPR121Write(0x5D, 0x24);
    
    // 启用自动配置和自动重新配置
    MPR121Write(0x7B, 0x0B);
    MPR121Write(0x7D, 0xC8);
    MPR121Write(0x7E, 0x82);
    MPR121Write(0x7F, 0xB4);

    //电极配置(重要)
    MPR121Write(0x5E, 0xBC);//1011,1100。启用基线跟踪,启用接近检测,启用所有12个电极
}

MPR121.H文件主内容:

#define MPR121_ADD    0xB4     //(相当于0x5A<<1)将ADDR引脚连接到VSS、VDD、SDA或SCL线,得到的I2C地址分别为0x5A、0x5B、0x5C和0x5D//本例 ADDR引脚接地,故地址是0x5A

// MPR121 寄存器定义
#define MHD_R    0x2B
#define NHD_R    0x2C
#define    NCL_R    0x2D
#define    FDL_R        0x2E

#define    MHD_F    0x2F
#define    NHD_F    0x30
#define    NCL_F        0x31
#define    FDL_F        0x32

#define    ELE0_T    0x41
#define    ELE0_R    0x42
#define    ELE1_T    0x43
#define    ELE1_R    0x44
#define    ELE2_T    0x45
#define    ELE2_R    0x46
#define    ELE3_T    0x47
#define    ELE3_R    0x48
#define    ELE4_T    0x49
#define    ELE4_R    0x4A
#define    ELE5_T    0x4B
#define    ELE5_R    0x4C
#define    ELE6_T    0x4D
#define    ELE6_R    0x4E
#define    ELE7_T    0x4F
#define    ELE7_R    0x50
#define    ELE8_T    0x51
#define    ELE8_R    0x52
#define    ELE9_T    0x53
#define    ELE9_R    0x54
#define    ELE10_T    0x55
#define    ELE10_R    0x56
#define    ELE11_T    0x57
#define    ELE11_R    0x58

#define    FIL_CFG    0x5D
#define    ELE_CFG    0x5E
#define GPIO_CTRL0    0x73
#define    GPIO_CTRL1    0x74
#define GPIO_DATA    0x75
#define    GPIO_DIR    0x76
#define    GPIO_EN        0x77
#define    GPIO_SET    0x78
#define    GPIO_CLEAR    0x79
#define    GPIO_TOGGLE    0x7A
#define    ATO_CFG0    0x7B
#define    ATO_CFGU    0x7D
#define    ATO_CFGL    0x7E
#define    ATO_CFGT    0x7F

// 全局常数(实测“3/2”参数适用3mm有机玻璃板)
#define TOU_THRESH    3        //触摸阈值 0x0F     10//15//30//10//3
#define    REL_THRESH    2     //释放阈值 0x0A     08//08//25//08//2

http://www.lryc.cn/news/570536.html

相关文章:

  • 5,事件实现文件保存
  • 常见的国内外Linux服务器运维面板汇总
  • 1351:面朝大海 春暖花开 [ 数据加强版 ]
  • 大旗网关闭,天涯带伤挂牌 论坛网站的末日来了?
  • HTML5 文本语义元素
  • 推荐标注数据标注
  • 处理bootsafa64.sys丢失
  • Python打卡训练营Day54
  • LG P4278 带插入区间K小值 Solution
  • Ghost8.0分区备份与恢复详细图解
  • 分享亿个HTML炫酷特效代码
  • Windows7 32位 旗舰版 [轻度优化 2.6G]
  • SpringBoot电脑商城项目--用户注册功能
  • Static修饰的变量定义在头文件(.h)中的影响
  • 500G 史上最全的JAVA全套视频教程网盘
  • semi-BATNet
  • Kotlin实现文件上传进度监听:RequestBody封装详解
  • web前端学习(三)——HTML5的字体、特殊符号、插入图片及头部元素的相关标签设置
  • 摩托罗拉v8对讲机驱动软件_摩托罗拉驱动下载安装教程
  • Meta-Analysis
  • 开源加密软件 TrueCrypt使用方法(图)
  • Rviz2中,在rviz和launch文件中都需要配置urdf文件,二者作用上的区别?
  • WordPress开启多站点功能以及插件MU Domain Mapping教程
  • CToolBar的使用总结(2)
  • html设置文本框为只读
  • Android系统文件夹结构说明以及Android专有名词介绍
  • 概率期望DP
  • 我的友情链接
  • C++ STL常用二分查找算法
  • 王峰:创业就是长征,能扛才能称王