www.pudn.com > uCOS_SPI.rar > spi.c


/****************************************Copyright (c)************************************************** 
**                              四川唐门高新技术开发有限公司 
**                                     研    发    部 
**                                独门暗器之孔雀翎研究室  
** 
**                                http://www.蜀中唐门.com 
** 
**                                   维护健康 信守诚诺 
** 
**--------------文件信息-------------------------------------------------------------------------------- 
**文   件   名: SPI.c 
**创   建   人: 赖皮 
**最后修改日期: 2007年1月29日 
**描        述: μCOS-II下LPC213x的SPI主模式底层驱动中间件  
**				去掉信号量判断,改为查询方式 
**               
**--------------历史版本信息---------------------------------------------------------------------------- 
** 创建人: 赖皮 
** 版  本: v1.0 
** 日 期: 2007年1月29日 
** 描 述: 原始版本 
** 
**--------------当前版本修订------------------------------------------------------------------------------ 
** 修改人: 赖皮 
** 日 期: 2007年1月29日 
** 描 述:  
** 
**          LAI2005PI@126.com 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
 
#define IN_SPI 
#include "config.h" 
 
static OS_EVENT *SPISem; 
 
/********************************************************************************************************* 
** 函数名称: SPIInit 
** 功能描述: 初始化SPI总线为主模式  全查询方式  SPI速度很快 未用MISO 
** 输 入: Fdiv:用于设定总线频率(总线频率=Fpclk/Fdiv) 
** 
** 输 出:TRUE  :成功 
**        FALSE:失败 
** 调用模块: OSSemCreate 
** 
** 作 者: 赖皮 
** 日 期: 2007年1月29日 
**------------------------------------------------------------------------------------------------------- 
********************************************************************************************************/ 
        uint8 SPIInit(uint8 Fdiv) 
{ 
    PINSEL0 = (PINSEL0 & 0xffffCCff) //| 0x5500;  // 选择管脚为SPI口  
    		| (0x01<<(4*2))			// P0.4连接SCK0 
			| (0x01<<(6*2))			// P0.6连接MOSI0		 
			; 
    SPI_SPCCR = Fdiv & 0xfe;                    // 分频值    
	SPI_SPCR  = (0 << 3) |						// CPHA = 0, 数据在SCK 的第一个时钟沿采样 
 			 	(0 << 4) |						// CPOL = 1, SCK 为低有效 
 			 	(1 << 5) |						// MSTR = 1, SPI 处于主模式 
 			 	(0 << 6) |						// LSBF = 0, SPI 数据传输MSB (位7)在先 
 			 	(0 << 7) ; 						// SPIE = 0, SPI 中断被禁止 
 			 	 
    SPISem = OSSemCreate(1);                    // 用于互斥访问SPI总线  
    if (SPISem != NULL) 
    { 
        return TRUE; 
    } 
    else 
    { 
        return FALSE; 
    } 
} 
 
/********************************************************************************************************* 
** 函数名称: SPIStart 
** 功能描述: 开始访问SPI  
** 输 入: 无 
** 
** 输 出: 无 
** 全局变量: 无 
** 调用模块: 无 
** 
** 作 者: 赖皮 
** 日 期: 2007年1月29日 
**------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
        void SPIStart(void) 
{   
	uint8 err; 
	 
    OSSemPend(SPISem, 0, &err); 
} 
 
/********************************************************************************************************* 
** 函数名称: SPIRW 
** 功能描述: 读写SPI  
** 输 入: Data:发送的数据  
** 输 出: SPI接收的数据 
** 作 者: 赖皮 
** 日 期: 2007年1月29日 
**------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
        uint8 SPIRW(uint8 Data) 
{     
    SPI_SPDR = Data; 
    while( 0 == (SPI_SPSR & 0x80));		// 等待SPIF置位,即等待数据发送完毕 
    return(SPI_SPDR); 
} 
 
/********************************************************************************************************* 
** 函数名称: SPIEnd 
** 功能描述: 访问SPI结束 
** 输 入: 无 
** 输 出: 无 
** 作 者: 赖皮 
** 日 期: 2007年1月29日 
**------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
        void SPIEnd(void) 
{ 
    OSSemPost(SPISem); 
} 
/********************************************************************************************************* 
**                            End Of File 
********************************************************************************************************/