主题中讨论的其他器件:DRV8711、 TMS320F280025C
工具与软件:
尊敬的支持团队:
我正在使用 DRV8711 EVM 板控制步进电机。 为了测试电路板是否有任何硬件问题、我首先使用了 Arduino UNO 并获得了以下逻辑分析仪信号。 使用此设置、我能够根据需要控制电机。
Arduino Uno 逻辑捕获
DRV8711写入时序图
下一步、我将尝试使用 TMS320F280025C LAUNCHXL 使用相同的 DRV8711 EVM 板来控制同一个电机。 下面是 DRV8711数据表中的 SPI 写入时序图、我将它用作初始化的参考。 我的初始化代码如下:( SPI_BIT_RATE 24的 SPI 波特率1 MHz)
void SPI_init (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 3;
GpioCtrlRegs.GPAGMUX1.bit.GPIO8 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 3;
GpioCtrlRegs.GPAGMUX1.bit.GPIO9 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 3;
GpioCtrlRegs.GPAGMUX1.bit.GPIO10 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1;
GpioCtrlRegs.GPAINV.bit.GPIO23 = 0;
GpioCtrlRegs.GPAODR.bit.GPIO23 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO23 = 1;
GpioCtrlRegs.GPAQSEL1.bit.GPIO8 = 3;//异步输入(SPISIMOA)
GpioCtrlRegs.GPAQSEL1.bit.GPIO10 = 3;//异步输入(SPISOMIA)
GpioCtrlRegs.GPAQSEL1.bit.GPIO9 = 3;//异步输入(SPICLKA)
EDIS;
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR =(8 - 1);
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.talk = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;
SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 24;
SpiaRegs.SPIPRI.bit.free = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFTX.bit.SPIRST = 1;
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}
此初始化设计符合数据表说明:"要完成读取或写入事务、SCS 必须设置为逻辑0。" 我的传输函数如下:
uint16 spi_txmit (Uint16数据)
{
INT ret = SPI_SUCCESS;
uint16 datain = 0;
SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
if (ret)
{
uint16超时= 1000;
IF (SpiaRegs.SPIFFRX.bit.RXFFST)
{
DATAIN = SpiaRegs。 SPIRXBUF;
}
while (SpiaRegs.SPISTS.bit.BUFFULL_flag!= 0且超时)
--超时;
if (!timeout)
RET = SPI_FAILURE;
if (ret)
{
超时= 1000;
while (SpiaRegs.SPIFFTX.bit.TXFFST!= 0);
SpiaRegs。 SPITXBUF =(SpiaRegs.SPICCR.bit.SPICHAR < 8)? ((data <<8)& 0xFF00):data;
SpiaRegs.SPICTL.bit.talk = 1;
while (!SpiaRegs.SPIFFRX.bit.RXFFST &&超时)
--超时;
if (!timeout)
RET = SPI_FAILURE;
if (ret){
SpiaRegs.SPICTL.bit.talk = 0;
}
}
}
RETURN ret == SPI_SUCCESS? (int)(datain & 0xFF):ret;
}
void drv8711_transmit (uint8_t 地址、uint16_t 数据)
{
uint8_t DATA_HIGH_BYTE =((DATA >> 8)& 0x1F)|((ADDRESS 和0x07)<< 5);
uint8_t DATA_LOW_BYTE = DATA & 0xFF;
SPI_chipselect (1);
SPI_txmit (data_high_byte);
SPI_txmit (data_low_byte);
DELAY_US (2);
SPI_chipselect (0);
}
尽管采用了这种设置、但我在执行代码后获得的逻辑分析仪示例显示步进电机无法正常运行。 下面是我捕获的信号:
F28002x CPOL 1逻辑捕获
目前、CPOL 设为0、CPHASE 设为1。 但是、我在逻辑分析仪上观察到的数据不正确;我看到的是0x07和0x63、而不是预期数据(0x03和0x31)。 逻辑分析仪设置为 CPOL 0、CPHASE 1、使能线路设置为高电平有效。 当我在逻辑分析仪上将 CPHASE 更改为0时、将得到以下信号:数据显示正确、但信号不符合预期。
F28002x CPOL 0逻辑捕捉
Arduino 和 TMS320生成的信号之间的主要区别在于两个时钟周期之间的时间:Arduino 的1.875 µs 和 TMS 的3.5 µs。 如我的代码所示、传输之间不存在有意的延迟。 此外、为了在传输期间使 MOSI 线路保持高电平、我在数据传输期间启用 TMS 上的 TALK 位、并在 FIFO 为空时将其禁用。
F28002x 技术参考手册按如下所示介绍数据传输过程、但此行为与 DRV8711的要求相冲突、因此我在代码中进行了相应调整:
F28002x 写入时序图
此时、我不确定 SPI 实现是否正确、而且我一直在控制步进电机。 您能帮我解决这个问题吗?
提前感谢您的支持。
此致、