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:通过 SPI 读取后出现故障

Guru**** 2386710 points
Other Parts Discussed in Thread: DRV8323, BOOSTXL-DRV8323RS, LAUNCHXL-F280025C
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1468803/boostxl-drv8323rs-fault-after-read-via-spi

器件型号:BOOSTXL-DRV8323RS
主题中讨论的其他器件:DRV8323LAUNCHXL-F280025C

工具与软件:

您好!

我的定制电路板使用 DRV8323RS、使用 GPIO11作为 CS 引脚、下载 universal_motorcontrol_lab、运行调试以查看它是否可以与 DRV 芯片通信、我所做的就是:  

1.设置 GPIO、 这是我的定制电路板、我 使用 GPIO11作为 CS 引脚

   GPIO_setPinConfig (GPIO_11_SPIA_STE);
  GPIO_setDirectionMode (11、GPIO_DIR_MODE_OUT);
  GPIO_setPadConfig (11、GPIO_PIN_TYPE_STD);

2.在  DRV8323_setupSPI 函数内、 我插入代码以确保可以加载默认值(抱歉我没有 逻辑分析仪)

  drvDataNew0至 drvDataNew6用于 statReg00至  statReg06  

  调用 DRV8323_setupSPI 后、其默认值已无问题地读取(根据 DRV 的手册)

  drvDataNew0  = 0
  drvDataNew1  = 0
  drvDataNew2  = 0
  drvDataNew3  = 1023
  drvDataNew4  = 2047
  drvDataNew5  = 345
  drvDataNew6  = 643

void DRV8323_setupSPI(DRV8323_Handle handle, DRV8323_VARS_t *drv8323Vars)
{
    DRV8323_Address_e drvRegAddr;
    uint16_t drvDataNew;

    // Set Default Values
    // Manual Read/Write
    drv8323Vars->manReadAddr  = 0;
    drv8323Vars->manReadData  = 0;
    drv8323Vars->manReadCmd = false;
    drv8323Vars->manWriteAddr = 0;
    drv8323Vars->manWriteData = 0;
    drv8323Vars->manWriteCmd = false;

    // Read/Write
    drv8323Vars->readCmd  = false;
    drv8323Vars->writeCmd = false;

    // Read registers for default values
    // Read Status Register 0
    drvRegAddr = DRV8323_ADDRESS_STATUS_0;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->statReg00.all = drvDataNew;

    drvDataNew0 = drvDataNew;

    // Read Status Register 1
    drvRegAddr = DRV8323_ADDRESS_STATUS_1;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->statReg01.all = drvDataNew;

    drvDataNew1 = drvDataNew;

      // Read Control Register 2
    // all bit default value are 0, 6*PWM Mode
    drvRegAddr = DRV8323_ADDRESS_CONTROL_2;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->ctrlReg02.all = drvDataNew;

    drvDataNew2 = drvDataNew;

    // Read Control Register 3
    // all bit default value are 1, IDRIVEP_HS=1000mA, IDRIVEN_HS = 2000mA
    drvRegAddr = DRV8323_ADDRESS_CONTROL_3;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->ctrlReg03.all = drvDataNew;

    drvDataNew3 = drvDataNew;

    // Read Control Register 4
    // all bit default value are 1, TDRIVE=400ns, IDRIVEP_LS=1000mA, IDRIVEN_LS = 2000mA
    drvRegAddr = DRV8323_ADDRESS_CONTROL_4;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->ctrlReg04.all = drvDataNew;

    drvDataNew4 = drvDataNew;

    // Read Control Register 5
    // DEAD_TIME=100ns, OCP_DEG=4us, VDS_LVL=0.75V
    drvRegAddr = DRV8323_ADDRESS_CONTROL_5;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->ctrlReg05.all = drvDataNew;

    drvDataNew5 = drvDataNew;

    // Read Control Register 6
    // DEAD_TIME=100ns, OCP_DEG=4us, VDS_LVL=0.75V
    drvRegAddr = DRV8323_ADDRESS_CONTROL_6;
    drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
    drv8323Vars->ctrlReg06.all = drvDataNew;

    drvDataNew6 = drvDataNew;

    return;
} // end of DRV8323_setupSPI() function

到目前为止、我确信与 DRV 的通信是可以的、尤其是 GPIO CS 引脚工作正常!!!

================================

===  再次读取===时会发生奇怪的事情  

================================

尝试通过  main.c 循环内的 HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1)读取最新更新值时

并通过 设置 drv8323Vars->readCmd = true 来强制执行读取操作;

void DRV8323_readData(DRV8323_Handle handle, DRV8323_VARS_t *drv8323Vars)
{
    DRV8323_Address_e drvRegAddr;
    uint16_t drvDataNew;

    drv8323Vars->readCmd = true;

    if(drv8323Vars->readCmd)
    {
        // Read registers for default values
        // Read Status Register 0
        drvRegAddr = DRV8323_ADDRESS_STATUS_0;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->statReg00.all  = drvDataNew;

        // Read Status Register 1
        drvRegAddr = DRV8323_ADDRESS_STATUS_1;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->statReg01.all  = drvDataNew;

        // Read Control Register 2
        drvRegAddr = DRV8323_ADDRESS_CONTROL_2;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->ctrlReg02.all  = drvDataNew;

        // Read Control Register 3
        drvRegAddr = DRV8323_ADDRESS_CONTROL_3;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->ctrlReg03.all  = drvDataNew;

        // Read Control Register 4
        drvRegAddr = DRV8323_ADDRESS_CONTROL_4;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->ctrlReg04.all  = drvDataNew;

        // Read Control Register 5
        drvRegAddr = DRV8323_ADDRESS_CONTROL_5;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->ctrlReg05.all  = drvDataNew;

        // Read Control Register 6
        drvRegAddr = DRV8323_ADDRESS_CONTROL_6;
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->ctrlReg06.all  = drvDataNew;


        drv8323Vars->readCmd = false;
    }

    // Manual read from the DRV8323
    if(drv8323Vars->manReadCmd)
    {
        // Custom Read
        drvRegAddr = (DRV8323_Address_e)(drv8323Vars->manReadAddr << 11);
        drvDataNew = DRV8323_readSPI(handle, drvRegAddr);
        drv8323Vars->manReadData = drvDataNew;

        drv8323Vars->manReadCmd = false;
    }

  
    return;
}  // end of DRV8323_readData() function

它返回 drvicVars_M1值:

statReg00 = 0   
statReg01 = 0
statReg02 = 0
statReg03 = 769
statReg04 = 1
statReg05 = 1
statReg00 = 1  

我的结论是当再次读取值,这是原因设置腐败...  

如果阅读过程有任何错误、请提供帮助?  

