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.

CCS/DRV8711: DRV8711 with MSP430g2553

Part Number: DRV8711
Other Parts Discussed in Thread: MSP430G2553

Tool/software: Code Composer Studio

Hi all,

I am using DRV8711 for my stepper motor control project. First i tried with MSP430g2553 controller and DRV8711 evaluation kit, its working fine.

Based on that i developed new own board with MSP430G2553 28 pin package and DRV8711. I wrote code for that, my issue is Motor not run even single step.

SPI communication between DRV and MSP is working fine and other I/O's are also working good.

I attached my schematic and program also. I put pullup resistor for nSTALL and RESET pins and i removed all series resistor connected between MSP and DRV8711.

Help anyone to solve this.

Regards

Yuvaraj

int main(void)
{
    Initialize();

    unsigned int i=0,j=5500,x=0;

    P2OUT &= ~nSLEEP;
    P2OUT |= RESET;
    for(i=0;i<1000;i++);
    P2OUT |= nSLEEP;
    P2OUT &= ~RESET;

    P2DIR = (RESET | STEP_AIN1 | nSLEEP);
    P2DIR &= ~nFAULT;
    P3DIR = (CS | DIR_AIN2);//0xff;

    P2OUT |= (RESET | STEP_AIN1 | nSLEEP);
    P3OUT |= (CS | DIR_AIN2);

    P2OUT &= ~RESET;

    while(1)
    {
        if ((nFAULT & P2IN) == 0)
        {
            P2OUT &= ~nSLEEP;
            P2OUT |= RESET;
            for(i=0;i<1000;i++);
            for(i=0;i<1000;i++);
            P2OUT |= nSLEEP;
            for(i=0;i<1000;i++);
            ReadAllRegisters();
            P2OUT &= ~RESET;
        }

        ReadAllRegisters();

        for(i=0;i<j;i++);

        P2OUT |= STEP_AIN1;

        for(i=0;i<j;i++);

         P2OUT &= ~STEP_AIN1;

         if(j<1000)
             j=1000;

    }
}

void Initialize()
{

    WDTCTL = WDTPW | WDTHOLD;
    DCOCTL = 0x00;
    DCOCTL = CALDCO_16MHZ;
    BCSCTL1 = CALBC1_16MHZ;
    BCSCTL2 |= DIVS_3;
    BCSCTL3 |= LFXT1S_2;

    // Configure GPIO
    P2SEL  &= ~(POT | nSLEEP);
    P2SEL2 &= ~(POT | nSLEEP);

    P2DIR = RESET | STEP_AIN1 | nSLEEP;
    P2DIR &= ~nFAULT;
    P3DIR = CS | DIR_AIN2;//0xff;

    P2OUT |= RESET | STEP_AIN1 | nSLEEP;
    P3OUT |= CS | DIR_AIN2;

    UCB0CTL1 = UCSWRST;
    P3DIR |= CS;
    P3OUT &= ~CS;
    P1SEL |= SCLK | SDATO |  SDATI;
    P1SEL2 |= SCLK | SDATO |  SDATI;

    UCB0CTL0 |= UCCKPH | UCMSB | UCMST | UCSYNC;
    UCB0CTL1 |= UCSSEL_2;   // SMCLK
    UCB0CTL1 &= ~UCSWRST;
    // End SPI Configure

    __bis_SR_register(GIE);

    // GUI Composer Monitor Initialization
    ClearBufferRelatedParam();

    // CTRL Register
    G_CTRL_REG.Address     = 0x00;
    G_CTRL_REG.DTIME     = 0x03;
    G_CTRL_REG.ISGAIN     = 0x03;
    G_CTRL_REG.EXSTALL     = 0x00;
    G_CTRL_REG.MODE     = 0x01; //0x03;
    G_CTRL_REG.RSTEP     = 0x00;
    G_CTRL_REG.RDIR     = 0x00;
    G_CTRL_REG.ENBL     = 0x01;

    // TORQUE Register
    G_TORQUE_REG.Address = 0x01;
    G_TORQUE_REG.SIMPLTH = 0x00;
    G_TORQUE_REG.TORQUE  = 0x7f;

    // OFF Register
    G_OFF_REG.Address     = 0x02;
    G_OFF_REG.PWMMODE     = 0x00;
    G_OFF_REG.TOFF         = 0x30;

    // BLANK Register
    G_BLANK_REG.Address = 0x03;
    G_BLANK_REG.ABT     = 0x01;
    G_BLANK_REG.TBLANK     = 0x08;

    // DECAY Register.
    G_DECAY_REG.Address = 0x04;
    G_DECAY_REG.DECMOD  = 0x03;
    G_DECAY_REG.TDECAY     = 0x10;

    // STALL Register
    G_STALL_REG.Address = 0x05;
    G_STALL_REG.VDIV     = 0x03;
    G_STALL_REG.SDCNT     = 0x03;
    G_STALL_REG.SDTHR     = 0x40;

    // DRIVE Register
    G_DRIVE_REG.Address = 0x06;
    G_DRIVE_REG.IDRIVEP = 0x00;
    G_DRIVE_REG.IDRIVEN = 0x00;
    G_DRIVE_REG.TDRIVEP = 0x01;
    G_DRIVE_REG.TDRIVEN = 0x01;
    G_DRIVE_REG.OCPDEG     = 0x01;
    G_DRIVE_REG.OCPTH     = 0x01;

    // STATUS Register
    G_STATUS_REG.Address = 0x07;
    G_STATUS_REG.STDLAT  = 0x00;
    G_STATUS_REG.STD     = 0x00;
    G_STATUS_REG.UVLO    = 0x00;
    G_STATUS_REG.BPDF    = 0x00;
    G_STATUS_REG.APDF    = 0x00;
    G_STATUS_REG.BOCP    = 0x00;
    G_STATUS_REG.AOCP    = 0x00;
    G_STATUS_REG.OTS     = 0x00;

    WriteAllRegisters();
}

