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.

BOOSTXL-DRV8323RS: DRV8323读取寄存器0x00,0x01时出现了0x80和0x40的故障

Part Number: BOOSTXL-DRV8323RS
Other Parts Discussed in Thread: DRV8323

 您好,尊敬的TI技术人员!我目前遇到一个问题,在spi通信过程中,读取寄存器0X00,0x01的时候,出现故障0x80、0x40的值!spi通信代码如下,且目前是设置其他寄存器的值是生效的,也就确定spi通信是正常的!调试输出在最下面:

/*
* @Author: Rick rick@guaik.io
* @Date: 2023-08-30 00:52:58
* @LastEditors: Rick
* @LastEditTime: 2023-10-13 17:48:41
* @Description:
*/

#include "drv8323.h"
#include <stdio.h>
#include <string.h>
#include "status.h"
#include "gpio.h"
#include "log.h"
#include "spi.h"
#include "stdint.h"
#include "tim.h"
#include "usart.h"

// SPI NSS、使能和校准引脚控制
#define _NSS(x) HAL_GPIO_WritePin(DRV8323_NSS_GPIO_Port, DRV8323_NSS_Pin, x)
#define _ENABLE(x) HAL_GPIO_WritePin(DRV8323_EN_GPIO_Port, DRV8323_EN_Pin, x)
#define _CAL(x) HAL_GPIO_WritePin(DRV8323_CAL_GPIO_Port, DRV8323_CAL_Pin, x)

// 外部 SPI 句柄(假设在其他地方定义)
extern SPI_HandleTypeDef hspi1;


/**
* @description: 制作指令
* --------------------------
* | R/W | ADDRESS | DATA |
* | B15 | B14-B11 | B10-B0 |
* --------------------------
* @param {uint16_t} rw 写入[0] 读取[1]
* @param {uint16_t} addr 地址
* @param {uint16_t} data 数据
* @return {*}
*/
static inline uint16_t _MakeWriteData(uint16_t rw, uint16_t addr,
uint16_t data) {
return (rw << 15) | ((addr & 0xF) << 11) | (data & 0x7FF);
}

/**
* @description: 处理接收到的数据
* @param {uint16_t} data
* @return {*}
*/
//static inline uint16_t _MakeRecvData(uint16_t data) {
// return ((data << 5) >> 5);
//}
static inline uint16_t _MakeRecvData(uint16_t data) {
return (data & 0x07FF);
}

/**
* @description: SPI读写处理
* @param {uint16_t} tx
* @param {uint16_t*} rx
* @return {*}

*/
static inline int _ReadWrite(DRV8323_T* drv, uint16_t tx, uint16_t* rx) {
_NSS(0);
HAL_Delay(5); // 延时1ms,确保大于400ns
int ret = HAL_SPI_TransmitReceive(drv->hspi, (uint8_t*)&tx, (uint8_t*)rx, 1, HAL_MAX_DELAY);
_NSS(1);
return HAL_OK == ret ? CAW_OK : CAW_ERR;
}


/**
* @description: 设置寄存器值
* @param {uint16_t} addr
* @param {uint16_t} value
* @return {*} [CAW_OK, CAW_ERR]
*/
int _SetReg(DRV8323_T* drv, uint16_t addr, uint16_t value) {
uint16_t ret;
uint16_t cmd = _MakeWriteData(0, addr, value);
if (_ReadWrite(drv, cmd, &ret)) {
return CAW_ERR;
}
cmd = _MakeWriteData(1, addr, 0);
if (_ReadWrite(drv, cmd, &ret)) {
return CAW_ERR;
}
if (_MakeRecvData(ret) != _MakeRecvData(value)) {
return CAW_ERR;
}
return CAW_OK;
}

/**
* @description: 获取寄存器值
* @param {uint16_t} addr
* @param {uint16_t*} value
* @return {*}
*/
int _GetReg(DRV8323_T* drv, uint16_t addr, uint16_t* value) {
uint16_t cmd = _MakeWriteData(1, addr, 0);
if (_ReadWrite(drv, cmd, value)) {
return CAW_ERR;
}
_MakeRecvData(*value); // 将处理后的值赋值给 *value
return CAW_OK;
}

