www.pudn.com > f2812_SPI.rar > MAIN.C


/****************************************************************************/ 
/*FILE NAME: MAIN.c                                                         */ 
/*designed by dfyitiaolong                                                  */ 
/*Revision:1.00                                                             */ 
/*Notice:                                                                   */ 
/****************************************************************************/ 
 
#include "F281X.h" 
#include "Macro.h" 
 
extern cregister volatile Uint16 IFR; 
extern cregister volatile Uint16 IER; 
 
volatile Uint16 *p_DSP1; 
Uint32 flag=0; 
 
void sysctrl(void); 
void init_GPIO(void); 
void init_SPI(void); 
void start_SPI(void); 
 
interrupt void my_xint1(void); 
 
#pragma DATA_SECTION(SPI_data,".m_data"); 
long SPI_data[2020]; 
long SPI_data1; 
Uint16 channel=1; 
Uint16 flag1=0; 
Uint16 flag3=0; 
Uint16 SPI_buff[8]={0}; 
 
extern unsigned int secureRamFuncs_runstart; 
extern unsigned int secureRamFuncs_loadstart; 
extern unsigned int secureRamFuncs_loadend; 
 
void main(void) 
{     
	Uint16 i; 
	DINT;  
	init_GPIO(); 
	ClrBit5_16(GPADAT); 
	sysctrl(); 
	nop; 
  
	SetBit14_16(GPBDAT);  //EN5 总开关 always open  
	ClrBit15_16(GPBDAT);  //SEL8 
	ClrBit11_16(GPBDAT);  //SEL9 
    
	SetBit8_16(GPBDAT);   //EN1   
	if(channel==0) 
	{ 
		ClrBit0_16(GPBDAT);  //SEL0 
		ClrBit1_16(GPBDAT);  //SEL1  
	} 
	else if(channel==1) 
	{ 
		SetBit0_16(GPBDAT);  //SEL0 
		ClrBit1_16(GPBDAT);  //SEL1 
	} 
	else if(channel==2) 
	{ 
		ClrBit0_16(GPBDAT);  //SEL0 
		SetBit1_16(GPBDAT);  //SEL1 
	} 
	 
	nop; 
 
	init_SPI(); 
	start_SPI(); 
 
//	上电初始化,清空采集数据区.38K,19K32bit字:11+8 
	p_DSP1=(volatile Uint16 *)0x0080000; 
	for(i=0;i<5000;i++) 
	{ 
		*p_DSP1=0x0000; 
		p_DSP1++; 
	} 
 
	for(i=0;i<2020;i++) //上电延时 
	{ 
		SPI_data[i]=0x00000000; 
	} 
	 
	EINT; 
   
  //握手后,给主机发0x03,告诉主机下位机断电过,需从新发最新的通道参数 
  //再发采集模式 
  //send_host(0x55,0xaa,03);  
    
	while(1)  //死循环轮训参数区,查看是否有通道启动标志 
	{ 
	}   
} 
 
   
void sysctrl(void)   //PIE control 
{ 
	DINT; 
	EALLOW; 
	IER = 0x0000; 
	IFR = 0x0000; 
	PLLCR=0X000a;  // 150M 30M*10/2 
	WDCR= 0x0068;  //Disable 
	asm("  C28OBJ"); 
    		 
	ClrBit16_32(XINTCNF2);   //XTIMCLK=SYSCLKOUT=150M 
	SetBit3_32(XINTCNF2);    //Disable XCLKOUT 
//	XTIMING0=0X00439E3C;     //2区和6区具有相同速度,不需配置存储转体寄存器 
                             //建立:2*XTIMCLK,激活:15*XTIMCLK,跟踪:0*XTIMCLK 
//	XTIMING6=0X00439E3C;    //缩放2:1,禁止XREADY 
	PCLKCR = BIT8_16; //SPI clk enable 
	SetBit0_16(PIECTRL);  //enable PIE vector 
	XINT1CR=0x0001;       //D2=0:中断在下降沿,D0=1:Enable XINT1 
	XINT2CR=0x0001; 
//	Clear all PIEIER registers: 
	PIEIER1 = 0; 
	PIEIER2 = 0; 
	PIEIER3 = 0;	 
	PIEIER4 = 0; 
	PIEIER5 = 0; 
	PIEIER6 = 0; 
	PIEIER7 = 0; 
	PIEIER8 = 0; 
	PIEIER9 = 0; 
	PIEIER10 = 0; 
	PIEIER11 = 0; 
	PIEIER12 = 0; 
//	Clear all PIEIFR registers: 
	PIEIFR1 = 0; 
	PIEIFR2 = 0; 
	PIEIFR3 = 0;	 
	PIEIFR4 = 0; 
	PIEIFR5 = 0; 
	PIEIFR6 = 0; 
	PIEIFR7 = 0; 
	PIEIFR8 = 0; 
	PIEIFR9 = 0; 
	PIEIFR10 = 0; 
	PIEIFR11 = 0; 
	PIEIFR12 = 0; 
           
//	Enable CPU INT1 which is connected to CPU-Timer 0,XINT1 and XINT2: 
	SetBit0_16(IER); 
//	SetBit6_16(PIEIER1); //PIE TINT0 
	SetBit3_16(PIEIER1); //PIE XINT1 
//	fill the PIE vector table   
	XINT1_ISR = (unsigned long)&my_xint1; 
 
    EDIS;    
	EINT; 
} 
 
