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.

[FAQ] [参考译文] [常见问题解答] SPI 配置和使用

Guru**** 2445440 points
Other Parts Discussed in Thread: TMS320F280049C

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/937258/faq-spi-configuration-and-use

主题中讨论的其他器件:TMS320F280049CDRV832X

将 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 (命令字);