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

📄 main0.c

📁 三星8gFlash memory驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------------
// Blinky.c
//------------------------------------------------------------------------------------
// Copyright (C) 2004 Silicon Laboratories, Inc.
//
// AUTH: BD
// DATE: 26 SEP 2002
//                      
// This program flashes a LED on the C8051F060 target board about five times
// a second using the interrupt handler for Timer3.
// The LED should be connected to P1.6
// Target: C8051F06x
//
// Tool chain: KEIL Eval 'c'
//-------------------------
//---------------------------------downlink-------------------------------------------
unsigned int ad_dat;
unsigned char x0;
float ad_dat0;
float jx0;
signed int xdata temp0 _at_ 0x0840;
float temp;
signed int jx;
//------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
#define  deltap1 4000
#define  deltap0 7

#define  zero_0 105

#define  pzero4  707	//通道4压力传感器零点(量化台阶数)
#define  kp4 447		//通道4压力传感器斜率(量化台阶数/MPa)
#define  pzero7 -10	//通道7压力传感器零点(量化台阶数)
#define  kp7 0		//通道7压力传感器斜率(量化台阶数/MPa)

#define  mintime 10
#define  maxtime 75
#define  open_time 30
#define  close_time 40
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f060.h>                    // SFR declarations
#include <intrins.h>
#include "func.h"
#include <MATH.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F06x
//-----------------------------------------------------------------------------

#define XBYTE ((unsigned char volatile  xdata*) 0)

sfr16 RCAP3    = 0xCA;                    // Timer3 reload value
sfr16 TMR3     = 0xCC;                    // Timer3 counter
sfr16 ADC0     = 0xBE;                 // ADC0 Data

//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------

#define SYSCLK 24000000//22118400                    	// approximate SYSCLK frequency in Hz
#define SAMP_RATE 50					// ADC sample rate in Hz
#define BAUDRATE 115200

#define kwyzk 	663.18				//zk板位移传感器斜率
#define	bwyzk	-452.444				//zk板位移传感器截距
#define kwytd	680.09				//cx板位移传感器斜率
#define bwytd	603.45				//cx板位移传感器截距
#define kwycx	683.82				//td板位移传感器斜率
#define bwycx	673.38			//td板位移传感器截距
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
//unsigned int Ram_ID(void);

void PORT_Init (void);
void external_osc (void);
void UART0_Init (void);
//void UART1_Init (void);
void Delay(unsigned char times);
void Delay1(void);
unsigned int AD_Complete (void);
void Ram_Erase(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3);    //Ram_Addr5与Ram_Addr2:00h-07h,
void Ram_Rd(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned char Ram_Addr2,
       unsigned char Ram_Addr1,unsigned int Ram_buf,unsigned int data_sum);//怎么校验ECC?
void Ram_Program(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned int Ram_buf,unsigned int data_sum);//,unsigned int Ram_buf);
//void Ram_Erase(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m);
//void Ram_Rd(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m,unsigned char Ram_Addr_l,
//				unsigned char Area,unsigned int Ram_buf,unsigned int data_sum);
//void Ram_Program(unsigned char Ram_Addr_h,unsigned char Ram_Addr_m,unsigned int Ram_buf);
//------------------------------------------------------------------------------------
// System Initialize Function 
//------------------------------------------------------------------------------------
//unsigned char bv;
unsigned int addr;
unsigned char page_5,page_4,page_3,duan;
unsigned int xdata vx0 _at_ 0x0322;
unsigned int para_addr,inx0=0,inx1=0,iny1,Dly_Time,Delay_Time,Delay_Time0;
unsigned int xdata Dly_Time0 _at_ 0x0320;
bit one_second,ten_ms,open_close=1,mode_3;
unsigned int time_counter;
bit state_val,sam_state,time_1s;
unsigned char xdata time_s _at_ 0x0ffc;
unsigned char xdata time_m _at_ 0x0ffd;
unsigned char xdata time_h _at_ 0x0ffe;
unsigned char xdata time_d _at_ 0x0fff;
unsigned int xdata test[1024] _at_ 0x0000;
unsigned int xdata test1[31] _at_ 0x0e00;
unsigned int xdata para _at_ 0x0f00;