void WriteAllRegisters()
{
    unsigned char dataHi = 0x00;
    unsigned char dataLo = 0x00;

    // Write CTRL Register
    dataHi = REGWRITE | (G_CTRL_REG.Address << 4) | (G_CTRL_REG.DTIME << 2) | (G_CTRL_REG.ISGAIN);
    dataLo = (G_CTRL_REG.EXSTALL << 7) | (G_CTRL_REG.MODE << 3) | (G_CTRL_REG.RSTEP << 2) | (G_CTRL_REG.RDIR << 1) | (G_CTRL_REG.ENBL);
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write TORQUE Register
    dataHi = REGWRITE | (G_TORQUE_REG.Address << 4) | (G_TORQUE_REG.SIMPLTH);
    dataLo = G_TORQUE_REG.TORQUE;
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write OFF Register
    dataHi = REGWRITE | (G_OFF_REG.Address << 4) | (G_OFF_REG.PWMMODE);
    dataLo = G_OFF_REG.TOFF;
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write BLANK Register
    dataHi = REGWRITE | (G_BLANK_REG.Address << 4) | (G_BLANK_REG.ABT);
    dataLo = G_BLANK_REG.TBLANK;
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write DECAY Register
    dataHi = REGWRITE | (G_DECAY_REG.Address << 4) | (G_DECAY_REG.DECMOD);
    dataLo = G_DECAY_REG.TDECAY;
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write STALL Register
    dataHi = REGWRITE | (G_STALL_REG.Address << 4) | (G_STALL_REG.VDIV << 2) | (G_STALL_REG.SDCNT);
    dataLo = G_STALL_REG.SDTHR;
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write DRIVE Register
    dataHi = REGWRITE | (G_DRIVE_REG.Address << 4) | (G_DRIVE_REG.IDRIVEP << 2) | (G_DRIVE_REG.IDRIVEN);
    dataLo = (G_DRIVE_REG.TDRIVEP << 6) | (G_DRIVE_REG.TDRIVEN << 4) | (G_DRIVE_REG.OCPDEG << 2) | (G_DRIVE_REG.OCPTH);
    SPI_DRV8711_ReadWrite(dataHi, dataLo);

    // Write STATUS Register
    dataHi = REGWRITE | (G_STATUS_REG.Address << 4);
    dataLo = (G_STATUS_REG.STDLAT << 7) | (G_STATUS_REG.STD << 6) | (G_STATUS_REG.UVLO << 5) | (G_STATUS_REG.BPDF << 4) | (G_STATUS_REG.APDF << 3) | (G_STATUS_REG.BOCP << 2) | (G_STATUS_REG.AOCP << 1) | (G_STATUS_REG.OTS);
    SPI_DRV8711_ReadWrite(dataHi, dataLo);
}

  • Hi Yuvaraj,

    What steps have you taken to compare the evaluation kit to your board?
    Do you have similar settings in your DRV8711 compared to the evaluation kit?
    Have you examined the fault pin, the reset pin and registers?
    Have you examined the high side and low side gate signals once the device is enabled?
  • Hi RICK,

    I have used similar settings of evaluation kit  in my DRV board and i also verified Fault and reset pin and all registers. Fault pin as high, Reset pin is LOW and registers status are like same as evaluation board.

    Still now, there is no MOSFET gate driven signal get from DRV8711.

    Regards

    Yuvaraj

  • Part Number: DRV8711

    Tool/software: Code Composer Studio

    Hi all,

    I am using DRV8711 for my stepper motor control project. First i tried with MSP430g2553 controller and DRV8711 evaluation kit, its working fine.

    Based on that i developed new own board with MSP430G2553 28 pin package and DRV8711. I wrote code for that, my issue is Motor not run even single step.

    SPI communication between DRV and MSP is working fine and other I/O's are also working good.

    I attached my schematic and program also. I put pullup resistor for nSTALL and RESET pins and i removed all series resistor connected between MSP and DRV8711.

    Help anyone to solve this.

    Regards

    Yuvaraj

    int main(void)
    {
        Initialize();

        unsigned int i=0,j=5500,x=0;

        P2OUT &= ~nSLEEP;
        P2OUT |= RESET;
        for(i=0;i<1000;i++);
        P2OUT |= nSLEEP;
        P2OUT &= ~RESET;

        P2DIR = (RESET | STEP_AIN1 | nSLEEP);
        P2DIR &= ~nFAULT;
        P3DIR = (CS | DIR_AIN2);//0xff;

        P2OUT |= (RESET | STEP_AIN1 | nSLEEP);
        P3OUT |= (CS | DIR_AIN2);

        P2OUT &= ~RESET;

        while(1)
        {
            if ((nFAULT & P2IN) == 0)
            {
                P2OUT &= ~nSLEEP;
                P2OUT |= RESET;
                for(i=0;i<1000;i++);
                for(i=0;i<1000;i++);
                P2OUT |= nSLEEP;
                for(i=0;i<1000;i++);
                ReadAllRegisters();
                P2OUT &= ~RESET;
            }

            ReadAllRegisters();

            for(i=0;i<j;i++);

            P2OUT |= STEP_AIN1;

            for(i=0;i<j;i++);

             P2OUT &= ~STEP_AIN1;

             if(j<1000)
                 j=1000;

        }
    }

    void Initialize()
    {

        WDTCTL = WDTPW | WDTHOLD;
        DCOCTL = 0x00;
        DCOCTL = CALDCO_16MHZ;
        BCSCTL1 = CALBC1_16MHZ;
        BCSCTL2 |= DIVS_3;
        BCSCTL3 |= LFXT1S_2;

        // Configure GPIO
        P2SEL  &= ~(POT | nSLEEP);
        P2SEL2 &= ~(POT | nSLEEP);

        P2DIR = RESET | STEP_AIN1 | nSLEEP;
        P2DIR &= ~nFAULT;
        P3DIR = CS | DIR_AIN2;//0xff;

        P2OUT |= RESET | STEP_AIN1 | nSLEEP;
        P3OUT |= CS | DIR_AIN2;

        UCB0CTL1 = UCSWRST;
        P3DIR |= CS;
        P3OUT &= ~CS;
        P1SEL |= SCLK | SDATO |  SDATI;
        P1SEL2 |= SCLK | SDATO |  SDATI;

        UCB0CTL0 |= UCCKPH | UCMSB | UCMST | UCSYNC;
        UCB0CTL1 |= UCSSEL_2;   // SMCLK
        UCB0CTL1 &= ~UCSWRST;
        // End SPI Configure

        __bis_SR_register(GIE);

        // GUI Composer Monitor Initialization
        ClearBufferRelatedParam();

        // CTRL Register
        G_CTRL_REG.Address     = 0x00;
        G_CTRL_REG.DTIME     = 0x03;
        G_CTRL_REG.ISGAIN     = 0x03;
        G_CTRL_REG.EXSTALL     = 0x00;
        G_CTRL_REG.MODE     = 0x01; //0x03;
        G_CTRL_REG.RSTEP     = 0x00;
        G_CTRL_REG.RDIR     = 0x00;
        G_CTRL_REG.ENBL     = 0x01;

        // TORQUE Register
        G_TORQUE_REG.Address = 0x01;
        G_TORQUE_REG.SIMPLTH = 0x00;
        G_TORQUE_REG.TORQUE  = 0x7f;

        // OFF Register
        G_OFF_REG.Address     = 0x02;
        G_OFF_REG.PWMMODE     = 0x00;
        G_OFF_REG.TOFF         = 0x30;

        // BLANK Register
        G_BLANK_REG.Address = 0x03;
        G_BLANK_REG.ABT     = 0x01;
        G_BLANK_REG.TBLANK     = 0x08;

        // DECAY Register.
        G_DECAY_REG.Address = 0x04;
        G_DECAY_REG.DECMOD  = 0x03;
        G_DECAY_REG.TDECAY     = 0x10;

        // STALL Register
        G_STALL_REG.Address = 0x05;
        G_STALL_REG.VDIV     = 0x03;
        G_STALL_REG.SDCNT     = 0x03;
        G_STALL_REG.SDTHR     = 0x40;

        // DRIVE Register
        G_DRIVE_REG.Address = 0x06;
        G_DRIVE_REG.IDRIVEP = 0x00;
        G_DRIVE_REG.IDRIVEN = 0x00;
        G_DRIVE_REG.TDRIVEP = 0x01;
        G_DRIVE_REG.TDRIVEN = 0x01;
        G_DRIVE_REG.OCPDEG     = 0x01;
        G_DRIVE_REG.OCPTH     = 0x01;

        // STATUS Register
        G_STATUS_REG.Address = 0x07;
        G_STATUS_REG.STDLAT  = 0x00;
        G_STATUS_REG.STD     = 0x00;
        G_STATUS_REG.UVLO    = 0x00;
        G_STATUS_REG.BPDF    = 0x00;
        G_STATUS_REG.APDF    = 0x00;
        G_STATUS_REG.BOCP    = 0x00;
        G_STATUS_REG.AOCP    = 0x00;
        G_STATUS_REG.OTS     = 0x00;

        WriteAllRegisters();
    }

    void WriteAllRegisters()
    {
        unsigned char dataHi = 0x00;
        unsigned char dataLo = 0x00;

        // Write CTRL Register
        dataHi = REGWRITE | (G_CTRL_REG.Address << 4) | (G_CTRL_REG.DTIME << 2) | (G_CTRL_REG.ISGAIN);
        dataLo = (G_CTRL_REG.EXSTALL << 7) | (G_CTRL_REG.MODE << 3) | (G_CTRL_REG.RSTEP << 2) | (G_CTRL_REG.RDIR << 1) | (G_CTRL_REG.ENBL);
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write TORQUE Register
        dataHi = REGWRITE | (G_TORQUE_REG.Address << 4) | (G_TORQUE_REG.SIMPLTH);
        dataLo = G_TORQUE_REG.TORQUE;
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write OFF Register
        dataHi = REGWRITE | (G_OFF_REG.Address << 4) | (G_OFF_REG.PWMMODE);
        dataLo = G_OFF_REG.TOFF;
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write BLANK Register
        dataHi = REGWRITE | (G_BLANK_REG.Address << 4) | (G_BLANK_REG.ABT);
        dataLo = G_BLANK_REG.TBLANK;
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write DECAY Register
        dataHi = REGWRITE | (G_DECAY_REG.Address << 4) | (G_DECAY_REG.DECMOD);
        dataLo = G_DECAY_REG.TDECAY;
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write STALL Register
        dataHi = REGWRITE | (G_STALL_REG.Address << 4) | (G_STALL_REG.VDIV << 2) | (G_STALL_REG.SDCNT);
        dataLo = G_STALL_REG.SDTHR;
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write DRIVE Register
        dataHi = REGWRITE | (G_DRIVE_REG.Address << 4) | (G_DRIVE_REG.IDRIVEP << 2) | (G_DRIVE_REG.IDRIVEN);
        dataLo = (G_DRIVE_REG.TDRIVEP << 6) | (G_DRIVE_REG.TDRIVEN << 4) | (G_DRIVE_REG.OCPDEG << 2) | (G_DRIVE_REG.OCPTH);
        SPI_DRV8711_ReadWrite(dataHi, dataLo);

        // Write STATUS Register
        dataHi = REGWRITE | (G_STATUS_REG.Address << 4);
        dataLo = (G_STATUS_REG.STDLAT << 7) | (G_STATUS_REG.STD << 6) | (G_STATUS_REG.UVLO << 5) | (G_STATUS_REG.BPDF << 4) | (G_STATUS_REG.APDF << 3) | (G_STATUS_REG.BOCP << 2) | (G_STATUS_REG.AOCP << 1) | (G_STATUS_REG.OTS);
        SPI_DRV8711_ReadWrite(dataHi, dataLo);
    }

     

    I have used similar settings of evaluation kit  in my DRV board and i also verified Fault and reset pin and all registers. Fault pin as high, Reset pin is LOW and registers status are like same as evaluation board.

    Still now, there is no MOSFET gate driven signal get from DRV8711.

    Regards,

    Yuvaraj

  • Hi Yuvaraj,

    Apologies for the delayed response. Please do not start a new thread for the same issue. This only makes it harder to track.

    Let's focus getting any FET operational.

    Please disconnect the motor and power up your board.
    Next take the DRV8711 out of sleep and confirm the regulators are operational (VINT, V5, and VCP). What are the voltages?
    If the regulators are operational and the nFAULT signal is high, enable the DRV8711 through the SPI register.
    Check the gates of the FETs. Are any FETs on?
    If not, did the nFAULT signal go low?
  • Hi Rick,

    I will check and come back.

    Yuvaraj