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

📄 备份spi_receive_ok.c

📁 c8051F221的SPI总线通信(收)
💻 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 + -