Jump to content

Search the Community

Showing results for tags 'I2C'.

More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • News
    • Announcements
    • Suggestions
    • New users say Hi!
  • Spotlight!
    • Sponsor Spotlight
    • Sponsor Giveaways
  • Energia
    • Energia - MSP
    • Energia - TivaC/CC3XXX
    • Energia - C2000
    • Energia Libraries
  • MSP Technical Forums
    • General
    • Compilers and IDEs
    • Development Kits
    • Programmers and Debuggers
    • Code vault
    • Projects
    • Booster Packs
    • Energia
  • Tiva-C, Hercules, CCXXXX ARM Technical Forums
    • General
    • SensorTag
    • Tiva-C, Hercules, CC3XXX Launchpad Booster Packs
    • Code Vault
    • Projects
    • Compilers and IDEs
    • Development Kits and Custom Boards
  • Beagle ARM Cortex A8 Technical Forums
    • General
    • Code Snippets and Scripts
    • Cases, Capes and Plugin Boards
    • Projects
  • General Electronics Forum
    • General Electronics
    • Other Microcontrollers
  • Connect
    • Embedded Systems/Test Equipment Deals
    • Buy, Trade and Sell
    • The 43oh Store
    • Community Projects
    • Fireside Chat
  • C2000 Technical Forums
    • General
    • Development Kits
    • Code Vault
    • Projects
    • BoosterPacks


There are no results to display.

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start



Website URL





Found 113 results

  1. Hello there, I am currently trying to write a custom firmware for an existing board I have. The I2C pin are connected to pins 3/4 of the cc3200, but in the standard case on the Launchpad is PIN 1/2 which won't work for me. So I stepped into the Wire.c and changed the begin() part: void TwoWire::begin(void) { MAP_PRCMPeripheralClkEnable(PRCM_I2CA0, PRCM_RUN_MODE_CLK); MAP_PinModeSet(PIN_01, PIN_MODE_0); MAP_PinModeSet(PIN_02, PIN_MODE_0); //MAP_PinTypeI2C(PIN_01, PIN_MODE_1); //MAP_PinTypeI2C(PIN_02, PIN_MODE_1); MAP_PinTypeI2C(PIN_03, PIN_MODE_5); MAP_PinTypeI2C(PIN_04, PIN_MODE_5); MAP_PRCMPeripheralReset(PRCM_I2CA0); MAP_I2CMasterInitExpClk(I2C_BASE, F_CPU, true); } But checking it with my logic analyzer just show that pint 3/4 are pulled high (due to the board itself to be in i2c spec). No clock is visible. Even when using an i2c scanner which should be visible. Am I making everything right or I don't? Do I have to make some more changes to get this working?
  2. I am using MSP432P401R and wanted to increase the I2C frequency from 100kHz(Standard) to 400kHz(Fast). In the Wire library for arduino, there is a function Wire.setclock(). Has anybody written such a function for energia? Because it is not there in energia. I went through the wire and twi libraries and found the following, In wire library, Wire.endTransmission calls a fucntion in twi library, twi_writeTo() which has the following line of code, UCBzCTL1 |= UCSSEL_2; // SMCLK Is this the line of code that sets the clock speed? Also in the twi.h library, the line of code, #define TWI_FREQ 100000L defines the frequency as 100kHz, but even if I changed it to 400000L, I don't see any change on hardware. Is this the right way? I'd appreciate if anyone can help me with this. Thanks
  3. I am trying (for quite long time) to write to EEPROM 64 bytes of data in 4 chunks (as EEPROM's page size is 16 bytes). Unfortunately, the MCU sends few extra bytes every time it transmits. For example, if I send 16 bytes, it transmits 22, with 6 last bytes being of unknown origin to me. For example, I send 15 text bytes within for(...) cycle xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx but see on the scope xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx BF F6 FD D7 3A C0 I tried another approach: send 15 bytes + 00. My program stops at 00, then I try to replace 00 with whatever has to be there using yet another write (1 byte only). However, I see 3 extra bytes: xx 2F 9A C9 00 I tried to write this 4 times at consequent addresses: 50 00 xx 00 50 01 xx 00 50 02 xx 00 50 03 xx 00 but every times I have the same extra bytes, like 50 01 xx 2F 9A C9 00 which result in (when reading 4 bytes) 50 00 xx xx xx xx 2F (5 bytes are read). Due to size of my project vs ROM size and also the need to learn C, I create all functions by myself, without using standard libraries. Below is I2C_write function, other ones regulating initialization, address selection or reading do not seem to be a problem. DCO is running at 16 MHz, with no division. void I2Ctext_write(unsigned int MemoryAddress, char * text, int length) { short int i = 0; UCB0I2CSA = addressSelect(MemoryAddress).three_bits_offset; while (UCB0STAT & UCBBUSY); //wait for USCI B0 bus to be inactive UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition while (!(IFG2&UCB0TXIFG)); UCB0TXBUF = addressSelect(MemoryAddress).seven_bits_address; if(length) { for (i = 0; i < length; i++) { while(*text) { while (!(IFG2&UCB0TXIFG)); if(!(*text)) { break; } UCB0TXBUF = *text; *text++; } } } else { while(*text) { while (!(IFG2&UCB0TXIFG)); if(!(*text)) { break; } UCB0TXBUF = *text; *text++; } } while (!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0; while (!(IFG2&UCB0TXIFG)); // data transmission has begun and the UCTXSTP bit may be set. UCB0CTL1 |= UCTXSTP; // Stop condition enabled; while (UCB0CTL1 & UCTXSTP); } Why do I see those extra bytes and what to do to get rid of them?
  4. Hello it looks like I bumped into an issue which might be of interest, and needs to be investigated. I have a string of I2C devices running on i2C Bus on Arduino Mega (MCP4531 potti, LM-75 Temp sensor, 2x PCF 8575 I/Expanders). All running smooth. The next step I had to exchange the Mega with Tiva Stellaris Launchpad (EK-TM4C129E ), which I did, I havent changed anything on the setup besides the Mega2560 with Launchpad. While running the i2C scanner I saw, full Bus of devives. Furthermore I changed the i2C modules (0,1,2 with setModule()) nothing changed, same issue persists. Pull-ups varied from 1KOhm - 9Kohm, still same issue. Anyone experienced something like that before?
  5. I2c not working with energia. Below is the code attached. Please help Master Reader #include <Wire.h> void setup() { Wire.setModule(0); Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output } void loop() { Wire.requestFrom(2, 6); // request 6 bytes from slave device #2 while(Wire.available()) // slave may send less than requested { char c = Wire.read(); // receive a byte as character Serial.print(c); // print the character } delay(500); } Slave Sender . #include <Wire.h> void setup() { Wire.setModule(0); Wire.begin(2); // join i2c bus with address #2 Wire.onRequest(requestEvent); // register event } void loop() { delay(100); } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() { Wire.write("hello "); // respond with message of 6 bytes // as expected by master }
  6. hello I am getting a cc3200 launchpad and mpu9250, there I want to get the sensor data. I am using the Energia IDE, could anyone have a suggestion for the library of mpu9250 used in Energia IDE? There I just found the library used in Arduino IDE. Is that universal? best wishes
  7. I have been trying to use this i2c code on energia. it works perfectly fine on arduino. i am new to tiva and need help using energia libraries with the multiple i2c ports. any help is appreciated trialEnergua.ino Adafruit_PWMServoDriver.h Adafruit_PWMServoDriver.cpp
  8. Interfacing without I2C 1. browse for "Liquid Crystal" folder in C:\Program Files (x86)\energia-1.8.7E21\hardware\energia\msp430\libraries or on the path where you downloaded the energia. 2. copy the folder and paste it to C:\Program Files (x86)\energia-1.8.7E21\libraries. note that this library is made for MSP430. You need to follow the pin convention of cc3200 launchpad. 3. open energia and change the rename the pin number as one given in the launchpad schematic. Make sure you dont use the pins that are connected to push buttons. try using the pins that are less multifunctional. use 5V as Vcc for Vdd and POT for best results. for example, replace LiquidCrystal lcd(P2_0, P2_1, P2_2, P2_3, P2_4, P2_5); with LiquidCrystal lcd(8, 9, 12, 13, 14, 15); 4. There you go!. upload the code. interfacing with I2c best advantage of the I2C is only two pins are used for operation! Connect the LCD module to the I2C module. 1.download the library from https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c . or if you have arduino, you can download the library from "Manage Library" looking for "LiquidCrystal I2C". 2. copy the library to the C:\Program Files (x86)\energia-1.8.7E21\libraries. make the necessary I2C connections 3. change the address from 0x20 to 0x27 and put 0x27,16,2., include the lcd library and upload the code. 4. comment out "WProgram.h" from the .cpp file if shows an error. 5. there you go!
  9. Hello all, I#ve got issues working with i2c (in another thread) but I wonder if anyone has gotten i2c working between 2 tivac connected boards using the master_writer and slave_receiver sketches? I can't seem to get any i2c working at all with the 1.8.7e21 version of energia. Can you make it work? Cheers Sol
  10. 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(); }
  11. Hello, I am trying to port Sparkfun's library to get the apds-9960 Gesture Sensor working on my Tiva C 1294 board. I set up the library like you normally would with ardunio while changing the interrupt pin and uploaded the code to my board with no issues. The only problem is when I go to serial monitor I get nothing printed to screen. Are there any other steps I need to take in order to convert this code to work on my Tiva board? I also tried moving to code composer studio but I cant find many clean tutorials on how to use it. I also have a MSP432 that I might try to get his working on if its supported better. Thanks! /**************************************************************** GestureTest.ino APDS-9960 RGB and Gesture Sensor Shawn Hymel @ SparkFun Electronics May 30, 2014 https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor Tests the gesture sensing abilities of the APDS-9960. Configures APDS-9960 over I2C and waits for gesture events. Calculates the direction of the swipe (up, down, left, right) and displays it on a serial console. To perform a NEAR gesture, hold your hand far above the sensor and move it close to the sensor (within 2 inches). Hold your hand there for at least 1 second and move it away. To perform a FAR gesture, hold your hand within 2 inches of the sensor for at least 1 second and then move it above (out of range) of the sensor. Hardware Connections: IMPORTANT: The APDS-9960 can only accept 3.3V! Arduino Pin APDS-9960 Board Function 3.3V VCC Power GND GND Ground A4 SDA I2C Data A5 SCL I2C Clock 2 INT Interrupt Resources: Include Wire.h and SparkFun_APDS-9960.h Development environment specifics: Written in Arduino 1.0.5 Tested with SparkFun Arduino Pro Mini 3.3V This code is beerware; if you see me (or any other SparkFun employee) at the local, and you've found our code helpful, please buy us a round! Distributed as-is; no warranty is given. ****************************************************************/ #include <Wire.h> #include <SparkFun_APDS9960.h> // Pins #define APDS9960_INT PE_4 // Needs to be an interrupt pin // LED #define LED PN_0 // Constants // Global Variables SparkFun_APDS9960 apds = SparkFun_APDS9960(); int isr_flag = 0; void setup() { pinMode(LED, OUTPUT); // Set interrupt pin as input pinMode(APDS9960_INT, INPUT); Wire.setModule(0); Wire.begin(); // Initialize Serial port Serial.begin(9600); Serial.println(); Serial.println(F("--------------------------------")); Serial.println(F("SparkFun APDS-9960 - GestureTest")); Serial.println(F("--------------------------------")); // Initialize interrupt service routine attachInterrupt(0, interruptRoutine, FALLING); // Initialize APDS-9960 (configure I2C and initial values) if ( apds.init() ) { Serial.println(F("APDS-9960 initialization complete")); } else { Serial.println(F("Something went wrong during APDS-9960 init!")); } // Start running the APDS-9960 gesture sensor engine if ( apds.enableGestureSensor(true) ) { Serial.println(F("Gesture sensor is now running")); } else { Serial.println(F("Something went wrong during gesture sensor init!")); } } void loop() { if( isr_flag == 1 ) { detachInterrupt(0); handleGesture(); isr_flag = 0; attachInterrupt(0, interruptRoutine, FALLING); } } void interruptRoutine() { isr_flag = 1; } void handleGesture() { if ( apds.isGestureAvailable() ) { switch ( apds.readGesture() ) { case DIR_UP: Serial.println("UP"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; case DIR_DOWN: Serial.println("DOWN"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; case DIR_LEFT: Serial.println("LEFT"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; case DIR_RIGHT: Serial.println("RIGHT"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; case DIR_NEAR: Serial.println("NEAR"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; case DIR_FAR: Serial.println("FAR"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second break; default: Serial.println("NONE"); } } }
  12. Hey all, I've currently got an issue where i2c just isn't working with energia, I've opened an issue on github but haven't gotten any replies. Is there a better way to get some eyes on this? Would anyone here mind taking a look? https://github.com/energia/tivac-core/issues/41 Cheers Sol
  13. This is a start to a bigger project and will be expanded on. Temperurature sensor for Mash -- MSP430, LM75B, possible other sensors, thermal couple. (working on code and proof of concept) Temperurature sensor for fermentation -- TBD Specific gravity sensor -- TBD User Interface -- TBD automation of pumps gas lines and equipment -- Requirements: Food safe, easily cleaned. probes and sensors sealed...... What I want is mash temp monitoring and logging to help me improve my brew days and procedure and maybe add a heater to keep the tempature stable during this time. Yes this has all been done before, but I want a home built one and one customized to my equipment.
  14. Hi, At a previous project I turn on and off power to ST LIS3DH Accelerometer using a MOSFET Circuitry. This is so to make sure the I2C Sensor is not consuming current when not in use. A colleague of mine designed to power a ST LSM303AGR from one of the MCU IO Pins. The MCU IO voltage is enough to power the ST LSM303AGR, so, should work. But, powering I2C Sensor from MCU IO Pins is not the usual way and new to me. Do you think that powering the ST LSM303AGR from one of the MCU IO Pin is okay or is not recommended? Regards, Markel
  15. Hello, I am trying to get RED, IR and GREEN led value in real time from MAX30101 sensor. I am using MSP430F5438A as my MCU. My IDE is CCS. The protocol required to communicate with the sensor is I2C. Now my problem is I am not any value except 0 in my read and write pointer (Indicated in the comment in my code). I am supposed to get some value in between 0 to 32. I'm attaching the link for the datasheet for the sensor: https://datasheets.maximintegrated.com/en/ds/MAX30101.pdf I know the datasheet is a whole lot. But I am referring page 17 which they have a pseudo code how to burst read the FIFO. If anyone already worked with the sensor or anyone know please have a look at it. #include <msp430.h> #include <msp430f5438a.h> #include <string.h> #define MAX30101_I2C_ADDRESS 0x57 #define MAX30101_REG_INT_STS1 0x00 #define MAX30101_REG_INT_STS2 0x01 #define MAX30101_REG_INT_EN1 0x02 #define MAX30101_REG_INT_EN2 0x03 #define MAX30101_REG_FIFO_WR 0x04 #define MAX30101_REG_FIFO_OVF 0x05 #define MAX30101_REG_FIFO_RD 0x06 #define MAX30101_REG_FIFO_DATA 0x07 #define MAX30101_REG_FIFO_CFG 0x08 #define MAX30101_REG_MODE_CFG 0x09 #define MAX30101_REG_SPO2_CFG 0x0a #define MAX30101_REG_LED1_PA 0x0c #define MAX30101_REG_LED2_PA 0x0d #define MAX30101_REG_LED3_PA 0x0e #define MAX30101_REG_PILOT_PA 0x10 #define MAX30101_REG_MULTI_LED 0x11 #define MAX30101_REG_TINT 0x1f #define MAX30101_REG_TFRAC 0x20 #define MAX30101_REG_TEMP_CFG 0x21 #define MAX30101_REG_PROX_INT 0x30 void Clock_setup(); // default void MAX30101_setup(); // Sensor config setup void I2C_setup(); void sendByte(char register_add, char data); int readByte(char wr_add, char rd_add, char register_add); void burstRead(char wr_add, char rd_add, char register_add, int no_ofsample); void FIFO_Clear(); char LED1 [96]; char LED2 [96]; char LED3 [96]; long L1[32]; long L2[32]; long L3[32]; int wr; int rd; int Ns; // number of available sample void main() { WDTCTL = WDTPW + WDTHOLD; Clock_setup(); I2C_setup(); _EINT(); MAX30101_setup(); while(1){ //FIFO_Clear(); wr= readByte(0xAE, 0xAF, 0x04); // reading WR_PTR---> I don't know why getting zero rd= readByte(0xAE, 0xAF, 0x06); // reading RD_PTR---> I don't know why getting zero Ns = wr-rd; if(Ns<0){ Ns+=32; } if(wr != rd){ burstRead(0xAE, 0xAF, 0x07, Ns); } } } void Clock_setup(){ P11DIR |= BIT2; // check smclk, 1MHz default P11SEL |= BIT2; // check smclk, 1MHz default P11DIR |= BIT0; // check aclk, 32.8KHz default P11SEL |= BIT0; // check aclk, 32.8KHz default } void I2C_setup() { P3SEL |= BIT7; // P3.1(UCB0_SDA), P3.2(UCB0_SCL) P5SEL |= BIT4; UCB1CTL1 |= UCSWRST; // reset enable UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // master + I2C mode + Sync UCB1CTL1 = UCSSEL_2 + UCSWRST; //use SMCLK + still reset UCB1BR0 = 10; // default SMCLK 1M/10 = 100KHz.........? UCB1BR1 = 0; // UCB1I2CSA = MAX30101_I2C_ADDRESS; // MAX30101 7 bit address 0x57 UCB1CTL1 &= ~UCSWRST; // reset clear // UCB1IE |= UCTXIE + UCRXIE; //TX and RX interrupt enabled } //Single Byte Transmit (TX) void sendByte(char register_add, char data){ // UCB0I2CSA = slave_add; //slave address for transmit mode UCB1CTL1 |= UCTR + UCTXSTT; // I2C transmit (write) mode + generating START condition UCB1TXBUF = register_add; //register address to measure temperature/pressure while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent while(UCB1CTL1 & UCTXSTT); //wait till START condition is cleared UCB1TXBUF = data; //send data to register while(!(UCB1IFG & UCTXIFG)); //wait until data got sent UCB1CTL1 |= UCTXSTP; //generate a STOP condition while(UCB1CTL1 & UCTXSTP); //wait until stop condition got sent } //Single Byte Receive (RX) int readByte(char wr_add, char rd_add, char register_add){ int rx_byte; //UCB0I2CSA = slave_add; //slave address UCB1CTL1 |= UCTXSTT + UCTR; // Generating START + I2C transmit (write) UCB1TXBUF = wr_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent UCB1TXBUF = register_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared UCB1CTL1 |= UCTXSTT; //generate RE-START //UCB1I2CSA = slave_add; //slave address UCB1TXBUF = rd_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent UCB1CTL1 &=~ UCTR; //receive mode while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared rx_byte = UCB1RXBUF; //read byte UCB1CTL1 |= UCTXSTP; //generate stop condition while(UCB1CTL1 & UCTXSTP); //wait till stop condition got sent return rx_byte; } //Multiple Byte Receive (RX) void burstRead(char wr_add, char rd_add, char register_add, int no_ofsample){ unsigned int i; //UCB1I2CSA = slave_add; //slave address //while(!(UCB1IFG & UCTXIFG)); //wait until slave address got sent UCB1CTL1 |= UCTXSTT + UCTR; // Generating START condition + I2C transmit (write) UCB1TXBUF = wr_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent UCB1TXBUF = register_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared UCB1CTL1 |= UCTXSTT; //generate RE-START condition //UCB1I2CSA = slave_add; //slave address UCB1TXBUF = rd_add; //write register address while(!(UCB1IFG & UCTXIFG)); //wait until reg address got sent UCB1CTL1 &=~ UCTR; //receive mode while( UCB1CTL1 & UCTXSTT); //wait till START condition is cleared //buffer[0] = UCB1RXBUF; //dummy read //while(!(UCB1IFG & UCRXIFG)); //wait till byte is completely read for(i=0;i<no_ofsample;++i){ LED1 = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED1[i+1] = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED1[i+2] = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read L1= ((LED1 << 16) | (LED1[i+1] << 08 | LED1[i+2]) & 0x03FFFF; LED2 = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED2[i+1] = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED2[i+2] = UCB1RXBUF; //burst read L2= ((LED2 << 16) | (LED2[i+1] << 08 | LED2[i+2]) & 0x03FFFF; while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED3 = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED3[i+1] = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read LED3[i+2] = UCB1RXBUF; //burst read while(!(UCB1IFG & UCRXIFG)); //wait while the Byte has being read L3= ((LED3 << 16) | (LED3[i+1] << 08 | LED3[i+2]) & 0x03FFFF; } //buffer[no_ofBytes-1] = UCB1RXBUF; //last Byte read //while(!(UCB1IFG & UCRXIFG)); //wait UCB1CTL1 |= UCTXSTP; //generate stop condition //while(UCB1CTL1 & UCTXSTP); //wait till stop condition got sent } // Sample Average = 4 // Mode = MultiLED // ADC Range = 2048 // Sample rate = 400 //pulse width = 411 // active slot 01, 02 and 03 void MAX30101_setup(){ sendByte(0x08, 0x40); sendByte(0x09, 0x07); sendByte(0x0A, 0x0F); sendByte(0x11, 0x77); sendByte(0x12, 0x07); } void FIFO_Clear(){ sendByte(0x04, 0x00); sendByte(0x05, 0x00); sendByte(0x06, 0x00); } Thanks, Rowshon.
  16. Hi everyone I am beginner and I want to use the adxl345 with msp430g2553 with I2C, but the example that I am using don´t working, always send 0 in the axes x,y and z. I use energia 1.6.10e18, the circuit have the pull'up resistor in SDA and SCL pines, and I remove the jumper of the green led. I used the same code but with arduino and it working but with enegia not, help me please. My launchpad is MSP-EXP430G2 rev 1.5 The SCL is connected in pin 14 and the SDA in pin 15. My OS is windows 7 When i put this function "Wire.setModule(0)" the mcu does make nothing, the uart don´t send nothing. The code is the follow: #include <Wire.h> void setup() { Serial.begin(9600); Serial.print("Iniciado"); Wire.begin(); writeTo(DATA_FORMAT, 0x01); //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register. writeTo(POWER_CTL, 0x08); //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register. } void loop() { uint8_t howManyBytesToRead = 6; readFrom( DATAX0, howManyBytesToRead, _buff); //read the acceleration data from the ADXL345 int X = (((int)_buff[1]) << 😎 | _buff[0]; int Y = (((int)_buff[3]) << 😎 | _buff[2]; int Z = (((int)_buff[5]) << 😎 | _buff[4]; Serial.print("x: "); Serial.print( X ); Serial.print(" y: "); Serial.print( Y ); delay(500); } void writeTo(byte address, byte val) { Wire.beginTransmission(DEVICE); // start transmission to device Wire.write(address); // send register address Wire.write(val); // send value to write Wire.endTransmission(); // end transmission } void readFrom(byte address, int num, byte _buff[]) { Wire.beginTransmission(DEVICE); // start transmission to device Wire.write(address); // sends address to read from Wire.endTransmission(); // end transmission Wire.beginTransmission(DEVICE); // start transmission to device Wire.requestFrom(DEVICE, num); // request 6 bytes from device int i = 0; while(Wire.available()) // device may send less than requested (abnormal) { digitalWrite(RED_LED,HIGH); _buff = Wire.read(); // receive a byte i++; } Wire.endTransmission(); // end transmission }
  17. Hello, I'm working on msp430fr4133 board and interface SHTC3 (SENSIRION) sensor. I'm working on energia v.18 IDE. I've library of SHTC3 sensor based library.this library perfectly working in Arduino board. But same library and its example sht-detect not working in energia IDE. When I refer SHTC3 compatible library file .h and .cpp. if I'm comparing datasheet and library files then in .cpp not mention any hex address e.g Reset,ID, measure, sleep, wake up. So,I have a 2 queries : (i) How this file working in arduino without addresses ? (ii) How to make energia compatible code by using attached library ? Please suggest me sample code for SHTC3 (SENSIRION). PFA. Thanks & Regards, Pratik arduino-sht-master.zip Sensirion_Humidity_Sensors_SHTC3_Datasheet.pdf
  18. Hello, everyone! Has anyone used the I2C display module with the TM4C123 Launchpad? I'm trying to use this code as a test, but I was not successful. The version of the library I am using is 1.2.1 I accept other suggestions for using the i2c display. Thanks in advance! The code: #include <Wire.h> #include <LiquidCrystal_I2C.h> // Start the I2C address at 0x27 position LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); void setup() { lcd.begin (16,2); } void loop() { lcd.setCursor(0,0); lcd.print("test line 1"); lcd.setCursor(1,1); lcd.print("test line 2"); } The error: In file included from C:\Users\Marcos\Documents\Energia\libraries\LiquidCrystal\FastIO.cpp:32:0: C:\Users\Marcos\Documents\Energia\libraries\LiquidCrystal\FastIO.h:38:52: fatal error: pins_arduino.h: No such file or directory #include <pins_arduino.h> // pleasing sanguino core ^ compilation terminated. exit status 1
  19. Hi, I posted a question on e2e but I found interesting to ask here too. I'm trying to port the Adafruit MCP4725 library to MSP430 using the Driverlib. I'm testing with launchpad EXP43FR2433 running at 1MHz and I would not want to use interruption to keep the code more portable. The sequence to write some value on DAC is relatively simple. - Set address -> send start -> send write cmd -> send upper byte -> send lower byte -> send stop. Using the following code one byte of the value is lost. msp43x_I2C_setSlaveAddress(EUSCI_B0_BASE, _i2caddr); msp43x_I2C_masterSendStart(EUSCI_B0_BASE); msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, controlBits); // write cmd msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, dataBits / 16); // Upper data bits (D11.D10.D9.D8.D7.D6.D5.D4) msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, (dataBits % 16) << 4); // Lower data bits (D3.D2.D1.D0.x.x.x.x) msp43x_I2C_masterMultiByteStop(EUSCI_B0_BASE); But if I insert some dummy code (__delay_cycles) the transmission starts to work. #define I2C_Delay 5 msp43x_I2C_setSlaveAddress(EUSCI_B0_BASE, _i2caddr); __delay_cycles(I2C_Delay); msp43x_I2C_masterSendStart(EUSCI_B0_BASE); __delay_cycles(I2C_Delay); msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, controlBits); // write cmd __delay_cycles(I2C_Delay); msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, dataBits / 16); // Upper data bits (D11.D10.D9.D8.D7.D6.D5.D4) __delay_cycles(I2C_Delay); msp43x_I2C_masterMultiByteNext(EUSCI_B0_BASE, (dataBits % 16) << 4); // Lower data bits (D3.D2.D1.D0.x.x.x.x) __delay_cycles(I2C_Delay); msp43x_I2C_masterMultiByteStop(EUSCI_B0_BASE); __delay_cycles(I2C_Delay); Someone knows what's happening? It looks like the library is not checking if the transmission was correctly performed. Thanks
  20. I am working on TM4C1294XL board and through Energia platform. I am trying to interface HMC5883L of GY-80 with TM4C1294XL board. I am getting static outputs irrespective of whether I initialize all the essential registers or initialize none, the static outputs do not change in both cases. I am pasting the code below, I suspect that something should be wrong with the code as there nothing much to do in connection (only four wires needed). #include "Wire.h" #define cra 0x00 #define crb 0x01 #define modeReg 0x02 #define data_X_MSB 0x03 #define data_X_LSB 0x04 #define data_Y_MSB 0x07 #define data_Y_LSB 0x08 #define data_Z_MSB 0x05 #define data_Z_LSB 0x06 #define statusReg 0x09 #define ID_reg_A 0x10 #define ID_reg_B 0x11 #define ID_reg_C 0x12 int magAddress = 0x1E; int X0,X1,Y0,Y1,Z0,Z1,X_out,Y_out,Z_out; float Xm,Ym,Zm; void setup(){ Wire.setModule(0); Wire.begin(); Serial.begin(115200); delay(100); Wire.beginTransmission(magAddress); Wire.write(modeReg); Wire.write(0x00); Wire.write(cra); Wire.write(0x38); Wire.write(crb); Wire.write(0xA0); Wire.write(data_X_MSB); Wire.write(0x00); Wire.write(data_X_LSB); Wire.write(0x00); Wire.write(data_Y_MSB); Wire.write(0x00); Wire.write(data_Y_LSB); Wire.write(0x00); Wire.write(data_Z_MSB); Wire.write(0x00); Wire.write(data_Z_LSB); Wire.write(0x00); Wire.endTransmission(); } void loop(){ Wire.beginTransmission(magAddress); Wire.write(data_X_LSB); Wire.write(data_X_MSB); Wire.endTransmission(); Wire.requestFrom(magAddress,2); if(Wire.available()<=2) { X0 = Wire.read(); X1 = Wire.read(); X1 = X1<<8; X_out = X0+X1; Xm = (X_out); } Wire.beginTransmission(magAddress); Wire.write(data_Y_LSB); Wire.write(data_Y_MSB); Wire.endTransmission(); Wire.requestFrom(magAddress,2); if(Wire.available()<=2) { Y0 = Wire.read(); Y1 = Wire.read(); Y1 = Y1<<8; Y_out = Y0+Y1; Ym = (Y_out); } Wire.beginTransmission(magAddress); Wire.write(data_Z_LSB); Wire.write(data_Z_MSB); Wire.endTransmission(); Wire.requestFrom(magAddress,2); if(Wire.available()<=2) { Z0 = Wire.read(); Z1 = Wire.read(); Z1 = Z1<<8; Z_out = Z0+Z1; Zm = (Z_out); } Serial.print("Xm = "); Serial.print(Xm); Serial.print("\t"); Serial.print("Ym = "); Serial.print(Ym); Serial.print("\t"); Serial.print("Zm = "); Serial.println(Zm); delay(200); }
  21. Still new to embedded programming and I am trying to use the MMA8452 accelerometer (datasheet) on SparkFun's breakout board (link). I programmed SparkFun's example program (link) into the MSP430G2553 via Energia with no issues and plotted the serial data in Excel. However this data, for lack of a better word, was "noisy." There would be huge spikes in the data even though the device was sitting still. Sometimes the WHO_AM_I value would be reported incorrectly as well. I found out the board shipped with 10k pull ups so I dropped them to the recommended 4.7k? resistors and the problem persisted. When I tried to investigate the SCL and SDA lines with my oscilloscope, the problem would disappear and the data would be a pristine flat line (as expected). That told me the scope probe capacitance was actually helping the circuit and rather than decrease resistance I should increase resistance. That seemed very counter intuitive to me, but I followed the data and changed pull ups to 15k. The problem disappeared and the data was clean. I was using short leads with and without a breadboard. The jumper to the Green LED was also removed from the SCL line. Being required to have 15k pull ups on the I2C bus seems wrong to me especially since the datasheet recommends 4.7k. Am I missing something? I am not well versed in I2C and Freescale's tech support has been less than helpful. I did order a MMA8451 sample and swapped it on SparkFun's breakout board and had the same problem. So I know the problem was not specific to that MMA8452. Other I2C devices (like the BQ32000) work fine.
  22. Check the usual suspects: Is the I²C bus initialised? Wire.begin(); Does the I²C device run at 3.3V? Otherwise, use a logic-level converter. Are pull-ups installed? Try 10, 4.7 or 2.2 kΩ for the SDA and SCL lines. In case the LaunchPad provides multiple I²C ports, is the correct port selected? Try Wire.setModule(0); // or other port number Wire.begin(); Still nothing? Use a logic analyser to trace the signals on the I²C port. (To be continued...)
  23. I am trying to interface GY-80 (only adxl345) to TM4C1294XL board using Energia. But outputs comes out to be 0. And also there comes this error "Failed to load dynamic library: 'ftd2xx.dll' " while uploading but the code gets uploaded successfully. I am pasting the code below, can somebody tell me where i am doing it wrong? #include "Wire.h" #define Power_Register 0x2D #define BW_rate 0x2C #define Int_enable 0x2E #define dataFormat 0x31 #define X_Axis_Register_DATAX0 0x32 #define X_Axis_Register_DATAX1 0x33 #define Y_Axis_Register_DATAY0 0x34 #define Y_Axis_Register_DATAY1 0x35 #define Z_Axis_Register_DATAZ0 0x36 #define Z_Axis_Register_DATAZ1 0x37 #define fifoCntrl 0x38 int ADXAddress = 0x53; int X0,X1,X_out; int Y0,Y1,Y_out; int Z1,Z0,Z_out; float Xa,Ya,Za; void setup() { Wire.setModule(0); Wire.begin(ADXAddress); Serial.begin(115200); delay(100); Wire.beginTransmission(ADXAddress); Wire.write(Power_Register); Wire.write(8); Wire.write(BW_rate); Wire.write(10); Wire.write(dataFormat); Wire.write(11); Wire.write(fifoCntrl); Wire.write(0); Wire.endTransmission(); } void loop() { Wire.beginTransmission(ADXAddress); Wire.write(X_Axis_Register_DATAX0); Wire.write(X_Axis_Register_DATAX1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2) { X0 = Wire.read(); X1 = Wire.read(); X1=X1<<8; X_out =X0+X1; } Wire.beginTransmission(ADXAddress); Wire.write(Y_Axis_Register_DATAY0); Wire.write(Y_Axis_Register_DATAY1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2) { Y0 = Wire.read(); Y1 = Wire.read(); Y1=Y1<<8; Y_out =Y0+Y1; } Wire.beginTransmission(ADXAddress); Wire.write(Z_Axis_Register_DATAZ0); Wire.write(Z_Axis_Register_DATAZ1); Wire.endTransmission(); Wire.requestFrom(ADXAddress,2); if(Wire.available()<=2) { Z0 = Wire.read(); Z1 = Wire.read(); Z1=Z1<<8; Z_out =Z0+Z1; } Serial.print("Xa= "); Serial.print(Xa);Serial.print("\t"); Serial.print("Ya= "); Serial.print(Ya);Serial.print("\t"); Serial.print("Za= "); Serial.println(Za); delay(1000); Serial.println(); }
  24. Hi everyone. I'm new to this forum and new to TI mcu. Planing to get a launchpad with msp430g2553 I have experience with atmegas, and arduino ide. I have a project to have some sensors around with batteries and a central receiver to publish to internet, the will comunicate vía nrf24l01 which is a SPI device and in the array of sensors some of them are I2C. As I see the description I2C and SPI share the pin in Msp430G2, so my question: is possible to use both in the same project in a reliable way? I did this project with atmega328 and arduino ide but I read the msp430g2553 has better power efficiency and want to give it a try.
  25. I'm trying to connect the HDC2010 temperature sensor to the MSP430FR5969 Launchpad. I'm using the HDC2010 EVM, which consists of a MSP430F5528 (which handles USB communications to the GUI tool) and a HDC2010 (connected over I2C). The portion with the HDC2010 can be broken off from the main board in order to use it with another MCU. I'm attempting to connect it to a MSP430FR5969 Launchpad which has the SHARP Memory LCD (uses SPI) connected to it. I couldn't find a ready made library for the HDC2010 & MSP430, so I copied over some code from the Arduino library. To check whether I was using the HDC2010 correctly, I first used the following code (mostly taken from the HDC2010 lib) and used an Arduino Uno. I used MOSFET level translators (since the Arduino is 5V, HDC2010 is 3.3). I did not break off the HDC2010 section from the main board of the EVM, so the main MSP430F5528 was still connected to the HDC2010, but I guess it was idle. #define ADDR 0x40 #include <Wire.h> //Define Register Map #define TEMP_LOW 0x00 #define TEMP_HIGH 0x01 #define HUMID_LOW 0x02 #define HUMID_HIGH 0x03 #define INTERRUPT_DRDY 0x04 #define TEMP_MAX 0x05 #define HUMID_MAX 0x06 #define INTERRUPT_CONFIG 0x07 #define TEMP_OFFSET_ADJUST 0x08 #define HUM_OFFSET_ADJUST 0x09 #define TEMP_THR_L 0x0A #define TEMP_THR_H 0x0B #define HUMID_THR_L 0x0C #define HUMID_THR_H 0x0D #define CONFIG 0x0E #define MEASUREMENT_CONFIG 0x0F #define MID_L 0xFC #define MID_H 0xFD #define DEVICE_ID_L 0xFE #define DEVICE_ID_H 0xFF float temperature = 0, humidity = 0; void openReg(uint8_t reg) { Wire.beginTransmission(ADDR); // Connect to HDC2010 Wire.write(reg); // point to specified register Wire.endTransmission(); // Relinquish bus control } uint8_t readReg(uint8_t reg) { openReg(reg); uint8_t reading; // holds byte of read data Wire.requestFrom(ADDR, 1); // Request 1 byte from open register Wire.endTransmission(); // Relinquish bus control if (1 <= Wire.available()) { reading = (Wire.read()); // Read byte } return reading; } float readTemp(void) { uint8_t byte[2]; uint16_t temp; byte[0] = readReg(TEMP_LOW); byte[1] = readReg(TEMP_HIGH); temp = (unsigned int)byte[1] << 8 | byte[0]; return (float)(temp) * 165 / 65536 - 40; } void writeReg(uint8_t reg, uint8_t data) { Wire.beginTransmission(ADDR); // Open Device Wire.write(reg); // Point to register Wire.write(data); // Write data to register Wire.endTransmission(); // Relinquish bus control } void setup() { // put your setup code here, to run once: Serial.begin(9600); Wire.begin(); } void loop() { // put your main code here, to run repeatedly: Serial.println(temperature = readTemp()); //Serial.println(humidity = readHumidity()); delay(1000); } This code worked and I got temperature readings. Next, I tried it out on the MSP430FR5969, again, without breaking off the sensor from the mainboard. It didn't work at first, so I checked with a logic analyzer and if I recall correctly, either the SCK or SDA lines wasn't sending any data. However, after sometime it started working properly, and then stopped again. After trying for a couple of hours, I decided to disconnect the HDC2010 from the mainboard, in case the MSP430F5528 was causing some issues. I connected the HDC2010 to the Arduino Uno via the logic level shifter, and the code worked correctly. However, it doesn't work with the MSP430FR5969. I tried out the inbuilt Wire examples, and the logic analyzer reveals that the I2C lines don't seem to be sending data at all (they work fine as GPIO). I'm using pins 9 & 10 on a Rev2.0 launchpad. What's odd is that it worked for a little while & I cannot figure out what I'm doing wrong. This is with a 1.2k ohm pull up on the clock line (2nd row). Without the pull up, the line remains low. The first row shows SDA, but the logic is inverted for some reason, and if I use a 10k pull up, it remains high continuously. I managed to capture this when it worked correctly with the MSP430FR5969: I've read conflicting reports about the actual I2C pins on the MSP430FR5969 launchpad: are they at 9 & 10 (as the board pdf & silkscreen says), or have they been shifted to the same pins as SPI? What's the best way to debug this? Simple I2C sketches don't seem to work for some reason, but it worked correctly for a little while.
  • Create New...