📄 int.c
字号:
#define INT_GLOBAL
#include "user_includes.h"
/***************************************************************************
[Function]:
[Input]:
[Output]:
[Note]:
***************************************************************************/
//PO脉冲输出的高低电平可以用timer1直接控制,而不用以20ms为单位来输出
void Timer1_Exception(void){
// T1MR3 += Timer100MS;
if (T1IR &0x01){
T1IR = 0x01;
}
if (T1IR &0x02){
T1IR = 0x02;
}
if (T1IR &0x04){
T1IR = 0x04;
}
if (T1IR & 0x08)
{
T1IR = 0x08;
if (((SSPSR &0x1)&&(SPI1Data.Mode == SPI1_TX_OK))
|| !SPI1Data.Timer ){
T1MCR &= ~(1<<9);
//Set1SPI1SSEL();
DisableSPI1Interrupt();
SPI1Data.Mode = SPI1_IDLE;
OSSemPost(SPI1Sem);
}
else {
T1MR3 = T1TC + SPI1_CPSDVSR*8;
}
if (SPI1Data.Timer){
SPI1Data.Timer--;
}
}
VICVectAddr = 0x00; // 中断处理结束
}
/***************************************************************************
[Function]: 定时器1初始化
[Input]:
[Output]:
[Note]:
***************************************************************************/
void T1_Ini(void)
{
T1TC = 0; /* 定时器设置为0 */
T1PR = 0;/* 时钟不分频 */
T1MCR = 1 | (1 << 3) | (1 << 6);/* 设置T0MR0匹配后复位T0TC,并产生中断标志 */
// |(1<<9);
// T1MR2 = Timer20MS;
// BeepTimePerCycle = Fpclk / 100;/* 0.01秒钟定时 */
T1TCR = 0x03; //启动并复位T1TC
T1TCR = 0x01;/* 启动定时器*/
}
/***************************************************************************
[Function]:
[Input]:
[Output]:
[Note]:
***************************************************************************/
void SPI1_Init(void)
{
SSPCR0 = (0x00 << 8) | // SCR 设置SPI时钟分频
(0x01 << 7) | // CPHA 时钟输出相位,仅SPI模式有效
(0x01 << 6) | // CPOL 时钟输出极性,仅SPI模式有效
(0x00 << 4) | // FRF 帧格式 00=SPI,01=SSI,10=Microwire,11=保留
(0x07 << 0); // DSS 数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能,1=禁止,0=允许
(0x00 << 2) | // MS 主从选择,0=主机,1=从机
(0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
(0x00 << 0); // LBM 回写模式
// VICIntEnable = 1 << 11;
SSPCPSR = SPI1_CPSDVSR; // PCLK分频值
// SSPIMSC = 0x07; // 中断屏蔽寄存器
SSPICR = 0x03; // 中断清除寄存器
DisableSPI1Interrupt();
//Set1SPI1SSEL();
}
/***************************************************************************
[Function]:
[Input]:
[Output]:
[Note]:
***************************************************************************/
uint32 IntStatus;
uint32 IntE;
uint32 SPmis;
uint32 SoftInt;
void SPI1_Exception(void){
uint32 sendByteNum = 2;
IntStatus = VICRawIntr;
IntE = VICIntEnable;
SoftInt = VICSoftInt;
SPmis = SSPMIS;
if (SSPMIS & 0x8){
SPI1Data.Timer = 10;
while((SSPSR&0x02) && (SPI1Data.Point<SPI1Data.Count)){
//发送FIFO未满且有要发送的数据
//SSPDR = SPI1Data.Buff[SPI1Data.Point++];
SSPDR = SPI1Data.Ptr_Buff[SPI1Data.Point];
sendByteNum++;
if (SPI1Data.Mode == SPI1_DATA_TX){
if (!--SPI1Data.AddressCnt){
SPI1Data.AddressCnt=4;
SPI1Data.Point++;
}
}
else {
SPI1Data.Point++;
}
}
if (SPI1Data.Point>=SPI1Data.Count){
SPI1Data.Mode = SPI1_TX_OK;
DisableSPI1Interrupt();
}
T1MR3 = T1TC + SPI1_CPSDVSR*8*sendByteNum;
}
VICVectAddr = 0x00;
}
/***************************************************************************
[Function]:SPI0_Init() 初始化SPI接口,设置为主机
[Input]:
[Output]:
[Note]:
***************************************************************************/
void SPI0_Init(void){
PINSEL0 = (PINSEL0 &0xFFFF00FF) | 0x00001500; //设置引脚连接SPI
S0PCCR = 128; //设置SPI时钟分频= (11059200*2)/8=2764800Hz
S0PCR = (1 << 3) | //CPHA = 1,数据在SCK的第二个时钟沿采样
(1 << 4) | //CPOL=1,SCK为低有效
(1 << 5) | //MSTR=1,SPI处于主模式
(0 << 6) | //LSBF=0,SPI数据传输MSB(Bit7)在先
(1 << 7); //SPIE =1,开SPI中断
// VICVectCntl3 = (0x20 | SPI_INT_ID);//EINT2
// VICVectAddr3 = (uint32)IRQ_SPI;//
S0PINT = 1; //
EXTINT = 4;
VICIntEnable = (1 << SPI_INT_ID) | (1 << 16); //
PINSEL0 |= 3 << 14;
Set1SPI0SSEL();
SPI0Data.ptrBuff = SPI0Data.Buff;
SPI0Data.Busy = 0;
SPI0Data.Mode = SPI0_Idle;
SPI0Data.Count = 10;
// VICIntEnable = 1<<16;//外部中断2
}
/***************************************************************************
[Function]:
[Input]:
[Output]:
[Note]:
***************************************************************************/
void SPI0_Exception(void)
{
uint16 temp;
temp = S0PSR;
S0PINT = 1;
if ((temp &(0x80 | 0x20)) || (VICSoftInt &(1 << SPI_INT_ID)))
{
temp = S0PDR;
if (SPI0Data.Point < SPI0Data.Count)
{
S0PDR = SPI0Data.Buff[SPI0Data.Point];
}
else
{
Set1SPI0SSEL();
}
SPI0Data.Buff[SPI0Data.Point++] = temp;
}
else if (temp &0x10){
//模式错误
S0PCR = 0xB8;
}
VICSoftIntClear = (1 << SPI_INT_ID); //清软中断
VICVectAddr = 0x00; // 中断处理结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -