dsp28335控制AD9852输出扫频信号,芯片发热说明有工作,但是却没有输出结果,求大侠帮忙解决?程序如下:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define Period 3750 // 周期0.1ms,周期太小时,会导致程序运行时间大于周期时间
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
#endif
/*******************************************************
--------------- 变量定义------------------------
********************************************************/
float adc[16]; //用于存储AD转换结果
float adclo=0; //AD转换的模拟参考电平,通常接地
float Output0[300]={0},Output1[300]={0}; //用于保存ADCINA0、ADCINA1两个通道滤波处理后的采样结果
float adcresulta0[10]={0}; //用于保存ADCINA0通道的10次采样结果
float adcresulta1[10]={0}; //用于保存ADCINA1通道的10次采样结果
float NUM[3]={0};
float VALUE[3]={0};
int SampleCount=0; //采样次数计数器
int flag=0; //用于保存数据的数组下标
Uint16 *p1 = (Uint16 *)0x004000;
Uint16 *p2 = (Uint16 *)0x004020;
Uint16 *P1 = (Uint16 *)0x004010;
Uint16 *P2 = (Uint16 *)0x004030;
Uint16 *f1 = (Uint16 *)0x004008;
Uint16 *f2 = (Uint16 *)0x004028;
Uint16 *f3 = (Uint16 *)0x004018;
Uint16 *f4 = (Uint16 *)0x004038;
Uint16 *f5 = (Uint16 *)0x004004;
Uint16 *f6 = (Uint16 *)0x004024;
Uint16 *F1 = (Uint16 *)0x004014;
Uint16 *F2 = (Uint16 *)0x004034;
Uint16 *F3 = (Uint16 *)0x00400C;
Uint16 *F4 = (Uint16 *)0x00402C;
Uint16 *F5 = (Uint16 *)0x00401C;
Uint16 *F6 = (Uint16 *)0x00403C;
Uint16 *bujin1 = (Uint16 *)0x004002;
Uint16 *bujin2 = (Uint16 *)0x004022;
Uint16 *bujin3 = (Uint16 *)0x004012;
Uint16 *bujin4 = (Uint16 *)0x004032;
Uint16 *bujin5 = (Uint16 *)0x00400A;
Uint16 *bujin6 = (Uint16 *)0x00402A;
Uint16 *xielv1 = (Uint16 *)0x004016;
Uint16 *xielv2 = (Uint16 *)0x004036;
Uint16 *xielv3 = (Uint16 *)0x00400E;
Uint16 *diaodian = (Uint16 *)0x00402E;
Uint16 *gongneng = (Uint16 *)0x00401E;
Uint16 *moshi = (Uint16 *)0x00403E;
Uint16 *shineng = (Uint16 *)0x004001;
Uint16 *a1 = (Uint16 *)0x004021;
Uint16 *a2 = (Uint16 *)0x004011;
Uint16 *A1 = (Uint16 *)0x004031;
Uint16 *A2 = (Uint16 *)0x004009;
Uint16 *xielv = (Uint16 *)0x004029;
Uint16 *DA1 = (Uint16 *)0x004019;
Uint16 *DA2 = (Uint16 *)0x004039;
/*******************************************************
------------------函数声明------------------------------
*******************************************************/
void ADC_init(void); // ADC初始化函数
void ePWM_init(void);
void sequence(float a[], int n); //排序算法
interrupt void ADCINT_isr(void); // 中断函数
void fir_filter(float b[],float c[]);
void set_freq(float x,float y);
void Updata_Deltaword(void);
void Updata_Ramprateword(void);
void set_phase(Uint16 x,Uint16 y);
void set_amplitude(void);
void UPDATA(void);
void Gpio_setup(void);
/******************************************************
------------------主函数-------------------------------
*******************************************************/
void main(void)
{
int i;
InitSysCtrl();
// InitXintf16Gpio();
//EALLOW;
//SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
//EDIS;
//MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
//InitFlash();
InitPieCtrl();
InitPieVectTable();
// InitGpio();
Gpio_setup();
GpioDataRegs.GPASET.bit.GPIO2=1;//初始化复位,超过十个时钟周期的高电平
DELAY_US(10000);
GpioDataRegs.GPACLEAR.bit.GPIO2=1;//初始化复位,超过十个时钟周期的高电平
GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号,开始时置高,防止烧毁芯片
GpioDataRegs.GPACLEAR.bit.GPIO3=1;//扫频起始频率选择,低电平选择F1
//GpioDataRegs.GPASET.bit.GPIO3=1;//高电平选择F2
GpioDataRegs.GPASET.bit.GPIO4=1;//高电平选择并行模式
GpioDataRegs.GPASET.bit.GPIO5=1;//输出振幅控制引脚
GpioDataRegs.GPASET.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平
//GpioDataRegs.GPACLEAR.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平
InitXintf16Gpio();
*moshi=0xE4;//清ACC1和ACC2,线性三角扫频模式,外部更新时钟
UPDATA();
*gongneng=0x05;//5倍频(150MHz)
UPDATA();
*shineng =0x60;
UPDATA();
*diaodian =0x10;
UPDATA();
set_freq(2*10^6,3*10^6);
set_phase(0,0);
set_amplitude();
Updata_Deltaword();
Updata_Ramprateword();
GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号
DELAY_US(10);//至少保持八个系统时钟周期
GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
GpioDataRegs.GPACLEAR.bit.GPIO0=1;//写数据时置高电平,写数据结束,置低电平
// InitXintf16Gpio();
DINT;
IER = 0x0000;
IFR = 0x0000;
ePWM_init();
ADC_init();
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1; // 使能PIE模块中的ADC采样中断
EINT;
ERTM;
EALLOW; // Allow access to EALLOW protected registers
PieVectTable.ADCINT= &ADCINT_isr;
//SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Start all the timers synced
EDIS; // Disable access to EALLOW protected registers
for(i=0;i<300;i++)//只利用初始化赋初值的话,数组好像并不是等于零,好奇怪啊
{
Output0[i]=0;
Output1[i]=0;
}
for(;;)
{
asm(" NOP");
}
}
/***************************************************************
----------------------中断函数----------------------------------
***************************************************************/
interrupt void ADCINT_isr(void) // ADC中断函数
{
SampleCount++; //采样计数器计数
//读取转换结果
adc[0]=((float)AdcMirror.ADCRESULT0)*3.0/4096.0+adclo; //读取ADCINA0通道采样结果
adc[1]=((float)AdcMirror.ADCRESULT1)*3.0/4096.0+adclo; //读取ADCINA1通道采样结果
adcresulta0[SampleCount-1]=adc[0]; //将ADCINA0通道采样到的数据存入数组adcresulta0[]中,等待数据处理
adcresulta1[SampleCount-1]=adc[1]; //将ADCINA1通道采样到的数据存入数组adcresulta1[]中,等待数据处理
if(SampleCount==5) //采样十次之后,需要进行滤波处理
{
int i;
i=0;
sequence(adcresulta0,5); //对采样十次得到的数据进行排序
sequence(adcresulta1,5);
for(i=1;i<4;i++)
{
Output0[flag]=Output0[flag]+adcresulta0[i]; //中值滤波法
Output1[flag]=Output1[flag]+adcresulta1[i]; //去掉最小的1个和最大的1个,取中间的3个数据进行求和
}
Output0[flag]=Output0[flag]/3; //计算4个采样数据的平均值
Output1[flag]=Output1[flag]/3;
flag++;
if(flag==300)
{
fir_filter(Output0,Output1);
int t=0;
for(i=0;i<300;i++)
{
if(Output0[i]>1.5&&Output0[i]<Output0[i+1])
{
if(Output0[i+1]>Output0[i+2])
{
NUM[t]=i+1;
VALUE[t]=Output0[i+1];
t++;
if(t>2)
{
t=0;
goto out;
}
}
}
}
out:asm (" ESTOP0");
flag=0;
for(i=0;i<300;i++)
{
Output0[i]=0;
Output1[i]=0;
}
}
SampleCount=0; //清采样计数器,进入新的连续十次的采样
}
PieCtrlRegs.PIEACK.all=0x0001; //响应PIE同组中断
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除AD中断的标志位
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;//复位序列发生器
//AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //立即启动下一次转换(不是使用EV触发了嘛?)
EINT; //使能全局中断
}
/************************************************************
--------------------EPWM配置函数-----------------------------
*************************************************************/
void ePWM_init(void)
{
//InitEPwmGpio();//使能内部上拉电阻并配置成EPWM模式
//EALLOW;
//SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocks
//EDIS;
//EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//使用映射寄存器
EPwm1Regs.TBPRD = Period; //周期为
//EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // 相位为0
EPwm1Regs.TBCTR = 0x0000; //初始计数值
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //增计数
//EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁止TBCTR加载相位
//EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; //定时器时钟源选择(同步信号输出选择)
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; //分频系数2*k
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //分频系数
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 2; //周期中断
EPwm1Regs.ETPS.bit.SOCACNT =1; // 事件发生次数
EPwm1Regs.ETPS.bit.SOCAPRD =1; // 发生一次事件启动ADC
EPwm1Regs.ETFLG.bit.SOCA =1; // 清除标志位(如果不清除会有触发信号吗?)
}
/*******************************************************************
-----------------------AD采样配置函数--------------------------------
********************************************************************/
void ADC_init(void)
{
InitAdc();
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf; // Acquisition window size
AdcRegs.ADCTRL1.bit.CPS = 0; // ADC预分频
AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; // ADCCLK=25MHz
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联方式
AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 启停模式
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; // 顺序采样
// AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM = 0;
AdcRegs.ADCMAXCONV.all = 0x0001; // 2 channels of AD convertion in SEQ
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除SEQ1中的中断标志位INT_SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ1=0; //复位序列发生器
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能SEQ1的中断请求
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //中断方式(每次转换结束置位标志位)
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1; //EVA事件启动AD转换
//AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //外部引脚触发位,此例无用
}
void fir_filter(float b[],float c[])
{
int i,j=0;
float sum;
float h[21]={
-0.09055792262407, 0.009744804975761, 0.01838867509003, 0.03195961694651,
0.04917012260358, 0.06836127325356, 0.08774901331544, 0.1053433191277,
0.1194310387162, 0.128484986607, 0.1316381457976, 0.128484986607,
0.1194310387162, 0.1053433191277, 0.08774901331544, 0.06836127325356,
0.04917012260358, 0.03195961694651, 0.01838867509003, 0.009744804975761,
-0.09055792262407
};
for(i=0;i<300;i++)
{
sum=0.0;
for(j=0;j<21;j++)
{
if(i >= j)
sum+=h[j]*b[i-j];
else
;
}
c[i]=sum;
}
for(i=0;i<280;i++)
{
c[i]=c[i+20];
}
}
void sequence(float a[],int n)
{
int i=0;
int j=0;
float temp=0;
for(i=0;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j]) //如果a[i]比a[j]大,则交换数据,前面的总是保存较小的数据
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void set_freq(float x,float y)
{
Uint16 k;
float ftw,temp;
float ftw1[6]={0},ftw2[6]={0};
ftw=x*281474976.7106/240;//240MHz系统频率
//ftw=x*5864062/5;//240MHz系统频率
for(k=9;k>3;k--)//计算频率1的控制字
{
//temp=ftw/256;//取商
//temp=ftw-temp*256;//取余
temp=(long int)ftw%256;
ftw1[k-4]=(Uint16)temp;
ftw/=256;
}
ftw=y*281474976.7106/240;//240MHz系统频率
//ftw=y*5864062/5;//240MHz系统频率
for(k=9;k>3;k--)//计算频率2的控制字
{
//temp=ftw/256;//取商
//temp=ftw-temp*256;//取余
temp=(long int)ftw%256;
ftw2[k-4]=(Uint16)temp;
ftw/=256;
}
// for(k=0;k<6;k++) //写频率控制字1
// *( (&dds1) +k*256)=ftw1[k];
// for(k=0x00;k<0x06;k++)//写频率控制字2
// *( (&dds2) +k*256)=ftw2[k];
//取最终的地址的内容 取地址 地址加i
//写频率控制字1
*f1=ftw1[0];
UPDATA();
*f2=ftw1[1];
UPDATA();
*f3=ftw1[2];
UPDATA();
*f4=ftw1[3];
UPDATA();
*f5=ftw1[4];
UPDATA();
*f6=ftw1[5];
UPDATA();
//写频率控制字2
*F1=ftw2[0];
UPDATA();
*F2=ftw2[1];
UPDATA();
*F3=ftw2[2];
UPDATA();
*F4=ftw2[3];
UPDATA();
*F5=ftw2[4];
UPDATA();
*F6=ftw2[5];
UPDATA();
}
void Updata_Deltaword(void)
{
// Uint16 k;
Uint16 deltaword[6]={0x00,0x80,0x00,0x00,0x00,0x00}; //40bit = 585.9khz
//for(k=0;k<6;k++) //写频率控制字1
//*( (&delta) +k)=deltaword[k];
//写48位斜率计数器值
*bujin6=deltaword[5];
UPDATA();
*bujin5=deltaword[4];
UPDATA();
*bujin4=deltaword[3];
UPDATA();
*bujin3=deltaword[2];
UPDATA();
*bujin2=deltaword[1];
UPDATA();
*bujin1=deltaword[0];
UPDATA();
}
void Updata_Ramprateword(void)
{
Uint16 ramprateword[3]={0x00,0x75,0x30}; // 时间步进 现取100us 最大6990.506us
//写Ramp Rate寄存器的值
*xielv3=ramprateword[2];
UPDATA();
*xielv2=ramprateword[1];
UPDATA();
*xielv1=ramprateword[0];
UPDATA();
}
void set_phase(Uint16 x,Uint16 y)
{
Uint16 phase_word1[2],phase_word2[2];
phase_word1[1]=x%256;
phase_word1[0]=(x/256)%256;
phase_word2[1]=y%256;
phase_word2[0]=(y/256)%256;
//写相位值1
*p1=phase_word1[0];
UPDATA();
*p2=phase_word1[1];
UPDATA();
//写相位值2
*P1=phase_word2[0];
UPDATA();
*P2=phase_word2[1];
UPDATA();
// for(k=0;k<2;k++)
// *( (&phase1) +k)=phase_word1[k];
//取最终的地址的内容 取地址 地址加i
// for(k=0;k<2;k++)
// *( (&phase2) +k)=phase_word2[k];
}
void set_amplitude(void)
{
Uint16 amplitude[2]={0xFF,0xFF};
*a1=amplitude[1];
UPDATA();
*a2=amplitude[0];
UPDATA();
*A1=amplitude[1];
UPDATA();
*A2=amplitude[0];
UPDATA();
}
void UPDATA(void)
{
GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
GpioDataRegs.GPASET.bit.GPIO1=1;//上升沿更新信号
DELAY_US(10);//至少保持八个系统时钟周期
GpioDataRegs.GPACLEAR.bit.GPIO1=1;//上升沿更新信号
}
void Gpio_setup(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//选择数字IO模式
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉电阻
GpioCtrlRegs.GPAPUD.bit.GPIO1=0;
GpioCtrlRegs.GPAPUD.bit.GPIO2=0;
GpioCtrlRegs.GPAPUD.bit.GPIO3=0;
GpioCtrlRegs.GPAPUD.bit.GPIO4=0;
GpioCtrlRegs.GPAPUD.bit.GPIO5=0;
GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出方向
GpioCtrlRegs.GPADIR.bit.GPIO1=1;
GpioCtrlRegs.GPADIR.bit.GPIO2=1;
GpioCtrlRegs.GPADIR.bit.GPIO3=1;
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
GpioCtrlRegs.GPADIR.bit.GPIO5=1;
EDIS;
}
| 用DSP28335控制AD9852时发现一直没有输出,但是板子发热倒是挺烫的说明是有工作的,现在找不到原因了,求问各位大侠怎么解决? |