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.

[参考译文] DRV8106-Q1:DRV8106-Q1寄存器只能由 SPI 第二次读取发送0x00值读取一次

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1270220/drv8106-q1-drv8106-q1-register-can-only-be-read-once-by-spi-second-read-send-0x00-value

器件型号:DRV8106-Q1

所有寄存器采用相同的行为、第一次读取 aftec POR 会发回写入数据表的默认值、第二次读取则提供0x00。

当我读取所有寄存器一次、然后重新读取循环、或读取 单个寄存器两次时、情况就是如此。

更改寄存器值时、即使用于删除锁定字段的 IC_CTL 也不起作用。

~~~~~~~ 关于测试制作的信息~~~~~~

测试顺序:

设置 SLEEP 和 DRVOFF 引脚以唤醒驱动器

置位 CS 引脚

移位地址+读取标志和虚值

获取状态和寄存器值

 DRV_CTRL_1的结果

第一次读取: 状态= 0xC0值= 0xFF

第二次读取状态 = 0xC0值= 0x00

注:

  • 读取 IC_STAT_1发回0x40值:POR 置位和 SPI nOK
  • 当我  在第二次读取之前插入一个 SLEEP 和 DRVOFF 引脚切换开关时,第二次读取可以正常工作(但在两次读取之间 DRV8106被复位,作为强制器重置到 SLEEP 模式)

低于 SPI 捕获 (粉色 MOSI,黄色 MISO): 1 成功读取(状态0xC0数据0xFF),然后2失败 读取0xC0状态和0x00数据   

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

    发出只 读寄存器高于 IC_CTL 寄存器(0美元x04)、只读寄存器可读取多次而不会出现问题

    当读取 R/W 寄存器时、第二个读取发送0x00、也可以成功读取其他寄存器。 我看起来像个软锁的家伙。

    13:44:06.110 ->===读数===
    
    13:44:06.110 -> IC_STAT_1已接收:C0-40
    
    13:44:06.110 -> VGS_VDS_STAT 已接收:C0-0
    
    13:44:06.110 -> IC_STAT_2已接收:C0-2
    
    13:44:06.110 -> IC_CTRL 已接收:C0-6
    
    13:44:06.110 -> BRG_CTRL 已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_1已接收:C0-FF
    
    13:44:06.110 -> DRV_CTRL_2已接收:C0-FF
    
    13:44:06.110 -> DRV_CTRL_3已接收:C0-20
    
    13:44:06.110 -> VDWS_CTRL1_已接收:C0-20
    
    13:44:06.110 -> VDS_CTRL_2已接收:C0-DD
    
    13:44:06.110 -> OLSC_CTRL 已接收:C0-0
    
    13:44:06.110 -> UVOV_CTRL 已接收:C0-14
    
    13:44:06.110 -> CSA_CTRL 已接收:C0-1
    
    13:44:06.110 ->==writing===
    
    13:44:06.110 ->===读数===
    
    13:44:06.110 -> IC_STAT_1已接收:C0-40
    
    13:44:06.110 -> VGS_VDS_STAT 已接收:C0-0
    
    13:44:06.110 -> IC_STAT_2已接收:C0-2
    
    13:44:06.110 -> IC_CTRL 已接收:C0-6
    
    13:44:06.110 -> BRG_CTRL 已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_1已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_2已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_3已接收:C0-0
    
    13:44:06.110 -> VDWS_CTRL1_已接收:C0-0
    
    13:44:06.110 -> VDS_CTRL_2已接收:C0-0
    
    13:44:06.110 -> OLSC_CTRL 已接收:C0-0
    
    13:44:06.110 -> UVOV_CTRL 已接收:C0-0
    
    13:44:06.110 -> CSA_CTRL 已接收:C0-0 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    发出只 读寄存器高于 IC_CTL 寄存器(0美元x04)、只读寄存器可读取多次而不会出现问题

    当读取 R/W 寄存器时、第二个读取发送0x00、也可以成功读取其他寄存器。 我看起来像个软锁的家伙。

    13:44:06.110 ->===读数===
    
    13:44:06.110 -> IC_STAT_1已接收:C0-40
    
    13:44:06.110 -> VGS_VDS_STAT 已接收:C0-0
    
    13:44:06.110 -> IC_STAT_2已接收:C0-2
    
    13:44:06.110 -> IC_CTRL 已接收:C0-6
    
    13:44:06.110 -> BRG_CTRL 已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_1已接收:C0-FF
    
    13:44:06.110 -> DRV_CTRL_2已接收:C0-FF
    
    13:44:06.110 -> DRV_CTRL_3已接收:C0-20
    
    13:44:06.110 -> VDWS_CTRL1_已接收:C0-20
    
    13:44:06.110 -> VDS_CTRL_2已接收:C0-DD
    
    13:44:06.110 -> OLSC_CTRL 已接收:C0-0
    
    13:44:06.110 -> UVOV_CTRL 已接收:C0-14
    
    13:44:06.110 -> CSA_CTRL 已接收:C0-1
    
    13:44:06.110 ->==writing===
    
    13:44:06.110 ->===读数===
    
    13:44:06.110 -> IC_STAT_1已接收:C0-40
    
    13:44:06.110 -> VGS_VDS_STAT 已接收:C0-0
    
    13:44:06.110 -> IC_STAT_2已接收:C0-2
    
    13:44:06.110 -> IC_CTRL 已接收:C0-6
    
    13:44:06.110 -> BRG_CTRL 已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_1已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_2已接收:C0-0
    
    13:44:06.110 -> DRV_CTRL_3已接收:C0-0
    
    13:44:06.110 -> VDWS_CTRL1_已接收:C0-0
    
    13:44:06.110 -> VDS_CTRL_2已接收:C0-0
    
    13:44:06.110 -> OLSC_CTRL 已接收:C0-0
    
    13:44:06.110 -> UVOV_CTRL 已接收:C0-0
    
    13:44:06.110 -> CSA_CTRL 已接收:C0-0 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SPI R/W 序列(Arduino 已用于控制我们的模型板

    //================================================================ //
    //名称:VTI_SPIRWRegister  
    //================================================================ //
    //角色:来自单个 DRV8106S 器件的 RW 寄存器
    //------------------ //
    //请求:
    //------------------ //
    //输入:
    // u8Write:1写入/ 0读取
    // u8Address 寄存器地址
    // u8DataIn:要写入的数据
    // pu8StatusOut:状态读取上的指针
    // pu8DataOut :数据读取指针
    //输出:状态和读取数据(2字节)
    //================================================================ //
    void VTI_SPIRWRegister (uint8_t u8Writeuint8_t u8Address、uint8_t u8DataIn、uint8_t * pu8StatusOut、uint8_t * pu8DataOut )
    {
     uint16_t u16RxTxBuf = 0u


     //将 CS 置为有效
     digitalWrite (TI_CS_PIN、低电平);

     //准备命令缓冲位,顺序 b7到 b0
     //第一个字节 :00 W0 A5 A3 A2 A1 A0
     //第二字节 D7 D6 D5 D4 D3 D2 D1 D0
     //对于写命令(W0 = 0),响应字由故障状态指示位组成
     //后跟8个空位。
     //对于读取命令(W0 = 1),响应字由故障状态指示位组成
     //后面是正在读取的寄存器中的当前数据。
     u16RxTxBuf =(uint16_t)((u8Address & 0x3FU))<<8U+(uint16_t)(u8DataIn)

     if (u8Write!= 0u)//如果需要写入,则添加标志
     {
      u16RxTxBuf |= 0x4000U//设置位14
     }

     u16RxTxBuf=  spi.transfer16 (u16RxTxBuf);

     //将 CS 置为无效
     digitalWrite (TI_CS_PIN、高电平);

     //从 Rx 缓冲区获取状态
     * pu8StatusOut =(uint8_t)(u16RxTxBuf>>8)&0xFF

     //从 Rx 缓冲区获取数据  
     * pu8DataOut =(uint8_t)(u16RxTxBuf&0xFF);

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

    使用 EVB 固件值的测试序列、不能将 DRV_CTL 更改为 EE

    写命令的应答应发回0x00数据、取代0x40值

    15:18:46.672 -> DRV8206测试 V0.1
    
    15:18:47.674 ->===写入===
    
    15:18:47.674 ->发送 IC_CTL:87收到:C0-40
    
    15:18:47.674 ->发送 BRG_CTRL:0已接收:C0-0
    
    15:18:47.674 ->发送 DRV_CTRL_1:EE 接收:C0-40
    
    15:18:47.674 ->发送 DRV_CTRL_2:EE 接收:C0-40
    
    15:18:47.674 ->===读数===
    
    15:18:47.674 -> IC_STAT_1已接收:C0-40
    
    15:18:47.674 -> VGS_VDS_STAT 已接收:C0-0
    
    15:18:47.674 -> IC_STAT_2已接收:C0-2
    
    15:18:47.674 -> IC_CTRL 收到:C0-6
    
    15:18:47.674 -> BRG_CTRL 已接收:C0-0
    
    15:18:47.674 -> DRV_CTRL_1已接收:C0-FF
    
    15:18:47.674 -> DRV_CTRL_2已接收:C0-FF
    
    15:18:47.674 -> DRV_CTRL_3收到:C0-20
    
    15:18:47.674 -> VDS_CTRL1_已接收:C0-20
    
    15:18:47.674 -> VDS_CTRL_2已接收:C0-DD
    
    15:18:47.674 -> OLSC_CTRL 已接收:C0-0
    
    15:18:47.674 -> UVOV_CTRL 已接收:C0-14
    
    15:18:47.674 -> CSA_CTRL 已接收:C0-1 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    关闭 PVDD、按预期检测到 UV 条件、但写入 IC_CTL 清除故障不会生效

    16:02:53.756 ->发送 IC_CTL:87收到:E4-64
    
    16:02:58.763 ->===读数===
    
    16:02:58.763 -> IC_STAT_1已接收:E4-64
    
    16:02:58.763 -> VGS_VDS_STAT 已接收:E4-0
    
    16:02:58.763 -> IC_STAT_2已接收:E4-82 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在设置了 SPI_OK 位、这是通过在 SLEEP 信号取消置位之前将 SCK 和其他控制信号设置为相关状态来固定的。

    无论写入如何不起作用、并且针对转售者0x05至0x0D 的读取仅起作用一次(首次读取后读为零)

    写入标志正确设置 IC_CTL 读取0x0400 通过 SPI 发送、写入0x4400通过 SPI 发送

    UV 报告工作,但由于寄存器写入问题而无法清除

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

    嘿、Jerome、

    我希望我们的汽车专家了解他对此的看法。

    您是否有 可用于进行测试和比较的 DRV8106S-Q1EVM? 您可以使用逻辑分析仪或示波器将您的 SPI 命令与 EVM 进行比较。   

    是否仔细检查了 SPI 时序、CS/CLK 极性和边沿设置是否符合6.6时序要求? 我只是想先讲一讲基础知识。   

    此致、

    雅各布

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

    您好!

    正如 Jacob 指出的、最好检查6.6定时要求。 EVM 和逻辑分析仪可以提供帮助。

    如果您看到 SPI_OK、MCU 可能会在 nSCS 为低电平时发送多于或少于16CLK。  下面是成功通信的 DRV 系列器件示例。  B15和 B14应为11、SCLK 应为16clk。 最好检查一下 Jacob 提到的那些。

    nSLEEP 应处于高电平、而 DVDD 应是用于 SPI 通信的良好稳定电源。 建议在 DVDD 引脚和 GND 之间使用1uF 电容器。

    此致

    森田真也

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

    我发现了问题、R/W 位逻辑 反相。

    谢谢