简介:DRV8703D-Q1 芯片调试文档面向电机驱动开发者与硬件工程师,围绕芯片从电路搭建到 SPI 软件配置给出系统调试指引。文档先梳理半桥电路、SPI 接口和电源电路三块电路板设计要点,再详解 SPI 初始化参数,包括上升沿输出/下降沿输入、16 位数据长度、波特率 37.5M/100 等,同时解释 16 位传输格式中 W0 位对读写命令的区分。寄存器章节逐个说明 FAULT Status、VDS and GDF、Main Control、IDRIVE and WD、VDS Control、Config Control 六个寄存器的功能与初始化值,例如 Main Control 写入 0x0019、IDRIVE and WD 写入 0x0087,方便读者直接参考配置。资源为 1 个 docx 文档,压缩包大小 528KB,可作为芯片调试的速查手册。目前该资源已有 2589 人学习,适合需要快速掌握 DRV8703D-Q1 寄存器配置或定位电机驱动异常的技术人员。
1. DRV8703D-Q1 上电先配 SPI 再谈 PWM:半桥驱动的六寄存器任务
一块电机驱动板上电后 nFAULT 直接拉低、SPI 写寄存器始终不生效,这往往不是 PWM 配置问题,而是 SPI 帧在对齐之前就被芯片丢弃了。DRV8703D-Q1 是 TI 的车规级半桥栅极驱动器,MCU 通过 4 线 SPI 写六个寄存器完成死区、栅极驱动电流、VDS 过流阈值和看门狗配置,配置完成后半桥才允许响应 IN1/IN2 的 PWM 输入。硬件调试时最容易忽略的是芯片 SPI 时序的主从边沿匹配,以及 Main Control 寄存器要分 0x0019 和 0x0031 两阶段写入。这篇文章把这套调试流程拆开:从 F2812 的 SPI 参数设置、16 位帧结构、6 个寄存器的初始化矩阵,到最后的回读验证和 nFAULT 定位。
2. F2812 SPI 边沿对齐与 DRV8703D-Q1 的 CPOL/CPHA 匹配
2.1 芯片要求的通信沿:上升沿发送,下降沿接收
DRV8703D-Q1 的 SPI 从机逻辑定义很明确:SDO 在 SCLK 上升沿更新数据,主机在下降沿采样 SDO;同时主机应在上升沿发送数据到 SDI,芯片在下降沿锁存 SDI。这就是 SPI Mode 0,即 CPOL=0、CPHA=0:SCLK 空闲为低电平,数据在第一个边沿(上升沿)被驱动,在第二个边沿(下降沿)被采样。
F2812(TMS320F281x)的 SPI 模块初始化为上升沿发送、下降沿接收,正好与芯片对齐。硬件调试中如果出现"写寄存器后读回全是 0xFFF"或者"寄存器写进去了但行为不对",第一步检查 SCLK 空闲电平是不是低,第二步检查主设备是不是在下降沿采样。把这两点确认好,比拿着示波器逐 bit 数数据更省时间。
SpiaRegs.SPICCR.all = 0x000F; // 16位字符长度,时钟空闲为低,上升沿发送 SpiaRegs.SPICTL.all = 0x0006; // 主模式,使能发送 SpiaRegs.SPIBRR.all = 0x0063; // 波特率 = 37.5MHz / (99+1) = 375kHz SpiaRegs.SPICCR.bit.SPISWRESET = 1; // 完成配置后软件复位使能 SPI0x000F 的低 4 位全为 1,表示 SPI 字符长度是 16 位,这一点必须与 DRV8703D 的 16 位帧对齐;bit6 的 CLOCK_POLARITY 为 0,SCLK 空闲为低。SPICTL 的 0x0006 中 bit2=1 是主设备模式,bit1=1 使能发送,如果不置 TALK 位,TXBUF 的数据不会出现在 SDO 上,抓波形只能看到时钟和片选在跳,数据线完全没反应。SPISWRESET 必须放到最后置 1,SPICCR/SPICTL/SPIBRR 的修改在复位状态期间才会被正确锁存。
2.2 375kHz 波特率与字符宽度取舍
SPIBRR 寄存器写 0x0063,十进制 99,实际波特率用 LSPCLK / (SPIBRR + 1) 计算,37.5MHz 时钟下得到 375kHz。这个速度对于 16 位帧来说,单帧传输时间大约 42.6us,配置周期很短,同时线缆容忍度高,适合调试阶段使用。如果板子上 SCLK 走线较长,或者电机相线靠近 SPI 排线,375kHz 比强行跑到 1MHz 以上可靠得多。
| SPIBRR 写入值 | 十进制 | 分频系数 | SCLK 频率 |
|---|---|---|---|
| 0x0063 | 99 | 100 | 375 kHz |
| 0x0031 | 49 | 50 | 750 kHz |
| 0x0015 | 21 | 22 | 1.704 MHz |
把波特率调高之前,建议先用回读命令确认 SDO 数据稳定。DRV8703D 没有像 I2C 那样的 ACK 应答,写命令是否生效只能通过后续读命令把寄存器内容拉回来验证。把 SCLK 提上去之后如果发现回读数据偶尔跳变,优先降回 375kHz,不要急着改线缆。
这里补充一点给使用 STM32F103 平台的参考:用 CubeMX 生成 SPI 时同样选 Mode0,MSB First,16 位数据帧;如果驱动代码里只能发 8 位,就按先高字节后低字节的顺序发送,先发 W0 和地址段所在的高字节,再发数据低字节,否则帧边界会错位。
3. DRV8703D-Q1 的 16 位帧格式与六寄存器地址映射
3.1 W0 位、地址段与数据段的划分
DRV8703D 的 SPI 帧固定 16 位,最高位 W0 决定读写方向:W0=0 是写命令,W0=1 是读命令。芯片只暴露六个寄存器,地址段用 3 位足够,数据段占满剩余 12 位。帧布局可以理解为:bit15 为 W0,bit14:12 为寄存器地址,bit11:0 为数据。
构造命令帧时最容易犯的错误是把地址左移位数搞错。地址要放到 bit14:12,不是放在最高字节里,否则芯片解析出来的地址段全是 0,命令全部落到 FAULT Status 这类只读寄存器上,写操作被静默丢弃。
#define DRV8703_SPI_WRITE(addr, data) (0x0000 | ((addr & 0x7) << 12) | (data & 0x0FFF)) #define DRV8703_SPI_READ(addr) (0x8000 | ((addr & 0x7) << 12)) uint16_t drv8703_frame; drv8703_frame = DRV8703_SPI_WRITE(0x03, 0x0087); // 写 IDRIVE and WD 寄存器写宏把地址段限制在 3 位,数据段限制在 12 位,避免越界位污染 W0。读宏直接把 bit15 置 1,发送后从 SDO 拿到的返回帧低 12 位就是目标寄存器内容。注意全双工 SPI 下 SDO 移出的数据是发送命令之前锁存的值,所以想读到刚写完的寄存器,需要连发两次读命令,第二次返回的才是有效内容。
3.2 六个寄存器的角色与初始化值
六个寄存器中,FAULT Status 和 VDS and GDF 是只读寄存器,其余四个读写。只读寄存器在调试阶段的价值很大:上电先读一次 FAULT Status,等于让芯片向 MCU 汇报自身状态,再决定要不要继续往下配。
| 地址 | 寄存器名 | 读写属性 | 调试初始化值 | 作用 |
|---|---|---|---|---|
| 0x00 | FAULT Status | 只读 | 读取检查 | 汇总 VDS、GDF、UVLO 等故障 |
| 0x01 | VDS and GDF | 只读 | 读取检查 | 锁定过流与栅极驱动故障来源 |
| 0x02 | Main Control | 读写 | 0x0019 后切 0x0031 | 输入逻辑与半桥运行模式 |
| 0x03 | IDRIVE and WD | 读写 | 0x0087 | 死区、看门狗、栅极驱动电流 |
| 0x04 | VDS Control | 读写 | 0x0070 | VDS 比较阈值与重试机制 |
| 0x05 | Config Control | 读写 | 0x0021 | 斩波与电流镜放大器开关 |
地址按芯片手册的六寄存器顺序排列,如果手头手册的地址偏移不同,替换宏定义里的地址段即可,帧构造方式不变。VDS and GDF 寄存器记录的是故障发生瞬间的状态,芯片内部会锁存,读完后需要清除故障源并重新初始化对应功能,否则 nFAULT 一直保持低电平。我自己调试时会先读 0x00,再读 0x01,两个值组合起来判断是桥臂过流还是栅极驱动异常。
4. 寄存器初始化矩阵:从 0x0019 到 0x0021 的配置序列
4.1 Main Control 为什么写两次
Main Control 在初始化流程里要写两个不同数值,这是 DRV8703D 调试中最容易抄错的地方。上电后第一帧写 0x0019,展开成二进制是 00011001,bit0、bit3、bit4 被置位,这个阶段的作用是让 IN1/IN2 输入引脚的电平参与内部逻辑,使 PWM 信号能够进入芯片,但半桥输出级此时还不具备完整的驱动配置。完成其余寄存器写入后,再把 Main Control 改写为 0x0031,也就是 00110001,bit4、bit5 相比第一阶段被置位,半桥进入实际运行状态。
我的理解是 0x0019 相当于预配置模式,先打通输入通路,让后续 SPI 写入不受输出级状态干扰;0x0031 才是真正的运行模式。如果把 0x0031 直接作为第一步写入,内部驱动级参数还是默认值,此时如果 PWM 已经跑起来,输出桥臂可能处于未知状态,故障保护逻辑会被噪声误触发。两阶段切换时 PWM 引脚应保持无效电平,等 0x0031 写完后再放开 PWM 输出。
4.2 IDRIVE、VDS、Config 三个寄存器的参数语义
IDRIVE and WD 写 0x0087,对应二进制 10000111。bit7 置 1 是关闭看门狗,避免调试过程中长时间不发 SPI 命令导致芯片复位;低 3 位为 111,选择高边驱动电流 440mA、低边 430mA,死区时间配置为 120ns。这个电流档位配合 IRFSL4310 这类 N 沟道功率管,栅极充放电速度足够。现场如果电机出现明显的振铃或尖叫声,把驱动电流调低一档比盲目加大栅极电阻更有效,栅极电阻过大会把开关损耗推到 MOS 管上,散热问题更麻烦。
VDS Control 写入 0x0070,即 01110000,把 VDS 比较阈值推到较高档位,同时关闭电流镜和重试机制。本设计中低边使用 0.03Ω 采样电阻并联做电流采样,电流环由 MCU 通过采样电阻闭环控制,VDS 只负责最后一道短路防线。关闭自动重试后,过流故障直接锁定到 nFAULT,MCU 读取 FAULT Status 再做策略处理,不会出现桥臂反复重启把 MOS 管打穿的情况。
Config Control 写入 0x0021,即 00100001,禁止斩波电流设置,同时关闭电流镜放大器。纯电压 PWM 驱动场景下,电流斩波在电机启动瞬间容易被相电流误触发,放大器的开关噪声也会耦合到模拟比较器上。采样电阻如果走的是 MCU ADC 回路,就不需要让芯片内部的电流镜参与。
void drv8703_init(void) { // 1. nSCS 拉低,发送第一帧:Main Control 进入预配置状态 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x02, 0x0019)); spi_cs_high(); // 2. 依次配置死区、驱动电流、看门狗、VDS 阈值 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x03, 0x0087)); spi_cs_high(); spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x04, 0x0070)); spi_cs_high(); spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x05, 0x0021)); spi_cs_high(); // 3. 全部配置完成后,Main Control 切到运行态 spi_cs_low(); drv8703_spi_xfer(DRV8703_SPI_WRITE(0x02, 0x0031)); spi_cs_high(); }每一帧都是独立的片选周期:nSCS 拉低、SCLK 移 16 位、nSCS 拉高。代码里每次写寄存器都单独拉低再拉高片选,是因为 DRV8703D 按帧识别数据,SCLK 第 16 个边沿之后 nSCS 必须释放一次。有人把片选全程拉低连续发 5 帧,芯片会把后续帧当作前一帧的延续,最终只有最后一帧被正确解析。
4.3 初始化时序与 PWM 释放顺序
整个初始化流程在实际板卡上执行时间很短,但顺序不能调整。先给 VM 上电,等待 DVDD 稳定,nSLEEP 拉高让芯片退出 sleep,之后依次写 0x0019、0x0087、0x0070、0x0021,最后写 0x0031。每一步之间不需要额外延时,因为 SPI 时钟 375kHz 下每一帧本身就有几十微秒间隔,芯片内部逻辑有足够时间锁存。
注意整个初始化期间 PWM 引脚必须保持无效电平。有些工程师先在 MCU 里配好 EPWM,再回头调 SPI,结果配置过程中 PWM 已经输出高电平,半桥直接导通,VDS 保护动作把 nFAULT 拉低。调试时要养成习惯:先完成 DRV8703 的全部寄存器配置,读取 FAULT Status 确认无故障,最后才使能 PWM 输出。用串口调试助手打印每个关键步骤的返回值,能直观看到哪一帧没写进去。
5. 回读验证与 nFAULT 故障定位技巧
5.1 两次读命令确认寄存器最终状态
Main Control 写完 0x0031 之后,用读命令把寄存器内容拉回来比对着看。第一次发送读命令,SDO 返回的是上一次 SPI 事务结束时锁存的数据,第二次发送相同读命令,返回的才是 0x0031。如果第二次回读得到的还是 0x0019,说明第二阶段写命令没有生效,优先检查 nSCS 的帧边界,而不是怀疑寄存器数值。
uint16_t drv8703_read_main_control(void) { uint16_t resp; spi_cs_low(); resp = drv8703_spi_xfer(DRV8703_SPI_READ(0x02)); // 第一帧,丢弃 spi_cs_high(); spi_cs_low(); resp = drv8703_spi_xfer(DRV8703_SPI_READ(0x02)); // 第二帧,有效回读 spi_cs_high(); return resp & 0x0FFF; }回读值取低 12 位,因为返回帧的 bit15 是芯片回填的状态位,bit14:12 是地址回显,数据段固定在低 12 位。如果连续多帧读回 0x0FFF,大概率是 SDO 线悬空,芯片根本没有应答,检查 nSCS 是否真正拉低、SCLK 是否进入芯片。
5.2 用故障寄存器区分 VDS 和 GDF 故障源
nFAULT 拉低后先读 0x00 和 0x01,两个只读寄存器配合起来能缩小排查范围。FAULT Status 为 0x0000 表示无故障,这是正常状态。如果读到非零值,0x01 寄存器里 VDS 相关位被置位,说明桥臂出现过流,重点查 MOS 管的 DS 电压和负载回路;栅极驱动故障位被置位,则查 GH/SH/GL/SL 四路栅极驱动到 MOS 管栅极的走线,以及 VM 电源是否掉到欠压阈值以下。
| 回读现象 | 可能原因 | 排查动作 |
|---|---|---|
| 回读全 0x0FFF | SDO 无应答 | 查 nSCS 帧边界、SCLK 极性 |
| FAULT Status 非零,VDS 位置位 | 桥臂过流或短路 | 查 MOS 管、采样电阻、电机相线 |
| FAULT Status 非零,GDF 位置位 | 栅极驱动异常 | 查 GH/GL 输出、VM 电压 |
| Main Control 回读 0x0019 | 第二阶段写入被丢弃 | 查片选时序、PWM 是否提前使能 |
把 SDO 回读数值与 0x0031 比对,就能判断第二阶段配置是否锁定;如果回读一直停在 0x0019,优先查 nCS 帧边界而不是寄存器值。
本文还有配套的精品资源,点击获取