⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 f2812内部spi程序
💻 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;     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -