📄 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -