A few points need to check in your init procedure:
1)the filters has setting for rising, falling, touch, you should set rising, falling, while touched is optional, refer to AN3891 and attached.
2)recommend to use auto configure, otherwise you need to do trial test to set every electrode CDC/CDT manually.
3)use b01 for CL bits.
Below is the sample code for your reference
MPR121 initialization and configuration.
#define TouchThre 10 // Touch threshold
#define ReleaThre 8 // Release threshold
#define Prox_TouchThre 6 // Proximity threshold
#define Prox_ReleaThre 4 // Proximity release threshold
void MPR121_init_to_run(void)
{
IIC_ByteWrite(0x80,0x63); // Soft reset MPR121 if not reset correctly
IIC_ByteWrite(0x73,0xFF); // LED Configuration, if not used, this part can be omitted
IIC_ByteWrite(0x74,0xFF);
IIC_ByteWrite(0x76,0xFF);
IIC_ByteWrite(0x77,0xFF);
IIC_ByteWrite(0x75,0xFF);
IIC_ByteWrite(0x81,0x00);
IIC_ByteWrite(0x82,0x00);
IIC_ByteWrite(0x83,0x00);
IIC_ByteWrite(0x84,0x00);
//touch pad baseline filter
//rising: baseline quick rising
IIC_ByteWrite(0x2B,0x01); // Max half delta Rising
IIC_ByteWrite(0x2C,0x01); // Noise half delta Rising
IIC_ByteWrite(0x2D,0x00); // Noise count limit Rising
IIC_ByteWrite(0x2E,0x00); // Delay limit Rising
//falling:
baseline slow falling
IIC_ByteWrite(0x2F,0x01); // Max half delta Falling
IIC_ByteWrite(0x30,0x01); // Noise half delta Falling
IIC_ByteWrite(0x31,0xFF); // Noise count limit Falling
IIC_ByteWrite(0x32,0x0); // Delay limit Falling
//touched: baseline keep
IIC_ByteWrite(0x33,0x00); // Noise half delta Touched
IIC_ByteWrite(0x34,0x00); // Noise count Touched
IIC_ByteWrite(0x35,0x00); // Delay limit Touched
//Proximity baseline filter
//rising: very quick rising
IIC_ByteWrite(0x36,0x0f); // Max half delta Rising
IIC_ByteWrite(0x37,0x0f); // Noise half delta Rising
IIC_ByteWrite(0x38,0x00); // Noise count Rising
IIC_ByteWrite(0x39,0x00); // Delay limit Rising
//falling: very slow rising
IIC_ByteWrite(0x3A,0x01); // Max half delta Falling
IIC_ByteWrite(0x3B,0x01); // Noise half delta Falling
IIC_ByteWrite(0x3C,0xff); // Noise count Falling
IIC_ByteWrite(0x3D,0xff); // Delay limit Falling
//touched
IIC_ByteWrite(0x3E,0x00);
IIC_ByteWrite(0x3F,0x00);
IIC_ByteWrite(0x40,0x00);
//Touch pad threshold
IIC_ByteWrite(0x41,TouchThre); // ELE0 TOUCH THRESHOLD
IIC_ByteWrite(0x42,ReleaThre); // ELE0 RELEASE THRESHOLD
IIC_ByteWrite(0x43,TouchThre); // ELE1 TOUCH THRESHOLD
IIC_ByteWrite(0x44,ReleaThre); // ELE1 RELEASE THRESHOLD
IIC_ByteWrite(0x45,TouchThre); // ELE2 TOUCH THRESHOLD
IIC_ByteWrite(0x46,ReleaThre); // ELE2 RELEASE THRESHOLD
IIC_ByteWrite(0x47,TouchThre); // ELE3 TOUCH THRESHOLD
IIC_ByteWrite(0x48,ReleaThre); // ELE3 RELEASE THRESHOLD
IIC_ByteWrite(0x49,TouchThre); // ELE4 TOUCH THRESHOLD
IIC_ByteWrite(0x4A,ReleaThre); // ELE4 RELEASE THRESHOLD
IIC_ByteWrite(0x4B,TouchThre); // ELE5 TOUCH THRESHOLD
IIC_ByteWrite(0x4C,ReleaThre); // ELE5 RELEASE THRESHOLD
IIC_ByteWrite(0x4D,TouchThre); // ELE6 TOUCH THRESHOLD
IIC_ByteWrite(0x4E,ReleaThre); // ELE6 RELEASE THRESHOLD
IIC_ByteWrite(0x4F,TouchThre); // ELE7 TOUCH THRESHOLD
IIC_ByteWrite(0x50,ReleaThre); // ELE7 RELEASE THRESHOLD
IIC_ByteWrite(0x51,TouchThre); // ELE8 TOUCH THRESHOLD
IIC_ByteWrite(0x52,ReleaThre); // ELE8 RELEASE THRESHOLD
IIC_ByteWrite(0x53,TouchThre); // ELE9 TOUCH THRESHOLD
IIC_ByteWrite(0x54,ReleaThre); // ELE9 RELEASE THRESHOLD
IIC_ByteWrite(0x55,TouchThre); // ELE10 TOUCH THRESHOLD
IIC_ByteWrite(0x56,ReleaThre); // ELE10 RELEASE THRESHOLD
IIC_ByteWrite(0x57,TouchThre); // ELE11 TOUCH THRESHOLD
IIC_ByteWrite(0x58,ReleaThre); // ELE11 RELEASE THRESHOLD
//Proximity threshold
IIC_ByteWrite(0x59,Prox_TouchThre); // ELE12 TOUCH THRESHOLD
IIC_ByteWrite(0x5A,Prox_ReleaThre); // ELE12 RELEASE THRESHOLD
//touch and release interrupt debounce
IIC_ByteWrite(0x5B,0x00); // Not used for polling method, effective for INT mode.
//AFE and filter configuration
IIC_ByteWrite(0x5C,0x10); // AFES=6 samples, same as AFES in 0x7B, Global CDC=16uA
IIC_ByteWrite(0x5D,0x24); // CT=0.5us, TDS=4samples, TDI=16ms
IIC_ByteWrite(0x5E,0x80); // Set baseline calibration enabled, baseline loading 5MSB
//Auto Configuration
IIC_ByteWrite(0x7B,0x0B); // AFES=6 samples, same as AFES in 0x5C
// retry=2b00, no retry,
// BVA=2b10, load 5MSB after AC,
// ARE/ACE=2b11, auto configuration enabled
//IIC_ByteWrite(0x7C,0x80); // Skip charge time search, use setting in 0x5D,
// OOR, AR, AC IE disabled
// Not used. Possible Proximity CDC shall over 63uA
// if only use 0.5uS CDT, the TGL for proximity cannot meet
// Possible if manually set Register0x72=0x03
// (Auto configure result) alone.
IIC_ByteWrite(0x7D,0xc8); // AC up limit /C8/BD/C0/9C
IIC_ByteWrite(0x7E,0x82); // AC low limit /82/7A/7C/65
IIC_ByteWrite(0x7F,0xb4); // AC target /B4/AA/AC/8C target for /3.0V/2.8V/1.8V
IIC_ByteWrite(0x5E,0xBC); // Run 12 touch + proximity, CL=2b10, load 5MSB to baseline
}
For the detailed explanation on each registers please refer to the datasheet and relevant
application note. All the registers can be read at anytime, but it’s suggested to use multiple
consecutive byte read to save the operation time and avoid data integrity issue. For example,
we can use one line code to read out registers from 0x00 to 0x2A to get all the sensing channels
output data and status information. All the registers except 0x5E and LED configuration registers
cannot be written in run mode but only when set into stop mode.
After initialization and set into run mode, the MPR121 will work automatically and
continuously until you set it into stop mode. MPR121 provides both touch status and touch
sensing data and provides interrupt output when touch/release status changed. The host
processor can read back output data and status upon interrupt, or poll the MPR121 periodically
on timer overflow.