DRV8334: Outputs stuck low when driving external MOSFETs (no SPI, F28P550SJ9PZ)

Part Number: DRV8334
Other Parts Discussed in Thread: CSD88599Q5DC

Tool/software:

Hello,

I am having an issue using the DRV8334 to drive an external H-bridge for a brushed DC motor.

The DRV8334 is connected and routed to a TMS320F28P550SJ9PZ microcontroller.
At the moment, I am not using the SPI interface – the device is running in its default (hardware) configuration.

Current setup:

  • PVDD: +12 V

  • NSLEEP: pulled high

  • DRVOFF: low (0)

  • PWM input: INHA (20 kHz, 50% duty cycle)

  • INLA: 0

  • INHB: 0

  • INLB: 1

  • External MOSFETs: CSD88599Q5DC

  • Bootstrap capacitors: 1 µF in series with 2.7 Ω resistors

  • VMOT (MOSFET supply): +20 V

  • Motor connection: Brushed DC motor connected between half-bridges A and B, half-bridge C left unconnected

  • nFAULT pin: high (not asserted)

Observed behavior:

  • GHA, GHB, GHC outputs: waveform pulled low at ~6 kHz, ~5.2 V amplitude

  • GLA, GLB, GLC outputs: logic low (0 V)

  • The output waveforms do not match the input PWM signals.

Goal:
I would like the DRV8334 to correctly drive the external MOSFETs so that the output signals reproduce the input PWM for proper motor control in this non-SPI configuration.

Questions:

  1. Why are the outputs stuck low despite the configuration above?

  2. Are there any specific conditions or pin configurations required for the DRV8334 to forward the PWM to the external MOSFETs without SPI setup?

Thank you in advance for your help.


  • Joris,

    You will need SPI to write to register 0x1B so that you can take ENABLE_DRV bit high which enables the gate driver outputs.

    Without this register write you can only exit sleep using the nSLEEP pin which puts you in the standby mode where the gate drive outputs are disabled.

    Regards,

    -Adam

  • Adam,

    Thanks for your reply.

    I tried your solution, but unfortunately it did not work.

    Currently, I am using the following initialization sequence for the DRV8334. However, as soon as I set ENABLE_DRV high, the nFAULT pin asserts. When I check the error status registers, the reported fault is VCP_OV.

    Here are my measurements:

    • VCP = 26 V

    • VDRAIN = 12.34 V (supplied through a 12 V regulator)

    • Bootstrap capacitor = 1 µF

    Also, the DRV_STAT pins remain consistently low.

    I have tested different variations of the initialization sequence, but this version is the most functional one so far.

    Is there a known/validated initialization sequence for the DRV8334 to avoid this VCP_OV fault ? 

    Code : 

    // =======================
    // Main
    // =======================
    int main(void)
    {
        SysCtl_disableWatchdog();
        SysCtl_disableMCD();
     
        Device_init();
        Device_initGPIO();
        Board_init();    

        SPI_setcharLength(mySPI0_BASE, 16);

        // Desable CRC 0x3800096E
        uint32_t spi_desable_crc = 0x3800096E;
        SPI_transmit32Bits(mySPI0_BASE, spi_desable_crc, 0);

        SPI_setcharLength(mySPI0_BASE, 8);

        // IC_CTRL2 read start
        uint32_t spi_IC_CTRL2_read = 0b001101110000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_read, 0);

        // IC_CTRL2 clear flag
        uint32_t spi_IC_CTRL2_cnFAULT = 0b001101100000000000000111;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_cnFAULT, 0);

        // IC_CTRL2 disable GVDD
        uint32_t spi_IC_CTRL2_GVDD = 0b001101100000001000000110;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_GVDD, 0);

        // MON_CTRL6 set value (0x30)
        uint32_t spi_MON_CTRL6 = 0b011000000000000010111011;
        SPI_transmit24Bits(mySPI0_BASE, spi_MON_CTRL6, 0);

        // Délais d'acquisition du nFAULT
        DEVICE_DELAY_US(1000000);

        // IC_CTRL2 set value (0x1B, 0 pour écrire)
        uint32_t spi_IC_CTRL2_DRV = 0b001101101000001000000110;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_DRV, 0);

        // IC_STAT1 read
        uint32_t spi_IC_STAT1 = 0b000000010000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT1, 0);
       
        // IC_STAT2 read
        uint32_t spi_IC_STAT2 = 0b000000110000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT2, 0);

        // IC_STAT3 read
        uint32_t spi_IC_STAT3 = 0b000001010000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT3, 0);

        // IC_STAT4 read  
        uint32_t spi_IC_STAT4 = 0b000001110000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT4, 0);

        // IC_STAT5 read  
        uint32_t spi_IC_STAT5 = 0b000010010000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT5, 0);

        // IC_STAT6 read  
        uint32_t spi_IC_STAT6 = 0b000010110000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT6, 0);

        Interrupt_initModule();
        Interrupt_initVectorTable();

        initPeripherals();
        initTimer0_60kHz();
        FSM_init();

        UART_init(115200);

        EINT;
        ERTM;

        for(;;)
        {
            (*Alpha_State_Ptr)();
        }
    }
  • Hi Joris,

    VCP-VDRAIN with the measurements you've provided is pretty close to the threshold value

    So once you power on the device and get this fault are you able to clear it and have it stay cleared? Are you able to increase VDRAIN? What is PVDD?

    Regards,

    Yara

  • Hi Yara,

    I have VMOTOR = 19 V and PVDD = 12 V.
    Currently, PVDD is connected to the same source as VDRAIN.

    For testing, I could either increase the VMOTOR voltage or connect an external power supply.

    After powering on the device, I clear CLR_FLT. However, I do not clear the VCP_OV status since it is read-only.

    Regards,
    Joris

  • Hi Joris,

    writing 1 to CLR_FLT should clear your faults if the fault conditions are removed, if VCP_OV does clear after writing 1 to CLR_FLT that means VCP is exceed the threshold so possibly VDRAIN might not be stable?

    Regards,

    Yara

  • Hello Yara,

    We are currently using the same supply voltage for PVDD and VDRAIN (VMOTOR) through a regulated power supply set at 20 V.
    The voltage on VCP remains stable at (VCP – VDRAIN) = 13.85 V, which, according to the datasheet, corresponds to an overvoltage condition.

    We suspect that our initialization sequence for the DRV8334 may not be correct in order to properly enable the driver (ENABLE_DRV = 1b).

    Our current sequence is as follows:

    • Disable CRC (to simplify debugging)
    • Set CLR_FLT = 1b

    • Set DIS_GVDD_SS = 0b (prototype)

    • Set ALL_CH = 0b

    • Set ENABLE_DRV = 1b

    However, whenever we write ENABLE_DRV = 1b, the nFAULT LED turns on.

    Could you confirm the correct initialization sequence required to bring the device into functional mode with ENABLE_DRV = 1b?

    We are working with the DRV8334 datasheet, December 2023 – Revised May 2025.

    // =======================
    // Main
    // =======================
    int main(void)
    {
        SysCtl_disableWatchdog();
        SysCtl_disableMCD();
     
        Device_init();
        Device_initGPIO();
        Board_init();    

        SPI_setcharLength(mySPI0_BASE, 16);

        // Desable CRC 0x3800096E
        uint32_t spi_desable_crc = 0x3800096E;
        SPI_transmit32Bits(mySPI0_BASE, spi_desable_crc, 0);

        SPI_setcharLength(mySPI0_BASE, 8);

        // IC_CTRL2 read start
        uint32_t spi_IC_CTRL2_read = 0b001101110000000000000000;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_read, 0);

        // IC_CTRL2 clear flag
        uint32_t spi_IC_CTRL2_cnFAULT = 0b001101100000000000000111;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_cnFAULT, 0);

        // IC_CTRL2 disable GVDD
        //uint32_t spi_IC_CTRL2_GVDD = 0b001101100000001000000110;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_GVDD, 0);

        // MON_CTRL6 set value (0x30)
        uint32_t spi_MON_CTRL6 = 0b011000000000000010111011;
        SPI_transmit24Bits(mySPI0_BASE, spi_MON_CTRL6, 0);

        // IC_CTRL2 clear flag
        uint32_t spi_IC_CTRL2_cnFAULT_2 = 0b001101100000000000000111;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_cnFAULT_2, 0);

        // Délais d'acquisition du nFAULT
        DEVICE_DELAY_US(1000000);

        // IC_CTRL2 set value (0x1B, 0 pour écrire)
        uint32_t spi_IC_CTRL2_DRV = 0b001101101000000000000110;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_DRV, 0);

        DEVICE_DELAY_US(100);

        // SPI_TEST set value (0x36, 0 pour écrire)
        uint32_t spi_SPI_TEST = 0b011011001111111111111111;
        SPI_transmit24Bits(mySPI0_BASE, spi_SPI_TEST, 0);

        DEVICE_DELAY_US(100);

        // SPI_TEST set value (0x36, 1 pour lire)
        uint32_t spi_SPI_TEST_READ = 0b011011011111111111111111;
        SPI_transmit24Bits(mySPI0_BASE, spi_SPI_TEST_READ, 0);

        DEVICE_DELAY_US(100);

        // IC_STAT1 read
        //uint32_t spi_IC_STAT1 = 0b000000010000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT1, 0);
       
        // IC_STAT2 read
        //uint32_t spi_IC_STAT2 = 0b000000110000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT2, 0);

        // IC_STAT3 read
        //uint32_t spi_IC_STAT3 = 0b000001010000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT3, 0);

        // IC_STAT4 read  
        //uint32_t spi_IC_STAT4 = 0b000001110000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT4, 0);

        // IC_STAT5 read  
        //uint32_t spi_IC_STAT5 = 0b000010010000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT5, 0);

        // IC_STAT6 read  
        //uint32_t spi_IC_STAT6 = 0b000010110000000000000000;
        //SPI_transmit24Bits(mySPI0_BASE, spi_IC_STAT6, 0);

        Interrupt_initModule();
        Interrupt_initVectorTable();

        initPeripherals();
        initTimer0_60kHz();
        FSM_init();

        UART_init(115200);

        EINT;
        ERTM;

        for(;;)
        {
            (*Alpha_State_Ptr)();
        }
    }

    Best regards,
    Joris




  • Hi,

    We have resolved the issue with the DRV8334 initialization.
    Here is the sequence we used:

    • Disable CRC8

    • Set bit ALL_CH to 0b (MON_CTRL6)

    • Clear the nFAULT flag bit (1b) (IC_CTRL2)

    • Device delay: 100 µs

    • Set ENABLE_DRV to 1b (IC_CTRL2)

    Another blocking point was the PWM initialization state. Initially, we had the PWM set to HIGH, but they must be set to LOW at startup.

    Code : 

    SPI_setcharLength(mySPI0_BASE, 16);

        // Desable CRC 0x3800096E
        uint32_t spi_desable_crc = 0x3800096E;
        SPI_transmit32Bits(mySPI0_BASE, spi_desable_crc, 0);

        SPI_setcharLength(mySPI0_BASE, 8);

        // MON_CTRL6 set value (0x30), ALL_CH
        uint32_t spi_MON_CTRL6 = 0b011000000000000010111011;
        SPI_transmit24Bits(mySPI0_BASE, spi_MON_CTRL6, 0);

        // IC_CTRL2 clear flag, nFAULT
        uint32_t spi_IC_CTRL2_cnFAULT_2 = 0b001101100000000000000111;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_cnFAULT_2, 0);

        // Delay nFAULT
        DEVICE_DELAY_US(100);

        // IC_CTRL2 set value (0x1B, 0 for write)
        uint32_t spi_IC_CTRL2_DRV = 0b001101101000000000000110;
        SPI_transmit24Bits(mySPI0_BASE, spi_IC_CTRL2_DRV, 0);