This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430FR4133: MSP430FR4133

Part Number: MSP430FR4133

Hi,

We are using MSP430FR4133 connected to an Accelerometer vis I2C bus.

We are using IAR 8

We would like to use P5 PIN2 and 3  or P8 PIN2 and 3 - please advice which is preferred.

We are trying to use EUSCI library - with no success:

This part pass:

EUSCI_B_I2C_initMasterParam param = {0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_ACLK;
param.i2cClk = CS_getACLK();
param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
param.byteCounterThreshold = 1;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_initMaster(EUSCI_B0_BASE, &param);

Not clear how to config the physical PINs  (is that correct?)

EUSCI_B_I2C_remapPins(EUSCI_B0_BASE,2+3 );

GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5 ,GPIO_PIN2 + GPIO_PIN3,GPIO_SECOND

This part also pass:

// EUSCI B I2C enableInterrupt(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_STOP_INTERRUPT);
// Specify slave address
EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE, 0x0D);//SLAVE_ADDRESS);

//Set Master in TX mode
EUSCI_B_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_MODE);

//Enable I2C Module to start operations
EUSCI_B_I2C_enable(EUSCI_B0_BASE);
 

And then I stock on this line:

EUSCI_B_I2C_masterSendSingleByte(EUSCI_B0_BASE,0x00);

Please advise.

