📄 main.c
字号:
/*Main.c*/
/*SPI-TLC5620 DA转换程序*/
#include "fm25cl64.h"
#include "global.c"
void SystemInit();
void Timer1Init();
void KickDog();
void SPI_Init();
//
void DA_OUT1(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA) ;
int numled0=200;
unsigned int t0=0,i=0;
int Voltage=0;
unsigned int rdregister ;
//
//CS_DA=0,更新模拟信号输出
#define CLR_CS (PCDATDIR=(PCDATDIR|0x2000) & 0xFFDF)
//CS_DA=1,锁存数据
#define SET_CS (PCDATDIR=PCDATDIR | 0x2020)
//
void READ(void) ; /*读命令*/
void WRITE(void) ; /*写命令*/
void WREN(void) ; /*写使能命令*/
void WRITE_BYTE(int ADDR,unsigned char *DATA,int num) ;
void READ_BYTE(int ADDR,unsigned char *DATA,int num) ;
void WRDI( void ) ;
unsigned int RDSR( void ) ;
void WRSR( unsigned int data ) ;
//
void WriteByte(int ADDR,unsigned char DATA ) ;
unsigned int ReadByte(int ADDR) ;
//
main()
{
unsigned char buf[10],buf1[10] ;
int num ;
int i ;
SystemInit(); //系统初始化
MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式
PBDATDIR=0xFFC2; //所有LED=0
PBDATDIR=PBDATDIR | 0x003D; //所有LED=1
SPI_Init();
//
Timer1Init(); /*定时器初始化*/
//asm(" CLRC INTM ");
for( i=0 ;i<10 ;i++ )
buf[i] = (i+1)*(i+1) ;
//
while(1)
{
// WRSR(0xFF) ;
// rdregister = RDSR() ;
WRSR(0x80) ;
WREN() ;
for( i=0 ;i<255 ;i++ )
{
WriteByte( 0x0000+i,i ) ;
num = ReadByte(0x0000+i) ;
if( num != (i%256) )
{
asm( " nop" ) ;
}
}
// rdregister = RDSR() ;
// for( i=0 ;i<100 ;i++ );
//
// WRITE_BYTE(0x1000,buf,2) ;
/* WRITE_BYTE(0x1001,&buf[1],1) ;
WRITE_BYTE(0x1002,&buf[2],1) ;
WRITE_BYTE(0x1003,&buf[3],1) ;
READ_BYTE(0x1000,buf1,1) ;
READ_BYTE(0x1001,&buf1[1],1) ;
READ_BYTE(0x1002,&buf1[2],1) ;
READ_BYTE(0x1003,&buf1[3],1) ;
WRDI() ;
rdregister = RDSR() ;*/
}
}
//
void SystemInit()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
SCSR1=0x81FE; /* 系统时钟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 | 0x001C; //SPISOMI,SPISIMO,SPICLK特殊功能方式
SET_CS ; //
SPICCR=0x47; //16bit数据
SPICTL=0xE6; //禁止中断.normal clock
SPIBRR=0x27; //1M波特率,40M/40=1M
SPICCR=SPICCR | 0x80;
}
//
void DA_OUT1(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{
unsigned int SndData ;
SndData=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数
//
CLR_CS ;
SndData = 0x06;
SndData = SndData<<8 ;
SPI_Write_Byte( SndData ) ;
//
//CLR_CS ;
for(i=0;i<5;i++); //延时
SET_CS ;
return ;
}
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{
unsigned int SndData ;
SndData=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数
//
SPI_Write_Byte( SndData ) ;
//
CLR_CS ;
for(i=0;i<5;i++); //延时
SET_CS ;
return ;
}
//
void WRITE(void) /*写命令*/
{ /* 数据写命令0x02*/
SPI_Write_Byte(0x02);
}
//
void READ(void) /*读命令*/
{ /*数据读命令0x03*/
SPI_Write_Byte(0x03);
}
//
void WREN(void) /*写使能命令*/
{
CLR_CS; /*片选下降沿*/
SPI_Write_Byte(0x06); /*使能写命令0x06*/
SET_CS; /*片选上升沿*/
return ;
}
//
void WRITE_BYTE(int ADDR,unsigned char *DATA,int num)
{
int i,k ;
//
WREN(); /*写使能*/
//for(i=0 ;i<5 ;i++ ) ;
CLR_CS; //Select the chip.
//for(i=0 ;i<2 ;i++ ) ;
SPI_Write_Byte(0x02); // Data write command.op_code.
SPI_Write_Byte((unsigned char)ADDR/256); /*高5位地址*/
SPI_Write_Byte((unsigned char)ADDR%256); /* 低8位地址*/
//
for( i=0; i<num; i++ )
{
SPI_Write_Byte(DATA[num]); /*写入num字节数据*/
//for(k=0 ;k<2 ;k++ ) ;
}
//for(i=0 ;i<2 ;i++ ) ;
SET_CS; // Deselect the chip.
//
return ;
}
void WriteByte(int ADDR,unsigned char DATA )
{
int i,k ;
//
WREN(); /*写使能*/
//for(i=0 ;i<5 ;i++ ) ;
CLR_CS; //Select the chip.
//for(i=0 ;i<2 ;i++ ) ;
SPI_Write_Byte(0x02); // Data write command.op_code.
SPI_Write_Byte((unsigned char)ADDR/256); /*高5位地址*/
SPI_Write_Byte((unsigned char)ADDR%256); /* 低8位地址*/
SPI_Write_Byte(DATA);
//for(i=0 ;i<2 ;i++ ) ;
SET_CS; // Deselect the chip.
//
return ;
}
//
void READ_BYTE(int ADDR,unsigned char *DATA,int num) /*字节读*/
{
unsigned int i,k;
CLR_CS; /*片选低*/
SPI_Write_Byte(0x03); // Read op_code.
SPI_Write_Byte((unsigned char)(ADDR/256)); /*高5位地址*/
SPI_Write_Byte((unsigned char)(ADDR%256)); /*低8位地址*/
for( i=0; i<num; i++ )
{
DATA[i]=SPI_Write_Byte(0x00); /*读出数据字节*/
for(k=0 ;k<2 ;k++ ) ;
}
SET_CS; /*片选高*/
return ;
}
//
unsigned int ReadByte(int ADDR) /*字节读*/
{
unsigned int i,k;
unsigned int data ;
CLR_CS; /*片选低*/
SPI_Write_Byte(0x03); // Read op_code.
SPI_Write_Byte((unsigned char)(ADDR/256)); /*高5位地址*/
SPI_Write_Byte((unsigned char)(ADDR%256)); /*低8位地址*/
data = SPI_Write_Byte(0x00); /*读出数据字节*/
SET_CS; /*片选高*/
return(data) ;
}
//
unsigned int RDSR( void )
{
unsigned int ret ;
CLR_CS ;
SPI_Write_Byte( 0x05 ) ;
ret = SPI_Write_Byte( 0x00 ) ;
SET_CS ;
return( ret ) ;
}
//
void WRSR( unsigned int data )
{
WREN() ;
CLR_CS ;
SPI_Write_Byte( 0x01 ) ;
SPI_Write_Byte( data ) ;
SET_CS ;
}
//
void WRDI( void )
{
CLR_CS ;
SPI_Write_Byte( 0x02 ) ;
SET_CS ;
return ;
}
//
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_OUT1(0,0,Voltage); //Voltage范围0-255对应0-3.3V
//DA_OUT1(1,0,Voltage); //Voltage范围0-255对应0-3.3V
//DA_OUT1(2,0,192); //2.475V,Voltage范围0-255对应0-3.3V
//DA_OUT1(3,0,128); //1.65V,Voltage范围0-255对应0-3.3V
//WREN() ;
//WRSR() ;
//rdregister = RDSR() ;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -