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

📄 spidriver.c

📁 程序展示了 ucos在EASYARM2200上的移植。并添加了多个设备在UCOS下的驱动UART:SPI:IIC:ZLG7290.当然还没有完全完成板上其它设备的驱动。由于限制
💻 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 + -