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

📄 spi.c

📁 这个是基于ARM7的相关驱动代码
💻 C
字号:
/*
*******************************************************************************
*                    Copyright (c) 2005, Comba Telecom System
*                             All Rights Reserved
*
* Purpose           : SPI File
* File Name         : SPI.c

* Chip type         : LPC22XX(ARM7TDMI)
* IDE               : ADS1.2

* Revision history  :
    01a,2005/08/29,Lu jiangmin  -- Creation(written),re. zlgmcu Chen mingji
  
* Description       :
    
*******************************************************************************
*/

#define _DEFINE_VAR_SPI
#include "config.h"

INT32U GetOSPrioCur(void)
{
    return OSPrioCur;
}

/*	
*******************************************************************************
* 函数功能: 初始化SPI0
* 说 明: 
*       1.  输入:
            Fdiv--时钟频率(必须采用最快的速度:Fpclk/8).
            输出:
            无.
            
*       2.  基本方法:
            a)主机模式,查询方式,MSB FIRST,工作模式3(CPOL=1,CPHA=1).
            
*       3.  注意:
            a)SPI0固定用做DATAFLASH,要求高速且执行指令最少!.
*******************************************************************************
*/
void SPI0Init (INT8U Fdiv)
{
    PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x5500;  //选择管脚为SPI0
    S0PCCR = Fdiv & 0xfe;
    S0PCR = 0x20;
}

INT8U SPI1Init(INT8U Fdiv)
{
    PINSEL1 = (PINSEL1 & 0xfffffc03) | 0x02a8;  //选择管脚为SPI1

    S1PCCR = Fdiv & 0xfe;                       //分频值
    S1PCR = SPI1_SPIE | SPI1_MSBF | SPI1_MSTR | SPI1_MODE_0;    //控制方式(头文件定义)

    UseSPI1TaskPro = OS_PRIO_SELF;              //避免任务不按照规范编写程序而使访问SPI混乱
    SPI1ReviceMbox = OSMboxCreate(NULL);        //用于中断返回收到的数据
    if (SPI1ReviceMbox == NULL)
    {
        return FALSE;
    }
    SPI1Sem = OSSemCreate(1);                   //用于互斥访问SPI总线
    if (SPI1Sem != NULL)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

INT8U GetSPI1Flag(void)
{
    OS_SEM_DATA SemData;
    
    if (OSSemQuery(SPI1Sem, &SemData) == OS_NO_ERR)
    {
        if (SemData.OSCnt != 0)
        {
            return 0;
        }
    }
    return 1;
}

INT8U SPI1Start(void)
{
    INT8U err;
    
    OSSemPend(SPI1Sem, 0, &err);
    UseSPI1TaskPro = GetOSPrioCur();
    return TRUE;
}

INT8U SPI1RW(INT8U *Rt, INT8U Data)
{
    INT8U temp, err;
  
    temp = GetOSPrioCur();
    if (temp == UseSPI1TaskPro)
    {
        S1PDR = Data;
        temp = (INT32U)OSMboxPend(SPI1ReviceMbox, 0, &err);
        *Rt = temp;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

INT8U SPI1SendNbyte(INT8U *data, INT8U nbyte)
{  
   INT8U temp, err;

   temp = GetOSPrioCur();
   if(UseSPI1TaskPro == temp)
   	{
   	   while(nbyte--)
   	   	{
   	   	   S1PDR = *data ++;
		   OSMboxPend(SPI1ReviceMbox, 0, &err);
   	   	}
	   return TRUE;
   	}
   else
   	   return FALSE;  
}
INT8U SPI1End(void)
{
    INT8U temp;
    
    temp = GetOSPrioCur();
    if (temp == UseSPI1TaskPro)
    {
        UseSPI1TaskPro = OS_PRIO_SELF;
        OSSemPost(SPI1Sem);
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

void SPI1_Exception(void)
{
    INT8U temp, temp1;
    
    temp = S1PSR;
    if ((temp & 0x80) != 0)
    {
        temp1 = S1PDR;
        OSMboxPost(SPI1ReviceMbox, (void *)(temp1 | 0x100));
    }
    
    if ((temp & 0x10) != 0)
    {
        S1PCR = SPI1_SPIE | SPI1_MSBF | SPI1_MSTR | SPI1_MODE_0;
    }
    S1PINT = 0x01;    
    VICVectAddr = 0;            // 通知中断控制器中断结束
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -