📄 spidriver.c
字号:
#include "config.h"
static INT8U useSpiTaskPriority;//保存调用SPI接口函数的是同一个任务
OS_EVENT *spiSem;
OS_EVENT *spiRcvMbox;
INT8U initSpi(INT8U fdiv)
{
PINSEL0=(PINSEL0&0XFFFF00FF)|0X5500;//连接SPI管脚
S0PCCR=fdiv&0xfe;//分频系数为偶数
S0PCR=SPI_MODE;
useSpiTaskPriority=OS_PRIO_SELF;
spiRcvMbox=OSMboxCreate(NULL);//创建通信邮箱,用于从中断返回数据
if(spiRcvMbox==NULL)
{
return(FALSE);
}
spiSem=OSSemCreate(1);//创建信号量
if(spiSem!=NULL)
{
return(TRUE);
}
else
{
return(FALSE);
}
}
INT8U getSpiFlag(void)
{
OS_SEM_DATA semData;
if(OSSemQuery(spiSem,&semData)==OS_NO_ERR)
{
if(semData.OSCnt!=0)
return(0);
}
return(1);
}
INT8U spiStart(void)
{
INT8U err;
OSSemPend(spiSem,0,&err);//等待资源可用
useSpiTaskPriority=GetOSPrioCur();//获取调用SPI接口的任务
return(TRUE);
}
INT8U spiReadWrite(INT8U *res,INT8U toWrite)
{
INT8U temp;
INT8U err;
INT8U *msg;
temp=GetOSPrioCur();
if(temp==useSpiTaskPriority)//调用该函数的是不是同一个任务
{
S0PDR=toWrite;
msg=(unsigned char*)OSMboxPend(spiRcvMbox,0,&err);
res=msg;
return(TRUE);
}
else
{
return(FALSE);
}
}
INT8U spiEnd(void)
{
INT8U tmp;
tmp=GetOSPrioCur();
if(tmp==useSpiTaskPriority)//调用该函数的是不是同一个任务
{
useSpiTaskPriority=OS_PRIO_SELF;//SPI接口使用完毕复位 useSpiTaskPriotiry
OSSemPost(spiSem);//释放SPI接口资源
return(TRUE);
}
else
return(FALSE);
}
/***SPI 中断处理函数***/
void SPI_Exception(void)
{
INT8U source;
static INT8U msg;
OS_ENTER_CRITICAL();
source=S0PSR;
if(source&0x80)//SPI 传输完成
{
msg=S0PDR;
OSMboxPost(spiRcvMbox,(void*)&msg);//返回读到的数据
//OSMboxPost(spiRcvMbox,(void*)(res|0x100));//返回读到的数据
}
if(source&0x10)//模式错误 读取SOPSR,再写S0PCCR
{
S0PCR=SPI_MODE;
}
S0PINT=0X01;//清除SPIF 标志
VICVectAddr=0x00;//中断处理完成,退出中断
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -