DRV8305: BOOSTXL-DRV8305EVM板子高侧无输出

Part Number: DRV8305
Other Parts Discussed in Thread: LAUNCHXL-F28P55X,

1.硬件外围电压:PVDD:12V,VCPH 电压为 22V,AVDD为4.99V、DVDD 为 3.3V, EN_GATEA为3.3V,WAKEA为3.3V,CP1H:11.82V,CP2H:17.59V. INH_A/INL_A  INH_B/INL_B INH_C/INL_C都有PWM输入,频率16KHz. 但GH_A/GL_A GH_B/GL_B GH_C/GL_C无输出导致MOS也无输出。

2.主控板LAUNCHXL-F28P55X ,只有HS_GATE(0x05)读/写入成功,LS_GATE(0x06)和IC_OPERATION(0x09)写入无效,且WARNING_WATCHDOG(0x01)读回0x0000(异常).

F28P550的SPI模式: CPOL=0, CPHA=1,

3.既然DRV8305N的05寄存器HS Gate Driver Control读写成功,为何06寄存器LS Gate Driver Control 读写错误?比如:默认是0x0344,读出是0x0144,写入0x0255后,再读出为0x0155,高位不能写。

4.串口输出:=== Initializing DRV8305 === LS_GATE before write: 0x0144 LS_GATE after write: 0x0155 LS_GATE Write test FAILED  HS_GATE before write: 0x0344 HS_GATE after write: 0x0266 OK Write test PASSED OPERATION before write: 0x0000 OPERATION after write: 0x0000 OPERATION Write test FAILED  [DRV8305] SNS clamp enabled [SYSTEM] Motor system ready OPERATION read: 0x0000

5. 测试代码::

// 测试 LS_GATE 寄存器
    uint16_t ls_before = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_LS_GATE_DRIVER_CONTROL);
    UART_SendString("LS_GATE before write: 0x");
    UART_SendHexWord(ls_before);
    UART_SendString("\r\n");

    // 写入测试值 0x0255
    if (DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_LS_GATE_DRIVER_CONTROL, 0x0255)) {
        delay_ms(10);
        uint16_t ls_after = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_LS_GATE_DRIVER_CONTROL);
        UART_SendString("LS_GATE after write: 0x");
        UART_SendHexWord(ls_after);
        UART_SendString("\r\n");
        if (ls_after == 0x0255) {
            UART_SendString("OK Write LS_GATE test PASSED\r\n");
        } else {
            UART_SendString("LS_GATE Write test FAILED \r\n");
        }
        // 恢复原值
        DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_LS_GATE_DRIVER_CONTROL, ls_before);
    } else {
        UART_SendString(" LS_GATE Write failed\r\n");
    }

    // 测试读 HS_GATE 寄存器
    uint16_t hs_before = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_HS_GATE_DRIVER_CONTROL);
    UART_SendString("HS_GATE before write: 0x");
    UART_SendHexWord(hs_before);
    UART_SendString("\r\n");

    // 写入测试值 0x0266
    //delay_ms(100);
    if (DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_HS_GATE_DRIVER_CONTROL, 0x0266)) {
        //delay_ms(100);
        uint16_t hs_after = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_HS_GATE_DRIVER_CONTROL);
        UART_SendString("HS_GATE after write: 0x");
        UART_SendHexWord(hs_after);
        UART_SendString("\r\n");
        if (hs_after == 0x0266) {
            UART_SendString("OK Write test PASSED\r\n");
        } else {
            UART_SendString("Fails Write test FAILED (value unchanged or wrong)\r\n");
        }
        // 恢复原值
        DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_HS_GATE_DRIVER_CONTROL, hs_before);
    } else {
        UART_SendString("Fails Write function returned error\r\n");
    }
 

// 测试读 OPERATION 寄存器 (0x09)
    uint16_t OP_before = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_IC_OPERATION);
    UART_SendString("OPERATION before write: 0x");
    UART_SendHexWord(OP_before);
    UART_SendString("\r\n");

    // 写入测试值 0x058
    delay_ms(20);
    if (DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_IC_OPERATION, 0x058)) {
        uint16_t OP_after = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_IC_OPERATION);
        UART_SendString("OPERATION after write: 0x");
        UART_SendHexWord(OP_after);
        UART_SendString("\r\n");
        if (OP_after == 0x058) {
            UART_SendString("OP Write test PASSED\r\n");
        } else {
            UART_SendString("OPERATION Write test FAILED \r\n");
        }
        // 恢复原值
        DRV8305_WriteRegister(SPI_MODULE_B, DRV8305_REG_IC_OPERATION, OP_before);
    } else {
        UART_SendString("OPERATION Fails Write function returned error\r\n");
    }

6.DRV8305读/写代码:

uint16_t DRV8305_ReadRegister(SPI_Module_t module, uint8_t regAddr) {
    if (regAddr > 0x0F) return 0xFFFF;

    // 构建读命令:B15=1, B14~B11=地址, B10~B0=0
    uint16_t txData = (1U << 15) | ((regAddr & 0x0F) << 11);
    // 片选拉低
    GPIO_writePin(MOT1_SPI_CS_EN, 0);
    delay_us(10);

    // 发送命令并接收响应
    uint16_t rxData = F28P550_SPI_Transfer16(module, txData);

    // 等待最后一位完全移出
    delay_us(5);
    GPIO_writePin(MOT1_SPI_CS_EN, 1);
    delay_us(10);

    drv8305_state.spi_transfer_count++;
    return (rxData & 0x07FF); //10位掩码
}

uint16_t F28P550_SPI_Transfer16(SPI_Module_t module, uint16_t data) {

    if (module >= SPI_MODULE_COUNT || !spi_states[module].initialized) {
        return 0xFFFF;
    }

    uint16_t base = (module == SPI_MODULE_A) ? SPIA_BASE : SPIB_BASE;

    // 清除标志
    HWREGH(base + SPI_O_STS) &= ~(SPI_STS_INT_FLAG | SPI_STS_OVERRUN_FLAG);

    // 发送16位数据(左对齐)
    SPI_writeDataBlockingNonFIFO(base, data);
    // 等待接收完成并读取数据(阻塞,无超时)
    uint16_t rx_data = SPI_readDataBlockingNonFIFO(base);

    // 再次清除标志,为下一次传输做准备
    HWREGH(base + SPI_O_STS) &= ~(SPI_STS_INT_FLAG | SPI_STS_OVERRUN_FLAG);

    // 更新统计
    spi_states[module].tx_count++;
    spi_states[module].rx_count++;

    return rx_data;
}

7.DRV8305初始化中的配置:

/******************************************************************************
 * DRV8305_ApplyConfiguration - 应用配置到DRV8305寄存器
 *****************************************************************************/
void DRV8305_ApplyConfiguration(const DRV8305_Config_t *config) {
    if (config == NULL) return;

    // ===== 关键调整:先写LS_GATE,再写HS_GATE =====
    // 1. 低速侧栅极驱动控制(0x6)- 先写!
    uint16_t ls_gate = 0;
    ls_gate |= ((config->rsvd & 0x01) << 10);     // TDRIVEN(bit9-8,2位)
    ls_gate |= ((config->tdrivep & 0x03) << 8);     // TDRIVEP(bit9-8,2位)
    ls_gate |= ((config->idriven_ls & 0x0F) << 4);  // IDRIVEN_LS(bit7-4,4位)
    ls_gate |= ((config->idrivep_ls & 0x0F) << 0);  // IDRIVEP_LS(bit3-0,4位)
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_LS_GATE_DRIVER_CONTROL, ls_gate);
    //delay_ms(20);  // 增加写入后延迟
    //uint16_t ls_check = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_LS_GATE_DRIVER_CONTROL);
    //UART_SendString("LS_GATE readback: 0x"); 
    //UART_SendHexWord(ls_check); 
    //UART_SendString("\r\n");

    // 2. 高速侧栅极驱动控制(0x5)- 后写!
    uint16_t hs_gate = 0;
    hs_gate |= ((config->rsvd & 0x01) << 10);     // TDRIVEN(bit9-8,2位)
    hs_gate |= ((config->tdriven & 0x03) << 8);     // TDRIVEN(bit9-8,2位)
    hs_gate |= ((config->idriven_hs & 0x0F) << 4);  // IDRIVEN_HS(bit7-4,4位)
    hs_gate |= ((config->idrivep_hs & 0x0F) << 0);  // IDRIVEP_HS(bit3-0,4位)
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_HS_GATE_DRIVER_CONTROL, hs_gate);
    //delay_ms(5);
    //uint16_t hs_check = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_HS_GATE_DRIVER_CONTROL);
    //UART_SendString("HS_GATE readback: 0x"); 
    //UART_SendHexWord(hs_check); 
    //UART_SendString("\r\n");

    // 3. 全局栅极驱动控制(0x7)
    uint16_t gate_ctrl = 0;
    gate_ctrl |= ((config->pwm_mode & 0x03) << 7);  // PWM_MODE(bit8-7)
    gate_ctrl |= ((config->dead_time & 0x07) << 4); // DEAD_TIME(bit6-4)
    gate_ctrl |= ((config->vds_mode & 0x03) << 2);  // TBLANK(bit3-2,临时映射)
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_GATE_DRIVE_CONTROL, gate_ctrl);

    // 4. 芯片操作配置(0x9)
    uint16_t ic_op = 0;
    ic_op |= config->enable_watchdog ? DRV8305_ICOP_WD_EN : 0;
    ic_op |= DRV8305_ICOP_DIS_GDRV_FAULT;
    ic_op |= DRV8305_ICOP_EN_SNS_CLAMP;
    ic_op |= ((config->sleep & 0x01) << 2);  // 唤醒
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_IC_OPERATION, ic_op);
    //delay_ms(10);
    //uint16_t op_check = DRV8305_ReadRegister(SPI_MODULE_B, DRV8305_REG_IC_OPERATION);
    //UART_SendString("Operation readback: 0x"); 
    //UART_SendHexWord(op_check); 
    //UART_SendString("\r\n");

    // 5. 配置SHUNT_AMPLIFIER_CONTROL (0xA)
    uint16_t shunt_ctrl = 0;
    shunt_ctrl |= ((config->gain & 0x03) << 9);  // 增益设置
    shunt_ctrl |= config->enable_ocp ? 0 : DRV8305_VDS_MODE_LATCH_SHUT;  // 过流保护
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_SHUNT_AMPLIFIER_CONTROL, shunt_ctrl);

    // 6. 配置VDS_SENSE_CONTROL (0xC)
    uint16_t vds_ctrl = 0;
    // 根据VDS模式配置阈值等参数
    DRV8305_WriteRegister(SPI_MODULE_B,DRV8305_REG_VDS_SENSE_CONTROL, vds_ctrl);

}