?? fpgadram_new.c
字號:
#include <absacc.h>
#include <reg51.h>
unsigned int xdata start_addr;
unsigned int xdata end_addr;
unsigned int xdata address;
unsigned int xdata data_address=0xa080; //雙口RAM數據存放地址計數器
unsigned int re_flagaddr;
unsigned int tr_flagaddr=0xa030;
unsigned int tr_startaddr; //發送數據開始地址
unsigned int tr_endaddr; //
unsigned int detail_answer(/*unsigned char *ptr,*/unsigned int len,unsigned char detail)
{
unsigned char i;
data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1; //當前數據區的尾地址,可以使用的首地址,偏移量
address=data_address;
data_address=data_address+len; //應答數據長度1字節
if(data_address>0x7f0)data_address=data_address-0x7F0+0x80; //偏移地址
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1; //CPU程序可以應用的首地址,偏移地址
address=data_address; //首地址偏移量
data_address=data_address+len; //應答數據長度1字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //尾地址偏移量
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
tr_flagaddr=0xa030;
for(i=0;i<6;i++){
tr_flagaddr=tr_flagaddr+i*5;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1 ;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000; //發送應答數據 絕對地址
XBYTE[address]=detail;
XBYTE[tr_flagaddr]=0x01;
return 1;
}
unsigned char answer_fpga(unsigned char flag)
{
unsigned char i;
//相應的接收標志寫成0x87
XBYTE[re_flagaddr]=0x87;
for(i=0;i<6;i++){
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1;
switch(flag){ //FPG對CPU進行設置
case 0x92:break;
case 0x93:detail_answer(1,0xd3);break;
case 0x94:detail_answer(1,0xd4);break;
case 0x95:detail_answer(1,0xd5);break;
case 0x96:detail_answer(1,0xd6);break;
case 0x97:detail_answer(1,0xd7);break;
case 0x98:detail_answer(1,0xd8);break;
case 0x99:detail_answer(1,0xd9);break;
case 0x9a:detail_answer(1,0xda);break;
case 0x9c:detail_answer(1,0xdc);break;
case 0x9d:break;
case 0x9e:break;
case 0x9f:break;
default:break;
}
return 1;
}
unsigned char fpga_dram_data(unsigned char flag)
{
unsigned int i,j;
unsigned char a;
switch(flag){
case 0x92:break;
case 0x93://設置時間 數據由雙口RAM讀到VNRAM中
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC009]=a; //year
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0XC008]=XBYTE[address]; //month
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC007]=a; //date
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC004]=a; //hour
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC002]=a; //min
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC000]=a; //sec
address++;
if(address>0xa7f0)address=0xa080;
a=XBYTE[address];
XBYTE[0XC006]=XBYTE[address]; //day
data_address=address; //實際地址
//應答
answer_fpga(0x93);
break;
case 0x94:address++;
if(address>0xa7f0)address=0xa080;
if(XBYTE[address]==0){
for(i=0;i<289;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X5000+i]=XBYTE[address];
}
}else{
for(i=0;i<289;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X5121+i]=XBYTE[address];
}
}
answer_fpga(0x94);
break;
case 0x95:address++;
if(address>0xa7f0)address=0xa080;
j=(XBYTE[address]-1)*98; //階段表
for(i=0;i<98;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X5242+i+j]=XBYTE[address];
}
answer_fpga(0x95);
break;
case 0x96:address++;
if(address>0xa7f0)address=0xa080;
j=(XBYTE[address]-1)*41; //方案
for(i=0;i<41;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X5e82+i+j]=XBYTE[address];
}
answer_fpga(0x96);
break;
case 0x97:
break;
case 0x98:address++;
if(address>0xa7f0)address=0xa080;
j=(XBYTE[address]-1)*74; // 計劃
for(i=0;i<74;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X63a2+i+j]=XBYTE[address]; }
answer_fpga(0x98);
break;
case 0x99:address++;
if(address>0xa7f0)address=0xa080;
for(i=0;i<60;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X6ce2+i]=XBYTE[address];
}
answer_fpga(0x99);
break;
case 0x9a:break;
case 0x9b:break;
case 0x9c:break;
case 0x9d:break;
case 0xc6:j=/*(XBYTE[address+1]-1)*/31*41; //方案 接受降級方案 寫到方案32指定的空間
for(i=0;i<40;i++){
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[0X5e82+i+j]=XBYTE[address];
}
answer_fpga(0x96);
break;
case 0x82:XBYTE[re_flagaddr]=0x87;
data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1; //首地址偏移量
address=data_address; //首地址偏移量
data_address=data_address+14; //應答數據長度14字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1; //首地址偏移量
address=data_address; //首地址偏移量
data_address=data_address+14; //應答數據長度14字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //尾地址偏移量
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
tr_flagaddr=0xa030;
for(i=0;i<6;i++){
tr_flagaddr=tr_flagaddr+i*5;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1 ;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000;
XBYTE[address]=0xc2;address++; //發送應答數據
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x10;address++; //最大輸出通道數
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x20;address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x20;address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x20;address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x20;address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0x18;address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X72E2];address++; //開機時間小時
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X72E3];address++; //開機時間分鐘
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X72E4];address++; //關機時間小時
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X72E5];address++; //關機時間分鐘
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X72E6];address++; //關機后狀態
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X8000];address++; //路口編號高位地址
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0X8001]; //路口編號地位地址
XBYTE[tr_flagaddr]=0x01;
XBYTE[tr_flagaddr]=0x01;
break;
case 0x83:XBYTE[re_flagaddr]=0x87;
data_address=XBYTE[0XA021]<<8+XBYTE[0XA022]+1; //首地址偏移量
address=data_address; //首地址偏移量
data_address=data_address+7; //應答數據長度7字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){}; //等待FGPA修改頭尾
XBYTE[0xa023]=0x01; //CPU修改頭尾
XBYTE[0xa024]=0X00;
data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
address=data_address;
data_address=data_address+7; //應答數據長度7字節
if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
data_address--;
XBYTE[0XA021]=data_address>>8; //
XBYTE[0XA022]=data_address;
XBYTE[0XA023]=0X00; //CPU修改頭尾結束
XBYTE[0XA024]=0X00;
tr_flagaddr=0xa030;
for(i=0;i<6;i++){
tr_flagaddr=tr_flagaddr+i*5;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1 ;
XBYTE[tr_flagaddr+1]=address>>8; //發送數據的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發送數據的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000;
XBYTE[address]=0xc3;address++;
if(address>0xa7f0)address=0xa080; //發送應答數據
XBYTE[address]=XBYTE[0XC009];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC008];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC007];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC004];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC002];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC000];address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=XBYTE[0XC006];
XBYTE[tr_flagaddr]=0x01;
break;
case 0x84:answer_fpga(0x84);break;
case 0x85:answer_fpga(0x85);break;
case 0x86:answer_fpga(0x86);break;
case 0x87:answer_fpga(0x87);break;
case 0x88:answer_fpga(0x88);break;
case 0x89:answer_fpga(0x89);break;
case 0x8a:answer_fpga(0x8a);break;
case 0x8b:answer_fpga(0x8b);break;
case 0x8c:answer_fpga(0x8c);break;
case 0x8d:answer_fpga(0x8d);break;
case 0x8e:answer_fpga(0x8e);break;
default:break;
}
return 1;
}
//address代表標志地址 address+1
deal_fpgadram()
{
unsigned char i;
unsigned char flag;
unsigned char xdata flagg;
for(i=0;i<6;i++){
re_flagaddr=0XA050+i*5;
flag=XBYTE[re_flagaddr];
if(flag>0&&flag<5){
start_addr=XBYTE[re_flagaddr+1]; //偏移地址
start_addr=(start_addr<<8);
start_addr=start_addr+XBYTE[re_flagaddr+2];
// start_addr=start_addr+0xa000;
// start_addr=(XBYTE[re_flagaddr+1]<<8)+XBYTE[re_flagaddr+2];
//開始地址
// end_addr =(XBYTE[re_flagaddr+3]<<8)+XBYTE[re_flagaddr+4]; //結束地址
end_addr=XBYTE[re_flagaddr+3];
end_addr=end_addr<<8;
end_addr=end_addr+ XBYTE[re_flagaddr+4];
// end_addr=end_addr+0xa000;
address=start_addr+0xa000; //實際開始地址
data_address=start_addr; //偏移開始地址
flagg=XBYTE[start_addr+0xa000];
fpga_dram_data(flagg); //接收fpga送來的數據
return ;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -