将 BLDC 电机驱动器与 SPI 搭配使用时、务必从 MCU 正确设置 SPI 设置、以匹配所需的格式并与 DRV 器件正确通信。 此常见问题解答演示了在 BLDC 电机驱动器应用中使用 SPI 时所需的硬件连接和 SPI 设置。
SPI 硬件
下图列出了从 MCU 到 DRV 器件所需的 SPI 总线连接:
|
标准名称 |
缩写 名称 |
TI MCU |
DRV SPI 引脚 |
|
主输出辅输入 (以前称为主器件输出从器件输入) |
MOSI |
SIMO |
SDI |
|
主输入辅输出 (以前称为主设备输入从设备输出) |
MISO |
SOMI |
SDO |
|
SPI 时钟 |
SCK |
SCK |
SCLK |
|
SPI 芯片选择 |
CS 或 SS |
STE |
nSCS |
确保检查数据表以确定每个 SPI 引脚是否需要外部上拉或下拉电阻器、或者是否配置为推挽引脚。
SPI 设置
有效的 SPI 帧必须满足 DRV 数据表“SPI 编程”部分确定的许多条件。 通常、有效 SPI 帧必须满足以下条件:
- 当 nSCS 引脚从高电平转换为低电平以及从低电平转换为高电平时、SCLK 引脚应为低电平
- 当 nSCS 引脚被拉为高电平时、SCLK 和 SDI 引脚上的任何信号都将被忽略、SDO 引脚将处于高阻态
- 数据在 SCLK 引脚的下降沿被捕捉、数据在 SCLK 引脚的上升沿被传播
- 必须经过完整的16个 SCLK 周期才能使事务有效
- 如果发送到 SDI 引脚的数据字小于或大于16位、则会发生帧错误并忽略数据字
有关如何使用 TMS320F280049C C2000 MCU 配置 SPI 的示例,请参阅“SPI 示例”中的 Config_EVM_SPI()函数。
SPI 读/写
数据表的“SPI 格式”部分描述了通过 SDI 引脚传入数据字的16位格式。 所有 DRV 器件通常具有1个读取或写入位(R/W)、地址位和数据位。
在固件的 SPI 读取和 SPI 写入函数中,通过将地址位移动到控制字中地址开始的正确位置并使用 R/W 位进行逻辑或运算(如果执行读取命令),确保构建正确的控制字。 或数据位(如果执行写命令)。
例如、在 DRV832x SPI 器件中、SDI 和 SDO 数据字格式如下:
要执行写操作、必须将大小为4位的地址向左移动11位、以便将位3移动到位14、其中地址的 MSB 需要位于该位置。 数据应使用0xFF 屏蔽并进行逻辑或运算、以免丢失 R/W 位和地址位的内容。
要执行读取操作、必须将大小为4位的地址向左移动11位、以便将位3移动到位14、其中地址的 MSB 需要位于该位置。 R/W 位(1表示读取)可向左移动15位以与 B15保持一致、或者控制字可与0x8000进行逻辑或运算、因此 R/W 将设置为1。
DRV832x 的 SPI 读取和写入命令示例可在下面的 SPI 示例中找到。
SPI 示例
下面是使用 TMS320F280049C C2000 MCU 的 SPI 和典型 DRV 栅极驱动器器件进行配置、读取和写入的示例。
空 Config_EVM_SPI (空)
{
//引脚配置
EALLOW;
// SPI_MOSI
GPIO_SetupPinOptions (16、GPIO_INPUT、GPIO_异 步| GPIO_PULLUP);
// SPI_MISO
GPIO_SetupPinOptions (17、GPIO_INPUT、GPIO_异 步| GPIO_PULLUP);
// SPI_CS
GPIO_SetupPinOptions (56、GPIO_INPUT、GPIO_异 步| GPIO_PULLUP);
// SPI_CLK
GPIO_SetupPinOptions (57、GPIO_INPUT、GPIO_异 步| GPIO_PULLUP);
GPIO_SetupPinMux (16、GPIO_MUX_CPU1、1);
GPIO_SetupPinMux (17、GPIO_MUX_CPU1、1);
GPIO_SetupPinMux (56、GPIO_MUX_CPU1、1);
GPIO_SetupPinMux (57、GPIO_MUX_CPU1、1);
EDIS;
EALLOW;
ClkCfgRegs.LOSPP.ALL = 0;
EDIS;
//初始化 SPI FIFO 寄存器
SpiaRegs.SPIFFTX.All=0xE040;
SpiaRegs.SPIFFRX.All=0x2044;
SpiaRegs.SPIFFCT.All=0x0;
//SPI 设置
SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI 复位打开
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//SCLK 高电平有效
SpiaRegs.SPICCR.bit.SPICHAR = 0xF;//16位 SPI 字符
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICTL.bit.OVERRUNINTENA=0;//无溢出中断
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//PHASE 0
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//主模式,变量名称尚未更新为当前命名规则
SpiaRegs.SPICTL.bit.TALK = 1;//nSCS 被启用
SpiaRegs.SPICTL.bit.SPIINTENA=0;//TX/RX 中断被禁用
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE =((25000000 / 1000000)- 1);//将波特率设置为1MHz
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点以避免干扰传输
SpiaRegs.SPICCR.bit.SPISWRESET = 1;//退出 SPI 复位
}
uint16 SPI_xmit (uint16 spiFrame)
{
SpiaRegs.SPITXBUF= spiFrame;
//等待 RX 标志指示 SPI 帧完成
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1)
{
}
返回 SpiaRegs.SPIRXBUF;
}
UINT16 SPI_READ (UINT16 addr)
{
uint16命令字=(0x8000 |(addr << 11));
返回 SPI_xmit (命令字);
}
UINT16 SPI_WRITE (UINT16 addr、UINT16数据)
{
uint16命令字=((addr << 11)|数据);
返回 SPI_xmit (命令字);
}

