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/TMS320F28069F: Please Check my DAC Code with 28069 DSP.

Part Number: TMS320F28069F
Other Parts Discussed in Thread: TLV5638

Tool/software: Code Composer Studio

Hi,

I'm studying in DAC(using SPI) Code for 28069 with TLV5638

My code is not working at ''while (SpiaRegs.SPISTS.bit.INT_FLAG !=1) { }'' in my code

(i check by DAC_A~F++ , and cnt_c. When i check by CCS Debug window, DAC_A,B,D is 1 and ''SpiaRegs.SPITXBUF = check_vale; '' is working but cnt_c is not 1.

So i think the code is not working from  ''while (SpiaRegs.SPISTS.bit.INT_FLAG !=1) { }'' in my code.

please check my code below and tell me what is wrong,

(I do not write all code, but i checked adc_isr is working, and the function DAC_Display is in adc_isr)

//Code


#include "DSP28x_Project.h"

__interrupt void adc_isr(void);
void InitEPwm(void);
void InitGPIO(void);
void InitAdc(void);
void AdcOffsetSelfCal(void);
void Adc_Config(void);
void DAC_Display(void);
void dev_DACSetup(void);
void CMD_SendDAC (short CH, short Value);
void SendSPI (Uint16 Channel1, Uint16 Channel2, short sTemp);

void scia_echoback_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void scia_msg(char *msg);


float DAC_A = 0;
float DAC_B = 0;
float DAC_C = 0;
float DAC_D = 0;
float DAC_E = 0;
float DAC_F = 0;
float DAC_Data = 0;

Uint16 count_int_adca = 0;
float Start_PWM_CNT = 0;
float Finish_PWM_CNT = 0;
float Time_1ms = 0;
float Time_2ms = 0;
float Time_10ms = 0;
float Time_100ms = 0;
float Time_1s = 0;
float adc_run_time = 0;

//DIDO
Uint16 DI1 = 0;
Uint16 DI2 = 0;
Uint16 DO1 = 0;
Uint16 DO2 = 0;
Uint16 DO3 = 0;

Uint16 RS_232_Data = 0;

Uint32 Clock_count = 0;
Uint32 Max_count = 0;


//ifdef define
#define SPI_DAC
#define __FLASH_PROGRAM

//DAC variable
Uint16 sel_CH = 11;
short ch_num = 1, dac_val=2000;

#define DAC_CH1 1
#define DAC_CH2 2
#define DAC_CH3 3
#define DAC_CH4 4

short Temp_c = 0;
short cnt_c = 0;
Uint16 check_vale = 0;

typedef short S16;

void main(void) {//main start


DINT;
IER = 0x0000;
IFR = 0x0000;


InitSysCtrl();

InitPieCtrl();
InitPieVectTable();


EINT;
ERTM;

InitSciaGpio();
EALLOW;
InitGPIO();
EDIS;

//ADC
InitAdc();
AdcOffsetSelfCal();
Adc_Config();

//Sci
scia_fifo_init(); // Initialize the SCI FIFO
scia_echoback_init(); // Initalize SCI for echoback

EALLOW;
PieVectTable.ADCINT1 = &adc_isr;
EDIS;

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
IER |= M_INT1;

//DAC
dev_DACSetup();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

InitEPwm();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;


for(;;)
{//for(;;) start

Clock_count++;

}//main finish

#ifdef __FLASH_PROGRAM
#pragma CODE_SECTION(adc_isr, "ramfuncs");
#endif
__interrupt void adc_isr(void)
{//adc_isr start


count_int_adca++;

LED_on = 1;
LED_on = 0;

Start_PWM_CNT = EPwm4Regs.TBCTR;

//Time by 5kHz
if((count_int_adca%TIME_DIV_1ms_5kHz)==0){
Time_Flags._1ms = SET;
if((count_int_adca%TIME_DIV_2ms_5kHz)==0){
Time_Flags._2ms = SET;
if((count_int_adca%TIME_DIV_10ms_5kHz)==0){
Time_Flags._10ms = SET;
if((count_int_adca%TIME_DIV_100ms_5kHz)==0){
Time_Flags._100ms = SET;
if((count_int_adca%TIME_DIV_1s_5kHz)==0){
Time_Flags._1s = SET;
}
}
}
}
}
else
{
Time_Flags._ISR = SET;
}

DAC_Display();

Finish_PWM_CNT = EPwm4Regs.TBCTR;
adc_run_time = Finish_PWM_CNT - Start_PWM_CNT;

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}//adc_isr finish


void dev_DACSetup()
{
EALLOW;

#ifdef SPI_DAC

GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Disable pull-up on GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Disable pull-up on GPIO17 (nDAC1_CS)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Disable pull-up on GPIO18 (SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Disable pull-up on GPIO19 (nDAC2_CS)

GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
//GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (nDAC1_CS)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
//GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (nDAC2_CS)

GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // SPI slave in, master out (SPISIMOA)
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; // nDAC1_CS
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // SPI Clock in / out (SPICLKA)
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; // nDAC2_CS

GpioCtrlRegs.GPADIR.bit.GPIO16 = 1; // GPIO16 : output
GpioCtrlRegs.GPADIR.bit.GPIO17 = 1; // GPIO17 : output
GpioCtrlRegs.GPADIR.bit.GPIO18 = 1; // GPIO18 : output
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // GPIO19 : output

SpiaRegs.SPICCR.all = 0x000F; //Reset on, falling edge, 16-bit char bits
SpiaRegs.SPICTL.all = 0x0006; //Enable master mode, interrupt
SpiaRegs.SPIBRR = 0x007F; //SPI Baudrate = LSPCLK/(SPIBRR+1)
//LSPCLK = SYSCLKOUT/LSPCLK (LSPCLK : LOSPCP reg, default 4)
SpiaRegs.SPICCR.all = 0x00CF; // Relinquish SPI from reset
SpiaRegs.SPIPRI.bit.FREE = 1; // set so breakpoints dont't disturb xmission

#endif


EDIS;
}

#ifdef __FLASH_PROGRAM
#pragma CODE_SECTION(DAC_Display, "ramfuncs");
#endif
void DAC_Display(void)
{
DAC_A++;

if (sel_CH==0)
{
CMD_SendDAC (1, 2048);
CMD_SendDAC (2, 2048);
CMD_SendDAC (3, 2048);
CMD_SendDAC (4, 2048);
}
else if (sel_CH==1)
{
CMD_SendDAC (1, 2048);
CMD_SendDAC (2, 2048);
CMD_SendDAC (3, 2048);
CMD_SendDAC (4, 2048);
}

else if (sel_CH==3)
{

CMD_SendDAC (1, ADC_CUR_INV_U*40.096+2048);
CMD_SendDAC (2, ADC_CUR_INV_V);
CMD_SendDAC (3, ADC_CUR_INV_W);
CMD_SendDAC (4, ADC_CUR_INV_U);

//DAC_CUR_gain_500A : 4.096 -> I_d_cmd = 1000 -> 4096 -> 0~1000 -> +2048 -> -500~500
}


/*
else if (sel_CH==2)
{
CMD_SendDAC (1, I_d*DAC_CUR_gain_500A+2048);
CMD_SendDAC (2, I_q*DAC_CUR_gain_500A+2048);
CMD_SendDAC (3, I_d_cmd*DAC_CUR_gain_500A+2048);
CMD_SendDAC (4, I_q_cmd*DAC_CUR_gain_500A+2048);

/DAC_CUR_gain_500A : 4.096 -> I_d_cmd = 1000 -> 4096 -> 0~1000 -> +2048 -> -500~500
}
*/
else
{
DAC_D++;
CMD_SendDAC (ch_num , dac_val);
}
}

#pragma CODE_SECTION(CMD_SendDAC, "ramfuncs");
void CMD_SendDAC (short CH, short Value)
{

if (Value > 4095) Temp_c = 4095;
else if (Value < 0) Temp_c = 0;
else Temp_c = (short) Value;

switch(CH)
{
case DAC_CH1: SendSPI (0, 0, Temp_c); break;
case DAC_CH2: SendSPI (0, 1, Temp_c); break;
case DAC_CH3: SendSPI (1, 0, Temp_c); break;
case DAC_CH4: SendSPI (1, 1, Temp_c); break;
default: break;
}
}

#pragma CODE_SECTION(SendSPI, "ramfuncs");
void SendSPI (Uint16 Channel1, Uint16 Channel2, short sTemp)
{

S16 Temp;
if (Channel1 == 0)
{
DAC_B++;
GpioDataRegs.GPADAT.bit.GPIO17= 0;
}
else
{
DAC_F++;
GpioDataRegs.GPADAT.bit.GPIO19= 0;
}
check_vale = (0xC000-Channel2*0x8000) | (sTemp & 0xfff);;
DAC_Data = check_vale;
SpiaRegs.SPITXBUF = check_vale;

while (SpiaRegs.SPISTS.bit.INT_FLAG !=1) { }
Temp= SpiaRegs.SPIRXBUF;
Temp= Temp;
cnt_c++;
if (Channel1 == 0)
{
DAC_C++;
GpioDataRegs.GPADAT.bit.GPIO17= 1;
}
else
{
DAC_E++;
GpioDataRegs.GPADAT.bit.GPIO19= 1;
}

}

Thanks in advance.