?? 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 + -