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

📄 main.c

📁 fm25c64和tms320lf2407通信程序
💻 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 + -