主题中讨论的其他器件: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;
}
}
提前感谢。