📄 备份spi_receive_ok.c
字号:
/*************************************************
//spi communication (正式版)
//design by zhixing_yuan 7.6.2006
//mcu type:c8051f221
//i/o define:nss:p2.3; sck:p2.0; mosi:p2.2; miso:p2.1; /int0 p0.2
//led footpint: data--p1.0--p1.6 choose--p0.3--p0.7 p0.0
//function:dir是控制连通MISO还是MOSI,每次数据包括5个字节组成一贞数据,DATA ID,DATA0,DATA1,DATA2,CHECKSUM(校验和),数据将通过SPI发送与接收
描述:在接收完一个数据之后,要往SPI0DAT写0
*************************************************/
#include <c8051f200.h>
#define uchar unsigned char
#define size 9
sbit EN=P0^2;
sbit NSS=P2^3;
sbit dir=P2^4;
uchar spi_index;
uchar spi_Data[size];
uchar DataID,Data0,Data1,Data2,CheckSum;
uchar spi_Receivedata;
/************************************
//名称:delay()
//功能: 延时小程序
//输入:无
//返回:无
************************************/
void delay(void)
{
int i, j;
for(i=0;i<1000;i++) j=i;
}
/**********************************************
//名称:System_init()
//功能:系统初始化函数
//输入:无
//返回:无
**********************************************/
void System_init(void)
{
PRT0MX = 0x04; //INT0 routed to Port Pin
PRT1MX = 0x00;
PRT2MX = 0x01; //Weak Pull-ups Disabled,SPI Bus I/O Enable
PRT0CF = 0x0ff; //IO口为推挽输出
PRT1CF = 0x0ff;
PRT2CF = 0x0ff;
P0MODE = 0x0ff; //输入使能
P1MODE = 0x0ff;
P2MODE = 0x0ff;
unsigned char fos_holdtime;
OSCXCN = 0x67; //起动外部时钟
//int i ;//晶振部分
//int j;
//for(i=0;i<2000;i++)j=i; //等待1MS以上的时间
for(fos_holdtime=0;fos_holdtime<8;fos_holdtime++)
{
delay();
}
while (!(OSCXCN & 0x80)); //等待起振
OSCICN = 0x08; //使用外部时钟
EA = 0; //看门狗——关
WDTCN = 0x0de;
WDTCN = 0x0ad; //disable WDTz
IE = 0x00; //关中断
EIE1 = 0x01; //使能SPI中断
EIE2 = 0x00; //禁止其他多余中断
// IE = 0x01; //只开int0
EA = 1 ;
SPI0CFG = 0x47; //CKPHA=0,CKPOL=1,8位帧长
SPI0CN = 0x01; //使能SPI总线,设为从端
SPI0CKR = 0x04; //SPI时钟选0
NSS = 0x01 ; //disable nss
EN=1;
}
/**************************************
//名称: putData()
//功能:把数据转换成LED显示的数据
//输入:16之内的数
//返回:LED格式的数据
**************************************/
uchar putData(uchar D)
{
uchar z;
switch (D)
{
case 0 : z = 0x3f; break;
case 1 : z = 0x06; break;
case 2 : z = 0x5b; break;
case 3 : z = 0x4f; break;
case 4 : z = 0x66; break;
case 5 : z = 0x6d; break;
case 6 : z = 0x7d; break;
case 7 : z = 0x27; break;
case 8 : z = 0x7f; break;
case 9 : z = 0x6f; break;
case 10 : z = 0x77; break;
case 11 : z = 0x7c; break;
case 12 : z = 0x39; break;
case 13 : z = 0x5e; break;
case 14 : z = 0x79; break;
case 15 : z = 0x71; break;
default : z = D; //错误显示o
}
return z;
}
/****************************************************
//名称: display()
//功能:把3个SPI数据,在LED上显示出来
//输入:DATA0,DATA1,DATA2
//返回:无
****************************************************/
void display(uchar data1,uchar data2,uchar data3)
{
uchar D;
D = data1 ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0xf7); //select D1L 1
delay();
D = data2;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0ef); //select D1H 2
delay();
D = data3 ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0df); //select D2L 3
delay();
D = spi_Data[4];
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0bf); //select D2H 4
delay();
D = spi_Data[5] ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x07f); //select D3L 5
delay();
D = spi_Data[6];
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0fe); //select D3H 6
delay();
delay();
P0 = (P0 | 0x0fb);
}
/*******************************************
//主程序
*******************************************/
void main(void)
{
System_init();
spi_Data[0]=0;
spi_Data[1]=12;
spi_Data[2]=11;
spi_Data[3]=10;
spi_Data[4]=0;
NSS = 1; //禁止从状态
dir=1; //IO接收状态
spi_index=1; //接收组1开头
while(1)
{
display(spi_Data[1],spi_Data[2],spi_Data[3]);
}
}
/*******************************************
// 名称: int6_isr()
//功能:收到发送中断,对外发送一组SPI数据
//输入:无
//返回:无
*******************************************/
void int6_isr(void) interrupt 6 using 1
{
EA=0;
// NSS = 1; //disable spi
spi_Data[5]=SPI0CN;
spi_Data[4]++;
if(WCOL)//写冲突处理,暂无处理
{spi_Data[5]=10;WCOL=0;}
if(MODF)//模式错误处理,暂无处理
{spi_Data[5]=9; MODF=0;}
if(RXOVRN)
{//接收缓冲区溢出处理
spi_Data[5]=8;//t为接收数据暂存变量
RXOVRN=0;
}
spi_Data[spi_index]=SPI0DAT; //read data
SPI0DAT=0; //send '24'
SPI0CN = 0x01;
// delay(); //delay for a time
spi_index++;
if (spi_index>3) //receive data count
spi_index=1;
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -