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.

MSP430FR6989: I can't output MCLK on pin PJ.1

Part Number: MSP430FR6989
Other Parts Discussed in Thread: MSP-EXP430FR6989

Hello,

I want to output the clock MCLK on pin PJ.1 but it doesn't work. I use IAR with driverlib on MSP-EXP430FR6989.

In my code, I wrote :

// Set PJ.0, PJ.1 and PJ.2 as Primary Module Function Input, SMCLK, MCLK and ACLK.
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);
GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN0);
GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN1);
GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN2);

The device runs  but I have nothing on these pins. Did I make a mistake ?

Thanks for your reply.

  • Hello Cristophe,

    I didn't encounter any issues when using the following code in CCS v6.2 DriverLib V3.4, make sure that you are measuring the correct pin (31):

    #include "driverlib.h"
    
    void main(void)
    {
        //Stop WDT
        WDT_A_hold(WDT_A_BASE);
    
        //Set DCO Frequency to 8MHz
        CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_6);
    
        //configure MCLK, SMCLK to be source by DCOCLK
        CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
        CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    
        // output MCLK
        GPIO_setOutputLowOnPin(
            GPIO_PORT_PJ,
            GPIO_PIN1
            );
    
        GPIO_setAsPeripheralModuleFunctionOutputPin(
            GPIO_PORT_PJ,
            GPIO_PIN1,
            GPIO_PRIMARY_MODULE_FUNCTION
            );
    
        /*
         * Disable the GPIO power-on default high-impedance mode to activate
         * previously configured port settings
         */
        PMM_unlockLPM5();
    
        while(1)
        {
            ;
        }
    }

    Regards, Ryan

  • without driver lib works fine on my board:

        // output ACLK to PJ.2
        PJDIR |= BIT2;
        PJSEL0 |= BIT2; 
        // output MCLK to PJ.1
        PJDIR |= BIT1;
        PJSEL0 |= BIT1; 
    

    Are you in LPMx mode?

    did you unlock GPIO high impedance?

        PM5CTL0 &= ~LOCKLPM5;           // Disable the GPIO power-on default high-impedance mode
                                        // to activate previously configured port settings
    

  • Hello,

    Thanks for your reply.

    I have tried to use the last update of driverlib (V 2_80_00_01) without more success.

    When I use PJ.0 and PJ.1 as a standard GPIO, it works.

    Here my code :

    #include <driverlib.h>
    
    
    
    void Init_Clock(void);
    void Init_I2C(void);
    void LCD_Initialiser(uint8_t contrast);
    void PCA_Initialiser(void);
    void LCD_Afficher_Ligne1(unsigned char *text);
    void LCD_Afficher_Ligne2(unsigned char *text);
    void PCA_Ecrire(uint8_t voyant);
    unsigned char *IHM_LectureCompteur  = "LECTURE COMPTEUR";
    unsigned char *IHM_CptMonoR  = "Mono Rouge: 1260";
    uint8_t contraste = 0x77;
    
    
    // TimerA0 UpMode Configuration Parameter
    Timer_A_initUpModeParam initUpParam_A0 =
    {
            TIMER_A_CLOCKSOURCE_SMCLK,              // SMCLK Clock Source
            TIMER_A_CLOCKSOURCE_DIVIDER_1,          // SMCLK/4 = 2MHz
            2500,                                  // 1,25ms debounce period
            TIMER_A_TAIE_INTERRUPT_DISABLE,         // Disable Timer interrupt
            TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // Enable CCR0 interrupt
            TIMER_A_DO_CLEAR,                       // Clear value
            true                                    // Start Timer
    };
    
    
    int main(void) {
    
        volatile uint32_t i;
    
        // Stop watchdog timer
        WDT_A_hold(__MSP430_BASEADDRESS_WDT_A__);
    
        // Set P1.0 to output direction
        
        GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3|GPIO_PIN4|GPIO_PIN5|GPIO_PIN6|GPIO_PIN7);
        GPIO_setAsOutputPin(GPIO_PORT_P3,GPIO_PIN2);
        GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0);
      
        GPIO_setOutputLowOnPin(GPIO_PORT_P3,GPIO_PIN2);
        GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN0);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
        
        // Configure button S1 (P1.1) interrupt
        GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION);
        GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);
        GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1);
        
    
        // Configure button S2 (P1.2) interrupt
        GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN2, GPIO_HIGH_TO_LOW_TRANSITION);
        GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN2);
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2);
        GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN2);
        
         // Configure INT_PCA (P1.4) interrupt
        GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN4, GPIO_HIGH_TO_LOW_TRANSITION);
        GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN4);
        GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN4);
        
         
        
        // Set PJ.4 and PJ5.2 as Primary Module Function Input, LFXT.
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN4 + GPIO_PIN5,GPIO_PRIMARY_MODULE_FUNCTION);
        
         
       
        // Set P4.0 and P4.1 as Secondary Module Function Input, I2C.
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4,GPIO_PIN0 + GPIO_PIN1,GPIO_SECONDARY_MODULE_FUNCTION);
        
        GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN0);
        GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN1);
        GPIO_setAsOutputPin(GPIO_PORT_PJ,GPIO_PIN2);
          // Set PJ.0, PJ.1 and PJ.2 as Primary Module Function Input, SMCLK, MCLK and ACLK.
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN0,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN1,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);
    
        
        // Disable the GPIO power-on default high-impedance mode
        // to activate previously configured port settings
        PMM_unlockLPM5();
        
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2);
        GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN4);
        
         // Start debounce timer
                    Timer_A_initUpMode(TIMER_A0_BASE, &initUpParam_A0);
        
        //enable interrupts
        __enable_interrupt();
       
        Init_Clock();   
        Init_I2C();
        
        LCD_Initialiser(contraste); 
        LCD_Afficher_Ligne1(IHM_LectureCompteur);    
        LCD_Afficher_Ligne2(IHM_CptMonoR );
        PCA_Initialiser();
        
        PCA_Ecrire(0x01);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x02);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x04);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x08);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x10);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x00);
        for(i=500000; i>0; i--);
        PCA_Ecrire(0x1F);
        for(i=500000; i>0; i--);
        
         __bic_SR_register(LPM3_bits);
        while(1)
        {
         ;
    
        }
    }
    
    void Init_I2C(void)
    {
       EUSCI_B_I2C_initMasterParam ParamI2C;
      
      ParamI2C.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_AUTOMATICALLY_ON_BYTECOUNT_THRESHOLD;
      ParamI2C.byteCounterThreshold = 20;
      ParamI2C.dataRate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
      ParamI2C.i2cClk = 800000;
      ParamI2C.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
     
      EUSCI_B_I2C_disable(EUSCI_B1_BASE);
      EUSCI_B_I2C_initMaster(EUSCI_B1_BASE,&ParamI2C);
      EUSCI_B_I2C_enable(EUSCI_B1_BASE);
    }
    
    void LCD_Initialiser(uint8_t contrast)
    {
    
      EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,0x3E);
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x00,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x38,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x39,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x1C,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,contrast,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x54,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x6E,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x0C,1000);
      EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,0x01,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,0x02,1000);
    
    }
    
    void PCA_Initialiser(void)
    {
      int n;
      
      EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,0x20);
      
      
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x03,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,0xE0,1000);
      for(n=100;n>0;n--); //attente
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x02,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,0x00,1000);
      
    }
    
    void PCA_Ecrire(uint8_t voyant)
    {
      EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,0x20);
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x01,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,(voyant & 0x1F),1000);
    }
    
    void LCD_Afficher_Ligne1(unsigned char *text)
    {
      int n;
      EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,0x3E);
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x00,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,0x80,1000);
      for(n=100;n>0;n--); //attente
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x40,1000);
      for(n=0;n<15;n++)
      {
        EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,*text,1000);
        ++text;
      }  
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,*text,1000);
      
    }
    
    void LCD_Afficher_Ligne2(unsigned char *text)
    {
      int n;
      EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,0x3E);
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x00,1000);
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,0xC0,1000);
      for(n=100;n>0;n--); //attente
      EUSCI_B_I2C_masterSendMultiByteStartWithTimeout(EUSCI_B1_BASE,0x40,1000);
      for(n=0;n<15;n++)
      {
        EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE,*text,1000);
        ++text;
      }  
      EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(EUSCI_B1_BASE,*text,1000);
      
    }
    
    
    /*
     * Clock System Initialization
     */
    void Init_Clock()
    {
        // Set DCO frequency to default 8MHz
        CS_setDCOFreq(CS_DCORSEL_0, CS_DCOFSEL_6);
    
        // Configure MCLK and SMCLK to default 2MHz
        CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_8);
        CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_8);
    
        // Intializes the XT1 crystal oscillator
        CS_turnOnLFXT(CS_LFXT_DRIVE_3);
     
    }
    
    #pragma vector = PORT1_VECTOR
    __interrupt void PORT1_ISR(void)
    {
        switch(__even_in_range(P1IV, P1IV_P1IFG7))
        {
            case P1IV_NONE : break;
            case P1IV_P1IFG0 : break;
            case P1IV_P1IFG1 :    // Button S1 pressed
                contraste--;
                if (contraste < 0x70)
                {
                  contraste=0x70;
                }
                LCD_Initialiser(contraste); 
                LCD_Afficher_Ligne1(IHM_LectureCompteur);            
                LCD_Afficher_Ligne2(IHM_CptMonoR);
               
                break;
            case P1IV_P1IFG2 :    // Button S2 pressed
                 contraste++;
                if (contraste > 0x7F)
                {
                  contraste=0x7F;
                }
                LCD_Initialiser(contraste); 
                LCD_Afficher_Ligne1(IHM_LectureCompteur);            
                LCD_Afficher_Ligne2(IHM_CptMonoR);
                
                break;
            case P1IV_P1IFG3 : break;
            case P1IV_P1IFG4 : 
                 
                LCD_Afficher_Ligne1(IHM_LectureCompteur);            
                LCD_Afficher_Ligne2("INT_PCA");
                break;
            case P1IV_P1IFG5 : break;
            case P1IV_P1IFG6 : break;
            case P1IV_P1IFG7 : break;
        }
    }
    
    /*
     * Timer A0 Interrupt Service Routine
     * Used as button debounce timer
     */
    #pragma vector = TIMER0_A0_VECTOR
    __interrupt void TIMER0_A0_ISR (void)
    {
        GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);   
        GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0); 
    
        
    }

    TimerA works well with correct frequency. The I2C bus works well too.

    I check signals on PIN 30,31 and 32 and I have no signal on MCLK, SMCLK and ACLK.

    Is there something to do with the JTAG port ?

  • It works now if I use :

    // output ACLK to PJ.2
    PJDIR |= BIT2;
    PJSEL0 |= BIT2;
    // output MCLK to PJ.1
    PJDIR |= BIT1;
    PJSEL0 |= BIT1;

    // output SMCLK to PJ.0
    PJDIR |= BIT0;
    PJSEL0 |= BIT0;

    Thanks to Mich !!!

    But why it does'nt work with driverlib api ?
  •       // Set PJ.0, PJ.1 and PJ.2 as Primary Module Function Input, SMCLK, MCLK and ACLK.
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN0,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN1,GPIO_PRIMARY_MODULE_FUNCTION);
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_PJ,GPIO_PIN2,GPIO_PRIMARY_MODULE_FUNCTION);

    "InputPin" sets PxDIR.y to 0, PRIMARY_MODULE_FUNCTION sets the two PxSEL bits to 0 and 1. This results in the configuration marked below:

    If you want to output the clocks, you should configure the pins as outputs.

  • Ah OK,

    I don't see that there was two API (input and output).
    It works now.

    Thanks a lot.

**Attention** This is a public forum