Part Number: DRV8711
Tool/software: Code Composer Studio
Hi all,
I am using DRV8711 for my stepper motor control project. First i tried with MSP430g2553 controller and DRV8711 evaluation kit, its working fine.
Based on that i developed new own board with MSP430G2553 28 pin package and DRV8711. I wrote code for that, my issue is Motor not run even single step.
SPI communication between DRV and MSP is working fine and other I/O's are also working good.
I attached my schematic and program also. I put pullup resistor for nSTALL and RESET pins and i removed all series resistor connected between MSP and DRV8711.
Help anyone to solve this.
Regards
Yuvaraj
int main(void)
{
Initialize();
unsigned int i=0,j=5500,x=0;
P2OUT &= ~nSLEEP;
P2OUT |= RESET;
for(i=0;i<1000;i++);
P2OUT |= nSLEEP;
P2OUT &= ~RESET;
P2DIR = (RESET | STEP_AIN1 | nSLEEP);
P2DIR &= ~nFAULT;
P3DIR = (CS | DIR_AIN2);//0xff;
P2OUT |= (RESET | STEP_AIN1 | nSLEEP);
P3OUT |= (CS | DIR_AIN2);
P2OUT &= ~RESET;
while(1)
{
if ((nFAULT & P2IN) == 0)
{
P2OUT &= ~nSLEEP;
P2OUT |= RESET;
for(i=0;i<1000;i++);
for(i=0;i<1000;i++);
P2OUT |= nSLEEP;
for(i=0;i<1000;i++);
ReadAllRegisters();
P2OUT &= ~RESET;
}
ReadAllRegisters();
for(i=0;i<j;i++);
P2OUT |= STEP_AIN1;
for(i=0;i<j;i++);
P2OUT &= ~STEP_AIN1;
if(j<1000)
j=1000;
}
}
void Initialize()
{
WDTCTL = WDTPW | WDTHOLD;
DCOCTL = 0x00;
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 |= DIVS_3;
BCSCTL3 |= LFXT1S_2;
// Configure GPIO
P2SEL &= ~(POT | nSLEEP);
P2SEL2 &= ~(POT | nSLEEP);
P2DIR = RESET | STEP_AIN1 | nSLEEP;
P2DIR &= ~nFAULT;
P3DIR = CS | DIR_AIN2;//0xff;
P2OUT |= RESET | STEP_AIN1 | nSLEEP;
P3OUT |= CS | DIR_AIN2;
UCB0CTL1 = UCSWRST;
P3DIR |= CS;
P3OUT &= ~CS;
P1SEL |= SCLK | SDATO | SDATI;
P1SEL2 |= SCLK | SDATO | SDATI;
UCB0CTL0 |= UCCKPH | UCMSB | UCMST | UCSYNC;
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0CTL1 &= ~UCSWRST;
// End SPI Configure
__bis_SR_register(GIE);
// GUI Composer Monitor Initialization
ClearBufferRelatedParam();
// CTRL Register
G_CTRL_REG.Address = 0x00;
G_CTRL_REG.DTIME = 0x03;
G_CTRL_REG.ISGAIN = 0x03;
G_CTRL_REG.EXSTALL = 0x00;
G_CTRL_REG.MODE = 0x01; //0x03;
G_CTRL_REG.RSTEP = 0x00;
G_CTRL_REG.RDIR = 0x00;
G_CTRL_REG.ENBL = 0x01;
// TORQUE Register
G_TORQUE_REG.Address = 0x01;
G_TORQUE_REG.SIMPLTH = 0x00;
G_TORQUE_REG.TORQUE = 0x7f;
// OFF Register
G_OFF_REG.Address = 0x02;
G_OFF_REG.PWMMODE = 0x00;
G_OFF_REG.TOFF = 0x30;
// BLANK Register
G_BLANK_REG.Address = 0x03;
G_BLANK_REG.ABT = 0x01;
G_BLANK_REG.TBLANK = 0x08;
// DECAY Register.
G_DECAY_REG.Address = 0x04;
G_DECAY_REG.DECMOD = 0x03;
G_DECAY_REG.TDECAY = 0x10;
// STALL Register
G_STALL_REG.Address = 0x05;
G_STALL_REG.VDIV = 0x03;
G_STALL_REG.SDCNT = 0x03;
G_STALL_REG.SDTHR = 0x40;
// DRIVE Register
G_DRIVE_REG.Address = 0x06;
G_DRIVE_REG.IDRIVEP = 0x00;
G_DRIVE_REG.IDRIVEN = 0x00;
G_DRIVE_REG.TDRIVEP = 0x01;
G_DRIVE_REG.TDRIVEN = 0x01;
G_DRIVE_REG.OCPDEG = 0x01;
G_DRIVE_REG.OCPTH = 0x01;
// STATUS Register
G_STATUS_REG.Address = 0x07;
G_STATUS_REG.STDLAT = 0x00;
G_STATUS_REG.STD = 0x00;
G_STATUS_REG.UVLO = 0x00;
G_STATUS_REG.BPDF = 0x00;
G_STATUS_REG.APDF = 0x00;
G_STATUS_REG.BOCP = 0x00;
G_STATUS_REG.AOCP = 0x00;
G_STATUS_REG.OTS = 0x00;
WriteAllRegisters();
}
void WriteAllRegisters()
{
unsigned char dataHi = 0x00;
unsigned char dataLo = 0x00;
// Write CTRL Register
dataHi = REGWRITE | (G_CTRL_REG.Address << 4) | (G_CTRL_REG.DTIME << 2) | (G_CTRL_REG.ISGAIN);
dataLo = (G_CTRL_REG.EXSTALL << 7) | (G_CTRL_REG.MODE << 3) | (G_CTRL_REG.RSTEP << 2) | (G_CTRL_REG.RDIR << 1) | (G_CTRL_REG.ENBL);
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write TORQUE Register
dataHi = REGWRITE | (G_TORQUE_REG.Address << 4) | (G_TORQUE_REG.SIMPLTH);
dataLo = G_TORQUE_REG.TORQUE;
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write OFF Register
dataHi = REGWRITE | (G_OFF_REG.Address << 4) | (G_OFF_REG.PWMMODE);
dataLo = G_OFF_REG.TOFF;
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write BLANK Register
dataHi = REGWRITE | (G_BLANK_REG.Address << 4) | (G_BLANK_REG.ABT);
dataLo = G_BLANK_REG.TBLANK;
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write DECAY Register
dataHi = REGWRITE | (G_DECAY_REG.Address << 4) | (G_DECAY_REG.DECMOD);
dataLo = G_DECAY_REG.TDECAY;
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write STALL Register
dataHi = REGWRITE | (G_STALL_REG.Address << 4) | (G_STALL_REG.VDIV << 2) | (G_STALL_REG.SDCNT);
dataLo = G_STALL_REG.SDTHR;
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write DRIVE Register
dataHi = REGWRITE | (G_DRIVE_REG.Address << 4) | (G_DRIVE_REG.IDRIVEP << 2) | (G_DRIVE_REG.IDRIVEN);
dataLo = (G_DRIVE_REG.TDRIVEP << 6) | (G_DRIVE_REG.TDRIVEN << 4) | (G_DRIVE_REG.OCPDEG << 2) | (G_DRIVE_REG.OCPTH);
SPI_DRV8711_ReadWrite(dataHi, dataLo);
// Write STATUS Register
dataHi = REGWRITE | (G_STATUS_REG.Address << 4);
dataLo = (G_STATUS_REG.STDLAT << 7) | (G_STATUS_REG.STD << 6) | (G_STATUS_REG.UVLO << 5) | (G_STATUS_REG.BPDF << 4) | (G_STATUS_REG.APDF << 3) | (G_STATUS_REG.BOCP << 2) | (G_STATUS_REG.AOCP << 1) | (G_STATUS_REG.OTS);
SPI_DRV8711_ReadWrite(dataHi, dataLo);
}
![]()