📄 at45db081new.c
字号:
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[3];
// unsigned char xdata *idata MyBuff11;
// unsigned int i,j;
PCA0MD &= ~0x40; //关看门狗
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;
EraseFlashPage();
// SPI0CFG &= ~0x30; //写时,SI在时钟上升沿写入芯片,_|~|_
FlashBuffer1Write(0,3,"123");
// SPI0CFG |= 0x30; //读时时钟下降沿有效
FlashBuffer1Read(0,3,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;*/
while(1);
}
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
*/
OSCICN = 0x83; // 配置系统时钟为内部高频振荡器的最高频率:
// 24.5MHz
RSTSRC = 0x04; // enable missing clock detector
// source and enable missing clock
}
void PORT_Init (void)
{
XBR0 = 0x02; // Enable SPI0
XBR1 = 0xc0; // Enable crossbar and weak pull-ups
// P74OUT = 0x0f;
P0MDOUT = 0xff;
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG|=0xf0;//CKPOL =1;SPI0CFG|=0xC0;
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/1000000; // SPI clock <= 20MHz (limited by
// flash 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 + -