请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28035 主题中讨论的其他器件:DRV8711
您好!
我目前遇到问题、即 SPIB SIMO 线路在向 DRV8711传输8个(16位)字后锁存为高电平。 DRV8711似乎已正确设置、因为测试设置中的步进电机能够移动。 但是、当我在初始设置后尝试写入或读取寄存器时、DRV8711没有响应。 我使用的是定制电路板。 附件是我的测试代码。 谢谢你。
#include "DSP28x_Project.h"
#include <stdint.h>
#ifdef _FLASH
extern Uint16 RamfuncsRunStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsLoadStart;
#endif
void epwm1RegInit(void)
{
EPwm1Regs.TBSTS.all = 0;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTR = 0;
EPwm1Regs.CMPCTL.all = 0x50; // immediate mode for CMPA and CMPB
EPwm1Regs.CMPB = 0;
EPwm1Regs.AQCTLA.all = 0x00;// Reset CMPA
EPwm1Regs.AQCTLA.bit.ZRO = 0x02; // output High at zero
EPwm1Regs.AQCTLA.bit.PRD = 0x00; // Unaffected.
EPwm1Regs.AQCTLA.bit.CAU = 0x01;// output low at CMPA
EPwm1Regs.AQCTLB.all = 0x09;
EPwm1Regs.AQSFRC.all = 0;
EPwm1Regs.AQCSFRC.all = 0;
EPwm1Regs.ETSEL.all = 0x0B; // Interrupt on ZERO
EPwm1Regs.ETPS.all = 1;
EPwm1Regs.ETFLG.all = 0;
EPwm1Regs.ETCLR.all = 0;
EPwm1Regs.ETFRC.all = 0;
EPwm1Regs.PCCTL.all = 0;
EPwm1Regs.TBCTL.all = 0x0010 + 0x200C;
EPwm1Regs.TBCTL.bit.CLKDIV = 0x6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0;
}
void spiTxDrv(Uint16 tx)
{
Uint16 dummyRead = 0;
SpibRegs.SPITXBUF = tx;
while (SpibRegs.SPIFFRX.bit.RXFFST == 0) {}
dummyRead = SpibRegs.SPIRXBUF;
}
Uint16 spiRxDrv(Uint16 rx)
{
Uint16 spiReturn = 0;
SpibRegs.SPITXBUF = rx;
while (SpibRegs.SPIFFRX.bit.RXFFST == 0) {}
spiReturn = SpibRegs.SPIRXBUF;
return spiReturn;
}
int main(void)
{
Uint16 txData = 0;
Uint16 rxData = 0;
float32 prd = 0.0;
Uint16 cmp = 0;
Uint16 fail = 0;
Uint16 i = 0;
Uint16 regVals[8] = {0x0119, 0x10C3, 0x2060, 0x3000, 0x4510, 0x531E, 0x6005, 0x7000};
Uint16 mask[8] = {0x0FFF, 0x07FF, 0x01FF, 0x01FF, 0x07FF, 0x0FFF, 0x0FFF, 0x00FF};
InitSysCtrl();
#ifdef _FLASH
memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart,(unsigned long)&RamfuncsLoadSize);
InitFlash();
#endif
InitGpio();
// spib gpio.
EALLOW;
//
// Enable internal pull-up for the selected pins
// Pull-ups can be enabled or disabled disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; //Enable pull-up on GPIO24 (SPISIMOB)
GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; //Enable pull-up on GPIO13 (SPISOMIB)
GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; //Enable pull-up on GPIO14 (SPICLKB)
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; //Enable pull-up on GPIO15 (SPISTEB)
//
// Set qualification for selected pins to asynch only
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO24 (SPISIMOB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (SPISOMIB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (SPICLKB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (SPISTEB)
//
// Configure SPI-B pins using GPIO regs
// This specifies which of the possible GPIO pins will be SPI functional
// pins. Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3; // Configure GPIO24 as SPISIMOB
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3; // Configure GPIO13 as SPISOMIB
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3; // Configure GPIO14 as SPICLKB
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 3; // Configure GPIO15 as SPISTEB
EDIS;
// set spib register.
SpibRegs.SPICCR.bit.SPISWRESET = 0; //Set SPISWRESET=0 before SPI configuration
SpibRegs.SPIBRR = 14; // spiclk 1MHz.
SpibRegs.SPICCR.bit.SPICHAR = 0xF; // 16bit word.
SpibRegs.SPICTL.all = 0x000E; // clk phase, master, talk = 1
SpibRegs.SPIFFTX.all = 0xE000;
SpibRegs.SPIFFRX.all = 0x6000;
SpibRegs.SPICCR.bit.SPISWRESET = 1; //Set SPISWRESET=1 before SPI configuration
// epwm1a gpio setup.
EALLOW;
//
// Disable internal pull-up for the selected output pins
// for reduced power consumption
// Pull-ups can be enabled or disabled by the user.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // Disable pull-up on GPIO0 (EPWM1A)
//
// Configure EPWM-1 pins using GPIO regs
// This specifies which of the possible GPIO pins will be
// EPWM1 functional pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
// set epw1 registers.
epwm1RegInit();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
// DRV8711 GPIOs
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; //DIR
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; //RESET
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; //n_SLEEP
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; //n_STALL
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0; //n_FAULT
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; //DIR
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; //RESET
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; //n_SLEEP
GpioCtrlRegs.GPADIR.bit.GPIO4 = 0; //N_STALL
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0; //n_FAULT
GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0; //DIR
GpioCtrlRegs.GPAQSEL1.bit.GPIO2 = 0; //RESET
GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 0; //n_SLEEP
GpioCtrlRegs.GPAQSEL1.bit.GPIO4 = 0; //n_STALL
GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 0; //n_FAULT
// led at gpio9.
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0; // set as GPIO44
GpioCtrlRegs.GPBDIR.bit.GPIO44 = 1; // set as output
EDIS;
GpioDataRegs.GPASET.bit.GPIO9 = 1;
GpioDataRegs.GPBSET.bit.GPIO44 = 1;
// don't care about direction for test.
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
// reset pin on DRV8711 is active-high.
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
// Set sleep to high to enable DRV8711.
GpioDataRegs.GPASET.bit.GPIO3 = 1;
DELAY_US(10000);
// calculate prd for 4Khz pwm for 150rpm @ 1/8 step.
prd = (1.0 / 4000.0);
prd /= (1.0 / 937500.0);
prd -= 1.0;
cmp = (Uint16)prd;
cmp /= 2;
/*
* gain = 10.
* mode = 1/8 step.
* enable = 1.
*/
spiTxDrv(regVals[0]);
// torque = 195.
spiTxDrv(regVals[1]);
// toff = 96.
spiTxDrv(regVals[2]);
// tblank = 0.
spiTxDrv(regVals[3]);
// decay = auto mixed.
spiTxDrv(regVals[4]);
// stall after 8 steps, stall thresh = 30.
spiTxDrv(regVals[5]);
// ocp thresh 500mV, deglitch = 1us.
spiTxDrv(regVals[6]);
// clear status register.
spiTxDrv(regVals[7]);
// set epwm1a.
EPwm1Regs.TBPRD = (Uint16)prd;
EPwm1Regs.CMPA.half.CMPA = cmp;
// let stepper motor run for 5 seconds.
DELAY_US(5000000);
// stop stepper motor.
EPwm1Regs.TBPRD = 0;
EPwm1Regs.CMPA.half.CMPA = 0;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
// wait 5 seconds.
DELAY_US(5000000);
for (i = 0; i < 8; i++)
{
// read a register.
rxData = spiRxDrv(0x8000 | i << 12);
rxData &= mask[i];
if (rxData != (regVals[i] & mask[i]))
{
fail = 1;
}
}
while (1)
{
if (fail == 1)
{
GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
DELAY_US(500000);
GpioDataRegs.GPASET.bit.GPIO9 = 1;
DELAY_US(500000);
}
}
return 0;
}

