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

📄 spi.c

📁 本库函数为大容量(2M)Flash SST25VF016B的驱动函数 包括IO模拟SPI总线方式和C8051F020硬件SPI方式下的驱动 函数接口简单易用 代码规范简洁
💻 C
字号:
#include <C8051F020.H>

/************************************************************************/
/*函数名称:	SPI_Init													*/
/*函数功能:	配置SPI为主模式,同时使能SPI和SPI中断	    				*/
/*输入参数:
/*输出参数:
/************************************************************************/
void SPI_Init(void)
{	
	SPI0CN  = 0x03;//使能SPI为主方式并使能SPI
	EIE1 |= 0X01;  //使能SPI中断
}

/************************************************************************/
/*函数名称:SST_SPICFG
/*函数功能:配置SPI数据采样时序和时钟速度
/*输入参数:配置方式选择参数DATA(0--3),时钟速度参数CKR_DATA(1,2,3,4,5,11)可
            选择1M,2M,3M,4M,5M,11M六档最大时钟最大速度为11M。
/*输出参数:无
/*说明    :本配置中均采用一次传送8位数据的方式
            数据采样时序选择与参数CFG_DATA对应关系为:
			DATA=0:在SCK周期的第一个边沿采集数据,SCK在空闲时为低电平
			DATA=1:在SCK周期的第二个边沿采集数据,SCK在空闲时为低电平
			DATA=2:在SCK周期的第一个边沿采集数据,SCK在空闲时为高电平
			DATA=3:在SCK周期的第二个边沿采集数据,SCK在空闲时为高电平
			时钟速率选择与参数CKR_DATA对应关系为:
			1-->1M; 2-->2M; 3-->3M; 4-->4M; 5-->5M; 11-->11M
/************************************************************************/
void SPI_CFG(unsigned char CFG_DATA,unsigned char CKR_DATA )
{
    switch(CFG_DATA)//数据采样时序选择
	{
		case 0x00://在SCK周期的第一个边沿采集数据,SCK在空闲时为低电平
			SPI0CFG =0x07;
			break;
		case 0x01://在SCK周期的第二个边沿采集数据,SCK在空闲时为低电平
			SPI0CFG =0x87;
			break;
		case 0x02://在SCK周期的第一个边沿采集数据,SCK在空闲时为低电平
			SPI0CFG =0x47;
			break;
		case 0x03://在SCK周期的第二个边沿采集数据,SCK在空闲时为高电平
			SPI0CFG =0xC7;
			break;
		default://为了方便调试在此放置死循环语句
			while(1);
			break;
	}
	switch(CKR_DATA)//采样时钟速率选择
	{
		case 0x01://1M
			SPI0CKR =10;
			break;
		case 0x02://2M
			SPI0CKR =4;
			break;
		case 0x03://3M
			SPI0CKR =3;
			break;
		case 0x04://4M
			SPI0CKR =2;
			break;
		case 0x05://5M
			SPI0CKR =1;
			break;
		case 0x0B://11M
			SPI0CKR =0;
			break;
		default:
		    break;
	}
}

/************************************************************************/
/* 程序名称: Send_Byte													*/
/* 程序功能:在时钟的上升沿在MOSI线上写入一位数据,写满一个字节  			*/
/* 输入:out																*/
/* 输出:SI																*/
/************************************************************************/
void Send_Byte(unsigned char out)
{	
    unsigned char i;
 	for(i=0;i<3;i++);
 	SPI0DAT =out;
 	while(TXBSY);
}

/************************************************************************/
/* 程序名称: Get_Byte													*/
/* 程序功能:在SCL的下降沿从MISO线上读取数据 							*/
/* 输入:	 SO															*/
/* 输出:	 None														*/
/************************************************************************/
unsigned char Get_Byte(void)
{ 
	unsigned char in;
	Send_Byte(0x00);//产生8位移位脉冲
 	in = SPI0DAT;
 	return in;
}

void SPI_ISR() interrupt 6
{
	if(WCOL)//写冲突
		WCOL =0;  
	if(MODF)//模式错误
		MODF =0; 
	if(RXOVRN);//接收溢出
	SPIF=0;
}

⌨️ 快捷键说明

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