AnsweredAssumed Answered

About MPR121 return value!

Question asked by Hongliang Pan on Aug 12, 2016

When i use a mpr121,and have wrong return value of the register 0x00,0x01.

when push ELE0,return 0x0000;

when push ELE1,return 0x0001;

when push ELE2,return 0x0002;

when push ELE3,return 0x0004;

when push ELE4,return 0x0008;

when push ELE5,return 0x0010;

when push ELE6,return 0x0020;

when push ELE7,return 0x00c0;

when push ELE8,return 0x0000;

when push ELE9,return 0x0001;

when push ELE10,return 0x0002;

when push ELE11,return 0x0004;

according to the manual,it should be

when push ELE0,return 0x0001;

when push ELE1,return 0x0002;

when push ELE2,return 0x0004;

when push ELE3,return 0x0008;

when push ELE4,return 0x0010;

when push ELE5,return 0x0020;

when push ELE6,return 0x0040;

when push ELE7,return 0x0080;

when push ELE8,return 0x0100;

when push ELE9,return 0x0200;

when push ELE10,return 0x0400;

when push ELE11,return 0x0800;

The code is:

        void IIC_MPR121()
{
  // Section A
  // This group controls filtering when data is > baseline.
  write_i2c(touch_shield,MHD_R, 0x01);
  write_i2c(touch_shield,NHD_R, 0x01);
  write_i2c(touch_shield,NCL_R, 0x02);
  write_i2c(touch_shield,FDL_R, 0x00);

  // Section B
  // This group controls filtering when data is < baseline.
  write_i2c(touch_shield,MHD_F, 0x01);
  write_i2c(touch_shield,NHD_F, 0x01);
  write_i2c(touch_shield,NCL_F, 0xff);
  write_i2c(touch_shield,FDL_F, 0x00);
 
  // Section C
  // This group sets touch and release thresholds for each electrode
  write_i2c(touch_shield,ELE0_T, TOU_THRESH);
  write_i2c(touch_shield,ELE0_R, REL_THRESH);
  write_i2c(touch_shield,ELE1_T, TOU_THRESH);
  write_i2c(touch_shield,ELE1_R, REL_THRESH);
  write_i2c(touch_shield,ELE2_T, TOU_THRESH);
  write_i2c(touch_shield,ELE2_R, REL_THRESH);
  write_i2c(touch_shield,ELE3_T, TOU_THRESH);
  write_i2c(touch_shield,ELE3_R, REL_THRESH);
  write_i2c(touch_shield,ELE4_T, TOU_THRESH);
  write_i2c(touch_shield,ELE4_R, REL_THRESH);
  write_i2c(touch_shield,ELE5_T, TOU_THRESH);
  write_i2c(touch_shield,ELE5_R, REL_THRESH);
  write_i2c(touch_shield,ELE6_T, TOU_THRESH);
  write_i2c(touch_shield,ELE6_R, REL_THRESH);
  write_i2c(touch_shield,ELE7_T, TOU_THRESH);
  write_i2c(touch_shield,ELE7_R, REL_THRESH);
  write_i2c(touch_shield,ELE8_T, TOU_THRESH);
  write_i2c(touch_shield,ELE8_R, REL_THRESH);
  write_i2c(touch_shield,ELE9_T, TOU_THRESH);
  write_i2c(touch_shield,ELE9_R, REL_THRESH);
  write_i2c(touch_shield,ELE10_T, TOU_THRESH);
  write_i2c(touch_shield,ELE10_R, REL_THRESH);
  write_i2c(touch_shield,ELE11_T, TOU_THRESH);
  write_i2c(touch_shield,ELE11_R, REL_THRESH);
   write_i2c(touch_shield,0x5c, 0x30);

 

 
  // Section D
  // Set the Filter Configuration
  // Set ESI2
  write_i2c(touch_shield,FIL_CFG, 0x42);
 
  // Section E
  // Electrode Configuration
  // Enable 6 Electrodes and set to run mode
  // Set ELE_CFG to 0x00 to return to standby mode
// write_i2c(touch_shield,ELE_CFG, 0x0c);    // Enables all 12 Electrodes
  //write_i2c(touch_shield,ELE_CFG, 0x06);        // Enable first 6 electrodes
 
  // Section F
  // Enable Auto Config and auto Reconfig

write_i2c(touch_shield,ATO_CFG0, 0x0B);
  write_i2c(touch_shield,ATO_CFGU, 0xC9);    // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V  
  write_i2c(touch_shield,ATO_CFGL, 0x96);    // LSL = 0.65*USL = 0x82 @3.3V
  write_i2c(touch_shield,ATO_CFGT, 0xBb);    // Target = 0.9*USL = 0xB5 @3.3V

write_i2c(touch_shield,ELE_CFG, 0x0c);    // Enables all 12 Electrodes 
}

 


uchar get_key()
{

    uchar count=0;
    uchar i=0;
    uint key_data;
    uint key_data2;
    key_data=read_i2c(touch_shield,0x01)<<8;
     key_data=key_data| read_i2c(touch_shield,0x00);
    key_data2=key_data;

 

//    for (i=0; i<12; i++)  //检测有多少按键被触摸
//      {
//        if ((dat & (1<<i)))
//          count++;
//      }
//      i=0;
//      if(count==1)
//      {

//         while(((dat & (1<<i)) == 0)&&(i<12))
//           i++;
//           i++;
//           return i;
//     }
//     return 0;

 

    while(key_data2!=0)
    {
    key_data2=read_i2c(touch_shield,0x01)<<8;
     key_data2=key_data2| read_i2c(touch_shield,0x00);
     }

      return key_data;

}

i don't know what's the problem? help please.

Outcomes