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. 测试代码::
// 测试读 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);
}