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