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

📄 main0.c

📁 三星8gFlash memory驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    Ram_CLE=0;

	P7MDOUT =0x00;		// P7 Input mode
	P7 = 0xff;
	EA=0;
//for(i=0;i<40;i++) _nop_();  //最小参数是40,〈40不能保证最开始数据的正确读取.
    Delay(2);     //10.24  仅仅为了提高稳定性                        
	while(Ram_Busy==0);//比用上条语句快3微秒。
data_sum=data_sum/4;
	for (i=0;i<data_sum;i++)
	{
		Ram_RE=0;
		XBYTE[temp_p]=P7;
        temp_p++;
	    Ram_RE=1;

		Ram_RE=0;
		XBYTE[temp_p]=P7;
        temp_p++;
	    Ram_RE=1;

		Ram_RE=0;
		XBYTE[temp_p]=P7;
        temp_p++;
	    Ram_RE=1;

		Ram_RE=0;
		XBYTE[temp_p]=P7;
        temp_p++;
	    Ram_RE=1;	
	}
	EA=1;
//	Ram_CS=1;   11.10
	SFRPAGE = old_SFRPAGE;
}

//------------------------------------------------------------------------------------
// 页写子程序(所以Ram_Addr2,Ram_Addr1默认为0)
//------------------------------------------------------------------------------------
   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)
{
	volatile unsigned int i;
	//bit k;
	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=1;
	P7MDOUT =0xff;		// P7 Output mode	
	Ram_CS=0;
	Ram_CLE=1;
	Ram_WE=0;
	P7 = 0x80;
	Ram_WE=1;			//  WE Pulse	
	Ram_CLE=0;
	Ram_ALE=1;			// Address latch
	Ram_WE=0;
	P7 = 0x00;             //column address==0
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = 0x00;             //column address==0
	Ram_WE=1;
	Ram_WE=0;
	P7 = Ram_Addr3;
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr4;
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr5;
	Ram_WE=1;
	Ram_ALE=0;
	EA=0;
	for (i=0;i<data_sum/4;i++)   //一页应为512,现在先做一个扇区
	{ 
		Ram_WE=0;			//  WE Pulse
		P7 = XBYTE[Ram_buf];
		Ram_buf++;
		Ram_WE=1;

		Ram_WE=0;			//  WE Pulse
		P7 = XBYTE[Ram_buf];
		Ram_buf++;
		Ram_WE=1;

		Ram_WE=0;			//  WE Pulse
		P7 = XBYTE[Ram_buf];
		Ram_buf++;
		Ram_WE=1;

		Ram_WE=0;			//  WE Pulse
		P7 = XBYTE[Ram_buf];
		Ram_buf++;
		Ram_WE=1;
	}
	EA=1;
	Ram_CLE = 1;
	Ram_WE=0;
	P7 = 0x10;
	Ram_WE=1;			//  WE Pulse
//while(Ram_Busy==0); //用此显示出错,且读出数据的确错误,全为ff
	Delay(2);          //delay的最小传递参数是1
	Ram_CLE = 0;
   SFRPAGE = old_SFRPAGE;
}
//------------------------------------------------------------------------------------
// 块擦子程序
//------------------------------------------------------------------------------------
  void Ram_Erase(unsigned char Ram_Addr5,unsigned char Ram_Addr4,unsigned char Ram_Addr3)
{	
	//bit k;
	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=1;

	while(Ram_Busy==0);
	P7MDOUT =0xff;
	Ram_CS=0;
	Ram_CLE=1;
	Ram_WE=0;
	P7 = 0x60;
	Ram_WE=1;			//  WE Pulse
	Ram_CLE=0;
	Ram_ALE=1;			// Address latch
	Ram_WE=0;
	P7 = Ram_Addr3;
	Ram_WE=1;		//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr4;
	Ram_WE=1;			//  WE Pulse
	Ram_WE=0;
	P7 = Ram_Addr5;
	Ram_WE=1;
	EA=0;
	Ram_ALE=0;
	Ram_CLE=1;
	Ram_WE=0;
	P7 = 0xd0;
	Ram_WE=1;		//  WE Pulse
	Delay(8);      //8是delay允许的最小参量10.19 22:19
//	while(Ram_Busy==0);
	EA=1;
	/*Ram_WE=0;
	P7 = 0x70;
	Ram_WE=1;*/
	Ram_CLE=0;
//	Ram_WP=0;    11.10
	/*Ram_RE=0;
	P7MDOUT=0x00;
    while(P7^6==1)
	{
	 if(P7^0==0)
    	{k=0;
		SFRPAGE = old_SFRPAGE;
		return k;
		}
     else 
	   { k=1;
	   SFRPAGE = old_SFRPAGE;
		return k;
		}
		}*/
//    Ram_CS=1;   11.10
	SFRPAGE = old_SFRPAGE;
}
//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
   	char old_SFRPAGE = SFRPAGE;
   	int i;
   	SFRPAGE = ADC0_PAGE;                // Switch to ADC0 Page
	ADC0CN = 0xC0;                      // ADC Disabled, Timer3 start-of-conversion
                                       // track 16 SAR clocks before data conversion
                                       // upon Timer3 OV.  DMA will enable ADC as needed
   	REF0CN = 0x02;                      // turn on bias generator and internal reference.
   	for(i=0;i<10000;i++);               // Wait for Vref to settle (large cap used on target board)
   	AMX0SL = 0x00;                      // Single-ended mode
  	ADC0CF = (SYSCLK/25000000) << 4;    // Select SAR clock frequency =~ 25MHz
    EIE1      |=0x80;
   	SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
	ad_dat=AD_Complete();
}