//SPI函数应改动,硬件引脚已改!由FPGA驱动,尚等FPGA编程实现 
void init_SPI(void) 
{  
//	EALLOW; 
	LOSPCP=0x0001;  //低速时钟,默认为0x0002,sysclock/(n*2),n!=0 
	ClrBit7_16(SPICCR);  
	SPICCR=0x4b;  //D7:软复位,无延迟下降沿(上升沿接受数据),禁止回送,12位字长,分两次移送。 
	SPICTL=0x06;  //禁止中断和溢出中断,SCLK不延迟,主机方式,禁止发送,SPI中断无效(采用查询方式)。 
	SPIBRR=0x03;  //D6~D0, SPI rate=CPU时钟/SPIBBR+1,3~127,  OR rate=CPU时钟/4,SPIBBR=0,1,2.0x13 
	SPIPRI=0x20;  //发送完当前字后挂起,仿真停止时 
	SetBit7_16(SPICCR);  //退出软件复位模式,准备接受或者发送下一个字  
//	EDIS; 
} 
 
 
void start_SPI(void) 
{ 
  Uint16 i; 
  ClrBit5_16(GPADAT);  //GPIOA1=0 -->AD同步,SYNC信号,该引脚已改变 
  for(i=0;i<2000;i++) 
  { 
  } 
  SetBit5_16(GPADAT); 
}   
 
//////////////////read AD data 
interrupt void my_xint1(void)  //origin:my_xint1   
{ 
	DINT; 
 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  //SPI INT. can read back the spi data 
	{ 
		nop; 
	} 
	SPI_buff[0]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[1]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[2]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[3]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[4]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[5]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[6]=SPIRXBUF; 
	nop; 
	SPIDAT=0x3333;    //发SPI脉冲 
	while((SPISTS&0x40)!=0x40)  
	{ 
		nop; 
	} 
	SPI_buff[7]=SPIRXBUF; 
 
	SPI_data1=((Uint32)(SPI_buff[0]&0x0fff)<<12)+(Uint32)(SPI_buff[1]&0x0fff);  
	 
	if((SPI_data1&0x00800000)==0x00800000) 
		SPI_data1=SPI_data1|0xff000000; 
	 
	if(flag3==0) 
	{ 
		if(((SPI_data1-3513450)>40000)||((SPI_data1-3513450)<-40000)) 
			{ 
				SPI_data[flag1++]=SPI_data1;   
				flag3++; 
			} 
	}	 
	else 
	{ 
		if(flag1<2020) 
		SPI_data[flag1++]=SPI_data1;   
	} 
	 
	nop; 
 
	PIEACK = 0x0001; //ACK TO INTERRUPT XINT1 
	EINT;  
} 
 
//ADS1271 的DRDY和SYNC都用FPGA驱动,而不再是GPIO驱动。确定控制过程! 
void init_GPIO(void) 
{ 
	EALLOW; 
//	GPAMUX=0x0003;         //PWM1,PWM2,GPA2-->bell 
	GPAMUX=0x0003; 
	GPBMUX=0;              //GPIOB for IO, switch used 
//	GPIOD NO USED 
	GPEMUX=0x0003;         // XINT1 and XINT2 
	GPFMUX=0x003f;         // 3:SCIA, f:SPI, the other for IO 
	GPGMUX=0x0030;         // 3:SCIB  
   
//	SetBit2_16(GPADIR);    //GPIOA2 驱动为输出 for bell 
	SetBit5_16(GPADIR); 
	GPBDIR=0xffff;         //GPIOB ALL FOR OUT 
	GPFDIR=0x0f00;         //8,9,10,11 OUT used for DAC    
	SetBit0_16(GPDDIR);    //GPIOD0 OUT FOR D/I 
	GPADAT=0X0000;         //init all out to 0 
	GPBDAT=0X0000; 
	GPDDAT=0X0000; 
	GPFDAT=0X0000;    
 
	ClrBit0_16(GPDDAT);  //D/I 
               
	EDIS;      
}