DRV8316 Buck Output

So i designed a board with drv8316 and encountered a problem with the buck of the DRV8316 by default when the nsleep pin is pulled high it should output 3.3v right?. From what i read in the datasheet it says like that but i get 2.5v only. I have attached the schematic below



Also if you could point out the mistakes, inefficiencies or how i could improve my design would be really helpful.
Thank you,
Kavin

Does it work when the USB is plugged in? Otherwise it looks like you’re trying to pull nSLEEP high using the output of the 3V regulator, which is powered by the buck, which doesn’t turn on until nSLEEP is pulled high by some other source. It baffles me how the hardware designers could have overlooked such an obvious paradox. Surely it wouldn’t have been impossible to invert the polarity on that pin so you pull it low to activate the buck.

What is the purpose of the eight 10nF capacitors between +BATT and GND? Are they supposed to be 10uF for a bit of bulk capacitance?

Hmm, hopefully someone who’s actually used it before can advise then.

I have used it before, and the buck worked for me.

As Deku pointed out the bulk capacitance has to be higher, but you’ve already mentioned it’s just a typo.
The “chicken and egg” problem we already discussed on discord, and you’ve tried different methods of pulling nsleep high.

The diode D2 is marked Zener type in schematics but I think it should be a schottky or just a normal diode.

The circuit around Q1, I’m not sure I agree with it 100% but it should work as long as VDD is just a small amount higher than VBUS…

At which places in the circuit are you measuring the 2.5V?

Thanks for the looking into it. I have found the issue thanks to you but i don’t know what happened the buck was indeed generating 3.3V but the output of the SM3407 was only 2.5V. I tried removing the diode connecting it to the VBUS and it worked. I don’t understand why that happened.

Is there a better way to isolate the USB and the BUCK of the DRV???

In DRV8316 i read the fault register and the fault bit is 1 but all the other registers shows no fault how is that possible? like this
00000001
00000000
00000000
The first register last bit shows that there is a fault but the other bit shows that there in no fault???

I’m glad you found it. I don’t know exactly what’s going on, but definitely you don’t want a Zener diode there.

Two normal diodes would be sufficient to isolate the power sources from each other, but depending on what exactly the goals were a power mux, load switch or efuse IC might work better for you.
Getting it right with just one FET will be tricky, I think.

Do you happen to know what maybe the issue here? @runger

Have you tried clearing the fault, and then checking again? I think maybe the fault register is latched until you clear it…

yeah i tried clearing the fault with the CLR_FLT bit in Control_Register_2 Register but the nFAULT pin is still LOW and the FAULT bit is still 1. I could read all the registers and write but couldn’t figure out the issue with the fault

The fault pin needs a pullup. I don’t see one on the schematic, but the MCU internal pullup may work. Do you have it enabled? pinMode(PB10, INPUT_PULLUP); (at least I think it’s PB10, the MCU schematic image is very low resolution)

yeah you are correct it is PB10 and yes i have enabled the internal pullup for that. When i read all three status the only bit that is 1 is the FAULT bit indicating a Fault but every no other bit in all the three registers is 1. So technically there should be not fault IDK what is happening. Trying to figure it out :slightly_smiling_face:

Edit: Or am i reading the registers worng??? this is how im reading it.

void readRegister(uint16_t addr)
{
  SPI_2.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
  digitalWrite(SELECT, LOW);
  // Read address 0x03
  uint16_t response = SPI_2.transfer16(addr);
  // take the SS pin high to de-select the chip:
  SPI_2.endTransaction();
  digitalWrite(SELECT, HIGH);
  delayMicroseconds(1);
  printBinary(response); // Print the binary response
}

void writeRegister(uint16_t addr)
{
  SPI_2.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
  digitalWrite(SELECT, LOW);
  SPI_2.transfer16(addr);
  digitalWrite(SELECT, HIGH);
  delayMicroseconds(1);
  SPI_2.endTransaction();
}

void DRV8316_init()
{
  pinMode(SELECT, OUTPUT);
  pinMode(MOTOR_ENABLE, OUTPUT);
  pinMode(MOTOR_FAULT, INPUT_PULLUP);
  digitalWrite(MOTOR_ENABLE, HIGH);
  digitalWrite(SELECT, HIGH);

  Serial.println("Initialzing....SPI");
  SPI_2.begin();
  Serial.println("InitialziED SPI");
  delayMicroseconds(100);

  readRegister(0b1000000100000000);
  readRegister(0b1000001100000000);
  readRegister(0b1000010100000000);
  readRegister(0b1000011100000000);
  readRegister(0b1000100100000000);
  readRegister(0b1000101100000000);
  readRegister(0b1000110100000000);
  readRegister(0b1000111100000000);
  readRegister(0b1001000100000000);
  readRegister(0b1001001100000000);

  Serial.println("UNLOCKING REGISTERS");
  writeRegister(0b0000011000000011);
  Serial.println("Registers Unlocked");

  Serial.println("Cleared Fault");
  writeRegister(0b0000100001100001);
  Serial.println("Cleared Fault");

  Serial.println("Before setting Buck");
  readRegister(0b1001000100000000);
  writeRegister(0b0001000000000010);
  Serial.println("After setting Buck");
  readRegister(0b1001000100000000);
}

void setup() { 
  pinMode(PC13, OUTPUT);
  Serial.begin(115200);
  DRV8316_init();
}

is this correct ???