📄 ssp.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模式有效
(0x01 << 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 + -