📄 uart-io.c
字号:
adh++;
adl=0x00;
}
}
else if (y==1)
{
as=0x28;
IO_SPI();
as=adh;
IO_SPI();
as=adl;
IO_SPI();
as=0x00;
IO_SPI_READSP();
//ws[z]=rs;
/*
as=0x4C;
IO_SPI();
as=adh;
IO_SPI();
as=adl;
IO_SPI();
as=0x00;
IO_SPI();
*/
y=0;
if (adl==0xFF)
{
adh++;
adl=0x00;
}
else
{
adl++;
}
}
/*if (rs==0xFF)
{_NOP();}
else
{_NOP();}*/
}
void Read_EEPROM(void)
{
uiA = 0x0000;
EEPROM_read(uiA);
delay1(10);
DataFlashstate=EEDR;
if (DataFlashstate==0x07) //判断数据状态
{
prof=1;
proe=1;
temp2=1;
pror=1;
temp3=1;
}
else if (DataFlashstate==0x06)
{
prof=1;
proe=1;
temp2=1;
pror=0;
temp3=0;
}
else if (DataFlashstate==0x05)
{
prof=1;
proe=0;
temp2=0;
pror=1;
temp3=1;
}
else if (DataFlashstate==0x04)
{
prof=1;
proe=0;
temp2=0;
pror=0;
temp3=0;
}
else if (DataFlashstate==0x03)
{
prof=0;
proe=1;
temp2=1;
pror=1;
temp3=1;
}
else if (DataFlashstate==0x02)
{
prof=0;
proe=1;
temp2=1;
pror=0;
temp3=0;
}
else if (DataFlashstate==0x01)
{
prof=0;
proe=0;
temp2=0;
pror=1;
temp3=1;
}
else if (DataFlashstate==0x00)
{
prof=0;
proe=0;
temp2=0;
pror=0;
temp3=0;
}
}
void Read_ros(void)
{
as=0x58; //读高熔丝位
IO_SPI();
as=0x08;
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI_READSP();
rosh=rs;
rs=0;
delay1(10);
as=0x50; //读熔丝位
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI_READSP();
rosl=rs;
rs=0;
delay1(10);
as=0x58; //读锁定位
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI_READSP();
lock=rs;
rs=0;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
_CLI(); //disable all interrupts
port_init(); //端口初始化
uart0_init(); //串口初始化
timer0_init(); //定时/计数器0初始化,键盘采样
timer2_init(); //定时/计数器2初始化,延时函数
SPI_init(); //SPI初始化
ADC1_init(); //ADC初始化(键值读取)
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x41; //timer interrupt sources
_SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void setzero(void)
{
upordown=0; //工作状态。1:下载flash;2:下载eeprom;3:下载熔丝位;4:读取DataFlash;5:编程
state=0; //状态参数
page=0; //下一页码
number=0; //下一字节数
i=0; //循环参数
j=0; //循环参数
x=0; //循环参数
y=0; //循环参数
ts=0; //判断hex文件开始,结束等信息的参数位
rxtxend=0; //发送,接收状态参数
DataFlashstate=0; //DataFlash内容状态
rxpage=0;
m=0; //延时计数参数
temp1=0;
temp2=0;
temp3=0;
temp4=0;
prof=0; //Flash编程完毕
proe=0; //EEPROM编程完毕
pror=0; //熔丝位编程完毕
adh=0; //编程地址高字节
adl=0; //编程地址低字节
fadl=0; //编程地址低字节后七位
tadl=0; //编程地址低暂存
tadh=0; //编程地址高暂存
tadl1=0; //编程地址低暂存
eadl=0;
eadh=0;
tempadh=0;
tempadl=0;
trueadr=0;
//uint tempadr=0;
beg=0; //编程开始状态变量
cc=0; //编程长度变量
ci=0; //编程长度判断变量
as=0;
bs=0;
cs=0; //反馈数据暂存
ds=0; //接收编程数据暂存
rs=0; //读出数据暂存
ads=0; //Hex地址判断状态
uiA=0;
ucD=0;
xs=0;
ys=0;
Syn=0;
rosl=0; //读出熔丝位暂存
rosh=0;
lock=0; //读出锁定位暂存
}
//
void main(void)
{
init_devices(); //初始化设备
PORTB |= 0x10; //PB4(DF_CS)=1
//insert your functional code here...
//~~~~~~~~~~~~~~~~~~~~~~~~~判断工作状态~~~~~~~~~~~~~~~~~~~~~~~~~~//
while(upordown==0)
{
if( ((temp1>=0x79)&&(temp1<=0x8f)) )
//下载数据开始
{
delay(50000); //按下50ms表示进入下载状态
if( ((temp1>=0x79)&&(temp1<=0x8f)) )
{
ucD = 0x00;
uiA = 0x0000;
PORTB |= 0x10; //PB4(DF_CS)=1
PORTB &= ~0x10; //PB4(DF_CS)=0
chip_unlock(); //片解锁
PORTB |= 0x10; //PB4(DF_CS)=1
delay(1000);
PORTB &= ~0x10; //PB4(DF_CS)=0
chip_erase(); //片擦除
PORTB |= 0x10; //PB4(DF_CS)=1
delay1(10);
state=2;
prof=0; //清除各个参数
proe=0;
pror=0;
temp2=0;
temp3=0;
DataFlashstate=0;
while(state==2)
{
if( ((temp1 >=0x11)&&(temp1<=0x21)) )
//从PC机下载Flash键按下
{
delay(50000); //按下50ms表示进入从PC机下载状态
if( ((temp1 >=0x11)&&(temp1<=0x21)) ) //判断是否进入下载状态
{
upordown=1; //从PC机下载文件
prof=1; //flash内容已下载
DownFromPC(); //从PC机中下载Flash数据至DataFlash中
ucD = BIT(2);
uiA = 0x0001;
EEPROM_write(uiA, rxpage);
}
}
else if( ((temp1>=0x21)&&(temp1<=0x37)) )
//下载EEPROM数据
{
delay(50000); //按下50ms表示进入下载状态
if( ((temp1>=0x21)&&(temp1<=0x37)) )
{
if (ucD==0x04)
{
uiA = 0x0001;
EEPROM_read(uiA);
page=EEDR; //重置page页参数
upordown=2;
proe=1;
temp2=proe;
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD |= BIT(1);
uiA = 0x0002;
EEPROM_write(uiA, rxpage);
}
else
{
page=0x00;
upordown=2; //设置工作状态
proe=1; //eeprom内容已下载
temp2=proe; //设置临时参数以备后用
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD = BIT(1);
uiA = 0x0002;
EEPROM_write(uiA, rxpage);
}
}
}
else if( ((temp1 >=0x37)&&(temp1<=0x4d)) )
//下载熔丝位数据
{
delay(50000); //按下50ms表示进入下载状态
if( ((temp1 >=0x37)&&(temp1<=0x4d)) )
{
if (ucD==0x04)
{
uiA = 0x0001;
EEPROM_read(uiA);
page=EEDR; //重置page页参数
upordown=3;
pror=1;
temp3=pror;
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD |= BIT(0);
}
else if (ucD==0x06)
{
uiA = 0x0002;
EEPROM_read(uiA);
page=EEDR; //重置page页参数
upordown=3;
pror=1;
temp3=pror;
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD |= BIT(0);
}
else if (ucD==0x02)
{
uiA = 0x0002;
EEPROM_read(uiA);
page=EEDR; //重置page页参数
upordown=3;
pror=1;
temp3=pror;
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD |= BIT(0);
}
else if (ucD==0x00)
{
page=0x00; //重置page页参数
upordown=3; //下载熔丝位数据
pror=1; //熔丝位内容已下载
temp3=pror; //设置临时参数以备后用
DownFromPC(); //从PC机中下载EEPROM数据至DataFlash中
ucD = BIT(0);
}
}
}
else if( ((temp1>=0x8f)&&(temp1<=0xa5)) )
//下载数据结束
{
delay(50000); //按下50ms表示进入下载状态
if( ((temp1>=0x8f)&&(temp1<=0xa5)) )
{
uiA = 0x0000;
EEPROM_write(uiA, ucD);
state=0;
}
}
}
}
}
else if( ((temp1>=0x4d)&&(temp1<=0x63)) )
//读DataFlash
{
delay(50000); //按下50ms表示进入读取状态
if( ((temp1>=0x4d)&&(temp1<=0x63)) )
{
upordown=4; //读DataFlash
delay1(1);
Read_EEPROM();
delay1(1);
ReadDataFlash(); //读DataFlash中的数据
}
}
else if( ((temp1 >=0x63)&&(temp1<=0x79)) )
//编程键按下
{
delay(50000); //按下50ms表示进入编程状态
if( ((temp1 >=0x63)&&(temp1<=0x79)) )
{
upordown=5; //向目标芯片编程
delay1(1);
Read_EEPROM();
while(Syn==0) //激活SPI编程状态并判断时钟是否同步
{
STA_SCL_LOW; //激活SPI编程状态
STA_RESET_HIG;
_NOP();
_NOP();
_NOP();
STA_RESET_LOW;
delay1(20);
as=0xAC; //判断时钟是否同步
IO_SPI();
as=0x53;
IO_SPI();
as=0x00;
IO_SPI_RESP();
as=0x00;
IO_SPI();
if(cs==0x53){Syn=1;} //反馈正确则标志时钟同步成功
}
if (prof==1)
{
as=0xAC; //擦除整个目标芯片
IO_SPI();
as=0x80;
IO_SPI();
as=0x00;
IO_SPI();
as=0x00;
IO_SPI();
delay1(5);
}
DownToChip(); //对目标芯片编程
/*prof=0;
proe=0;
pror=0;
temp2=0;
temp3=0;
{ReadFromChip();}*/
//while(1);
setzero();
}
}
else if( ((temp1>=0xa5&&temp1<0xbb)) )
//读熔丝位
{
delay(50000); //按下50ms表示进入读取状态
if( ((temp1>=0xa5&&temp1<0xbb)) )
{
while(Syn==0) //激活SPI编程状态并判断时钟是否同步
{
STA_SCL_LOW; //激活SPI编程状态
STA_RESET_HIG;
_NOP();
_NOP();
_NOP();
STA_RESET_LOW;
delay1(20);
as=0xAC; //判断时钟是否同步
IO_SPI();
as=0x53;
IO_SPI();
as=0x00;
IO_SPI_RESP();
as=0x00;
IO_SPI();
if(cs==0x53){Syn=1;} //反馈正确则标志时钟同步成功
}
delay1(1);
Read_ros(); //读熔丝位
}
}
else if( ((temp1>=0xbb&&temp1<0xd1)) )
//写熔丝位
{
delay(50000); //按下50ms表示进入读取状态
if( ((temp1>=0xbb&&temp1<0xd1)) )
{
while(Syn==0) //激活SPI编程状态并判断时钟是否同步
{
STA_SCL_LOW; //激活SPI编程状态
STA_RESET_HIG;
_NOP();
_NOP();
_NOP();
STA_RESET_LOW;
delay1(20);
as=0xAC; //判断时钟是否同步
IO_SPI();
as=0x53;
IO_SPI();
as=0x00;
IO_SPI_RESP();
as=0x00;
IO_SPI();
if(cs==0x53){Syn=1;} //反馈正确则标志时钟同步成功
}
delay1(1);
Write_ros(); //写熔丝位
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -