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

📄 spi.c

📁 ARM7 lpc2100 SPI驱动API,源码有详细注解
💻 C
字号:

#include "cfg.h"

void  MSpiInit(uint8 Int_SPIx);
uint8  MSendData(uint8 Int_SPIx,uint8 data);

/****************************************************************************
* 名    称:void  MSpiInit(uint8 Int_SPIx)
* 功    能:初始化SPI接口,设置为主机。SSEL0、SSEL1接上拉电阻,
						同时用IO口指定从机的SSEL为低电位
* 入口参数:Int_SPIx,SPI0、SPI1,MSpiInit(0),MSpiInit(1)初始不分先后,
						有效值0,1
* 出口参数:无
****************************************************************************/
void  MSpiInit(uint8 Int_SPIx)
{ if (!Int_SPIx)
	{	PINSEL0 = (PINSEL0 & ~0xff00) | 0x5500;//打开SCK0,MOSI0,MISO0,SSEL0
		S0PDR = 0x00;        //清SPI数据寄存器
  		S0PCCR = 0x52;		   //设置SPI时钟分频,SPI速率=Fplck/SxPCCR,
  										 	//SxPCCR必须为偶数,且不小于8	 			 
 		S0PCR = 0<<0 |       //[2:0]无定义
 	        	0<<3 |       //CPHA=0:上升沿采样,下降沿输出;1:下升沿采样,上降沿输出	
 	        	1<<4 |       //CPOL=0:SCK高电平有效;1:SCK低电平有效
 	        	1<<5 |       //MSTR=0:从机;1:主机
 	        	0<<6 |       //LSBF=0:SPI数据传输MSB在先;1:LSB在先
 	        	0<<7 ;       //SPIE=0:中断禁止;1:中断使能
 	        
 		S0PINT= 0<<0 |       //SPIE中断标志位,1:有中断;向该位写1清0,
 	                     	//当SPIF和WCOL至少有一位为1时,SPIE置位
 	        	0<<1 ;       //[7:1]无定义
/*		S0PSR只读 	        
		S0PSR = 0<<0 |       //[2:0]无定义
 	        	0<<3 |       //ABRT=1:从机中止标志,1:中止;读取该位清0	
 	        	0<<4 |       //MODF=0:模式错误,1:错误;读取该位清0,当清0后,才能写SxPCR
 	        	0<<5 |       //ROVR=0:读溢出;1:溢出;读取该位清0
 	        	0<<6 |       //WCOL=0:写冲突,1:冲突;读取该位清0
 	        	0<<7 ;       //SPIF=0:传输完成标志;1:有完成;读取该位清0
*/ 	        
	}
	if (Int_SPIx)
	{	PINSEL1 = (PINSEL1 & ~0x3fc) | 0x2a8;//打开SCK1,MOSI1,MISO1,SSEL1
		S1PDR = 0x00;        //清SPI数据寄存器
  		S1PCCR = 0x52;		   //设置SPI时钟分频,SPI速率=Fplck/SxPCCR,
  										 	//SxPCCR必须为偶数,且不小于8	 			 
 		S1PCR = 0<<0 |       //[2:0]无定义
 	        	0<<3 |       //CPHA=0:上升沿采样,下降沿输出;1:下升沿采样,上降沿输出	
 	        	1<<4 |       //CPOL=0:SCK高电平有效;1:SCK低电平有效
 	        	1<<5 |       //MSTR=0:从机;1:主机
 	        	0<<6 |       //LSBF=0:SPI数据传输MSB在先;1:LSB在先
 	        	0<<7 ;       //SPIE=0:中断禁止;1:中断使能
 	        
 		S1PINT= 0<<0 |       //SPIE中断标志位,1:有中断;向该位写1清0,
 	                     	//当SPIF和WCOL至少有一位为1时,SPIE置位
 	        	0<<1 ;       //[7:1]无定义
/*		S1PSR只读 	        
		S1PSR = 0<<0 |       //[2:0]无定义
 	        	0<<3 |       //ABRT=1:从机中止标志,1:中止;读取该位清0	
 	        	0<<4 |       //MODF=0:模式错误,1:错误;读取该位清0,当清0后,才能写SxPCR
 	        	0<<5 |       //ROVR=0:读溢出;1:溢出;读取该位清0
 	        	0<<6 |       //WCOL=0:写冲突,1:冲突;读取该位清0
 	        	0<<7 ;       //SPIF=0:传输完成标志;1:有完成;读取该位清0
*/ 	        
	}
}
/****************************************************************************
* 名    称:uint8  MSendData(uint8 Int_SPIx,uint8 data)
* 功    能:向SPI总线发送数据,并接收从机发回的数据。
* 入口参数:Int_SPIx,SPI0、SPI1;data,待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/

uint8  MSendData(uint8 Int_SPIx,uint8 data)
{  	uint8 Int_SPISendData;
    
    if (!Int_SPIx)
    {	IO0CLR = HC595_CS0;			    // 片选
		S0PDR = data;			
    	while( 0==(S0PSR&0x80) );		// 等待SPIF置位,即等待数据发送完毕
    	Int_SPISendData=S0PDR;
		IO0SET = HC595_CS0;
    }
    if (Int_SPIx)
    {	IO0CLR = HC595_CS1;
		S1PDR = data;
    	while( 0==(S1PSR&0x80) );		// 等待SPIF置位,即等待数据发送完毕
    	Int_SPISendData=S1PDR;
		IO0SET = HC595_CS1;
    }
    
    return Int_SPISendData ;  
}  

⌨️ 快捷键说明

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