📄 at45081.c
字号:
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 + -