📄 uart-spi-730.c
字号:
}
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();
//prof=1;
while(Syn==0) //激活SPI编程状态并判断时钟是否同步
{
SPCR=0x00;
STA_SCL_LOW; //激活SPI编程状态
STA_RESET_HIG;
_NOP();
_NOP();
_NOP();
STA_RESET_LOW;
SPCR=0x5D;
//delay1(20);
as=0xAC; //判断时钟是否同步
write_SPI(as);
as=0x53;
write_SPI(as);
as=0x00;
cs=read_SPI();
as=0x00;
write_SPI(as);
if(cs==0x53){Syn=1;} //反馈正确则标志时钟同步成功
}
if (prof==1)
{
as=0xAC; //擦除整个目标芯片
write_SPI(as);
as=0x80;
write_SPI(as);
as=0x00;
write_SPI(as);
as=0x00;
write_SPI(as);
delay1(5);
}
cs=0x00;
Syn=0;
/*for (i=0;i<64;i++)
{
as=0x40;
write_SPI(as);
as=tempadh&&0x3F;
write_SPI(as);
as=tempadl;
write_SPI(as);
//as=datacache[z];
as=0x33;
write_SPI(as);
z++;
as=0x48;
write_SPI(as);
as=tempadh&&0x3F;
write_SPI(as);
as=tempadl;
write_SPI(as);
//as=datacache[z];
as=0x33;
write_SPI(as);
z++;
tempadl++;
}
as=0x4C;
write_SPI(as);
as=adh&&0x3F;
write_SPI(as);
as=adl;
write_SPI(as);
as=0x00;
write_SPI(as);
delay1(10);
tempadh=adh;
tempadl=adl;
z=0;
//tempadl=tempadl-0x3F;
ReadFromChip();
tempadl=adl;
if (tempadl==0xFF)
{
tempadh++;
tempadl=0x00;
}
tempadl++;
*/
STA_RESET_HIG;
z=0;
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -