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

📄 slaver_spi_isr.c

📁 2812SPI双机通信程序.rar
💻 C
字号:

//修改时间2008.4.21
//版本号:0.1

#include "DSP281x_Device.h"     
#include "DSP281x_Examples.h" 
#include "Communication.h"

#pragma CODE_SECTION(SPI_datadeal ,"COM");

extern Uint32 clock;


interrupt void SPIR_ISR(void)
{
    //读命令
   	Uint16 rdata = 0;
	
	rdata = SpiaRegs.SPIRXBUF;  //接收一个数据
                    


                       

   	KickDog(); 
    
    SPI_f = 0;
    
    //判断命令

	if (SpiaRegs.SPIFFTX.bit.TXFFST == 0)  //当还有数据在发送时,不接收任何
	{
		SPI_com[0] = SPI_com[1];       //连续进四次接收中断,收四个数据,正好为一组命令
		SPI_com[1] = SPI_com[2];
		SPI_com[2] = SPI_com[3];
		SPI_com[3] = rdata;
		KickDog();
		
	


	
		//==========读电压判断命令=================//	
		    	
		if ( (SPI_com[0] == 0x0003) && (SPI_com[1] == 0x100A) && (SPI_com[2] == 0x0004) )  //判断电压命令是否正确
		{
			RCheckSum = SPI_Rchecksum(SPI_com);   
		 	if(RCheckSum == SPI_com[3])        //校验码是否正确
		 	{
		  		SPI_f = 3;                     
		  	 	SPI_receivecount = 2*SPI_com[2];  //读出所要发送的字数
		  	}
		}

		

	}

	if((SPI_f != 0) && (SpiaRegs.SPIFFTX.bit.TXFFST == 0) )   
	{
		Init_SPI();		
		SPI_datadeal();
		PieCtrlRegs.PIEIER6.bit.INTx1 = 0; //关接收中断
		PieCtrlRegs.PIEIER6.bit.INTx2 = 1; //开发送中断,开始发送数据
	}


	
		
	KickDog();

	

    

	SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
	SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; 	// Clear Interrupt flag
	PieCtrlRegs.PIEACK.all|=0x20;    // Issue PIE ack


}							
//======================================================================					
					


void SPI_datadeal(void)   
{	


//====根据命令把相应的数据写入缓冲中=======
	switch(SPI_f)
	{
	
	            
	            								
//==============读取A B C三相电压=====================//		
		case 3: 
	   		    SPI_readdata(UXa,UXb,UXc,UXd);
	   		    SCheckSum = SPI_Schecksum(SPI_data) ; //计算发送校验码
	    		SPI_data[12] = SCheckSum;
	            KickDog();
	            SPI_f = 0;
	            break;
	            
	            
	            
	    default:
			      			      
			    break; 
	 	
	}
	

}


//================四个32位数装入16位数组子程序==================//
void SPI_readdata(Uint32 a,Uint32 b,Uint32 c,Uint32 d)
{	
	Uint32 temp;
	
	KickDog();
	SPI_data[0] = 2;                   //缓冲中数据的起始位置
	SPI_data[1] = 12;                  //缓冲中数据的结束位置 
	SPI_data[2] = 0x0003;              //功能码
    SPI_data[3] = SPI_receivecount;        //发送的字数
    temp = a>>16;                          //开始转存数据
    SPI_data[4] = ((Uint16)temp);
   	temp = a;
    SPI_data[5] = ((Uint16)temp);
    temp = b>>16;
    SPI_data[6] = ((Uint16)temp);
   	temp = b;
    SPI_data[7] = ((Uint16)temp);
    temp = c>>16;
    SPI_data[8] = ((Uint16)temp);
   	temp = c;
    SPI_data[9] = ((Uint16)temp);
    temp = d>>16;
    SPI_data[10] = ((Uint16)temp);
   	temp = d;
    SPI_data[11] = ((Uint16)temp);  
    		     		    
    SPI_f = 0;
		
}





//=====================SPI发送中断=====================//
interrupt void SPIT_ISR(void)
{
		
	if((SpiaRegs.SPIFFTX.bit.TXFFST == 0) )  //发送FIFO空
	{
//SPI_data[0]为发送字数的起始位,SPI_data[1]为中止位,真正发送的数据从SPI_data[2]开始,SPI_data[2]为功能码,SPI_data[3]为数据字数			
		while ( (SPI_data[0] < (SPI_data[1]+1)) && (SpiaRegs.SPIFFTX.bit.TXFFST<16))
		{
			SpiaRegs.SPITXBUF = SPI_data[ SPI_data[0] ];  //开始发送数据
			SPI_data[0]++;
		}
	}
		
	if(SPI_data[0] >= (SPI_data[1]+1))   //判断发送完毕
	{
		PieCtrlRegs.PIEIER6.bit.INTx2 = 0;  //关发送中断,关接收中断,便于下一轮的命令接收
    		PieCtrlRegs.PIEIER6.bit.INTx1 = 1;	
	}
		

		
   	
    	SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; 	// Clear Interrupt flag
	PieCtrlRegs.PIEACK.all|=0x20;    // Issue PIE ack
	    
	    
}


Uint16 SPI_Schecksum(Uint16 array[])   //发送校验码计算子程序
{	
	Uint16 i;
	SCheckSum = 0;
	for	(i=4;i<(array[3]+4);i++)
	{
		SCheckSum = SCheckSum+array[i]; 
	}
	return(SCheckSum);			
}


Uint16 SPI_Rchecksum(Uint16 *p)     //接收校验码计算子程序
{
	Uint16 i;
	RCheckSum = 0;
	for(i=0;i<3;i++)
	{
		RCheckSum =RCheckSum + (*(p+i));
	}
	return(RCheckSum);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -