📄 flash.c
字号:
//name:flash.c
//author:Liweihua
//date:2004.11.30
#include "upsd3200.h" // special function register declarations for UPSD
#include "flash.h" // include the definition of your system memory map
#include "upsd_hardware.h"
#include "lcd.h"
FLASHCB xdata flashcb;
MSG_ENTRY xdata msg_entry[1024];
extern LCDCB xdata lcdcb;
extern PSD_REGS PSD8xx_reg;
static char code msg_type_dot[6][8]=
{
{0xB5,0xF7,0xB6,0xC8,0xD0,0xC5,0xCf,0xA2},//调度信息
{0xB5,0xF7,0xB7,0xE5,0xD0,0xBA,0xC1,0xF7},//调峰泻流
{0xCC,0xEC,0xC6,0xF8,0xD4,0xA4,0xB1,0xA8},//天气预报
{0xCB,0xAE,0xCE,0xC4,0xB2,0xA5,0xB1,0xA8},//水文播报
{0xBD,0xC9,0xB7,0xD1,0xCD,0xA8,0xD6,0xAA},//缴费通知
{0xD5,0xFE,0xB2,0xDF,0xCD,0xA8,0xB8,0xE6} //政策通告
};
void flash_init(void)
{
get_entry_wr_msg();
flashcb.event_notice=FLASH_EV_NULL;
//always read newest recode first
if(flashcb.ptr_wr_msg==MAIN_FLASH_ADDR_START)
{
if(flashcb.pagenum_wr_msg==0)
flashcb.pagenum_rd_msg=0x06;
else
flashcb.pagenum_rd_msg=flashcb.pagenum_wr_msg-1;
flashcb.ptr_rd_msg=0xFF00;
}
else
{
flashcb.pagenum_rd_msg=flashcb.pagenum_wr_msg;
flashcb.ptr_rd_msg=flashcb.ptr_wr_msg-HISORY_MSG_MAXLEN;
}
flashcb.len_wr_msg=0;
flashcb.len_rd_msg=0;
return;
}
void flash_reset(void) // reset flash, read array mode
{
// Note: the following constants (FLASH_COMMON_XXXX)
// are declared type volatile in the header file
// so they are not optimized away by the compiler
*(FLASH_COMMON_X555) = 0xAA; // unlock main flash, write 0xAA to addess 0xX555
*(FLASH_COMMON_XAAA) = 0x55; // unlock main flash, write 0x55 to addess 0xXAAA
*(FLASH_COMMON_X555) = 0xF0; // write 0xF0 command to reset
// Flash memory to Read Array Mode
// now delay 3 msec per dat sheet
return;
}
unsigned char flash_write_with_poll(unsigned char xdata* addr, unsigned char dat)
{
unsigned char done;
unsigned char error;
unsigned char err;
unsigned char poll;
done = FALSE;
err = FALSE;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(FLASH_COMMON_X555) = 0xA0;
*(addr) = dat;
dat = dat & NVM_DATA_POLL;
do
{
poll = *(addr);
error = poll & NVM_ERROR;
poll = poll & NVM_DATA_POLL;
if (dat == poll)
done = TRUE;
else if (error == NVM_ERROR )
err = TRUE;
}
while((done == FALSE) && (err == FALSE));
if (err == TRUE)
{
poll = *(addr);
poll = poll & NVM_DATA_POLL;
if (dat == poll)
done = TRUE;
*(FLASH_COMMON_X555) = 0xF0;
}
return(done);
}
unsigned char flash_erase_sector(unsigned char xdata* flash_bulk_erase_address)
{
unsigned char done;
unsigned char poll;
unsigned char error;
unsigned char err;
done = FALSE;
err = FALSE;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(FLASH_COMMON_X555) = 0x80;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(flash_bulk_erase_address) = 0x30;
do
{
poll = *(flash_bulk_erase_address);
error = poll & NVM_ERROR;
poll = poll & NVM_DATA_POLL;
if (poll == NVM_DATA_POLL)
done = TRUE;
else if (error == NVM_ERROR)
err = TRUE;
}
while((done == FALSE) && (err == FALSE));
if (err == TRUE)
{
poll = *(flash_bulk_erase_address);
poll = poll & NVM_DATA_POLL;
if (poll == NVM_DATA_POLL)
done = TRUE;
*(FLASH_COMMON_X555) = 0xF0;
}
return(done);
}
void flash_write_one_recode(void)
{
unsigned char xdata i;
unsigned char xdata* paddr;
watchdog_reset();
paddr=flashcb.ptr_wr_msg;
PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
for(i=0;i<flashcb.len_wr_msg;i++)
flash_write_with_poll(paddr++,flashcb.buf_wr[i]);
flashcb.ptr_wr_msg+=HISORY_MSG_MAXLEN;
if(flashcb.ptr_wr_msg>MAIN_FLASH_ADDR_END)
{
flashcb.pagenum_wr_msg++;
flashcb.ptr_wr_msg=MAIN_FLASH_ADDR_START;
if(flashcb.pagenum_wr_msg==0x07)
flashcb.pagenum_wr_msg=0x00;
}
return;
}
void flash_read_one_recode(void)
{
unsigned char xdata i;
unsigned char xdata * paddr;//Be sure not to define this value to type of unsigned char xdata*!!!
watchdog_reset();
PSD8xx_reg.PAGE=msg_entry[lcdcb.msg_num].page;
paddr=msg_entry[lcdcb.msg_num].addr;
flashcb.len_rd_msg=0;
flash_reset();
for(i=0;i<HISORY_MSG_MAXLEN;i++)
{
if(*paddr!=0xFF)
{
flashcb.buf_rd[i]=*paddr++;
flashcb.len_rd_msg++;
}
else
break;
}
return;
}
/*
unsigned char get_all_recode_entry(void)
{
unsigned char xdata *addr;
unsigned short i=0;
PSD8xx_reg.PAGE=0x00;
addr =MAIN_FLASH_ADDR_START;
flash_reset();
while(*addr != 0xFF)
{
if(addr==0xFF00)
{
addr = MAIN_FLASH_ADDR_START;
PSD8xx_reg.PAGE+=1;
if(PSD8xx_reg.PAGE==0x08)
{
PSD8xx_reg.PAGE=0x07;
addr=0xFF00;
msg_entry[i].msg_type=*addr;
msg_entry[i].page=PSD8xx_reg.PAGE;
msg_entry[i].addr=addr;
i++;
break;
}
}
else
{
msg_entry[i].msg_type=*addr;
msg_entry[i].page=PSD8xx_reg.PAGE;
msg_entry[i].addr=addr;
addr+=HISORY_MSG_MAXLEN;
i++;
}
}
return(i);
}
*/
unsigned char get_all_recode_entry(void)
{
unsigned char xdata *addr;
unsigned short i=0;
watchdog_reset();
if(flashcb.ptr_wr_msg==MAIN_FLASH_ADDR_START)
{
if(flashcb.pagenum_wr_msg==0)
PSD8xx_reg.PAGE=0x06;
else
PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg-1;
addr=0xFF00;
}
else
{
PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
addr=flashcb.ptr_wr_msg-HISORY_MSG_MAXLEN;
}
flash_reset();
while(*addr != 0xFF)
{
if(addr==MAIN_FLASH_ADDR_START)
{
msg_entry[i].msg_type=*addr;
msg_entry[i].page=PSD8xx_reg.PAGE;
msg_entry[i].addr=addr;
i++;
if(PSD8xx_reg.PAGE==0x00)
break;
else
{
addr=0xFF00;
PSD8xx_reg.PAGE-=1;
}
}
else
{
msg_entry[i].msg_type=*addr;
msg_entry[i].page=PSD8xx_reg.PAGE;
msg_entry[i].addr=addr;
addr-=HISORY_MSG_MAXLEN;
i++;
}
}
return(i);
}
void get_entry_wr_msg(void)
{
unsigned char xdata *addr;
watchdog_reset();
PSD8xx_reg.PAGE=0x00;
addr =MAIN_FLASH_ADDR_START;
flash_reset();
while((*addr) != 0xFF)
{
if(addr==0xFF00)
{
addr = MAIN_FLASH_ADDR_START;
PSD8xx_reg.PAGE+=1;
if(PSD8xx_reg.PAGE==0x07)
{
PSD8xx_reg.PAGE=0x00;
break;
}
}
else
addr+=HISORY_MSG_MAXLEN;
}
if(addr == MAIN_FLASH_ADDR_START)
flash_erase_sector(MAIN_FLASH_ADDR_START);
flashcb.ptr_wr_msg = addr;
flashcb.pagenum_wr_msg=PSD8xx_reg.PAGE;
return;
}
void fill_lcdbuf(void)
{
unsigned short i,j=0;
unsigned char*p;
watchdog_reset();
for(i=0;i<8;i++)
lcdcb.msg_buf[i]=msg_type_dot[flashcb.buf_rd[0]][i];
lcdcb.msg_buf[i++]=',';
lcdcb.msg_buf[i++]=flashcb.buf_rd[1]/10+0x30;
lcdcb.msg_buf[i++]=flashcb.buf_rd[1]%10+0x30;
lcdcb.msg_buf[i++]=':';
lcdcb.msg_buf[i++]=flashcb.buf_rd[2]/10+0x30;
lcdcb.msg_buf[i++]=flashcb.buf_rd[2]%10+0x30;
lcdcb.msg_buf[i++]=':';
lcdcb.msg_buf[i++]=flashcb.buf_rd[3]/10+0x30;
lcdcb.msg_buf[i++]=flashcb.buf_rd[3]%10+0x30;
lcdcb.msg_buf[i++]=',';
p=&flashcb.buf_rd[4];
while(j<flashcb.len_rd_msg-4)
{
if( ( *p>=0xA1) && (i%2 == 0) )
{//汉字,从偶地址开始
lcdcb.msg_buf[i] = *p++;
i++;
lcdcb.msg_buf[i] = *p++;
i++;
j += 2;
}
else if(*p<0xA1)
{//半宽字符
lcdcb.msg_buf[i]= *p++;
i++;
j++;
}
else
{//汉字从奇地址开始
lcdcb.msg_buf[i] = 0x20;
i++;
}
}
lcdcb.msg_len=i;
return;
}
void flash_set_syspara(void)
{
unsigned char i;
watchdog_reset();
PSD8xx_reg.PAGE=0x07;
if(flashcb.ptr_wr_syspara==MAIN_FLASH_ADDR_START)
flash_erase_sector(MAIN_FLASH_ADDR_START);
for(i=0;i<DATACENTER_IP_LEN;i++)
flash_write_with_poll(flashcb.ptr_wr_syspara++, flashcb.datacenter_ip[i]);
for(i=0;i<DATACENTER_PORT_LEN;i++)
flash_write_with_poll(flashcb.ptr_wr_syspara++, flashcb.datacenter_port[i]);
return;
}
void flash_get_syspara(void)
{
unsigned char xdata *addr;
unsigned char i;
watchdog_reset();
PSD8xx_reg.PAGE=0x07;
addr =MAIN_FLASH_ADDR_START;
flash_reset();
while((*addr) != 0xFF)
{
if(addr==0xFFEF)
{
addr=MAIN_FLASH_ADDR_START;
break;
}
addr+=SYSPARA_LEN;
}
flashcb.ptr_wr_syspara=addr;
if(addr==MAIN_FLASH_ADDR_START)
addr=0xFFEF;
else
addr-=SYSPARA_LEN;
for(i=0;i<DATACENTER_IP_LEN;i++)
flashcb.datacenter_ip[i]=*addr++;
for(i=0;i<DATACENTER_PORT_LEN;i++)
flashcb.datacenter_port[i]=*addr++;
return;
}
void flash_poll(void)
{
watchdog_reset();
switch(flashcb.event_notice)
{
case FLASH_EV_NULL:
break;
case FLASH_EV_WRITE_ONE_RECODE:
flash_write_one_recode();
flashcb.event_notice=FLASH_EV_NULL;
break;
case FLASH_EV_READ_ONE_RECODE:
flash_read_one_recode();
fill_lcdbuf();
lcdcb.event_notice=SCR_EVENT_HISTORY_MSG;
flashcb.event_notice=FLASH_EV_NULL;
break;
case FLASH_EV_GET_ALL_RECODE_ENTRY:
flashcb.msg_sum=get_all_recode_entry();
if(flashcb.msg_sum==0)
lcdcb.event_notice=SCR_EVENT_NO_RECODE;
else
lcdcb.event_notice=SCR_EVENT_NEXT_PAGE;
flashcb.event_notice=FLASH_EV_NULL;
break;
default:
break;
}
return;
}
/*****************For xiaogui PSD,but something wrong,no answer!!!**************
void flash_write_with_poll(volatile unsigned char *addr, unsigned char dat)
{
EA = 0;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(FLASH_COMMON_X555) = 0xA0;
*(addr) = dat;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
EA = 1;
//延时3ms左右
delayms();
}
void flash_erase_sector(volatile unsigned char *sector_erase_address)
{
EA = 0;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(FLASH_COMMON_X555) = 0x80;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(sector_erase_address) = 0x30;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
EA = 1;
}
void flash_regs_init(void)
{
PSD8xx_reg.VM=0x92;
PSD8xx_reg.MAINPROTECT=0x00;
}
unsigned char flash_write_one_recode(void)
{
unsigned char i;
unsigned char xdata*idata paddr;
unsigned char n=0;
//unsigned char *bufp;
unsigned char page_tmp;
page_tmp=PSD8xx_reg.PAGE;
PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
paddr=flashcb.ptr_wr_msg;
for(i=0;i<flashcb.len_wr_msg;i++)
{
if(flash_write_with_poll(paddr++,flashcb.buf_wr[i])==1)
continue;
else
break;
}
PSD8xx_reg.PAGE=page_tmp;
if(i==flashcb.len_wr_msg)
{
flashcb.ptr_wr_msg+=HISORY_MSG_MAXLEN;
if(flashcb.ptr_wr_msg>MAIN_FLASH_ADDR_END)
{
flashcb.pagenum_wr_msg++;
flashcb.ptr_wr_msg=MAIN_FLASH_ADDR_START;
if(flashcb.pagenum_wr_msg==0x88)
flashcb.pagenum_wr_msg=0x80;
}
return(1);
}
else
return(0);
}
void flash_reset(void)
{
EA = 0;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
*(FLASH_COMMON_X555) = 0xAA;
*(FLASH_COMMON_XAAA) = 0x55;
*(FLASH_COMMON_X555) = 0xF0;
PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
EA = 1;
delayms();
}
**************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -