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

📄 se300.c

📁 stm32通过上位机在线升级
💻 C
字号:
/***************************************************************
功能:实现存储器EEPROM AT45db081的数据读写操作,同时了解硬件spi读写操作
作者:ZDP
时间:2005-11-30
版本:V1.0
***************************************************************/
#include <c8051f020.h>
#include <stdio.h>
#include <intrins.h>

unsigned int Count1msInc;
void SYSCLK_Init (void);
void PORT_Init (void);
void SPI0_Init (void);
void Timer0_Init (void);

void SendSPIByte(unsigned char ch);
unsigned char GetSPIByte(void);
void recevercommend(void);
void sendcommend(void);

//#define	SYSCLK		11059200
#define	SYSCLK		24000000
#define	CIIF_ADDR	0x4000
#define	CAM_ADDR	0x8000
unsigned char	xdata   cpld_addr[4] _at_ CIIF_ADDR;
unsigned char	xdata	cam_addr[1024] _at_ CAM_ADDR;
unsigned int	xdata	camcpldaddr;
unsigned char	xdata	sdata[4];
	
unsigned char xdata MyRecBuff[128];
unsigned char xdata MySendBuff[512];
unsigned char xdata commendstat;
unsigned char xdata ver[12]={"ver 0.0.0.1"};
void main (void)
{
	unsigned int i;
	WDTCN = 0xde;                       // disable watchdog timer
	WDTCN = 0xad;
	SYSCLK_Init ();                     // initialize oscillator
	Timer0_Init();
	PORT_Init ();                       // initialize crossbar and GPIO
	EA=1;
	SPI0_Init ();                       // initialize SPI0
	while(1)
	{

		recevercommend();
		if(commendstat==1)
		{
			commendstat=0;
			switch (MyRecBuff[1])
			{
				//read config
				case 0xc0:
					MySendBuff[0] = 12;
					for(i=0;i<12;i++)
					{
						MySendBuff[i+1]=ver[i];
					}
					sendcommend();
					break;
				case 0xc1:
					MySendBuff[0] = 64;
					cpld_addr[0]&=0xf3;
					camcpldaddr = (MyRecBuff[3]<<8)+MyRecBuff[2];
					for (i = 0;i<64;i++)
					{
						MySendBuff[i+1]=cam_addr[camcpldaddr+i];
						if( cpld_addr[0]&0x01==0)	//modfiy 2007/9/11
							MySendBuff[i+1]=0xFF;
					}
					sendcommend();
					break;
				//write config	
				case 0xc2:
					camcpldaddr = (MyRecBuff[3]<<8)+MyRecBuff[2];
					cam_addr[camcpldaddr]=MyRecBuff[4];
					sdata[0]=cpld_addr[0]&0xf3;
					sdata[0]|=0x04;
					cpld_addr[0]=sdata[0];
					MySendBuff[0] = 0;
					sendcommend();
					break;
				//read common io	
				case 0xc3:
					camcpldaddr = MyRecBuff[2];
					MySendBuff[0]=2;
					MySendBuff[1]=cpld_addr[0]&0x01;		//modfiy 2007/9/11
					MySendBuff[2]=cam_addr[camcpldaddr];
					sendcommend();
					break;
				//write common io	
				case 0xc4:
					camcpldaddr = MyRecBuff[2];
					cam_addr[camcpldaddr]=MyRecBuff[4];
					MySendBuff[0] = 0;
					sendcommend();
					break;
				//detect cam	
				case 0xc5:
					sdata[0]=cpld_addr[0]&0x01;
					MySendBuff[0] = 1;
					MySendBuff[1] = sdata[0];
					sendcommend();
					break;
					
				//rest cam	1
				case 0xc6:
					sdata[0]=cpld_addr[0]&0xbf;
					sdata[0]|=(MyRecBuff[2]<<6);
					cpld_addr[0]=sdata[0];
					MySendBuff[0] = 0;
					sendcommend();
					break;
				//cpld bypass 0	
				case 0xc7:
					sdata[0]=cpld_addr[0]&0xdf;
					sdata[0]|=(MyRecBuff[2]<<5);
					cpld_addr[0]=sdata[0];
					MySendBuff[0] = 1;
					MySendBuff[1] = cpld_addr[0];
					sendcommend();
					break;
				//cam rest finish
				case 0xc8:
					sdata[0]=cpld_addr[1]&0x01;
					MySendBuff[0] = 1;
					MySendBuff[1]=sdata[0];
					sendcommend();
					break;
				default:
			
					break;	
			}
		}
		
		_nop_();
	}	
}
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 24.000MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
}
void PORT_Init (void)
{
	XBR0    = 0x06;                     // Enable SMBus, SPI0
	XBR1    = 0x84;						// Enable sysclk out
	XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
	EMI0TC  = 0xFF;						
	EMI0CF	= 0x34;						// p5 p6 p7 
	P74OUT  = 0xFF;					//p5 p6 p7 端口引脚的输出方式为推挽
	P0MDOUT = 0x15;
	P0MDOUT |= 0x80;					//clk 端口引脚的输出方式为推挽
}
void SPI0_Init (void)
{
	SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
	                               		// 8-bit data words
	SPI0CFG|=0xC0;						//CKPOL =1;

	SPI0CN &= ~0x02;                    // 禁止 Master mode; SPI enabled; flags
//	SPI0CN |=  0x02;					// Master mode; SPI enabled; flags
	SPI0CN |=  0x01;                    // 使能 SPI0
	SPI0CKR = SYSCLK/2/2000000-1;       // SPI clock <= 8MHz (limited by 
	                               		// EEPROM spec.)
}