In case you have a [pre[ared example I for MSP430FR4133 I would appreciate that.

BR,

Shimon

 

  • Hi Shimon,

    Connected to an Accelerometer youi may use the master mode of I2C in msp430fr4133. We have two kinds of I2C demo code - Register level code and Driver lib code. All the demo code is attached.

    /* --COPYRIGHT--,BSD
     * Copyright (c) 2017, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     * --/COPYRIGHT--*/
    //******************************************************************************
    //!  MSP430FR4133 Demo - USCI_B0 I2C Master RX multiple bytes from MSP430 Slave
    //!
    //!  Description: This demo connects two MSP430's via the I2C bus. The master
    //!  reads 5 bytes from the slave. This is the MASTER CODE. The data from the slave
    //!  transmitter begins at 0 and increments with each transfer.
    //!  The USCI_B0 RX interrupt is used to know when new data has been received.
    //!  ACLK = n/a, MCLK = SMCLK = BRCLK =  DCO = ~1MHz
    //!
    //!                                /|\  /|\
    //!               MSP430FR4133      10k  10k     MSP430FR4133
    //!                   slave         |    |        master
    //!             -----------------   |    |   -----------------
    //!           -|XIN  P5.2/UCB0SDA|<-|----+->|P5.2/UCB0SDA  XIN|-
    //!            |                 |  |       |                 | 32kHz
    //!           -|XOUT             |  |       |             XOUT|-
    //!            |     P5.3/UCB0SCL|<-+------>|P5.3/UCB0SCL     |
    //!            |                 |          |             P1.0|--> LED
    //!
    //! This example uses the following peripherals and I/O signals.  You must
    //! review these and change as needed for your own board:
    //! - I2C peripheral
    //! - GPIO Port peripheral (for I2C pins)
    //! - SCL2
    //! - SDA
    //! - CS
    //!
    //! This example uses the following interrupt handlers.  To use this example
    //! in your own application you must add these interrupt handlers to your
    //! vector table.
    //! - USCI_B0_VECTOR
    //******************************************************************************
    #include "driverlib.h"
    
    //*****************************************************************************
    //
    //Set the address for slave module. This is a 7-bit address sent in the
    //following format:
    //[A6:A5:A4:A3:A2:A1:A0:RS]
    //
    //A zero in the "RS" position of the first byte means that the master
    //transmits (sends) data to the selected slave, and a one in this position
    //means that the master receives data from the slave.
    //
    //*****************************************************************************
    #define SLAVE_ADDRESS 0x48
    
    //*****************************************************************************
    //
    //Specify Expected Receive data count.
    //
    //*****************************************************************************
    #define RXCOUNT 0x05
    
    //*****************************************************************************
    //
    //Target frequency for SMCLK in kHz
    //
    //*****************************************************************************
    #define CS_SMCLK_DESIRED_FREQUENCY_IN_KHZ   1000
    
    //*****************************************************************************
    //
    //SMCLK/FLLRef Ratio
    //
    //*****************************************************************************
    #define CS_SMCLK_FLLREF_RATIO   30
    
    uint8_t RXData;
    void main (void)
    {
        WDT_A_hold(WDT_A_BASE);
    
        //Set DCO FLL reference = REFO
        CS_initClockSignal(
        		CS_FLLREF,
        		CS_REFOCLK_SELECT,
        		CS_CLOCK_DIVIDER_1
            );
    
        //Set Ratio and Desired MCLK Frequency  and initialize DCO
        CS_initFLLSettle(
            CS_SMCLK_DESIRED_FREQUENCY_IN_KHZ,
            CS_SMCLK_FLLREF_RATIO
            );
    
        //Set SMCLK = DCO with frequency divider of 1
        CS_initClockSignal(
        		CS_SMCLK,
        		CS_DCOCLKDIV_SELECT,
        		CS_CLOCK_DIVIDER_1
        		);
    
        //Set MCLK = DCO with frequency divider of 1
        CS_initClockSignal(
        		CS_MCLK,
        		CS_DCOCLKDIV_SELECT,
        		CS_CLOCK_DIVIDER_1
        		);
    
        // Configure Pins for I2C
        /*
        * Select Port 5
        * Set Pin 2, 3 to input with function, (UCB0SIMO/UCB0SDA, UCB0SOMI/UCB0SCL).
        */
        GPIO_setAsPeripheralModuleFunctionInputPin(
            GPIO_PORT_P5,
            GPIO_PIN2 + GPIO_PIN3,
            GPIO_PRIMARY_MODULE_FUNCTION
        );
    
        //Set P1.0 as an output pin.
        /*
    
         * Select Port 1
         * Set Pin 0 as output
         */
        GPIO_setAsOutputPin(
            GPIO_PORT_P1,
            GPIO_PIN0
        );
    
        /*
         * Disable the GPIO power-on default high-impedance mode to activate
         * previously configured port settings
         */
        PMM_unlockLPM5();
    
        EUSCI_B_I2C_initMasterParam param = {0};
        param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
        param.i2cClk = CS_getSMCLK();
        param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
        param.byteCounterThreshold = RXCOUNT;
        param.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_AUTOMATICALLY_ON_BYTECOUNT_THRESHOLD;
        EUSCI_B_I2C_initMaster(EUSCI_B0_BASE, &param);
    
        //Specify slave address
        EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE,
            SLAVE_ADDRESS
            );
    
        //Set Master in receive mode
        EUSCI_B_I2C_setMode(EUSCI_B0_BASE,
            EUSCI_B_I2C_RECEIVE_MODE
            );
    
        //Enable I2C Module to start operations
        EUSCI_B_I2C_enable(EUSCI_B0_BASE);
    
        EUSCI_B_I2C_clearInterrupt(EUSCI_B0_BASE,
            EUSCI_B_I2C_RECEIVE_INTERRUPT0 +
            EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT +
            EUSCI_B_I2C_NAK_INTERRUPT
            );
    
        //Enable master Receive interrupt
        EUSCI_B_I2C_enableInterrupt(EUSCI_B0_BASE,
            EUSCI_B_I2C_RECEIVE_INTERRUPT0 +
            EUSCI_B_I2C_BYTE_COUNTER_INTERRUPT +
            EUSCI_B_I2C_NAK_INTERRUPT
            );
    
        while (1)
        {
          __delay_cycles(2000);
    
          while (EUSCI_B_I2C_SENDING_STOP ==
                  EUSCI_B_I2C_masterIsStopSent(EUSCI_B0_BASE));
    
          EUSCI_B_I2C_masterReceiveStart(EUSCI_B0_BASE);
    
          __bis_SR_register(CPUOFF+GIE);        // Enter LPM0 w/ interrupt
        }
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=USCI_B0_VECTOR
    __interrupt
    #elif defined(__GNUC__)
    __attribute__((interrupt(USCI_B0_VECTOR)))
    #endif
    void USCIB0_ISR(void)
    {
        static uint8_t count = 0;
    
    	switch(__even_in_range(UCB0IV,0x1E))
    	{
    	  case 0x00: break; // Vector 0: No interrupts break;
    	  case 0x02: break; // Vector 2: ALIFG break;
    	  case 0x04:
                EUSCI_B_I2C_masterReceiveStart(EUSCI_B0_BASE);
                break; // Vector 4: NACKIFG break;
    	  case 0x06: break; // Vector 6: STT IFG break;
    	  case 0x08: break; // Vector 8: STPIFG break;
    	  case 0x0a: break; // Vector 10: RXIFG3 break;
    	  case 0x0c: break; // Vector 14: TXIFG3 break;
    	  case 0x0e: break; // Vector 16: RXIFG2 break;
    	  case 0x10: break; // Vector 18: TXIFG2 break;
    	  case 0x12: break; // Vector 20: RXIFG1 break;
    	  case 0x14: break; // Vector 22: TXIFG1 break;
    	  case 0x16:
                RXData = EUSCI_B_I2C_masterReceiveSingle(
                                        EUSCI_B0_BASE
                                        );   // Get RX data
    		  if (++count >= RXCOUNT) {
    			  count = 0;
    			  __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
    		  }
                break; // Vector 24: RXIFG0 break;
    	  case 0x18: break; // Vector 26: TXIFG0 break;
          case 0x1a:
                GPIO_toggleOutputOnPin(
                    GPIO_PORT_P1,
                    GPIO_PIN0
                    );
    		  break; // Vector 28: BCNTIFG break;
    	  case 0x1c: break; // Vector 30: clock low timeout break;
    	  case 0x1e: break; // Vector 32: 9th bit break;
    	  default: break;
    	}
    }
    
    
    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2014, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     *******************************************************************************
     *
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430FR413x Demo  - eUSCI_B0 I2C Master RX multiple bytes from MSP430 Slave
    //
    //  Description: This demo connects two MSP430's via the I2C bus. The master
    //  reads 5 bytes from the slave. This is the MASTER CODE. The data from the slave
    //  transmitter begins at 0 and increments with each transfer.
    //  The USCI_B0 RX interrupt is used to know when new data has been received.
    //  ACLK = default REFO ~32768Hz, MCLK = SMCLK = BRCLK = DCODIV ~1MHz.
    //
    //    *****used with "MSP430G6021x_euscib0_i2c_11.c"****
    //
    //                                /|\  /|\
    //               MSP430FR4133      10k  10k     MSP430FR4133
    //                   slave         |    |        master
    //             -----------------   |    |   -----------------
    //            |     P5.2/UCB0SDA|<-|----|->|P5.2/UCB0SDA     |
    //            |                 |  |       |                 |
    //            |                 |  |       |                 |
    //            |     P5.3/UCB0SCL|<-|------>|P5.3/UCB0SCL     |
    //            |                 |          |             P1.0|--> LED
    //
    //   Cen Fang
    //   Texas Instruments Inc.
    //   June 2013
    //   Built with IAR Embedded Workbench v5.60 & Code Composer Studio v5.5
    //******************************************************************************
    #include <msp430.h>
    
    volatile unsigned char RXData;
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;
    
        // Configure GPIO
        P1OUT &= ~BIT0;                         // Clear P1.0 output latch
        P1DIR |= BIT0;                          // For LED
        P5SEL0 |= BIT2 | BIT3;                   // I2C pins
    
        // Disable the GPIO power-on default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
    
        // Configure USCI_B0 for I2C mode
        UCB0CTLW0 |= UCSWRST;                   // Software reset enabled
        UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; // I2C mode, Master mode, sync
        UCB0CTLW1 |= UCASTP_2;                  // Automatic stop generated
                                                // after UCB0TBCNT is reached
        UCB0BRW = 0x0008;                       // baudrate = SMCLK / 8
        UCB0TBCNT = 0x0005;                     // number of bytes to be received
        UCB0I2CSA = 0x0048;                     // Slave address
        UCB0CTL1 &= ~UCSWRST;
        UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;
    
        while (1)
        {
            __delay_cycles(2000);
            while (UCB0CTL1 & UCTXSTP);         // Ensure stop condition got sent
            UCB0CTL1 |= UCTXSTT;                // I2C start condition
    
            __bis_SR_register(LPM0_bits|GIE);   // Enter LPM0 w/ interrupt
        }
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = USCI_B0_VECTOR
    __interrupt void USCIB0_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCIB0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
      {
        case USCI_NONE:          break;         // Vector 0: No interrupts
        case USCI_I2C_UCALIFG:   break;         // Vector 2: ALIFG
        case USCI_I2C_UCNACKIFG:                // Vector 4: NACKIFG
          UCB0CTL1 |= UCTXSTT;                  // I2C start condition
          break;
        case USCI_I2C_UCSTTIFG:  break;         // Vector 6: STTIFG
        case USCI_I2C_UCSTPIFG:  break;         // Vector 8: STPIFG
        case USCI_I2C_UCRXIFG3:  break;         // Vector 10: RXIFG3
        case USCI_I2C_UCTXIFG3:  break;         // Vector 14: TXIFG3
        case USCI_I2C_UCRXIFG2:  break;         // Vector 16: RXIFG2
        case USCI_I2C_UCTXIFG2:  break;         // Vector 18: TXIFG2
        case USCI_I2C_UCRXIFG1:  break;         // Vector 20: RXIFG1
        case USCI_I2C_UCTXIFG1:  break;         // Vector 22: TXIFG1
        case USCI_I2C_UCRXIFG0:                 // Vector 24: RXIFG0
          RXData = UCB0RXBUF;                   // Get RX data
          __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
          break;
        case USCI_I2C_UCTXIFG0:  break;         // Vector 26: TXIFG0
        case USCI_I2C_UCBCNTIFG:                // Vector 28: BCNTIFG
          P1OUT ^= BIT0;                        // Toggle LED on P1.0
          break;
        case USCI_I2C_UCCLTOIFG: break;         // Vector 30: clock low timeout
        case USCI_I2C_UCBIT9IFG: break;         // Vector 32: 9th bit
        default: break;
      }
    }
    

    I suggest you use the register level code.(The size of the code will be smaller)

    Best regards

    Gary

**Attention** This is a public forum