//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
void clr_mem(void);
void rece_para(void);
void trans_para(void);
void set_start(void);
void trans_page(void);
//void trans_byte(void);
//void test_online(void);
void reset(void);
void clr_comd(void);
//void mem(void);
void samp_mem(void);
void end_proc(void);
void Timer3_Init (int counts);
void ADC0_Init (void);
unsigned char code fa[7]={1,0,1,0,1,0,1};
unsigned int xdata ml[7] _at_ 0x0700;
unsigned int code dcommand[14][7]={
{45,30,30,30,30,30,45},
{45,30,30,30,60,30,45},
{45,30,30,30,90,30,45},
{45,30,30,30,120,30,45},
{45,30,30,30,150,30,45},
{45,30,30,30,180,30,45},
{45,30,30,30,210,30,45},
{45,30,30,30,240,30,45},
{45,30,30,30,270,30,45},
{45,30,30,30,300,30,45},
{45,30,30,30,330,30,45},
{45,30,30,30,360,30,45},
{45,30,30,30,390,30,45},
{45,30,30,30,420,30,45}};
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {
	unsigned char x0;
	unsigned int i;
   	WDTCN = 0xde;   // disable watchdog timer
   	WDTCN = 0xad;
   	PORT_Init ();
   	external_osc ();                     // initialize oscillator
   	UART0_Init();
   	ADC0_Init ();                          // configure ADC0 and ADC1 for differential
   	EA = 1;									// enable global interrupts		
	ES0=1;
	PS=1;
	
	SFRPAGE = 0x0f;              // Switch to configuration page
	PWD=1;
	txshdn=1;
	val1=1;
	val2=1;
//trans_para();
		time_s=0;
		time_m=0;
		time_h=0;
		time_1s=0;

/*	for(i=0;i<1024;i++){test[i]=0xffff;}
	Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);

	Ram_Erase(0x03,0xff,0x00);
	Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);

	for(i=0;i<1024;i++){test[i]=i;}
	Ram_Program(0x03,0xff,0x00,0x0000,2048);
	Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0000,2048);
*/
	do{Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
		x0=XBYTE[0x0efe];}
		while(x0!=0xaa);
 	do{Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
		x0=XBYTE[0x0eff];}
		while(x0!=0x55);
	

		duan=0;
		if(para>0&&para<15)
			{for(x0=0;x0<7;x0++){ml[x0]=dcommand[para-1][x0];}}
		SFRPAGE = 0x0f;              // Switch to configuration page
		PWD=0;
		val1=1;
		val2=1;
		txshdn=1;	
		for(x0=0;x0<40;x0++){Delay(10);} //11.20由238改成了10,验证是否与井下程序同步
	
		para_addr=0x0e00;      
		page_5=0x00;
		page_4=0x00;
        page_3=0x00;
		addr=0x0000;
		    
repeat:Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);		    
    /*读出当前参数段中的间隔时间*/
		inx1=XBYTE[para_addr];
		para_addr++;
		inx1=(inx1<<8)|XBYTE[para_addr];
		para_addr++;
	/*读出当前参数段中的应测采样点数 */
		inx0=XBYTE[para_addr];
		para_addr++;
		inx0=(inx0<<8)|XBYTE[para_addr];
		para_addr++;

		Delay_Time0=XBYTE[para_addr];
		para_addr++;
		Delay_Time0=(Delay_Time0<<8)|XBYTE[para_addr];
		para_addr++;

		para_addr++;
		Dly_Time0=XBYTE[para_addr]*1000-Delay_Time0;
		para_addr++;
       
		vx0=XBYTE[para_addr];
		para_addr++;
		vx0=(vx0<<8)|XBYTE[para_addr];
		para_addr++;
		para_addr=para_addr+6;

	   	if(inx0==65535)
			{if(inx1==65535)
				{SFRPAGE = 0x0f;P5=0x2f;
				end_proc();
				SFRPAGE = 0x00;
				RSTSRC=0x10;
				}
			}
			
		ten_ms=0;
		Timer3_Init (SYSCLK/12/SAMP_RATE);        // Init Timer3 for 100ksps sample rate

		sam_state=0;
		Delay_Time=Delay_Time0/20;
        Dly_Time=Dly_Time0/20;
pl2:	iny1=inx1/20;   			
pl5:    if(Dly_Time==0){Delay_Time=Delay_Time0/20;
                        Dly_Time=Dly_Time0/20;}                //Delay_Time*19;  }
        if(ten_ms!=1){goto pl5;}
		ten_ms=0;  
		if(vx0==0x01){if(Delay_Time!=0)
						{SFRPAGE = 0x0f;val1=0;state_val=1;Delay_Time--;}			
                     else
					 	{SFRPAGE = 0x0f;val1=1;state_val=0;Dly_Time--;}			 
                    }
		if(vx0==0x02){if(Delay_Time!=0)
						{SFRPAGE = 0x0f;val2=0;
						state_val=1;
						Delay_Time--;}			
                     else
					 	{SFRPAGE = 0x0f;val2=1;state_val=0;Dly_Time--;}
                    }
		iny1--;
		if(sam_state==0){samp_mem();//mem();
		sam_state=1;}	
		
		if(iny1!=0){goto pl5;}
		sam_state=0;
		inx0--;
	    if(inx0!=0){goto pl2;} 	
		goto repeat;
	}


/*void mem(void)
{	


	unsigned int i;
			test[addr]=time_h;
			addr++;	
			test[addr]=time_m;
			addr++;
			test[addr]=time_s;
			addr++;	
						
			SFRPAGE = 0x0f;P6=0xfc;	//P6=0xfc?11.09
			Delay(1);					
			EA=0;
			ad_dat=AD_Complete();
			ad_dat=AD_Complete()-32768;
			EA=1;
			jx=ad_dat-(zero_0);
			if(jx>=deltap1)
				{test[addr]=255;}
			else
				{test[addr]=0;}
			addr++;
			
			
			test[addr]=13;
			addr++;

			SFRPAGE = 0x0f;P6=0xfe;//P6=0xfe?11.09
				Delay(1);					
				EA=0;						
				ad_dat=AD_Complete();
				ad_dat=AD_Complete();
				EA=1;
				ad_dat0=ad_dat-32768;
				ad_dat0=ad_dat0-(pzero7);
				if(ad_dat0<0)ad_dat0=0;
				ad_dat0=ad_dat0*kp7;
			test[addr]=ad_dat0;
			addr++;
			
			SFRPAGE = 0x0f;P6=0xfb;	//P6=0xfb?11.09
				Delay(1);					
				EA=0;					
				ad_dat=AD_Complete();
				ad_dat=AD_Complete();
				EA=1;
				jx0=ad_dat-32768;
				jx0=jx0-(pzero4);
				if(jx0<0)jx0=0;
				jx0=(jx0*10/kp4);
			test[addr]=jx0;
			addr++;

			test[addr]=16;
			addr++;
						
				if(addr==0x0100)//应该为0x400?
					{  	addr=0x0000;
						Ram_Program(page_5,page_4,page_3,0x0c00);
						for(i=0;i<256;i++)//256?
							{test[i]=0xffff;}
						page_3++;
						if(page_3==0x00)
							{page_4++;}
						if(page_4==0x00)
							{page_5++;}
					}
}*/

void samp_mem(void)
{	unsigned int i;
		for(i=0;i<16;i++)
			{	SFRPAGE = 0x0f;
				P6=0xf8|i;		
				Delay(5);
				EA=0;
				ad_dat=AD_Complete();						
				//ad_dat=AD_Complete();
				EA=1;

				test[addr]=ad_dat;
				addr=addr+1;			
			}
				if(addr==0x0400)
					{  	//for(addr=0;addr<2048;addr++){test[addr]=addr;}
						addr=0x0000;
						Ram_Program(page_5,page_4,page_3,0x0000,2048);
						page_3++;
						if(page_3==0x00)
							{page_4++;   
                        	if(page_4==0x00)
								{page_5++;}
							}
					}			
}
void end_proc(void)	
{           Ram_Program(page_5,page_4,page_3,0x0000,2048);
			Delay(20);
			Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
			Delay(20);
			Ram_Erase(0x03,0xff,0x00);
			Delay(20);
			XBYTE[0x0efe]=0xff;
			XBYTE[0x0eff]=0xff;
			Ram_Program(0x03,0xff,0x00,0x0e00,512);
			Delay(20);
}

//------------------------------------------------------------------------------------
// PORT_Init
//------------------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void external_osc (void) 
{
   int n;                        // local variable used in delay FOR loop.
   char old_SFRPAGE;
   old_SFRPAGE = SFRPAGE;                 // Save old SFRPAGE
   SFRPAGE = CONFIG_PAGE;        // switch to config page to config oscillator
	OSCXCN = 0x67;                // start external oscillator; 22.1 MHz Crystal
   for (n=0;n<255;n++);          // d elay about 1ms  
   while ((OSCXCN & 0x80) == 0);   
	CLKSEL |= 0x01;               // switch to external oscillator
   SFRPAGE = old_SFRPAGE;                 // restore SFRPAGE
}  

//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{	char old_SFRPAGE = SFRPAGE;
   SFRPAGE = UART0_PAGE;               // Switch to UART0 page
   SCON0   = 0xf0;                     // SCON: mode 1, 8-bit UART, enable RX
   SSTA0 = 0x10;                       // Timer 1 generates UART0 baud rate and
                                       // UART0 baud rate divide by two disabled
   SFRPAGE = TIMER01_PAGE;             // Switch to Timer 0/1 page
   TMOD   = 0x21;                      // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      // SMOD = 1
   SFRPAGE = UART0_PAGE;               // Switch to UART0 page
   TI0    = 0;                         // Indicate TX ready
   ES0=1;
   ET0=0;
   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

void PORT_Init (void)
{
	char old_SFRPAGE = SFRPAGE;
   SFRPAGE = CONFIG_PAGE;              // Switch to configuration page
   XBR0    = 0x05;                     // Enable UART0 on crossbar
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   P0MDOUT = 0xff;                    // enable Port0 outputs as push-pull
   P2MDOUT = 0xff;                    // enable Port0 outputs as push-pull
   P3MDOUT = 0xff;                    // enable Port0 outputs as push-pull
   P5MDOUT   = 0xff;
   P6MDOUT = 0Xff;
   SFRPAGE = old_SFRPAGE;                 // restore SFRPAGE
}

void Delay(unsigned char times)
{
	unsigned int i;
	for(i=0;i<160*times;i++)_nop_();
}

//------------------------------------------------------------------------------------
// 读数子程序
//------------------------------------------------------------------------------------
  void Ram_Rd(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3,unsigned char Ram_Addr2,
       unsigned char Ram_Addr1,unsigned int Ram_buf,unsigned int data_sum)
{		
	unsigned int i;
	unsigned int temp_p;
	char old_SFRPAGE;
   	old_SFRPAGE = SFRPAGE;                 // Save old SFRPAGE
   	SFRPAGE = 0x0F;
	Ram_CS=1;	// CS* 0
	Ram_CLE=0; // Command latch	
	Ram_WE=1;	// CS* 0
	Ram_ALE=0; // Command latch
	Ram_RE=1;	// CS* 0
    Ram_WP=0;   //擦/写保护
//while(Ram_Busy==0);
	temp_p = Ram_buf;
	P7MDOUT =0xff;		// P7 Output mode	
	Ram_CS=0;
	Ram_CLE=1;
	Ram_WE=0;
	P7 =0x00;
	Ram_WE=1;			//  WE Pulse

	Ram_CLE=0;
	Ram_ALE=1;			// Address latch
	Ram_WE=0;
	P7 = Ram_Addr1;
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr2;
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr3;
	Ram_WE=1;			//  WE Pulse
    Ram_WE=0;
	P7 = Ram_Addr4;
	Ram_WE=1;	
    Ram_WE=0;
	P7 = Ram_Addr5;
	Ram_WE=1;
	Ram_ALE=0;
    Ram_CLE=1;
    Ram_WE=0;
	P7 =0x30;
	Ram_WE=1;

⌨️ 快捷键说明

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