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.

[参考译文] DRV8350:能够通过 SPI 读取寄存器、但无法修改寄存器(用于栅极驱动器设置的配置)

Guru**** 2463330 points


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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1295695/drv8350-able-to-read-registers-through-spi-but-not-able-to-modify-the-registers-for-configuration-of-gate-driver-settings

器件型号:DRV8350

我使用的是 DRV8350SRTVT 芯片、它与 STM32H7IGT6 MCU 连接。 STM MCU 是主器件、闸极驱动器是从器件。

栅极驱动器中的配置寄存器必须使用 SPI 通信协议进行设置。 下面随附了此工具的代码和设置。

我可以使用 SPI 读取配置寄存器(能够看到默认值)、但无法写入或修改寄存器。

我还将栅极驱动 HS 中的 LOCK 位设置为011 (已解锁、因此我可以修改 SPI 寄存器)。 栅极驱动器已启用。

在 SPI 通信中没有收到任何故障/错误。

SCLK 最小周期= 0.1s
SPI 速度: 537.109 Kbit/s ⇒传输时间1位= 1.86s (在示波器上验证了值)

1) 1)写入 OCP 寄存器

默认值- 00101101101
要写入的值- 00100100000
Rx 缓冲区中按预期接收的值(修改前的值)

 

2) 2)在写入修改后的值之后读取 OCP 寄存器

无法写入寄存器的值-不存在 SPI 错误、但无法修改寄存器

当我执行读取操作时、仍然返回默认值。

3) 3)读取栅极驱动器 HS 寄存器(用于检查 SPI 寄存器位是否锁定)

数据位的 MSB - 011 (未锁定 SPI 寄存器)

代码

//SPI6栅极驱动器的参数设置


hspi6.instance = SPI6;
hspi6.Init.Mode = SPI_MODE_MASTER;
hspi6.Init.Direction = SPI_DIRECTION_2LINES;
hspi6.Init.DataSize = SPI_DATASIZE_16BIT;
hspi6.Init.CLKPolarity = SPI_POLICY_LOW;
hspi6.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi6.Init.nss = SPI_NSS_soft;
hspi6.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi6.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi6.Init.TIMode = SPI_TIMODE_DISABLE;
hspi6.Init.CRCCalrup = SPI_CRCCALCULATION_DISABLE;
hspi6.Init.CRCPolynomial = 0x0;
hspi6.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
hspi6.Init.NSSPolarity = SPI_NSS_POLICY_LOW;
hspi6.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi6.Init.TxCRCInitializationPattern = SPI_CRC_initialization_all_zero_pattern;
hspi6.Init.RxCRCInitializationPattern = SPI_CRC_initialization_all_zero_pattern;
hspi6.Init.MasterSSIdleness = SPI_MASTER_SS_idlene_00CYCLE;
hspi6.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_idlene_00CYCLE;
hspi6.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi6.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi6.Init.IOSwap = SPI_IO_SWAP_DISABLE;

#define GATEDRIVER_CSA_CONTROL_REGISTER_ADDRESS 0x6

void access_gate_driver_register{

/*启用栅极驱动器-将 GPIO 引脚设置为高电平*/

HAL_GPIO_WritePin (GPIOE、GPIO_PIN_2、GPIO_PIN_SET);

HAL_GPIO_WritePin (GPIOE、GPIO_PIN_3、GPIO_PIN_SET);

HAL_DELAY (1);


uint16_t 命令 word_read =(0x8000 |(reg_address << 11));

uint16_t 命令 word_write =((reg_address << 11)| data_bits);

如果(READ_OR_WRITE_BIT == GATEDRIVER_READ)

{

SPI_TX_BUFFER_GATE_DRIVER =命令字读取;

如果(READ_OR_WRITE_BIT == GATEDRIVER_WRITE)、则否则为

{

SPI_TX_BUFFER_Gate_driver =命令字写;

HAL_GPIO_WritePin (nss_port_gate_driver[hjoin->id]、nss_pin_gate_driver[hjoin->id]GPIO_PIN_reset);

if (HAL_SPI_TransmitReceive (&hspi6、(uint8_t*)&SPI_TX_BUFFER_GATE_DRIVER、(uint8_t*)&SPI_Rx_BUFFER_GATE_DRIVER、1、HAL_TIMEOUT)!= HAL_OK)

{

GATE_DRIVER_SPI_ERROR++;

HAL_GPIO_WritePin (nss_port_gate_driver[hjoin->id]、nss_pin_gate_driver[hjoin->id]GPIO_PIN_set);

ASYSTR_WRITE_Gate_DRIVER_REGISTER (hjoint、GATEDRIVER_OCP_CONTROL_REGISTER_ADDRESS、0b00100100000);

HAL_DELAY (1);

ASYSTR_READ_Gate_DRIVER_REGISTER (hjoint、GATEDRIVER_GATEDRIVER_HS_REGISTER_ADDRESS);

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

    您好、Caroline:  

    感谢您在 e2e 电机驱动器论坛发帖!

    我们的团队目前正在美国度假,但将在下周回来解决您的问题。 同时、请随意添加尽可能多的数据和详细信息、以确保高效简化的调试过程。

    此致、  
    安德鲁  

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

    您好、Caroline:

    很抱歉响应出现延迟。

    您要处理的问题看起来很常见、您是否看过我们的 SPI 常见问题解答? https://e2e.ti.com/support/motor-drivers/f/38/t/937258

    通常、 发生该错误时 、用户会通过使能引脚意外禁用器件 、而使能引脚会复位 SPI 寄存器设置。

    此致、

    亚拉

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

    您好、Caroline:

    您的问题是否已得到解决? 如果是、请点击"此已解决我的问题按钮"、如果不是简单回复此帖子、否则我将很快关闭此帖子。

    此致、

    亚拉