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

📄 at45db081new.c

📁 6B59574HC165 AT45DB081 IS62LV1024 SP3530 软件串口程序 以太网测控资料
💻 C
📖 第 1 页 / 共 2 页
字号:
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为82H  缓冲区2为85H
		SendSPIByte(PAGE_PROG_THROUGH_B2);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(先擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B1);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(先擦除)
{
   		unsigned int  i;
		DF_RDY_BUSY; 		// check if flash is busy
   		DF_CHIP_SELECT;					//缓冲区1为84H  缓冲区2为87H
		SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B2);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
   		SendSPIByte((unsigned char)start_addr);
   		for (i=0;i<len;i++)
   			SendSPIByte(buffer[i]);
		DF_CHIP_NOSELECT;
}
sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
sfr16 T2       = 0xcc;                 // Timer2
sfr16 DAC0     = 0xd2;                 // DAC0 data
sfr16 DAC1     = 0xd5;                 // DAC1 data
unsigned int Count1msInc;
void SYSCLK_Init (void);
void PORT_Init (void);
void SPI0_Init (void);
void Timer0_Init (void);
void main (void) {
unsigned char xdata MyBuff[270];
unsigned char xdata MyBuff1[270];

unsigned char xdata *idata MyBuff11;
unsigned int i,j;
	WDTCN = 0xde;                       // disable watchdog timer
	WDTCN = 0xad;
	SYSCLK_Init ();                     // initialize oscillator
	Timer0_Init();
	PORT_Init ();                       // initialize crossbar and GPIO
	EA=1;
	DF_RESET;
	SPI0_Init ();                       // initialize SPI0
	RAM_CHIP_SELECT_BANK0;
    EMI0CF = 0x2F; 
	for(i=0;i<4096;i++)
	{MyBuff[0]=i>>8;
	 MyBuff[1]=i;       //将页地址写入数组的前两个字节.
	for(j=2;j<264;j++)
	{
	  MyBuff[j]=i;
	  }                //向数组写数据共262个字节
        AT450XXPageAddr=i; //指定待写页
		FlashBuffer1Write(0,264,MyBuff);//将数组的内容写入缓存1
		FlashBuffer1ProgAutoErase(); //将缓存的内容写入主存(带擦除)
    }
_nop_();
for(i=0;i<32;i++)
{  
   for(j=0;j<128;j++)
   {AT450XXPageAddr=i*128+j;//指定待读页
   MyBuff11=0x100+j*128;//指定数据放置的XRAM的地址(首地址为0x100).
	PageToBuffer2();//将主存内容读入缓存2
	FlashBuffer2Read(0,264,MyBuff11); //将缓存2的内容读入XRAM
	}
	_nop_();  //在此设断点观察XRAM中的数据是否与写入的数据相符.
}
_nop_(); //同时在此设一断点在全部读完主存后观察XRAM中的内容.
   //	i=1;
   //	if (i)
	//{ 
	//	Count1msInc=0;
	//	ErasingDataFlash();			//整片擦除
	//	Count1msInc=0;
    //  for (i=0;i<2;i++)
	//	{	
	//		AT450XXPageAddr=i;
	//		for (j=0;j<255;j++)
		//	{
		//		MyBuff[j]=j+i;
		//	}
		//	if (i%2)
			
			//	FlashBuffer1Write(255,9,MyBuff);
				
				//FlashAutoProgViaBuffer1(0,264,MyBuff); //将指定数据通过缓存1写入Flash指定位置(先擦除)
	for(i=264;i>0;i--)
	{
	  MyBuff[j]=i;
	  j++;
	  }
	  AT450XXPageAddr=5;
	  	FlashBuffer1Write(0,200,MyBuff);
				FlashBuffer1ProgAutoErase();
				//FlashAutoProgViaBuffer1(0,264,MyBuff); //将指定数据通过缓存1写入Flash指定位置(先擦除)
	PageToBuffer2();
	FlashBuffer2Read(0,200,MyBuff1);
	AT450XXPageAddr=1;
		//FlashBuffer1Write(0,200,MyBuff);
		//		FlashBuffer1ProgAutoErase();
				//FlashAutoProgViaBuffer1(0,264,MyBuff); //将指定数据通过缓存1写入Flash指定位置(先擦除)
	PageToBuffer2();
	FlashBuffer2Read(0,200,MyBuff1);
	//	FlashRead(0,200,MyBuff1);
		//	else
		//		FlashAutoProgViaBuffer2(0,264,MyBuff); //将指定数据通过缓存2写入Flash指定位置(先擦除)
		//}
      /*  for(i=0;i<520;i++)
		{ if(i<260)
		  MyBuff[i]=0x00;
		  else 
		  MyBuff[i]=0x01;

		}*/
	    AT450XXPageAddr=0;
		FlashBuffer1Write(20,14,"1234567890UUAA");
		FlashBuffer1Read(0,260,MyBuff1);
	   	FlashBuffer1Write(20,14,"3234567890UUAA");
	   	FlashBuffer1Read(20,14,MyBuff); //在此处设置断点,观察MyBuff的内容
		FlashBuffer1ProgNoErase();
	   	PageToBuffer2();
	   	FlashBuffer2Read(20,14,MyBuff); 
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
	   	Count1msInc=0;
	   	FlashBuffer1Write(20,14,"1234567890UUAA");
	   	Count1msInc=0;
	   	FlashBuffer1Read(100,14,MyBuff);
	   	Count1msInc=0;
	   	FlashBuffer1ProgNoErase(); 
	   	Count1msInc=0;
	   	PageToBuffer2();
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
	   	FlashProgViaBuffer1(100,14,MyBuff);
		//ErasingDataFlash();
	//	EraseFlashPage(); 
		FlashBuffer1Read(1,1, MyBuff); //从缓冲区1的指定位置(0-263)中读入指定字节
		FlashBuffer2Read(1,1,MyBuff); //从缓冲区2的指定位置(0-263)中读入指定字节
		FlashBuffer1Write(1,1,"!");
		FlashBuffer2Write(1,1,"1");
		GetFlashStatus();
		PageToBuffer1();
		PageToBuffer2();
		FlashBuffer1ProgNoErase();
		FlashBuffer2ProgNoErase();
		FlashBuffer1ProgAutoErase();
		FlashBuffer2ProgAutoErase();
		FlashProgViaBuffer1(1,1, MyBuff);
		FlashProgViaBuffer2(1,1, MyBuff);
		FlashAutoProgViaBuffer1(1,1, MyBuff);
		FlashAutoProgViaBuffer2(1,1, MyBuff);
	//}
xxx:   goto xxx;
}
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 11.0592MHz 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    = 0x07;                     // Enable SMBus, SPI0, and UART0
   XBR1    = 0x00;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   EMI0TC  = 0x21;

   P74OUT  = 0x0F;
   P0MDOUT = 0x15;
}
void SPI0_Init (void)
{
   SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
                                       // 8-bit data words
   SPI0CFG|=0xC0;//CKPOL =1;

   SPI0CN = 0x03;                      // Master mode; SPI enabled; flags
                                       // cleared
   SPI0CKR = SYSCLK/2/2000000-1;       // SPI clock <= 8MHz (limited by 
                                       // EEPROM spec.)
}

void Timer0_Init (void)
{
   CKCON|=0x8;
   TMOD|=0x1;    //16Bit
   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 + -