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.

CCS/TMDSCNCD28069MISO: F28069M-DRV8301-InstaspinFOC-Proj_lab10e

Part Number: TMDSCNCD28069MISO
Other Parts Discussed in Thread: DRV8301, MOTORWARE

Tool/software: Code Composer Studio

HI, I am trying to use SPI-B (pins 24-27) for SPI communication to an external chip. First, I tried using the following code to set up SPI-B and it worked.

void InitSpibGpio()
{

EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.

// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (SPISIMOA)

GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO19 (SPISTEA)

// GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0; // Enable pull-up on GPIO54 (SPISIMOA)
// GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0; // Enable pull-up on GPIO55 (SPISOMIA)
// GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0; // Enable pull-up on GPIO56 (SPICLKA)
// GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pull-up on GPIO57 (SPISTEA)

/* Set qualification for selected pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.

// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input GPIO3 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; // Asynch input GPIO5 (SPISIMOA)

GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3; // Asynch input GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3; // Asynch input GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3; // Asynch input GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3; // Asynch input GPIO19 (SPISTEA)

// GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO54 (SPISIMOA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO55 (SPISOMIA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO56 (SPICLKA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO57 (SPISTEA)


/* Configure SPI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SPI functional pins.
// Comment out other unwanted lines.

// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; // Configure GPIO3 as SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2; // Configure GPIO5 as SPISIMOA

//GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; // Configure GPIO16 as SPISIMOA
//GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1; // Configure GPIO17 as SPISOMIA
//GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1; // Configure GPIO18 as SPICLKA
//GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1; // Configure GPIO19 as SPISTEA

// GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOA
// GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIA
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA

EDIS;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpibRegs.SPIFFTX.all=0xE040;
SpibRegs.SPIFFRX.all=0x2044;
SpibRegs.SPIFFCT.all=0x0;
}
void spi_init()
{

SpibRegs.SPICCR.bit.CLKPOLARITY=1;
SpibRegs.SPICCR.bit.SPICHAR=0xF;
SpibRegs.SPICCR.bit.SPILBK=0;
SpibRegs.SPICCR.bit.SPISWRESET=0;
//SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits

SpibRegs.SPICTL.bit.CLK_PHASE=0;
SpibRegs.SPICTL.bit.MASTER_SLAVE=1;
SpibRegs.SPICTL.bit.OVERRUNINTENA=0;
SpibRegs.SPICTL.bit.TALK=1;


// SpiaRegs.SPICTL.all =0x0006; //0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.

SpibRegs.SPICCR.bit.CLKPOLARITY=1;
SpibRegs.SPICCR.bit.SPICHAR=0xF;
SpibRegs.SPICCR.bit.SPILBK=0;
SpibRegs.SPICCR.bit.SPISWRESET=1;
//SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset

SpibRegs.SPIBRR =BaudRate;//0x007F;//0x030C; // Baud rate

}

SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
SysCtrlRegs.PCLKCR0.bit.SPIBENCLK = 1; // SPI-B

Since the same code doesn't work in InstaSpin_FOC lab projects because SpibRegs are not defined in these labs, I tried the following code in proj_lab10e in InstaSpin-FOC example projects.

void HAL_setupSpiB(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;

SPI_reset(obj->spiBHandle);
SPI_setMode(obj->spiBHandle,SPI_Mode_Master);
SPI_setClkPolarity(obj->spiBHandle,SPI_ClkPolarity_OutputRisingEdge_InputFallingEdge);
SPI_setClkPhase(obj->spiBHandle,SPI_ClkPhase_Normal);
SPI_enableTx(obj->spiBHandle);
SPI_enableTxFifoEnh(obj->spiBHandle);
SPI_enableTxFifo(obj->spiBHandle);
//SPI_setTxDelay(obj->spiBHandle,0x0);
SPI_setTxDelay(obj->spiBHandle,0);
//SPI_setBaudRate(obj->spiBHandle,(SPI_BaudRate_e)(0x000d));
SPI_setBaudRate(obj->spiBHandle,(SPI_BaudRate_e)(0x0014));
SPI_setCharLength(obj->spiBHandle,SPI_CharLength_16_Bits);
SPI_setSuspend(obj->spiBHandle,SPI_TxSuspend_free);
SPI_enable(obj->spiBHandle);

return;
} // end of HAL_setupSpiB() function

void HAL_setupGpios(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;


// PWM1
GPIO_setMode(obj->gpioHandle,GPIO_Number_0,GPIO_0_Mode_EPWM1A);

// PWM2
GPIO_setMode(obj->gpioHandle,GPIO_Number_1,GPIO_1_Mode_EPWM1B);

// PWM3
GPIO_setMode(obj->gpioHandle,GPIO_Number_2,GPIO_2_Mode_EPWM2A);

// PWM4
GPIO_setMode(obj->gpioHandle,GPIO_Number_3,GPIO_3_Mode_EPWM2B);

// PWM5
GPIO_setMode(obj->gpioHandle,GPIO_Number_4,GPIO_4_Mode_EPWM3A);

// PWM6
GPIO_setMode(obj->gpioHandle,GPIO_Number_5,GPIO_5_Mode_EPWM3B);

// PWM-DAC4
GPIO_setMode(obj->gpioHandle,GPIO_Number_6,GPIO_6_Mode_EPWM4A);

// Push Button SW2
GPIO_setMode(obj->gpioHandle,GPIO_Number_7,GPIO_7_Mode_GeneralPurpose);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_7,GPIO_Direction_Input);

// ADCSOCAO_NOT or PWM-DAC3
GPIO_setMode(obj->gpioHandle,GPIO_Number_8,GPIO_8_Mode_EPWM5A);

// Push Button SW1
GPIO_setMode(obj->gpioHandle,GPIO_Number_9,GPIO_9_Mode_GeneralPurpose);

// PWM-DAC1
GPIO_setMode(obj->gpioHandle,GPIO_Number_10,GPIO_10_Mode_EPWM6A);

// PWM-DAC2
GPIO_setMode(obj->gpioHandle,GPIO_Number_11,GPIO_11_Mode_EPWM6B);

// DRV8301-LED1
GPIO_setMode(obj->gpioHandle,GPIO_Number_12,GPIO_12_Mode_GeneralPurpose);

// OCTWn
GPIO_setMode(obj->gpioHandle,GPIO_Number_13,GPIO_13_Mode_TZ2_NOT);

// FAULTn
GPIO_setMode(obj->gpioHandle,GPIO_Number_14,GPIO_14_Mode_TZ3_NOT);

// LED2
GPIO_setMode(obj->gpioHandle,GPIO_Number_15,GPIO_15_Mode_GeneralPurpose);

// Set Qualification Period for GPIO16-23, 5*2*(1/90MHz) = 0.11us
// GPIO_setQualificationPeriod(obj->gpioHandle,GPIO_Number_16,5);

// SPI-SIMO
GPIO_setMode(obj->gpioHandle,GPIO_Number_16,GPIO_16_Mode_SPISIMOA);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_16,GPIO_16_Mode_GeneralPurpose);
// GPIO_setPullup(obj->gpioHandle,GPIO_Number_16, GPIO_Pullup_Enable);

// SPI-SOMI
GPIO_setMode(obj->gpioHandle,GPIO_Number_17,GPIO_17_Mode_SPISOMIA);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_17,GPIO_17_Mode_GeneralPurpose);
// GPIO_setPullup(obj->gpioHandle,GPIO_Number_17, GPIO_Pullup_Enable);

// SPI-CLK
GPIO_setMode(obj->gpioHandle,GPIO_Number_18,GPIO_18_Mode_SPICLKA);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_18,GPIO_18_Mode_GeneralPurpose);
// GPIO_setPullup(obj->gpioHandle,GPIO_Number_18, GPIO_Pullup_Enable);

// SPI-STE
GPIO_setMode(obj->gpioHandle,GPIO_Number_19,GPIO_19_Mode_SPISTEA_NOT);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_19,GPIO_19_Mode_GeneralPurpose);
// GPIO_setPullup(obj->gpioHandle,GPIO_Number_19, GPIO_Pullup_Enable);

#ifdef QEP
// EQEPA
GPIO_setMode(obj->gpioHandle,GPIO_Number_20,GPIO_20_Mode_EQEP1A);
GPIO_setQualification(obj->gpioHandle,GPIO_Number_20,GPIO_Qual_Sample_3);

// EQEPB
GPIO_setMode(obj->gpioHandle,GPIO_Number_21,GPIO_21_Mode_EQEP1B);
GPIO_setQualification(obj->gpioHandle,GPIO_Number_21,GPIO_Qual_Sample_3);

// STATUS
GPIO_setMode(obj->gpioHandle,GPIO_Number_22,GPIO_22_Mode_GeneralPurpose);

// EQEP1I
GPIO_setMode(obj->gpioHandle,GPIO_Number_23,GPIO_23_Mode_EQEP1I);
GPIO_setQualification(obj->gpioHandle,GPIO_Number_23,GPIO_Qual_Sample_3);
#else
// EQEPA
GPIO_setMode(obj->gpioHandle,GPIO_Number_20,GPIO_20_Mode_GeneralPurpose);

// EQEPB
GPIO_setMode(obj->gpioHandle,GPIO_Number_21,GPIO_21_Mode_GeneralPurpose);

// STATUS
GPIO_setMode(obj->gpioHandle,GPIO_Number_22,GPIO_22_Mode_GeneralPurpose);

// EQEP1I
GPIO_setMode(obj->gpioHandle,GPIO_Number_23,GPIO_23_Mode_GeneralPurpose);
#endif

// SPI SIMO B
GPIO_setMode(obj->gpioHandle,GPIO_Number_24,GPIO_24_Mode_SPISIMOB);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_24,GPIO_24_Mode_GeneralPurpose);
GPIO_setQualificationPeriod(obj->gpioHandle,GPIO_Number_24,3);
GPIO_setPullup(obj->gpioHandle,GPIO_Number_24, GPIO_Pullup_Enable);

// SPI SOMI B
GPIO_setMode(obj->gpioHandle,GPIO_Number_25,GPIO_25_Mode_SPISOMIB);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_25,GPIO_25_Mode_GeneralPurpose);
GPIO_setQualificationPeriod(obj->gpioHandle,GPIO_Number_25,3);
GPIO_setPullup(obj->gpioHandle,GPIO_Number_25, GPIO_Pullup_Enable);

// SPI CLK B
GPIO_setMode(obj->gpioHandle,GPIO_Number_26,GPIO_26_Mode_SPICLKB);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_26,GPIO_26_Mode_GeneralPurpose);
GPIO_setQualificationPeriod(obj->gpioHandle,GPIO_Number_26,3);
GPIO_setPullup(obj->gpioHandle,GPIO_Number_26, GPIO_Pullup_Enable);

// SPI CSn B
GPIO_setMode(obj->gpioHandle,GPIO_Number_27,GPIO_27_Mode_SPISTEB_NOT);
// GPIO_setMode(obj->gpioHandle,GPIO_Number_27,GPIO_27_Mode_GeneralPurpose);
GPIO_setQualificationPeriod(obj->gpioHandle,GPIO_Number_27,3);
GPIO_setPullup(obj->gpioHandle,GPIO_Number_27, GPIO_Pullup_Enable);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_28,GPIO_28_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_29,GPIO_29_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_30,GPIO_30_Mode_GeneralPurpose);

// ControlCARD LED2
GPIO_setMode(obj->gpioHandle,GPIO_Number_31,GPIO_31_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_31);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_31,GPIO_Direction_Output);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_32,GPIO_32_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_33,GPIO_33_Mode_GeneralPurpose);

// ControlCARD LED3
GPIO_setMode(obj->gpioHandle,GPIO_Number_34,GPIO_34_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_34);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_34,GPIO_Direction_Output);

// JTAG
GPIO_setMode(obj->gpioHandle,GPIO_Number_35,GPIO_35_Mode_JTAG_TDI);
GPIO_setMode(obj->gpioHandle,GPIO_Number_36,GPIO_36_Mode_JTAG_TMS);
GPIO_setMode(obj->gpioHandle,GPIO_Number_37,GPIO_37_Mode_JTAG_TDO);
GPIO_setMode(obj->gpioHandle,GPIO_Number_38,GPIO_38_Mode_JTAG_TCK);

// DRV8301 Enable
GPIO_setMode(obj->gpioHandle,GPIO_Number_39,GPIO_39_Mode_GeneralPurpose);

// CAP1
GPIO_setMode(obj->gpioHandle,GPIO_Number_40,GPIO_40_Mode_GeneralPurpose);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_40,GPIO_Direction_Input);

// CAP2
GPIO_setMode(obj->gpioHandle,GPIO_Number_41,GPIO_41_Mode_GeneralPurpose);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_41,GPIO_Direction_Input);

// CAP3
GPIO_setMode(obj->gpioHandle,GPIO_Number_42,GPIO_42_Mode_GeneralPurpose);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_42,GPIO_Direction_Input);

// DC_CAL
GPIO_setMode(obj->gpioHandle,GPIO_Number_43,GPIO_43_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_44,GPIO_44_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_50,GPIO_50_Mode_GeneralPurpose);

// DRV8301 Enable
GPIO_setMode(obj->gpioHandle,GPIO_Number_51,GPIO_51_Mode_GeneralPurpose);
GPIO_setLow(obj->gpioHandle,GPIO_Number_51);
GPIO_setDirection(obj->gpioHandle,GPIO_Number_51,GPIO_Direction_Output);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_52,GPIO_52_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_53,GPIO_53_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_54,GPIO_54_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_55,GPIO_55_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_56,GPIO_56_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_57,GPIO_57_Mode_GeneralPurpose);

// No Connection
GPIO_setMode(obj->gpioHandle,GPIO_Number_58,GPIO_58_Mode_GeneralPurpose);

return;
} // end of HAL_setupGpios() function

CLK_enableSpiaClock(obj->clkHandle);
CLK_enableSpibClock(obj->clkHandle);

But somehow I don'e see the SPI-clock output. Is there anything I am missing in initializing?

Please help regarding this!!!

  • Please take a look at the steps for adding SCI/UART to a Motorware project in the motorware_hal_tutorial.pdf in C:\ti\motorware\motorware_1_01_00_18\docs\tutorials. The process should be similar for SPI, including adding the correct HAL handles to interact with the API as intended in Motorware.

    Sean