jurs:
You will have to select the register by using a write command.
Typical I2C read from a selected start register goes like that for reading two bytes from register 0x04 and 0x05:
#define DEVICE_I2C_ADDRESS 0x5A // this must be the I2C bus address of your device
byte register4;
byte register5;
Wire.beginTransmission(DEVICE_I2C_ADDRESS); // select device with "beginTransmission()"
Wire.write(0x04); // select starting register with "write()"
Wire.endTransmission(); // end write operation, as we just wanted to select the starting register
Wire.requestFrom(DEVICE_I2C_ADDRESS, 2); // select number of bytes to get from the device (2 bytes in this case)
register4= Wire.read(); // read from the starting register
register5= Wire.read(); // read next byte from the following register
OK?
i have a try with your code, and i think your code seems right, but the output data still begins from the first register:0x00.
this is the whole code:
#include "mpr121rdctrg.h"
#include <Wire.h>
int irqpin = 2; // Digital 2
void setup(){
pinMode(irqpin, INPUT);
digitalWrite(irqpin, HIGH); //enable pullup resistor
Serial.begin(9600);
Wire.begin();
mpr121_setup();
Serial.println("start");
}
void loop(){
readTouchInputs();
}
void readTouchInputs(){
if(!checkInterrupt()){
//read the touch state from the MPR121
Wire.beginTransmission(0x5A); // select device with "beginTransmission()"
Wire.write(0x04); // select starting register with "write()"
Wire.endTransmission(); // end write operation, as we just wanted to select the starting register
Wire.requestFrom(0x5A,2);
byte LSB = Wire.read();
byte MSB = Wire.read();
uint16_t touched = ((MSB << 8) | LSB); //16bits that make up the touch states
byte bit0=bitRead(touched,0);
Serial.print(bit0);
byte bit1=bitRead(touched,1);
Serial.print(bit1);
byte bit2=bitRead(touched,2);
Serial.print(bit2);
byte bit3=bitRead(touched,3);
Serial.print(bit3);
byte bit4=bitRead(touched,4);
Serial.print(bit4);
byte bit5=bitRead(touched,5);
Serial.print(bit5);
byte bit6=bitRead(touched,6);
Serial.print(bit6);
byte bit7=bitRead(touched,7);
Serial.print(bit7);
byte bit8=bitRead(touched,8);
Serial.print(bit8);
byte bit9=bitRead(touched,9);
Serial.print(bit9);
byte bit10=bitRead(touched,10);
Serial.print(bit10);
byte bit11=bitRead(touched,11);
Serial.print(bit11);
Serial.println();
}
}
void mpr121_setup(void){
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 ESI2
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, 0x0B);
set_register(0X5A, ATO_CFGU, 0xC9); // USL = (Vdd-0.7)/vdd256 = 0xC9 @3.3V set_register(0X5A, ATO_CFGL, 0x82); // LSL = 0.65USL = 0x82 @3.3V
set_register(0X5A, ATO_CFGT, 0xB5);/ // Target = 0.9*USL = 0xB5 @3.3V
set_register(0X5A, ELE_CFG, 0x01);
}
boolean checkInterrupt(void){
return digitalRead(irqpin);
}
void set_register(int address, unsigned char r, unsigned char v){
Wire.beginTransmission(address);
Wire.write(r);
Wire.write(v);
Wire.endTransmission();
}