|
//Main.c //SPI-TLC5620 DA转换程序 #include "global.c" void SystemInit(); void Timer1Init(); void KickDog(); void SPI_Init(); void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA); int numled0=200; unsigned int t0=0,i=0; int Voltage=0; main() {
SystemInit(); //系统初始化 MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式 PBDATDIR=0xFFC2; //所有LED=0 PBDATDIR=PBDATDIR | 0x003D; //所有LED=1 SPI_Init(); // CreateDASigal(); /* while(1) { CreateDASigal(); i=10; for(i=0;i<100;i++); } */ Timer1Init(); //定时器初始化 asm(" CLRC INTM "); while(1); }
void SystemInit() { asm(" SETC INTM "); //关闭总中断 asm(" CLRC SXM "); //禁止符号位扩展 asm(" CLRC CNF "); //B0块映射为 on-chip DARAM asm(" CLRC OVM "); //累加器结果正常溢出 SCSR1=0x87FE; //系统时钟CLKOUT=20*2=40M //打开ADC,EVA,EVB,CAN和SCI的时钟 WDCR=0x006F; //禁止看门狗,看门狗时钟64分频 KickDog(); //初始化看门狗 IFR=0xFFFF; //清除中断标志 IMR=0x0003; //打开中断2 }
void Timer1Init() {
EVAIMRA=0x0080; // 定时器1周期中断使能 EVAIFRA=0xFFFF; // 清除中断标志 GPTCONA=0x0000; T1PR=2500; // 定时器1初值,定时0.4us*2500=1ms T1CNT=0; T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能 }
void SPI_Init() //SPI-DA初始化 { MCRB=MCRB | 0x0014; //SPISIMO,SPICLK特殊功能方式 PBDATDIR=PBDATDIR | 0x0002; //CS_DA=1 SPICCR=0x004a; //11bit数据 SPICTL=0x0006; //禁止中断 SPIBRR=0x0027; //1M波特率,40M/40=1M SPICCR=SPICCR | 0x80;
}
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA) { unsigned char flag=0; SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数 while(1) { flag=SPISTS&0x40; if(flag==0x40) break; } SPIRXBUF=SPIRXBUF; //虚读寄存器以清除中断标志
PBDATDIR=PBDATDIR & 0xFFFD; //CS_DA=0,更新模拟信号输出 for(i=0;i<5;i++); //延时 PBDATDIR=PBDATDIR | 0x0002; //CS_DA=1,锁存数据 }
void c_int2() //定时器1中断服务程序 {
if(PIVR!=0x27) { asm(" CLRC INTM "); return; } T1CNT=0; numled0--; if(numled0==0) { numled0=200; if((PBDATDIR & 0x0001)==0x0001) PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0;LED灭 else PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮 } if(Voltage<0) Voltage=0; DA_OUT(0,0,Voltage); //Voltage范围0-255对应0-3.3V DA_OUT(1,0,Voltage); //Voltage范围0-255对应0-3.3V DA_OUT(2,0,192); //2.475V,Voltage范围0-255对应0-3.3V DA_OUT(3,0,128); //1.65V,Voltage范围0-255对应0-3.3V if(t0<255) Voltage++; else Voltage--; if(Voltage<0) Voltage=0; if(t0==508) t0=0; t0++; EVAIFRA=0x80; asm(" CLRC INTM "); }
void KickDog() //踢除看门狗 { WDKEY=0x5555; WDKEY=0xAAAA; }
|