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);
}
I have used similar settings of evaluation kit in my DRV board and i also verified Fault and reset pin and all registers. Fault pin as high, Reset pin is LOW and registers status are like same as evaluation board.
Still now, there is no MOSFET gate driven signal get from DRV8711.
Regards,
Yuvaraj