📄 chipsecond.c
字号:
#include "560.h"
#pragma section code tab5 0x80000
extern void _delay(void);
extern void _ICrd(void);
void Beepsd(unsigned int m)
{
IOP3 |= 0x08;
while(m != 0)
{
_delay();
m--;
}
IOP3 &= 0xF7;
}
/*Flash的写*/
void W29c040wrsd(unsigned long adr,unsigned char *dat,unsigned int size)
{
unsigned int Liv_i, Liv_j;
unsigned int low_addr;
unsigned long high_addr;
unsigned char write_data[256];
unsigned char *p; /*指针变量*/
unsigned long Llv_counter; /*检测写入完整否的计数变量*/
Llv_counter = 0;
low_addr = (unsigned int)(adr&0x0000FF);
high_addr = adr & 0xFFFF00;
Liv_i = size + low_addr;
if (Liv_i > 256)
{/*跨页面写*/
Liv_i = Liv_i - 256;
/*第二步,余下字节写入第二页面*/
Llv_counter = high_addr + 256;
// Flashrdsd(Llv_counter,write_data);
p = (unsigned char *)Llv_counter;
for(Liv_j = 0; Liv_j < 256; Liv_j++)
write_data[Liv_j] = *(p + Liv_j);
for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = dat[256 - low_addr + Liv_j];
/*解除数据保护*/
p = (unsigned char *)(Llv_counter & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)Llv_counter;
for (Liv_j = 0; Liv_j < 256; Liv_j++)
*(p + Liv_j ) = write_data[Liv_j];
// /*数据校验*/
// p = (unsigned char *)(Llv_counter & 0xFF0000); /*Llv_counter借用为地址*/
// Llv_counter = 0;
// write_data[0] = *p;
// write_data[0] &= 0x40;
for (Liv_i = 0; Liv_i < 10; Liv_i++)
_delay();
// while (Llv_counter < 0x7FFFF)
// {
// write_data[1] = *p;
// write_data[1] &= 0x40;
// if (write_data[0] == write_data[1])
// break;
// write_data[0] = write_data[1];
// Llv_counter++;
// }
// W29pwr(temp_adr, write_data);
Liv_i = 256;
}
/*同一页面写*/
// Flashrdsd(high_addr,write_data);
p = (unsigned char *)high_addr;
for(Liv_j = 0; Liv_j < 256; Liv_j++)
write_data[Liv_j] = *(p + Liv_j);
for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = dat[Liv_j - low_addr];
/*解除数据保护*/
p = (unsigned char *)(high_addr & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)high_addr;
for (Liv_j = 0; Liv_j < 256; Liv_j++)
*(p + Liv_j ) = write_data[Liv_j];
// /*数据校验*/
// p = (unsigned char *)(high_addr & 0xFF0000);
// Llv_counter = 0;
// write_data[0] = *p;
// write_data[0] &= 0x40;
for (Liv_i = 0; Liv_i < 10; Liv_i++)
_delay();
// while (Llv_counter < 0x7FFFF)
// {
// write_data[1] = *p;
// write_data[1] &= 0x40;
// if (write_data[0] == write_data[1])
// break;
// write_data[0] = write_data[1];
// Llv_counter++;
// }
// W29pwr(high_addr, write_data);
}
/*Flash写,数据缓冲区在serialdata中*/
void W29c040wrsd_serialdata(unsigned long adr,unsigned int size)
{
unsigned int Liv_i, Liv_j;
unsigned int low_addr;
unsigned long high_addr;
unsigned char write_data[256];
unsigned char *p; /*指针变量*/
unsigned long Llv_counter; /*检测写入完整否的计数变量*/
Llv_counter = 0;
low_addr = (unsigned int)(adr & 0x0000FF);
high_addr = adr & 0xFFFF00;
Liv_i = size + low_addr;
if (Liv_i > 256)
{/*跨页面写*/
/*第一步,补齐第一页面剩余字节*/
Liv_i = Liv_i - 256;
/*第二步,余下字节写入第二页面*/
Llv_counter = high_addr + 256;
// Flashrdsd(Llv_counter,write_data);
p = (unsigned char *)Llv_counter;
for(Liv_j = 0; Liv_j < 256; Liv_j++)
write_data[Liv_j] = *(p + Liv_j);
for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = serialdata[256 - low_addr + Liv_j];
/*解除数据保护*/
p = (unsigned char *)(Llv_counter & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)Llv_counter;
for (Liv_i = 0; Liv_i < 256; Liv_i++)
*(p + Liv_i ) = write_data[Liv_i];
// /*数据校验*/
// p = (unsigned char *)(Llv_counter & 0xFF0000);/*Llv_counter是暂时借用的*/
//
// Llv_counter = 0;
// write_data[0] = *p;
// write_data[0] &= 0x40;
for (Liv_i = 0; Liv_i < 10; Liv_i++)
_delay();
// while (Llv_counter < 0x7FFF)
// {
// write_data[1] = *p;
// write_data[1] &= 0x40;
// if (write_data[0] == write_data[1])
// break;
// write_data[0] = write_data[1];
// Llv_counter++;
//
// }
Liv_i = 256;
}
/*同一页面写*/
// Flashrdsd(high_addr,write_data);
p = (unsigned char *)high_addr;
for(Liv_j = 0; Liv_j < 256; Liv_j++)
write_data[Liv_j] = *(p + Liv_j);
for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = serialdata[Liv_j - low_addr];
/*解除数据保护*/
p = (unsigned char *)(high_addr & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)high_addr;
for (Liv_i = 0; Liv_i < 256; Liv_i++)
*(p + Liv_i ) = write_data[Liv_i];
// /*数据校验*/
// p = (unsigned char *)(high_addr & 0xFF0000);
// Llv_counter = 0;
// write_data[0] = *p;
// write_data[0] &= 0x40;
for (Liv_i = 0; Liv_i < 10; Liv_i++)
_delay();
// while (Llv_counter < 0x7FFF)
// {
// write_data[1] = *p;
// write_data[1] &= 0x40;
// if (write_data[0] == write_data[1])
// break;
// write_data[0] = write_data[1];
// Llv_counter++;
// }
}
unsigned char Icrdsd(unsigned int padr,unsigned int badr,unsigned int size)
{
union gyt2 abc;
unsigned int i;
abc.pr = padr;
Buffer[0] = abc.str[0];
Buffer[1] = abc.str[1];
abc.pr = badr;
Buffer[2] = abc.str[0];
Buffer[3] = abc.str[1];
abc.pr = size;
Buffer[4] = abc.str[0];
Buffer[5] = abc.str[1];
_ICrd();
for (i = 0; i < size; i++)
rxd[i] = serialdata[i];
/*效验过程*/
abc.pr = padr;
Buffer[0] = abc.str[0];
Buffer[1] = abc.str[1];
abc.pr = badr;
Buffer[2] = abc.str[0];
Buffer[3] = abc.str[1];
abc.pr = size;
Buffer[4] = abc.str[0];
Buffer[5] = abc.str[1];
_ICrd();
for (i = 0; i < size; i++)
{
if(rxd[i] != serialdata[i])
return ERROR;
}
return RIGHT;
}
void Updatemain(void)
{
unsigned char *p;
unsigned int page,padr,i,j;
unsigned long adr,t;
__DI();
adr = 0x900;
// page = (unsigned int)(adr/1024);
// padr = (unsigned int)(adr%1024);
page = 2;
padr = 256;
for(i=0;i<450;i++) //写0x900-0x1A000的主程序
{
if (i%50 == 0x00)
Beepsd(10);
j = Icrdsd(page,padr,256); //一次写256个字节
if (j == ERROR)
return;
p = (unsigned char *)0x00;
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
p = (unsigned char *)adr;
for (j = 0; j < 256; j++)
*(p+j) = serialdata[j];
p = (unsigned char *)(adr&0xFF0000);
t = 0;
serialdata[0] = *p;
serialdata[0] &= 0x40;
while (t < 0x2FFFFF)
{
serialdata[1]=*p;
serialdata[1] &= 0x40;
if(serialdata[0] == serialdata[1])
break;
serialdata[0]=serialdata[1];
t++;
}
padr += 256;
adr += 256;
if (padr > 1023)
{
padr = 0x00;
page++;
}
}
while(con)
{
Beepsd(10);
}
}
unsigned char Icguanlinew(void)
{//读出管理卡(ssf1101)中的信息,并写到Flash中,编码单品: 23字节;条码单品:28字节
unsigned char *p;
unsigned int page,padr,i,j;
unsigned long adr,t;
union gyt2 abc;
abc.str[0] = serialdata[3]; /*前面早就读出来了的*/
abc.str[1] = serialdata[2];
adr = taxreg;
page = 0;
padr = 0x100;
for (i = 0; i < abc.pr; i++)
{
if (i%40 == 0)
Beepsd(10);
j = Icrdsd(page,padr,256); //一次写256个字节
if (j == ERROR)
return ERROR;
/**********************/
p = (unsigned char *)0x00;
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
p = (unsigned char *)adr;
for (j = 0; j < 256; j++)
*(p+j) = serialdata[j];
p = (unsigned char *)(adr&0xff0000);
t = 0;
serialdata[0] = *p;
serialdata[0] &= 0x40;
while(t<0x2fffff)
{
serialdata[1] = *p;
serialdata[1] &= 0x40;
if(serialdata[0] == serialdata[1])
break;
serialdata[0] = serialdata[1];
t++;
}
padr+=256;
adr+=256;
if(padr>1023)
{
padr = 0;
page++;
}
}
return RIGHT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -