📄 uart-io.c
字号:
}
rxtxend=0;
ts=0;
}
else
{
rxtxend=0;
ts=0;
}
}
}
if (rxtxend==2&&temp==0x0A)
{
rxtxend++;
}
}
//~~~~~~~~~~~~~~~~开始编程Flash并校验~~~~~~~~~~~~~~~~//
void Programme(void)
{
if (ci==0)
{
x=0;
y=0;
ci=1;
}
else if (ci==1)
{
xs=ds;
xs=xs-0x30;
xs=xs<<4;
ci++;
//i++;
}
else if (ci==2)
{
ys=ds;
ys=ys-0x30;
ds=xs|ys;
ci--;
x++;
if (y==0)
{
as=0x40;
IO_SPI();
as=adh;
IO_SPI();
as=adl;
IO_SPI();
as=ds;
IO_SPI();
y=1;
}
else if (y==1)
{
as=0x48;
IO_SPI();
as=adh;
IO_SPI();
as=adl;
IO_SPI();
as=ds;
IO_SPI();
/*
as=0x4C;
IO_SPI();
as=adh;
IO_SPI();
as=adl;
IO_SPI();
as=0x00;
IO_SPI();
*/
y=0;
if (adl==0xFF)
{
ProgrammingFlash();
adh++;
adl=0x00;
}
else
{
fadl=adl&0x3F; //取LSB后六位
if (fadl==0x3F)
{
_NOP();
_NOP();
ProgrammingFlash();
}
adl++;
}
}
}
if (x==cc)
{
tadl=adl;
tadh=adh;
cc=0;
as=0;
ci=0;
}
}
//~~~~~~~~~~~~~~~~开始编程EEPROM并校验~~~~~~~~~~~~~~~~//
void Programmeeprom(void)
{
if (ci==0)
{
x=0;
y=0;
ci=1;
}
else if (ci==1)
{
xs=ds;
xs=xs-0x30;
xs=xs<<4;
ci++;
}
else if (ci==2)
{
ys=ds;
ys=ys-0x30;
ds=xs|ys;
ci--;
x++;
as=0xC0;
IO_SPI();
as=eadh&0x3F;
IO_SPI();
as=eadl;
IO_SPI();
as=ds;
IO_SPI();
//delay1(1);
if (eadl==0xFF)
{
eadh++;
eadl=0x00;
}
else
{
eadl++;
}
}
if (x==cc)
{
tadl=adl;
tadh=adh;
cc=0;
as=0;
ci=0;
}
}
void Write_ros(void)
{
as=0xAC; //写高熔丝位
IO_SPI();
as=0xA8;
IO_SPI();
as=0x00;
IO_SPI();
as=rosh;
IO_SPI();
delay1(10);
as=0xAC; //写熔丝位
IO_SPI();
as=0xA0;
IO_SPI();
as=0x00;
IO_SPI();
as=rosl;
IO_SPI();
delay1(10);
as=0xAC; //写锁定位
IO_SPI();
as=0xFF;
IO_SPI();
as=0x00;
IO_SPI();
as=0xFF;
IO_SPI();
}
#pragma vector = USART_RXC_vect
__interrupt void uart0_rx_isr(void)
{
//uart has received a character in UDR
temp=read_UART(); //读取UDR
write_SPI(temp); //写flash
number++;
if (number == 255) //buffer1写满,存入主存,开始向buffer2写
{
PORTB |= 0x10; //PB4(DF_CS)=1
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(B1TOMM_WITHOUT_ERASE);//将第一页存入主存
write_SPI((char)(page>>7));
write_SPI((char)(page<<1));
write_SPI(0x00);
PORTB |= 0x10; //PB4(DF_CS)=1
page++;
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(BUFFER_2_WRITE); //开始向buffer2写
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
}
if (number == 510) //buffer2写满,存入主存,开始向buffer1写
{
PORTB |= 0x10; //PB4(DF_CS)=1
number = 0;
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(B2TOMM_WITHOUT_ERASE);//将第二页存入主存
write_SPI((char)(page>>7));
write_SPI((char)(page<<1));
write_SPI(0x00);
PORTB |= 0x10; //PB4(DF_CS)=1
page++;
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(BUFFER_1_WRITE); //开始向buffer1写
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
}
//判断文件是否发送完毕,并将最后一页写入DataFlash
end();
if (rxtxend==3)
{
if (number<255)
{
PORTB |= 0x10; //PB4(DF_CS)=1
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(B1TOMM_WITHOUT_ERASE);//将第一页存入主存
write_SPI((char)(page>>7));
write_SPI((char)(page<<1));
write_SPI(0x00);
}
else if (number<510&&number>255)
{
/*for (i=number;i<528;i++)
{
write_SPI(0xFF);
number++;
}*/
PORTB |= 0x10; //PB4(DF_CS)=1
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(B2TOMM_WITHOUT_ERASE);//将第二页存入主存
write_SPI((char)(page>>7));
write_SPI((char)(page<<1));
write_SPI(0x00);
}
}
//
if (page==2048||rxtxend==3) //flash写满,停止
{
PORTB |= 0x10; //PB4(DF_CS)=1
rxpage=page+1;
state=2; //状态置位
page=0;
number=0;
upordown=0;
UCSRB &= ~0x80; //关闭UART接受中断使能
TCCR0 = 0x05; //启动定时/计数器0
}
}
#pragma vector = USART_TXC_vect
__interrupt void uart0_tx_isr(void)
{
//uart has transmit a character in UDR
temp=read_SPI(); //读取DataFlash
//delay1(3);
ds=temp;
ascii();
UDR=temp; //将值赋给UDR
number++;
if (number == 255) //buffer1读取完毕,主存转入buffer1,开始读取buffer2
{
PORTB |= 0x10; //PB4(DF_CS)=1
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B1_XFER);//主存转入buffer1
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10; //PB4(DF_CS)=1
page++;
PORTB &= ~0x10; //PB4(DF_CS)=0
write_SPI(BUFFER_2_READ); //开始读取buffer2
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
//write_SPI(0x00);
}
if (number == 510)//buffer2读取完毕,主存转入buffer2,开始读取buffer1
{
PORTB |= 0x10; //PB4(DF_CS)=1
number = 0;
PORTB &= ~0x10; //PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B2_XFER);//主存转入buffer2
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10; //PB4(DF_CS)=1
page++;
PORTB &= ~0x10; //PB4(DF_CS)=0
write_SPI(BUFFER_1_READ); //开始读取buffer1
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
//write_SPI(0x00);
}
if (upordown==4)
{
end();
}
else if (upordown==5)
{
jud();
}
if (beg==1)
{
Programme();
}
else if (beg==2)
{
Programmeeprom();
}
if (page==2048||rxtxend==3) //flash全部读取完成,停止
{
if (prof==1)
{
if (temp2==1) //如果有EEPROM数据,则
{
page--;
number=0;
rxtxend=0;
temp2=0;
PORTB |= 0x10;//PB4(DF_CS)=1
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10;//PB4(DF_CS)=1
page++;
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B2_XFER);//将第二页装入buffer2
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10;//PB4(DF_CS)=1
page++;
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
}
else
{
if (temp3==1&&pror==1) //如果有熔丝位数据,则
{
page--;
number=0;
rxtxend=3;
temp3=0;
PORTB |= 0x10;//PB4(DF_CS)=1
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10;//PB4(DF_CS)=1
page++;
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
}
else if (temp3==0&&pror==1)
{
if (number==3)
{
PORTB |= 0x10; //PB4(DF_CS)=1
state =0; //状态清0
page=0;
upordown=0;
rxtxend=0;
UCSRB &= ~0x40; //关闭UART发送中断使能
TCCR0 = 0x05; //启动定时/计数器0
temp2=proe;
temp3=pror;
}
}
else
{
PORTB |= 0x10; //PB4(DF_CS)=1
state =0; //状态清0
page=0;
upordown=0;
UCSRB &= ~0x40; //关闭UART发送中断使能
TCCR0 = 0x05; //启动定时/计数器0
temp2=proe;
temp3=pror;
}
}
}
else if (prof==0&&proe==1)
{
if (temp3==1&&pror==1)
{
temp2=0;
page--;
number=0;
rxtxend=3;
temp3=0;
PORTB |= 0x10;//PB4(DF_CS)=1
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
write_SPI((uchar)(page>>7));
write_SPI((uchar)(page<<1));
write_SPI(0x00);
PORTB |= 0x10;//PB4(DF_CS)=1
page++;
delay1(1);
PORTB &= ~0x10;//PB4(DF_CS)=0
write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
}
else if (temp3==0&&pror==1)
{
if (number==3)
{
PORTB |= 0x10; //PB4(DF_CS)=1
state =0; //状态清0
page=0;
upordown=0;
rxtxend=0;
UCSRB &= ~0x40; //关闭UART发送中断使能
TCCR0 = 0x05; //启动定时/计数器0
temp2=proe;
temp3=pror;
}
}
else
{
PORTB |= 0x10; //PB4(DF_CS)=1
state =0; //状态清0
page=0;
upordown=0;
UCSRB &= ~0x40; //关闭UART发送中断使能
TCCR0 = 0x05; //启动定时/计数器0
temp2=proe;
temp3=pror;
}
}
else if (prof==0&&proe==0)
{
;
}
}
}
void Programme_Chip(void)
{
do
{
temp=read_SPI(); //读取DataFlash
ds=temp;
ascii();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -