📄 isr.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 + -