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