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

📄 isr.c

📁 DSP56F800e HYBRID Controller
💻 C
字号:
#include "Headers.h"




UInt16 TX_BUFFER[BUFFER_LENGTH];
UWord8 headTx,tailTx;


unsigned int data='A',data1,data2;     //dummy


void ClearInterrupt()
{


      
  	
  asm(bfclr #$3C00,X:IPR0);
  asm(bfclr #$003F,X:IPR1);
  asm(bfclr #$FFCF,X:IPR2);
  asm(bfclr #$FFFC,X:IPR3);
  
  asm(bfclr #$FC3F,X:IPR4);
  asm(bfclr #$FF3F,X:IPR5);
  asm(bfclr #$FFCF,X:IPR6);
  asm(bfclr #$FFFF,X:IPR7);
  
  asm(bfclr #$F3FF,X:IPR8);
  asm(bfclr #$FFFF,X:IPR9);
 
  
  asm(bfset #$0020,X:ICTL); //toate intreruperile sunt dezactivate
  asm(bfset #0300,SR);      //maschez toate intreruperile de pe nivelurile 0,1,2 
}



void enterCritical()
{

 asm(bfset #$0020,X:ICTL);  //toate intreruperile sunt dezactivate

}


void exitCritical()
{

 asm(bfclr #$0020,X:ICTL);  //activez posibilitatea de a avea  intreruperi
	
}



















void initIsrSpi0()
{
	
		asm (bfclr #$0300,SR);		;		//permit toate tipurile de intrerupere
		asm (bfset #$0003,X:IPR5);  //intreruperea de transmisie pt spi0 are prioritatea 2
	    asm(bfclr  #$0020,X:ICTL); 
	
}












#pragma interrupt saveall 
void isrtSpi0TransmitterEmpty()
{

   enterCritical();
    
   if(headTx!=tailTx) 
   {
   	
     SPI0_SPDTR  = TX_BUFFER[tailTx];//scrierea in registrul SPI0_SPDTR determina 
                       			     //initiera unei noi transmisii
                                     //sterge bitul SPTE -SPI Transmitter Empty   
     tailTx = ( tailTx + 1 ) & (BUFFER_LENGTH - 1) ;
  
   }
   
    SPI0_SPDTR =0xAA;
   puts("Intrerupere");
  exitCritical();                     
      
}




#pragma interrupt saveall 
void isrtSpi0Receiver()
{
   if( (SPI0_SPSCR>>SPI0_RECEIVER_FULL)&01 ) //daca intreruperea a fost cauzata de receptia datei
   {
   	
    //retin data primita si sterg bitul SPRF - SPI Receiver Full
    data1 = SPI0_SPSCR; //dummy read
    data1 = SPI0_SPDRR; //retin data receptionata
                        //aceasta data tr. citita inainte de a receptiona o noua data
   	data2 = SPI0_SPSCR;
   	printf("SPI0 Receiver overflow");
   }
  
  
   if((SPI0_SPSCR>>SPI0_RECEIVER_OVERFLOW)&01) //daca intreruperea este cauzata de overflow
   {
   	 //retin data primita si sterg bitul SPRF - SPI Receiver Full
    data2 = SPI0_SPSCR; //dummy read
    data2 = SPI0_SPDRR; //retin data receptionata
                     //aceasta data tr. citita inainte de a receptiona o noua data
   	
   	 printf("SPI0 Receiver overflow");
   }
    
     
   if(  (SPI0_SPSCR>>SPI0_MODE_FAULT)&01 )     //nivelul de pe pinul SSn este inconsistent  
   {
   	 printf("SPI0 Fault Mode");
   	
   	
   }

	
}

#pragma interrupt saveall 
void isrtSpi1ReceiverFull()
{

  //registrul de receptie este plin
  
  //retin data primita si sterg bitul SPRF - SPI Receiver Full
  data = SPI1_SPSCR; //dummy read
  data = SPI1_SPDRR; //retin data receptionata
                     //aceasta data tr. citita inainte de a receptiona o noua data
                      	
}

⌨️ 快捷键说明

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