CPP_Technologist 2 Posted March 26, 2013 Share Posted March 26, 2013 Hello All! I'm having trouble achieving I2C communication with Sparkfun's MPR121 I2C capacitive touch sensor breakout board. I've used the breakout board (and code) many times before with the Arduino, but for some reason I can't get it to work with the MSP430G2553 and Energia. I'm using an MPR121 library found at http://bildr.org/2011/05/mpr121_arduino/ to help with register configuration. My code compiles fine, but I'm trying to print the output from the touch sensor to the serial monitor and nothing is showing up, so I'm assuming the touch sensor isn't working. I know the serial monitor works fine; I ran the DigitalReadSerial example and I can see the output on the monitor. I've connected the MPR121's SDA to pin 1.7 and the SCL to pin 1.6, and the IRQ (interrupt request) to pin 2.4. The SDA and SCL both have 10K pull up resistors on the MPR121's breakout board. The MPR121 is connected to Vcc and GND on the launchpad. Here is my code: #include <mpr121.h> #include <Wire.h> boolean touchStates[12]; //to keep track of the previous touch states void setup(){ pinMode(P2_4, INPUT); // IRQ pin digitalWrite(P2_4, HIGH); //enable pullup resistor Serial.begin(9600); Wire.begin(); mpr121_setup(); } void loop(){ readTouchInputs0(); } void readTouchInputs0(){ if(!checkInterrupt1()){ //read the touch state from the MPR121 Wire.requestFrom(90,2); byte LSB0 = Wire.read(); byte MSB0 = Wire.read(); uint16_t touched = ((MSB0 << 8) | LSB0); //16bits that make up the touch states for (int i=0; i < 12; i++){ // Check what electrodes were pressed if(touched & (1<<i)){ if(touchStates == 0){ //pin i was just touched Serial.print("pin "); Serial.print(i); Serial.println(" was just touched"); }else if(touchStates == 1){ //pin i is still being touched } touchStates = 1; }else{ if(touchStates == 1){ Serial.print("pin "); Serial.print(i); Serial.println(" is no longer being touched"); //pin i is no longer being touched } touchStates = 0; } } } } 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)/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); } boolean checkInterrupt1(void){ return digitalRead(P2_4); } void set_register(int address, unsigned char r, unsigned char v){ Wire.beginTransmission(address); Wire.write®; Wire.write(v); Wire.endTransmission(); } Quote Link to post Share on other sites
CPP_Technologist 2 Posted March 26, 2013 Author Share Posted March 26, 2013 Don't know why this posted with so many @ such and such. I didn't write that. Anyway, I got this working with the code above. I rewired everything and it started working, so I must have had a bad connection somewhere. cde 1 Quote Link to post Share on other sites
Qlirim 0 Posted March 2, 2019 Share Posted March 2, 2019 Hey mate, hope you are doing well. I came across your post having problems with I2C communication in other boards different from Arduino, I have the same problems, I can't make the code work for Easy8051A board, if there's any chance that you see this comment please reply or contact me at https://www.facebook.com/liri15 or qlirimmurati@gmail.com, I know that i'm asking too much but this is for an important project and i'm really hopeless right now. Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.