AnsweredAssumed Answered

MPR121 Auto-configuration, wrong baseline value.

Question asked by William Liu on Dec 29, 2015

Hi everyone! I came across some problems when use MPR121 touch sensor, the baseline value is always small than filtered data, as shown in the picture below:


data in the red box are filtered data from register:0x04~0x1D, data in the purple box are data from register:0x1E~0x2A(I have multiply the data by 4 to carry out 2 lift-shift operation).

the process of auto-configuration can be seen in the below picture:


void mpr121_setup(void){
  //Section zero- stop mode,then registers can be changed!
  set_register(0X5A, ELE_CFG, 0x00);
  // Section A - Controls filtering when data is > baseline.
  set_register(0X5A, MHD_R, 0x01);
  set_register(0X5A, NHD_R, 0x01);
  set_register(0X5A, NCL_R, 0x00);
  set_register(0X5A, FDL_R, 0x00);
  // Section B - Controls filtering when data is < baseline.
  set_register(0X5A, MHD_F, 0x01);
  set_register(0X5A, NHD_F, 0x01);
  set_register(0X5A, NCL_F, 0xFF);
  set_register(0X5A, FDL_F, 0x02);
  // Section C - Sets touch and release thresholds for each electrode
  set_register(0X5A, ELE0_T, TOU_THRESH);
  set_register(0X5A, ELE0_R, REL_THRESH);
  set_register(0X5A, ELE1_T, TOU_THRESH);
  set_register(0X5A, ELE1_R, REL_THRESH);
  set_register(0X5A, ELE2_T, TOU_THRESH);
  set_register(0X5A, ELE2_R, REL_THRESH);
  set_register(0X5A, ELE3_T, TOU_THRESH);
  set_register(0X5A, ELE3_R, REL_THRESH);
  set_register(0X5A, ELE4_T, TOU_THRESH);
  set_register(0X5A, ELE4_R, REL_THRESH);
  set_register(0X5A, ELE5_T, TOU_THRESH);
  set_register(0X5A, ELE5_R, REL_THRESH);
  set_register(0X5A, ELE6_T, TOU_THRESH);
  set_register(0X5A, ELE6_R, REL_THRESH);
  set_register(0X5A, ELE7_T, TOU_THRESH);
  set_register(0X5A, ELE7_R, REL_THRESH);
  set_register(0X5A, ELE8_T, TOU_THRESH);
  set_register(0X5A, ELE8_R, REL_THRESH);
  set_register(0X5A, ELE9_T, TOU_THRESH);
  set_register(0X5A, ELE9_R, REL_THRESH);  
  set_register(0X5A, ELE10_T, TOU_THRESH);
  set_register(0X5A, ELE10_R, REL_THRESH);
  set_register(0X5A, ELE11_T, TOU_THRESH);
  set_register(0X5A, ELE11_R, REL_THRESH);
  // Section D
  // Set the Filter Configuration
  set_register(0X5A, AFE_CFG, 0x00);
  set_register(0X5A, FIL_CFG, 0x04);
   // Section E
  // Electrode Configuration
  // Set ELE_CFG to 0x00 to return to standby mode
  //set_register(0X5A, ELE_CFG, 0x0C);  // Enables all 12 Electrodes
  // Section F
  // Enable Auto Config and auto Reconfig
  set_register(0X5A, ATO_CFG0, 0x0F);
  set_register(0X5A, ATO_CFGU, 0xC9);  // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   
  set_register(0X5A, ATO_CFGL, 0x82);  // LSL = 0.65*USL = 0x82 @3.3V
  set_register(0X5A, ATO_CFGT, 0xB5);  // Target = 0.9*USL = 0xB5 @3.3V
  set_register(0X5A, ELE_CFG, 0x0C);  // Enables all 12 Electrodes   



// MPR121 Register Defines
#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 AFE_CFG 0x5C
#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
#define SOFT_RESET 0X80
// Global Constants
#define TOU_THRESH 0x06
#define REL_THRESH 0x0A

the code is setup for registers.

registers for 0x2b~0x32  are so complicated for me,MHD NHD~~~~@ i also wish someone can tell me how it works.

thanks very much!