//接受命令
unsigned char GetSPIByte(void)
{ 
	SPI0DAT = 0;
//	Count1msInc=0;
//	while (SPIF == 0 && Count1msInc<100);	// 等待写结束
	while (SPIF == 0 );	// 等待读结束
	SPIF = 0; 
	return  SPI0DAT;                   
}
void recevercommend(void)
{
	unsigned int rece_data_loop,recedatd_sync,recedatd_numb;
	recedatd_sync=GetSPIByte();
	if(recedatd_sync==0x55)
	{
		recedatd_numb=GetSPIByte();
		if(recedatd_numb>63)	recedatd_numb=63;
		MyRecBuff[0]=recedatd_numb;
		for(rece_data_loop=1;rece_data_loop<recedatd_numb+1;rece_data_loop++)					
		{
			MyRecBuff[rece_data_loop]=GetSPIByte();
		}
		commendstat=1;
	}
	else
	{
		commendstat=0;
	}	
}

//发送命令
void SendSPIByte(unsigned char ch)
{
	unsigned char	date;		
	SPI0DAT = ch;
	Count1msInc=0;
	while (SPIF == 0 && Count1msInc<1000);	// 等待写结束
//	while (SPIF == 0);	// 等待写结束
	date = SPI0DAT;
	SPIF = 0;
}
void sendcommend(void)
{
	unsigned int send_data_loop,senddata_numb;
	SendSPIByte(0x55);
	senddata_numb=MySendBuff[0];
	for(send_data_loop=0;send_data_loop<senddata_numb+1;send_data_loop++)					
	{
		SendSPIByte(MySendBuff[send_data_loop]);
	}
}

void Timer0_Init (void)
{
	CKCON|=0x08;
	TMOD|=0x01;    //16Bit Timer0
	TR0 = 0;		// STOP Timer0
	TH0 = (-SYSCLK/1000) >> 8;    		// set Timer0 to overflow in 1ms
	TL0 = -SYSCLK/1000;
	TR0 = 1;   	// START Timer0
	IE|= 0x2;
}
void Timer0_ISR (void) interrupt 1  //1ms
{
	TH0 = (-SYSCLK/1000) >> 8;  
	TL0 = -SYSCLK/1000;
	Count1msInc++;
}

⌨️ 快捷键说明

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