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

📄 ssp.c

📁 arm 2103 philip 的 详尽测试程序和程序模块
💻 C
字号:
/******************************************************************************************
** 文件名称: SSP.c
** 文件描述: LPC2103 SSP操作软件包。
** 文件说明: 数据的发送、接收采用查询方式。
******************************************************************************************/
#include "config.h"

#define		SCK1	(2<<28)	//时钟线 P0.14
#define		MISO1	(1<<6)	//主机输入,从机输出 P0.19
#define		MOSI1	(1<<8)	//主机输出,从机输入 P0.20
#define		SSEL1	(1<<10)	//片选端口 P0.21

/*********************************************************************************************************
**函数名称:uint8	SSP_Init(uint8	Type,uint8	MODE,uint32	F_ssp,uint8 INT_En)
**函数功能:初始化SSP控制器
**入口参数:Type	通信格式,0--SPI,1--SSI,2--Microwire
**			MODE	模式位,1--主机,0--从机	
**			F_ssp	SSP通信速率
**			INT_En	SSP中断使能控制字节,按位来操作
**					bit0--接收溢出中断
**					bit1--超时中断
**					bit2--Rx FIFO至少有一半为满时,产生中断
**					bit3--Tx FIFO至少有一半为空时,产生中断
**出口参数:1--初始化成功,0--初始化失败
**说明:在SPI模式下,默认CPHA=0,CPOL=1,数据位数默认为8位
**		通信速率限制在Fpclk/(254*256)~Fpclk/2
********************************************************************************************************/
uint8	SSP_Init(uint8	Type,uint8	MODE,uint32	F_ssp,uint8 INT_En)
{
	if(Type > 2)	return(0);
	if(MODE > 1)	return(0);
	//初始化引脚
	PINSEL0 = ((PINSEL0 & (~(3<<28)))|SCK1);
	PINSEL1 = ((PINSEL1&(~(0x3ff<<6)))|(MISO1|MOSI1|SSEL1));
	SSPCR0 = (0x00 << 8)|		//SCR	设置SPI时钟分频
			 (0x00 << 7)|		//CPHA	时钟输出相位,仅SPI模式有效
			 (0x00 << 6)|		//CPOL	时钟输出极性,仅SPI模式有效
			 (Type << 4)|		//FRF	帧格式 00-SPI,01-SSI,10-Microwire,11-保留
			 (0x07 << 0);		//DSS	数据长度,0000~0010-保留 0011-4位 0111-8位 1111-16位

	SSPCR1 = (0x00 << 3)|		//SOD	从机输出允许
			 ((1-MODE) << 2)|	//MS	模式位
			 (0x01 << 1)|		//SSE	使能
			 (0x00 << 0);		//LBM	禁止回写模式
	SSPIMSC = INT_En & 0x0f; 	//中断屏蔽寄存器,4个中断条件都可以产生中断
	SSPICR = 0x03;	 			//中断清除寄存器
	if(MODE == 0)	return(1);	//如果是从机,则不必关心通信速率
	//设置通信速率
	if(F_ssp > (Fpclk/2))	F_ssp = Fpclk/2;
	if(F_ssp < (Fpclk/254))	
	{
		SSPCR0 |= (0xff<<8);
		if(F_ssp < (Fpclk/(254*256)))	F_ssp = Fpclk/(254*256);
		SSPCPSR = (Fpclk/(F_ssp*256));	//PCLK分频器
	}
	else	SSPCPSR = (Fpclk/F_ssp);	//PCLK分频器
	return(1);
}
/*********************************************************************************************************
**函数名称:uint8	SSP_SendByte(uint8	data)
**函数功能:SSP接口向总线发送1字节数据
**入口参数:data	待发送的数据
**出口参数:接收到的数据
********************************************************************************************************/
uint8	SSP_SendByte(uint8	data)
{
	SSPDR = data;
	
	while((SSPSR & 0x01) == 0);	//等待TFE置位,即发送FIFO空
	return(SSPDR);
}
/*********************************************************************************************************
**函数名称:uint8	SSP_RcvByte(void)
**函数功能:SSP接口从总线接收1字节数据
**入口参数:无
**出口参数:接收到的数据
********************************************************************************************************/
uint8	SSP_RcvByte(void)
{
	while((SSPSR & 0x04) == 0);	//等待RFF置位,即接收FIFO不为空
	return(SSPDR);
}

⌨️ 快捷键说明

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