Danny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >>我最终只需调用一次即可成功读取寄存器、因此将其从 Main.c 末尾的 while 循环中删除  

        .
        .
        .
        HAL_writeDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1);
        HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1);

      }// while ()循环结束

      //禁用 PWM
      HAL_disablePWM (motorHandle_M1->halMtrHandle);

    }// main ()函数结束

    >>并将其移动到这里,只读一次!  

      //启用全局中断
      HAL_enableGlobalInts (halHandle);

      //启用调试中断
      HAL_enableDebugInt (halHandle);

      systemVars.powerRelayWaitTime_ms = POWER_RELAY_WAIT_TIME_ms;

      HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1);

    >>更改后的寄存器可以写入和读取  

      drvicVars_M1.ctrlReg02.bit.OTW_REP = true;
      drvicVars_M1.ctrlReg02.bit.pwm_mode = DRV8323_PWMMODE_6

      drvicVars_M1.ctrlReg03.bit.IDRIVEN_HS = DRV8323_ISINK_HS_0P880_A
      drvicVars_M1.ctrlReg03.bit.IDRIVEP_HS = DRV8323_ISOUR_HS_0P820_A

      drvicVars_M1.ctrlReg04.bit.IDRIVEN_LS = DRV8323_ISINK_LS_0P880_A
      drvicVars_M1.ctrlReg04.bit.IDRIVEP_LS = DRV8323_ISOUR_LS_0P820_A

      drvicVars_M1.ctrlReg05.bit.Vds_LVL = DRV8323_Vds_level_1P880_V
      drvicVars_M1.ctrlReg05.bit.OCP_MODE = DRV8323_AUTOMOTIVE_RETRY
      drvicVars_M1.ctrlReg05.bit.dead_time = DRV8323_DEADTIME_100_NS

      drvicVars_M1.ctrlReg06.bit.cas_gain = DRV8323_GAIN_20VpV
      drvicVars_M1.ctrlReg06.bit.Ls_REF = false;
      drvicVars_M1.ctrlReg06.bit.VREF_DIV = true;
      drvicVars_M1.ctrlReg06.bit.CSA_FET = false;

      drvicVars_M1.writeCmd = 1;
      HAL_writeDRVData (handle、&drvicVars_M1);
      SYSCTL_DELAY (1000U);

      drvicVars_M1.writeCmd = 1;
      HAL_writeDRVData (handle、&drvicVars_M1);
      SYSCTL_DELAY (1000U);

    >>现在、当我将1设置为 motorVars_M1.flagEnableRunAndIdentify 时、立即发生模块化过流故障

    motorVars_M1.54 Ref_Hz       = 60.0
    motorVars_M1.maxCurrent_A      = 30.0
    motorSetVars_M1.overCurrent_A   = 30.0

    >>如果通过禁用 CS 引脚禁用 SPI 至 DRV、则可以在不 发生模块过流故障的情况下运行电机

      /*   GPIO_setPinConfig (GPIO_11_SPIA_STE);
        GPIO_setDirectionMode (11、GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig (11、GPIO_PIN_TYPE_PULLUP);
      */

    我的第一个问题是、如何继续读取寄存器? 调用  HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1) 是否会多次损坏数据?  

    我的第二个问题是 原因  moduleOverCurrent ??????  

    Danny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Danny:

    「我知道了,妈妈会很快回来的。」

    1. 仅在启用 STE 引脚时触发的模块过流故障可能与引脚排列有关。 仔细检查 GPIO11在电路板上的连接位置。
    2. 我注意到在您指定的代码中不起作用、写入命令和读取命令之间没有延迟。 如果添加延迟、它是否会改变有关行为的任何变化?

    此致、
    Jason Osborn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jason:

    仅在启用 STE 引脚时触发的模块过流故障可能与引脚排列有关。 仔细检查 GPIO11在电路板上的连接位置。

    这是我的定制电路板、通过硬接线将 GPIO11连接至 DRV CS 引脚、我曾提到过、它可以读取默认值、甚至更新寄存器、现在我的电路板已损坏、我需要准备新电路板并继续测试、以确认过流故障是否由 MOSFET 引起。

    我注意到在您所说的代码中、写入命令和读取命令之间没有延迟。 如果添加延迟、它是否会改变有关行为的任何内容?

    我甚至在每次读取 或写入之间增加了3ms 的延迟、它基于 TI 示例  universal_motorcontrol_lab DMC_LEVEL_4 、您可以使用 BoostXL-DRV8323RS + LaunchXL-F280025C 帮助自己进行测试吗

    Jason、

    Danny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Danny:

    我对 GPIO11的担心是它可能意外地与另一个信号连接/短路、从而导致问题。

    • 这不太可能是问题所在、但可以肯定的是、预定义符号 DRV_CS_GPIO 是否处于活动状态?
    • 如果您可以在没有 STE/PTE 引脚的情况下运行电机、您如何与 DRV 通信?
    •  DRV8323RS 对象的 rxTimeOut 位的状态是什么?

    此致、
    Jason Osborn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jason:

    这不可能是问题所在、但可以肯定的是、预定义符号 DRV_CS_GPIO 是否处于活动状态?

    它没有预定义的 DRV_CS_GPIO ,因此它被禁用,下面是我的 HAL_setupGPIOs 函数:  

    由于它不是 TI 板、因此我不需要进行线缆连接、因此我的板是硬线直接将 GPIO 11连接到 DRV CS 引脚

    [报价 userid="525429" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1468803/boostxl-drv8323rs-fault-after-read-via-spi/5654760 #5654760"]如果您可以在没有 STE/PTE 引脚的情况下运行电机、您如何与 DRV 通信?[/QUOT]

    如果我禁用 STE 引脚, DRV 以默认值运行,当然增益可能不会被校正,但至少可以运行...

    正如我所说的、我可以读取默认值、写入一次、然后再次读取以确认最后一次写入的值、但如果我再次读取、返回值会损坏。  

     DRV8323RS 对象的 rxTimeOut 位的状态是什么?[/quot]

    谢谢!

    Danny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Danny:

    我理解这个问题。 到目前为止、我的问题针对的是我过去所看到的类似问题的常见原因。 感谢您提供 rxTimeOut 图像。

    • 如果 rxTimeOut 为 false/0、则表示实际正在 SPI 线路上接收消息、但数据本身不正确。
      • 您的电源是否稳定? 如果监测直流母线电压、是否存在任何主要波动?

    • 在 hal.c 文件函数 HAL_MTR_setGateDriver 中、固件执行 DRV 配置。 这些设置是否与您的自定义硬件匹配?

    • 请完成您的 GPIO 配置-是否还有任何仍然设置为使用不再相关的 SPIA? 例如、DRV8323RS 代码将 GPIO5设置为 SPIA_STE。

    如果可能、我建议您使用示波器、信号分析器或类似设备来监控以下信号、并对照您希望看到的内容进行检查。

    • SPIA_STE、_SIMO、_MISO (0-3.3V)
    • VDC 总线的 MCU ADC 引脚(0V - 3.3V)

    此致、
    Jason Osborn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jason:

    抱歉、正如我说过的、我可以读取默认值、然后写入/更新增益等寄存器  

    因此,我确信我的主板设置是正确的,没有任何错误的设置!  

    但以 TI 示例 universal_motorcontrol_lab 为基础

    位于 main.C 的 while 循环 、其将继续调用  

    #elif defined (_F28002x)|| defined (_F28003x)

      HAL_writeDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1);
      HAL_readDRVData (motorHandle_M1->halMtrHandle、&drvicVars_M1);

    #else

    如果我再次调用 HAL_readDRVData、则返回数据 已损坏...。。  

    请看、您是否有 BoostXL-DRV8323RS + LaunchXL-F280025C? 您是否可以使用 UNIVERSAL_MOTORCONTROL_LAB 进行测试 、以便继续读取 STATUS_0等寄存器?

    Danny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    丹尼,道歉的反应延误。

    在{project}/src_board/drvic/drv8323s.c 文件中、您能否将第381行"SPI_readDataNonBlocking (")更改为"SPI_readDataBlockingFIFO ("

    请告诉我,如果这能解决你的问题

    此致、
    Jason Osborn