📄 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 + -