unsigned int AD_Complete (void)
{	char old_SFRPAGE = SFRPAGE;
	unsigned int AD_Con;
   	SFRPAGE =0x00;           // Switch to UART0 page
    AD0BUSY=1; 
 	while(AD0BUSY==0)
   	AD_Con = ADC0;
   	AD0INT = 0;
	SFRPAGE = old_SFRPAGE;
	return AD_Con;
} 

void ser_int (void) interrupt 4 
{  	unsigned char x3;
	unsigned char old_SFRPAGE=SFRPAGE;
		SFRPAGE =0x0f;
		SFRPAGE = UART0_PAGE;
		//SCON0=0x70;
		SM20=0;TB80=0;
		ES0=0;
		RI0=0;
		x3=SBUF0;
	switch(x3)
		{
		case 17:SFRPAGE = 0x0f;txshdn=1;Delay(10);clr_mem();break;
		case 18:SFRPAGE = 0x0f;txshdn=1;Delay(10);rece_para();break;
		case 19:SFRPAGE = 0x0f;txshdn=1;Delay(10);trans_para();break;	
		case 20:SFRPAGE = 0x0f;txshdn=1;Delay(10);set_start();break;
		case 21:SFRPAGE = 0x0f;txshdn=1;Delay(10);reset();break;
		//case 22:SFRPAGE = 0x0f;txshdn=1;Delay(10);test_online();break;
		case 23:SFRPAGE = 0x0f;txshdn=1;Delay(10);clr_comd();break;
		case 24:SFRPAGE = 0x0f;txshdn=1;Delay(30);trans_page();break;
		default:SFRPAGE = 0x0f;txshdn=0;break;}
		SFRPAGE = 0x0f;txshdn=0;
		ES0=1;
		SFRPAGE = UART0_PAGE;
		//SCON0=0xf0;
		SM20=1;
		RI0=0;
		SFRPAGE=old_SFRPAGE;
		}


void reset(void)
     {     
		SFRPAGE = UART0_PAGE;
		SBUF0=0x05;
		while(TI0==0);
		TI0=0;
		Delay(20);
		ES0=1;
		SFRPAGE=0x00;
		RSTSRC=0x10;
	 }

void clr_mem(void)
		{		unsigned char i,k;
		        signed int j;
				for(i=0;i<0x08;i++)
				{	for(j=0;j<256;j++)
					{  for(k=0;k<4;k++)
					   {Ram_Erase(i,j,k*64);
					   Delay(5);
					   }
					}
				}
				SFRPAGE = UART0_PAGE;
				SBUF0=0x01;
				while(TI0==0);
		   		TI0=0;
				SFRPAGE=0x00;;
				RSTSRC=0x10;
		}


void clr_comd(void)
		{	
				SFRPAGE = UART0_PAGE;
				SBUF0=0x07;
				while(TI0==0);
		   		TI0=0;
				Ram_Erase(0x03,0xff,0x00);
				Delay(20);
				SFRPAGE=0x00;
				RSTSRC=0x10;
		}

void rece_para(void)
			{	unsigned char x1,jiaoyan;
				unsigned int i;
				SFRPAGE = UART0_PAGE;	
				Ram_Erase(0x03,0xff,0x00);
			Delay(60);
				SBUF0=0x02;
				while(TI0==0);
		   		TI0=0;

			jiaoyan=0;
				for(i=0;i<512;i++)				
					{
						while(RI0==0);
						RI0=0;
						x1=SBUF0;
						XBYTE[0x0e00+i]=x1;
						if(i<=510){jiaoyan=jiaoyan+x1;}
					}
					
			Ram_Program(0x03,0xff,0x00,0x0e00,512);
			Delay(20);	
			if(jiaoyan=XBYTE[0x0fff])
				{SBUF0=0xaa;
				while(TI0==0);
		   		TI0=0;
				}
			else
				{SBUF0=0x55;
				while(TI0==0);
		   		TI0=0;
				}
			ES0=1;
			SFRPAGE=0x00;
			RSTSRC=0x10;
			}

void trans_para(void)
			{unsigned char x1,jiaoyan;
				unsigned int i;
			SFRPAGE = UART0_PAGE;
			Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
			Delay(60);
			SBUF0=0x03;
				while(TI0==0);
		   		TI0=0;
			Delay(60);
			jiaoyan=0;			

			for(i=0;i<511;i++)
			{
				x1=XBYTE[i+0x0e00];
				Delay(2);
//wait:		    
                SBUF0=x1;//5
				while(TI0==0);
					TI0=0;
//goto wait;
				jiaoyan=jiaoyan+x1;
			}
			Delay(2);
			SBUF0=jiaoyan;
			while(TI0==0);
		   	TI0=0;
				
			Delay(20);
			ES0=1;
			//SFRPAGE=0x00;
			//RSTSRC=0x10;
			}
			
void set_start(void)
			{   
				Ram_Rd(0x03,0xff,0x00,0x00,0x00,0x0e00,512);
			    Delay(20);
				XBYTE[0x0efe]=0xaa;
				XBYTE[0x0eff]=0x55;
				Ram_Erase(0x03,0xff,0x00);
				Delay(20);
				Ram_Program(0x03,0xff,0x00,0x0e00,512);
				Delay(20);
				ES0=1;
				SFRPAGE = UART0_PAGE;
				SBUF0=0x04;
				while(TI0==0);
				TI0=0;
				for(addr=0;addr<4096;addr++){XBYTE[addr]=0xffff;}//清所有数据暂存区
				SFRPAGE=0x00;;
				RSTSRC=0x10;
			}


void trans_page(void)
			{unsigned char z1,jiaoyan;
			unsigned int addr;
			unsigned char Ram_Addr5,Ram_Addr4,Ram_Addr3,Ram_Addr2;
			SFRPAGE = UART0_PAGE;
			SBUF0=0x08;
			while(TI0==0);
			TI0=0;
			Delay(60);	

			Ram_Addr5=0x00;
			Ram_Addr4=0x00;
			Ram_Addr3=0x00;
			Ram_Addr2=0;

			addr=0x0000;
			jiaoyan=0;
		
again:		Ram_Rd(Ram_Addr5,Ram_Addr4,Ram_Addr3,Ram_Addr2,0,0x0000,512);
			for(addr=0;addr<512;addr++)
				{   z1=XBYTE[addr];
					SBUF0=z1;
					while(TI0==0);
					TI0=0;
					jiaoyan=jiaoyan+z1;
				}
			while(RI0==0);
			RI0=0;
			z1=SBUF0;
			if(z1==0x55)
				{SBUF0=jiaoyan;
				while(TI0==0);
				TI0=0;
				goto td1;
				}
			Ram_Addr2++;Ram_Addr2++;
			if(Ram_Addr2==8)
			{Ram_Addr2=0;
			Ram_Addr3++;
			if(Ram_Addr3==0x00)
				{	Ram_Addr4++;
				if(Ram_Addr4==0x00)
                    {Ram_Addr5++;}
					if(Ram_Addr5==0x80)
						{	goto td1;}	
				}
			}	
			goto again;
td1:		ES0=1;
			}

/*void test_online(void)
			{unsigned char x0,i;

			do{
			  for(i=0;i<=15;i++)
			   {	SFRPAGE = 0x0f;
					P6=0xf0|i;		
					Delay(10);
					EA=0;
					ad_dat=AD_Complete();						
					ad_dat=AD_Complete();
					EA=1;
					x0=ad_dat;
					SFRPAGE = UART0_PAGE;
					SBUF0=x0;
				while(TI0==0);
					TI0=0;
				while(RI0==0);
					RI0=0;
					x0=SBUF0;
					x0=ad_dat>>8;
					SBUF0=x0;
				while(TI0==0);
					TI0=0;
				while(RI0==0);
					RI0=0;
					x0=SBUF0;
			   }				
			 }
				while (x0!=0x55);
				ES0=1;
			SFRPAGE=0x00;;
			RSTSRC=0x10;
			}
*/

void Timer3_Init (int counts)
{
   char old_SFRPAGE = SFRPAGE;

   SFRPAGE = TMR3_PAGE;                // Switch to Timer 3 page
   	TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
   	TMR3CF = 0x00;                      // use SYSCLK as timebase
   	time_counter=50;
	one_second=0;
   	RCAP3   = -counts;                  // Init reload values
   	TMR3    = 0xffff;                   // set to reload immediately
   	EIE2   |= 0x01;                        // enable Timer3 interrupts
   	EIP2   |= 0x01;                        // Timer3 high perior interrupts
   	TR3 = 1;                            // start Timer3
   SFRPAGE = old_SFRPAGE;              // restore SFRPAGE
}

void Timer3_ISR (void) interrupt 14
{
char old_SFRPAGE;

   TF3 = 0;                               // clear TF3
   old_SFRPAGE = SFRPAGE;                 // Save old SFRPAGE
	ten_ms=1;
	time_counter--;
	if(time_counter!=0){goto t3end;}
	time_counter=50;
	time_s++;
	if(time_s==60){time_m++;time_s=0;}
	if(time_m==60){time_h++;time_m=0;}
	one_second=1;
t3end:	
	SFRPAGE = old_SFRPAGE;
}

⌨️ 快捷键说明

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