/**
* @description: 初始化DRV8323
* @param {DRV8323_T*} drv
* @return {*}
*/
int DRV8323_Init(DRV8323_T* drv, SPI_HandleTypeDef* hspi) {
drv->hspi = hspi;
_ENABLE(0);
HAL_Delay(50);

_ENABLE(1);
HAL_Delay(500);
// 配置寄存器
if (_SetReg(drv, DRV8323_DRIVER_CONTROL_REG, 0x0000)) {

return CAW_ERR;
}
HAL_Delay(5);
if (_SetReg(drv, DRV8323_GATE_DRIVE_HS_REG, 0x03FF)) {

return CAW_ERR;
}
HAL_Delay(5);
if (_SetReg(drv, DRV8323_GATE_DRIVE_LS_REG, 0x07FF)) {

return CAW_ERR;
}
HAL_Delay(5);
if (_SetReg(drv, DRV8323_OCP_CONTROL_REG, 0x0259)) {

return CAW_ERR;
}
HAL_Delay(5);
if (_SetReg(drv, DRV8323_CSA_CONTROL_REG, 0x02C3)) {

return CAW_ERR;
}
HAL_Delay(5);

_CAL(1);
HAL_Delay(100);
_CAL(0);
HAL_Delay(100);

return CAW_OK;
}

int DRV8323_GetFaultStatus(DRV8323_T* drv, uint16_t* r0) {
if (_GetReg(drv, DRV8323_FAULT_STATUS_REG, r0)) {
return CAW_ERR;
}
return CAW_OK;
}
void DRV8323_Clear_Fault(){
_ENABLE(0);
HAL_Delay(5);
_ENABLE(1);
}
int DRV8323_GetVGSStatus(DRV8323_T* drv, uint16_t* r1) {
if (_GetReg(drv, DRV8323_VGS_STATUS_REG, r1)) {
return CAW_ERR;
}
return CAW_OK;
}

void DRV8323_ShowRegs(DRV8323_T* drv) {
uint16_t r0, r1, r2, r3, r4, r5, r6;
if (_GetReg(drv, DRV8323_FAULT_STATUS_REG, &r0)) {
return;
}
if (_GetReg(drv, DRV8323_VGS_STATUS_REG, &r1)) {
return;
}
if (_GetReg(drv, DRV8323_DRIVER_CONTROL_REG, &r2)) {
return;
}
if (_GetReg(drv, DRV8323_GATE_DRIVE_HS_REG, &r3)) {
return;
}
if (_GetReg(drv, DRV8323_GATE_DRIVE_LS_REG, &r4)) {
return;
}
if (_GetReg(drv, DRV8323_OCP_CONTROL_REG, &r5)) {
return;
}
if (_GetReg(drv, DRV8323_CSA_CONTROL_REG, &r6)) {
return;
}
char buf[512];
sprintf(buf,
"\r\n********** REG INFO START **********\r\n\r\n"
"DRV8323_FAULT_STATUS_REG:\t0x%X\r\n"
"DRV8323_VGS_STATUS_REG:\t\t0x%X\r\n"
"DRV8323_DRIVER_CONTROL_REG:\t0x%X\r\n"
"DRV8323_GATE_DRIVE_HS_REG:\t0x%X\r\n"
"DRV8323_GATE_DRIVE_LS_REG:\t0x%X\r\n"
"DRV8323_OCP_CONTROL_REG:\t0x%X\r\n"
"DRV8323_CSA_CONTROL_REG:\t0x%X\r\n"
"\r\n*********** REG INFO END ***********\r\n\r\n",
r0, r1, r2, r3, r4, r5, r6);
CAW_LOG_RAW(buf);
}
在main函数的调用:
DRV8323_Clear_Fault();
if (!DRV8323_Init(&driver, &hspi1)) {
drv_init_state = 1;
DRV8323_ShowRegs(&driver);
printf("DRV8323 init ok...");
} else {
// 初始化失败退出任务
printf("DRV8323 init failed...");
}
供电27V,这是打印输出:

********** REG INFO START **********

DRV8323_FAULT_STATUS_REG: 0x80
DRV8323_VGS_STATUS_REG: 0x40
DRV8323_DRIVER_CONTROL_REG: 0x0
DRV8323_GATE_DRIVE_HS_REG: 0x3FF
DRV8323_GATE_DRIVE_LS_REG: 0x7FF
DRV8323_OCP_CONTROL_REG: 0x259
DRV8323_CSA_CONTROL_REG: 0x2C3

*********** REG INFO END ***********

DRV8323 init ok...status =0



  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,      

    读取寄存器0X00,0x01的时候,出现故障0x80、0x40的值!

         请重新确认寄存器值,DRV8323S寄存器是10位数据. (数据手册Table 10. DRV832xS and DRV832xRS Register Map)    

  • 你好!这个读取应该是8~9~10bit都为0吧,我已经把读出的结果在代码上作了处理:
    static inline uint16_t _MakeRecvData(uint16_t data) {
    return (data & 0x07FF);
    }
    初始化过程如下:

    int DRV8323_Init(DRV8323_T* drv, SPI_HandleTypeDef* hspi) {
    drv->hspi = hspi;
    _ENABLE(0);
    HAL_Delay(50);

    _ENABLE(1);
    HAL_Delay(500);


    // 配置寄存器
    if (_SetReg(drv, DRV8323_DRIVER_CONTROL_REG, 0x0000)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_GATE_DRIVE_HS_REG, 0x03FF)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_GATE_DRIVE_LS_REG, 0x07FF)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_OCP_CONTROL_REG, 0x0259)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_CSA_CONTROL_REG, 0x02C3)) {

    return CAW_ERR;
    }
    HAL_Delay(5);
    _CAL(1);
    HAL_Delay(100);
    _CAL(0);
    HAL_Delay(100);

    return CAW_OK;
    }


    调用方法如下:
    if (!DRV8323_Init(&driver, &hspi1)) {
    drv_init_state = 1;
    DRV8323_ShowRegs(&driver);
    printf("DRV8323 init ok...\r\n");
    } else {
    drv_init_state =0;
    }
    下面是初始后的结果!

    DVDD现在输出3.3V,27v的供电!vcp引脚对gnd为38V左右

  • 你好!这个读取应该是8~9~10bit都为0吧,我已经把读出的结果在代码上作了处理:
    static inline uint16_t _MakeRecvData(uint16_t data) {
    return (data & 0x07FF);
    }
    初始化过程如下:

    int DRV8323_Init(DRV8323_T* drv, SPI_HandleTypeDef* hspi) {
    drv->hspi = hspi;
    _ENABLE(0);
    HAL_Delay(50);

    _ENABLE(1);
    HAL_Delay(500);


    // 配置寄存器
    if (_SetReg(drv, DRV8323_DRIVER_CONTROL_REG, 0x0000)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_GATE_DRIVE_HS_REG, 0x03FF)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_GATE_DRIVE_LS_REG, 0x07FF)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_OCP_CONTROL_REG, 0x0259)) {

    return CAW_ERR;
    }

    HAL_Delay(5);
    if (_SetReg(drv, DRV8323_CSA_CONTROL_REG, 0x02C3)) {

    return CAW_ERR;
    }
    HAL_Delay(5);
    _CAL(1);
    HAL_Delay(100);
    _CAL(0);
    HAL_Delay(100);

    return CAW_OK;
    }


    调用方法如下:
    if (!DRV8323_Init(&driver, &hspi1)) {
    drv_init_state = 1;
    DRV8323_ShowRegs(&driver);
    printf("DRV8323 init ok...\r\n");
    } else {
    drv_init_state =0;
    }
    下面是初始后的结果!

    DVDD现在输出3.3V,27v的供电!vcp引脚对gnd为38V左右

  • 您好,希望能尽快解决这个问题,目前已经进度有些慢了!能否给些技术支持

  • 您好,

         请重新确认:

         读取到的“8.6.1.1 Fault StatusRegister 1 (address = 0x00)” 寄存器的值是0x080,

          “8.6.1.2 Fault StatusRegister 2 (address = 0x01)” 寄存器的值是0x040?