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:请使用28069 DSP 检查我的 DAC 代码。

Guru**** 1865100 points
Other Parts Discussed in Thread: TLV5638
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/734702/ccs-tms320f28069f-please-check-my-dac-code-with-28069-dsp

器件型号:TMS320F28069F
主题中讨论的其他器件:TLV5638

工具/软件:Code Composer Studio

您好!

我正在使用 TLV5638学习28069的 DAC (使用 SPI)代码

我的代码无法在代码中的'while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}'中工作

(我通过 DAC_A~F++和 cnt_c 进行检查 当我通过 CCS Debug 窗口进行检查时、DAC_A、B、D 为1、'SpiaRegs.SPITXBUF = CHECK_Vale;'正在工作、但 cnt_c 不为1。

因此、我认为代码  无法从代码中的'while (SpiaRegs.SPISTS.bit.INT_flag!= 1){''运行。

请检查下面的代码、告诉我错误是什么、

(我不编写所有代码、但我检查了 ADC_ISR 是否正常工作、函数 DAC_Display 是否位于 ADC_ISR 中)

//代码


#include "DSP28x_Project.h"

_interrupt void ADC_ISR (void);
void InitEPwm (void);
空 InitGPIO (空);
void InitAdc (void);
void AdcOffsetSelfCal (void);
void ADC_Config (void);
void DAC_Display (void);
void DEV_DACSetup (void);
void CMD_SendDAC (短通道、短值);
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;
浮点 DAC_B = 0;
浮点 DAC_C = 0;
浮点 DAC_D = 0;
浮点 DAC_E = 0;
浮点 DAC_F = 0;
浮点 DAC_Data = 0;

uint16 count_int_adca = 0;
浮点 Start_PWM_CNT = 0;
浮点 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 SPI_DAC
#define _flash_program

//DAC 变量
UINT16 SEL_CH = 11;
ch_num 短接= 1、DAC_val=2000;

#define DAC_CH1
#define DAC_CH2
#define DAC_CH3 3.
#define DAC_CH4 4.

短路 Temp_c = 0;
短路 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();//初始化 SCI FIFO
scia_echoback_init();//初始化用于 echoback 的 SCI

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 结束

#ifdef __flash_program
#pragma CODE_SECTION (ADC_ISR、"ramfuncs");
#endif
_interrupt void ADC_ISR (void)
{//ADC_ISR 启动


count_int_adca++;

LED_ON = 1;
LED_ON = 0;

START_PWM_CNT = EPwm4Regs.TBCTR;

//时间5kHz
if (((count_int_adca%TIME_DIV_1ms_5kHz)=0){
TIME_Flags_1ms =设置;
if (((count_int_adca%TIME_DIV_2ms_5kHz)=0){
TIME_Flags。_2ms =置位;
if (((count_int_adca%TIME_DIV_10ms_5kHz)=0){
TIME_Flags。_10ms =置位;
if (((count_int_adca%TIME_DIV_100ms_5kHz)=0){
TIME_Flags..._100ms =设置;
if (((count_int_adca%TIME_DIV_1s_5kHz)=0){
TIME_Flags._1 =设置;





其他

TIME_Flags.. ISR =置位;

DAC_Display();

final_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 完成


void DEV_DACSetup()

EALLOW;

ifdef SPI_DAC

GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;//禁用 GPIO16上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;//禁用 GPIO17上的上拉电阻(nDAC1_CS)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//禁用 GPIO18上的上拉电阻器(SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;//禁用 GPIO19上的上拉电阻(nDAC2_CS)

GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;//异步输入 GPIO16 (SPISIMOA)
//GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (nDAC1_CS)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
//GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (nDAC2_CS)

GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;// SPI 从器件输入、主器件输出(SPISIMOA)
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;// nDAC1_CS
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;// SPI 时钟输入/输出(SPICLKA)
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;// nDAC2_CS

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

SpiaRegs.SPICCR.ALL = 0x000F;//复位打开、下降边沿、16位字符位
SpiaRegs.SPICTL.ALL = 0x0006;//启用主控模式,中断
SpiaRegs.SPIBRR = 0x007F;//SPI 波特率= LSPCLK/(SPIBRR+1)
//LSPCLK = SYSCLKOUT/LSPCLK (LSPCLK:LOSPCP reg,缺省值4)
SpiaRegs.SPICCR.ALL = 0x00CF;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点不要干扰 xmission

#endif


EDIS;

#ifdef __flash_program
#pragma CODE_SECTION (DAC_Display、"ramfuncs");
#endif
void DAC_Display (void)

DAC_A+;

如果(SEL_CH=0)

CMD_SendDAC (1、2048);
CMD_SendDAC (2、2048);
CMD_SendDAC (3、2048);
CMD_SendDAC (4、2048);

否则、如果(SEL_CH==1)

CMD_SendDAC (1、2048);
CMD_SendDAC (2、2048);
CMD_SendDAC (3、2048);
CMD_SendDAC (4、2048);

否则、如果(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


/*
否则、如果(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

*
其他

DAC_D++;
CMD_SendDAC (ch_num、DAC_val);

#pragma CODE_SECTION (CMD_SendDAC、"ramfuncs");
void CMD_SendDAC (短通道、短值)

如果(值> 4095) Temp_c = 4095;
否则、如果(值< 0) Temp_c = 0;
否则 Temp_c =(短整型)值;

开关(通道)

案例 DAC_CH1:SendSPI (0、0、Temp_c);break;
案例 DAC_CH2:SendSPI (0、1、Temp_c);break;
案例 DAC_CH3:SendSPI (1、0、Temp_c);break;
案例 DAC_CH4:SendSPI (1、1、Temp_c);break;
默认值:break;

#pragma CODE_SECTION (SendSPI、"ramfuncs");
void SendSPI (UINT16通道1、UINT16通道2、短 sTemp)

S16温度;
如果(信道1 = 0)

DAC_B++;
GpioDataRegs.GPADAT.bit.GPIO17=0;

其他

DAC_F++;
GpioDataRegs.GPADAT.bit.GPIO19=0;

CHECK_Vale =(0xC000-Channel2*0x8000)|(sTemp & 0xxif);
DAC_Data = CHECK_Vale;
SpiaRegs.SPITXBUF = CHECK_Vale;

while (SpiaRegs.SPISTS.bit.INT_flag!=1){}
temp= SpiaRegs.SPIRXBUF;
TEMP=温度;
CNT_c++;
如果(信道1 = 0)

DAC_C++;
GpioDataRegs.GPADAT.bit.GPIO17= 1;

其他

DAC_E++;
GpioDataRegs.GPADAT.bit.GPIO19= 1;

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    InGwon Jo、

    看起来您没有在 SPICTL 中启用 SPI 中断。

    Tommy