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

📄 at45081.c

📁 这是新华龙(www.xhl.xom.xn)开发的
💻 C
📖 第 1 页 / 共 2 页
字号:
		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;
}

//
// P0.0 - SCL (SMBus -- not used)
// P0.1 - SDA (SMBus -- not used)
// P0.2 - SCK  (connected to SCK on EEPROM)
// P0.3 - MISO (connected to SI on EEPROM)
// P0.4 - MOSI (connected to SO on EEPROM)
// P0.5 - NSS  (unconnected, but pulled high by on-chip pull-up resistor)
// P0.6 - TX -- UART used for display/testing purposes
// P0.7 - RX
//
// Assumes an 22.1184MHz crystal is attached between XTAL1 and XTAL2.
//

//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F00x
//-----------------------------------------------------------------------------

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

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

//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------

unsigned int Count1msInc;
unsigned char Count1ms,Count10ms,Count1s;
unsigned char TimeSecond,TimeMinute;
extern bit double_second;

void SYSCLK_Init (void);
void PORT_Init (void);
void SPI0_Init (void);
void Timer0_Init (void);

//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void TestI2C (void);
void Rtl8019AS_Init(void);
void test8019(void);
void Delay1ms(unsigned char T)
{
	Count1ms=T;
	while (Count1ms);
}


void main (void) {

unsigned char xdata MyBuff[264];
unsigned char 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; 
   	ClearCommRecBuffer();
	OpenComm(); 
//	OpenComm1(); 
	SendCommString("Init OK\r\n");
   	i=1;
   	if (i)
	{ 
		Count1msInc=0;
//		printf ("\nStart Erase Chip\r\n");
		ErasingDataFlash();			//整片擦除
		Count1msInc=0;
		for (i=0;i<2;i++)
		{	
			AT450XXPageAddr=i;
			for (j=0;j<255;j++)
			{
				MyBuff[j]=j+i;
			}
			if (i%2)
				FlashAutoProgViaBuffer1(0,264,MyBuff); //将指定数据通过缓存1写入Flash指定位置(先擦除)
			else
				FlashAutoProgViaBuffer2(0,264,MyBuff); //将指定数据通过缓存2写入Flash指定位置(先擦除)
		}

	   	AT450XXPageAddr=0;
//	   	printf ("Time:%d\r\n",Count1msInc);

	   	FlashBuffer1Write(20,14,"1234567890UUAA");
	   	FlashBuffer1Read(20,14,MyBuff); 
		FlashBuffer1ProgNoErase();
	   	PageToBuffer2();
	   	FlashBuffer2Read(20,14,MyBuff); 


//	   	printf ("Time:%d\r\n",Count1msInc);
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
//	   	printf ("Time:%d\r\n",Count1msInc);
	   	Count1msInc=0;
	   	FlashBuffer1Write(20,14,"1234567890UUAA");
//	   	printf ("Time:%d\r\n",Count1msInc);
	   	Count1msInc=0;
	   	FlashBuffer1Read(100,14,MyBuff);
//	   	printf ("Time:%d\r\n",Count1msInc);
	   	Count1msInc=0;
	   	FlashBuffer1ProgNoErase(); 
//	   	printf ("Time:%d\r\n",Count1msInc);
	   	Count1msInc=0;
	   	PageToBuffer2();
//	   	printf ("Time:%d\r\n",Count1msInc);
		
	   	Count1msInc=0;
	   	FlashBuffer2Read(100,14,MyBuff);
//	   	printf ("Time:%d\r\n",Count1msInc);
	   	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);
	}
	test8019();
	TestI2C ();

xxx:   goto xxx;
}

//-----------------------------------------------------------------------------
// Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 18.432MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz 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
                                       // detector
//	OSCICN = 0x07;   //interal 16MHZ
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//

#define PRT0CF P0MDOUT
#define PRT1CF P1MDOUT
#define PRT2CF P2MDOUT



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;
}

//-----------------------------------------------------------------------------
// SPI0_Init
//-----------------------------------------------------------------------------
//
// Configure SPI0 for 8-bit, 2MHz SCK, Master mode, polled operation, data 
// sampled on 1st SCK rising edge.
//
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
	Count10ms=10;
	Count1s=0;
   TR0 = 0;                         	// STOP Timer0
   TH0 = (-SYSCLK/1000) >> 8;    		// set Timer0 to overflow in 1ms
   TL0 = -SYSCLK/1000;
   TR0 = 1;   	// START Timer0
   IE|= 0x2; 
}

//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
void Timer0_ISR (void) interrupt 1  //1ms
{
	TH0 = (-SYSCLK/1000) >> 8;  
   	TL0 = -SYSCLK/1000;
	if (Count1ms) Count1ms--;
	Count1msInc++;
	if (Count10ms) Count10ms--;
	else
	{
		Count10ms=10;    			//10ms
		tcp_time_out=1;
		if (Count1s) Count1s--;
		else
		{
			Count1s=100;			//1s
			TimeSecond++;
			if (TimeSecond%2) double_second=1;
			if (TimeSecond>=60)
			{
				TimeSecond=0;		//1min
				TimeMinute++;
				if	(TimeMinute==60)	TimeMinute=0;
                if	(gateway_ip_address_ttl>0)	gateway_ip_address_ttl=gateway_ip_address_ttl-1;
				if	(ping_ip_address_ttl>0)	ping_ip_address_ttl=ping_ip_address_ttl-1;
			}
		}
	}
}

⌨️ 快捷键说明

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