📄 spi.c
字号:
/******************************************************************************************
** 文件名称: SPI .c
** 文件描述: SPI操作软件包。
** 文件说明: 软件包采用查询方式。
******************************************************************************************/
#include "config.h"
/*定义SPI的管脚*/
#define SCK0 (1<<8) // SCK0 为P0.4的第二功能
#define MISO0 (1<<10) // MISO0 为P0.5的第二功能
#define MOSI0 (1<<12) // MOSI0 为P0.6的第二功能
#define SSEL0 (1<<14) // SSEL0 为P0.7的第二功能
/*********************************************************************************************************
**函数名称:SPI_Init(uint8 MODE,uint32 F_spi,uint8 INT_En)
**函数功能:初始化SPI接口
**入口参数:MODE SPI模式选择,0--从机,1--主机
** F_spi SPI通信速率,最大为Fpclk/8.该参数在从机模式下是无效的
** INT_En 中断使能位,0--中断禁止,1--中断使能
**出口参数:1--操作正确
** 0--操作失败
**说明:初始化函数设置:CPHA=0,CPOL=1,LSBF=0
********************************************************************************************************/
uint8 SPI_Init(uint8 MODE,uint32 F_spi,uint8 INT_En)
{
if((MODE != 0)&&(MODE != 1)) return(0);
PINSEL0 = (PINSEL0 & (~(0xff<<8)))|SCK0|MISO0|MOSI0|SSEL0; //设置管脚连接SPI
if(F_spi > (Fpclk/8)) F_spi = Fpclk/8;
SPI_SPCCR = Fpclk/F_spi; //设置SPI时钟分频
SPI_SPCR = (0<<3)| //CPHA=0,数据在SCK的第一个跳变沿采样
(1<<4)| //CPOL=1,时钟为低有效
(MODE<<5)| //MODE=1,设置为主机
(0<<6)| //LSBF=0,数据传输MSB在先
(INT_En<<7); //设置中断使能位
MODE = S0PSR; //清除SPI传输完成标志
S0PINT = 0x01; //清除SPI中断标志位
return(1);
}
/*********************************************************************************************************
**函数名称:SPI_SendByte()
**函数功能:向SPI总线发送1字节数据
**入口参数:data 待发送的数据
**出口参数:返回值为读取的数据
**说明:调用函数前要先选中SPI从机
********************************************************************************************************/
uint8 SPI_SendByte(uint8 data)
{
SPI_SPDR = data;
while((SPI_SPSR & 0x80) ==0); //等待SPIF置位,即等待数据发送完毕
return(SPI_SPDR);
}
/*********************************************************************************************************
**函数名称:SPI_RcvData()
**函数功能:从SPI总线上接收1字节数据
**入口参数:无
**出口参数:返回值为接收到的数据
**说明:采用查询方式接收数据,故存在死等待情况
********************************************************************************************************/
uint8 SPI_RcvData(void)
{
while((SPI_SPSR & 0x80) ==0); //等待SPIF置位,即等待接收到有效的数据
return(SPI_SPDR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -