关于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

STM32F103硬件IIC对MPR121的初始化相关推荐

  1. 基于Stm32f103硬件iic驱动LM75A温度传感器

    这是LM75A温度传感器的概述,本文主要介绍基于Stm32f103的硬件iic驱动LM75A温度传感器. 这是我所使用的硬件电路,很简单. 对于该传感器的使用,主要是读取温度值,查看数据手册我们知道需 ...

  2. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

  3. STM32 驱动 GY-302 光照传感器 BH1750 模块(软件IIC与硬件IIC驱动)

    1.特别说明 ​ 要是不想看原理和过程,直接下拉找代码吧,都是测试过的,很稳定,有硬件I2C驱动的,也有软件模拟I2C驱动的,基于STM32F103系列和STM32F4系列实现,基于标准库实现,条理清 ...

  4. 【国货之光】GD32E230F4使用硬件IIC+DMA读写24C04

    在很久很久以前,我就写过GD32E230替换STM32F031的帖子,主要介绍了USART和SPI的外设移植开发,当时IIC使用的是软件i2c,没有介绍的价值.在使用IIC时,大多数我们都是采用软件的 ...

  5. STM32H7系列使用硬件IIC读写EEPROM(HAL库配置源码)

    记得在使用STM32F103系列时,好多人说其硬件IIC通讯不稳定.后来我们用到了STM32H743的单片机,使用了其硬件IIC对EEPROM进行读写.硬件IIC使用并不麻烦,而且相比于I/O模拟的I ...

  6. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  7. STM32 HAL 硬件IIC+DMA+简单图形库控制OLED

    目录 前言 一.建立工程 二.编写和移植 前期准备 驱动部分修改 三.使用和验证 结论 (2022年1月22日重制)本文主要是移植带简单图形库的程序,如果只是实现DMA控制,建议看[0.96寸 OLE ...

  8. MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

    和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度.编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家. AD7745硬件IIC驱动完整版下 ...

  9. 【STM32】CubeMX+HAL库之 硬件IIC+DMA控制OLED(兼容SSD1306SH1106驱动)

    [STM32]CubeMX+HAL库之 硬件IIC+DMA控制1.3寸OLED 前言 目前网上大多数驱动OLED屏都采用软件IIC,因为HAL库的升级使得硬件IIC的稳定性得到了保障,所以想采用硬件I ...

最新文章

  1. java序列化的作用
  2. 20155201 网络攻防技术 实验六 信息搜集与漏洞
  3. PHP生成静态HTML的源代码及用法
  4. 【287】◀▶ arcpy 常用类说明
  5. python模块之paramiko学习二
  6. Andorid之Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法总结
  7. Asterisk权威指南/第三章 安装Asterisk
  8. “阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家
  9. 强化学习ppt_强化学习和最优控制的十个关键点81页PPT汇总
  10. 编写MR代码中,JAVA注意事项
  11. python画条形图-python使用Matplotlib画条形图
  12. Java ME游戏编程_Java ME游戏编程(第2版)
  13. L2TP详解(六)——L2TP排错、使用限制和注意事项
  14. 面试题38 数字在排序数组中出现的次数
  15. redis下载安装教程
  16. stm32cubeMx---DCMI 配置与使用
  17. pcr扩增的原理和步骤
  18. php如何实时显示弹幕,斗鱼弹幕 PHP 实现
  19. 移动硬盘插入提示需要格式化RAW_移动硬盘怎么分区,硬盘分区教程学习
  20. Layabox引擎开发H5打地鼠游戏(一)

热门文章

  1. 剪切的文件丢失如何找回?这四种方法可试
  2. 剪切的数据不见了怎么找回来?试试这个方法
  3. note: how userspace relates to netdevice rings
  4. java实现小程序开发(一)
  5. 被加盟片骗局坑了的请看
  6. 方正PC迅速崛起 联想地位面临威胁
  7. 微型计算机原理2018,2018年自考《微型计算机原理应用》习题及答案四
  8. 订单中心表结构设计_商超仓储中心物流拣选系统的设计与应用
  9. 从《美国工厂》看外企文化
  10. idea 爆红问题总结并解决