⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpga.c

📁 重要代码,FPGA CYCLONE FLASH DRIVER
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <excalibur.h>
#include <math.h>
#include "flash.c"

//定义接收缓冲区的大小
#define RXBUFSIZE    512

//基地址量
#define BASE_ADD     0x800
#define FLASH_BASE_ADD  0X200000
#define FLASH_BASE_ADD_bake 0x3f0000

#define TIME         50000000          //50000000  50M对应1秒

//赋值临时变量
unsigned char jj;

//接收缓冲区
unsigned char RxBuf[RXBUFSIZE];
int RxHead=0;
int RxTail=0;

//第一次使用双口ram的标志
int First=0;

//重新启动的次数
unsigned int* ResetNumber;

//路口编号,主机路口编号,主从标志
unsigned char Parameter[5]={0,0,0,0,0};    

//0x23 0x24地址
unsigned char* WriteGate1;
unsigned char* WriteGate2;

//透明性标志量
int RevStatus=0;
int BeginBitContent=0;

//临时更新标志
unsigned char f_temp=0,f_tem=0;;

//接收标志寄存器
unsigned int Now_MarkRx_Number=0;

//crc校验后的结果
int Data_Number=0;
unsigned short CheckByte_Write;
unsigned char CheckByte_Read;

//经过透明性检测后的原始数据
unsigned char CheckData[300];
unsigned char Test_Package_Data[14];

//尾地址寄存器
unsigned char* Now_Tail_High;
unsigned char* Now_Tail_Low;

//临时使用的双口ram的数据
unsigned int  Now_Tail_Add;
unsigned int  Now_Head_Add;
unsigned char* Now_Ram_Write_Add;
unsigned char* Now_Ram_Read_Add;
unsigned char* Now_Ram_Read_End_Add;

//接收地址寄存器
unsigned char* Rx_Head_High[6];
unsigned char* Rx_Head_Low[6];
unsigned char* Rx_Tail_High[6];
unsigned char* Rx_Tail_Low[6];
unsigned char* Tx_Head_High[6];
unsigned char* Tx_Head_Low[6];
unsigned char* Tx_Tail_High[6];
unsigned char* Tx_Tail_Low[6];

//接收地址间接赋值变量
unsigned char Rx_Head_High_test;
unsigned char Rx_Head_Low_test;
unsigned char Rx_Tail_High_test;
unsigned char Rx_Tail_Low_test;
unsigned char Now_Tail_High_test;
unsigned char Now_Tail_Low_test;

//发送标志寄存器
unsigned char* MarkTx[6];
//接收标志寄存器
unsigned char* MarkRx[6];

//flash基地址变量
unsigned short* Conf_Phase1_Address_Flash;
unsigned short* Conf_Phase2_Address_Flash;
unsigned short* Conf_Stage_Address_Flash;
unsigned short* Conf_Controlstage_Address_Flash;
unsigned short* Conf_Daydesign_Address_Flash;
unsigned short* Conf_Daydesigntable_Address_Flash;
unsigned short* Conf_YaoKong_Address_Flash;
unsigned short* Conf_CurNumber_Address_Flash;
unsigned short* Conf_Solution_Address_Flash;

//flash各区域对应的缓冲区地址
unsigned char  Conf_Phase1_Address_Buffer[288];
unsigned char  Conf_Phase2_Address_Buffer[288];
unsigned char  Conf_Stage_Address_Buffer[98];
unsigned char  Conf_Controlstage_Address_Buffer[41];
unsigned char  Conf_Daydesign_Address_Buffer[74];
unsigned char  Conf_Daydesigntable_Address_Buffer[60];
unsigned char  Conf_YaoKong_Address_Buffer[8];
unsigned char  Conf_CurNumber_Address_Buffer[32];
unsigned char  Conf_Solution_Address_Buffer[40];

//flash个区域对应的备份基地址
unsigned short* Conf_Phase1_Address_Backup;
unsigned short* Conf_Phase2_Address_Backup;
unsigned short* Conf_Stage_Address_Backup;
unsigned short* Conf_Controlstage_Address_Backup;
unsigned short* Conf_Daydesign_Address_Backup;
unsigned short* Conf_Daydesigntable_Address_Backup;
unsigned short* Conf_YaoKong_Address_Backup;
unsigned short* Conf_CurNumber_Address_Backup;
unsigned short* Conf_Solution_Address_Backup;

//flash中的流量存储变量地址
unsigned short* Flow_Information_Base;
unsigned short* Flow_Information_End;
unsigned short* Now_Flow_Information_Add;
//unsigned short* Flow_Information_Backup_Base;
//unsigned short* Now_Flow_Information_Backup_Add;

//flash头地址、尾地址
unsigned char* Now_Read_Add;
unsigned char* Now_Read_End;

//两个地址之间的字节数的计算函数
int length(unsigned char* begin,unsigned char* end);
unsigned char WrRamTimePhase;

//接收标志量
unsigned char Receive_From=0;
unsigned char Finished_Receive=0;

//透明性检测的标志
volatile unsigned char Transmit_Number;
int transparence;
int transparence_valid;
unsigned char Valid_Data;
unsigned char Valid_Data_Number;
unsigned char Test_Bit;
int Direct_Now_Data_Length;
unsigned short Check_Temp;
unsigned char Add_Bit;
int Add_transparence;
int Add_transparence_valid;
unsigned char Flash_Bit;

//串口标志
np_uart* uart_use;

//经过串口发送的函数
void TransmitComm(np_uart* uartbase);
void Transmit485();
void TransmitEnternet();
int  ReceiveComm();
int  Receive485();
int  ReceiveEnternet();

//经过串口发送的数据包
void TransmitTestPackage(np_uart* uartbase);
void Transmit_Mistake_Package(np_uart* uartbase,unsigned char mistake_mark);
void Transmit_Answer_Package(np_uart* uartbase,unsigned char answer_mark);
void Transmit_Query_Package(np_uart* uartbase,unsigned char query_mark);
void Transmit_Flow_Package(np_uart* uartbase);

//针对标志进行对各个包处理的函数
int Check_Tx_Mark_Bit();
void Write_Flash();
void Write_Comm(np_uart* uartbase);
void Write_Ram();
void Write_Flash_Flow();
void Handle_Para();
void SelfAlgorith();


//透明性检测的函数
void Check_Transparence();
void Check_Frame();
//crc校验的函数
unsigned short Cal_Crc(unsigned char *ptr, unsigned int len);
void Write_Comm_to_Ram();           //写双口RAM
void Add_transparences();

//串口接收函数
void ReceiveISRUart1(int context);
void ReceiveISRUart2(int context);
void myisr(int context);
void myisr2(int context);
int leddata=0x8;
int leddd=0x0000;
int ledd[4]={0x0008,0x0004,0x0002,0x0001};//0:面板灯4  1:面板灯3  2:面板灯2  1:面板灯4
volatile int nnn=0;
volatile int mmm=0;
volatile int ddd=0;

//流量数据包
unsigned char flow_data[69];


volatile int T_number=0;

void Transmit();

//测试包函数  每15秒发送一次数据包,测试
void myisr(int contextin)
{

//	na_timer_dram->np_timercontrol = 0;
    leddd=(leddd&0x000e)|ledd[3];
	na_led_pio->np_piodata=leddd;
	ledd[3]=(~ledd[3])&0x0001;	
	nnn++;
	ddd++;
	if(nnn==15)
	{
    	TransmitTestPackage(uart_use);
		nnn=0;
	}
	if(ddd==5)
	{
    ddd=0;
	Data_Number=7;
	CheckData[0]=0x00;
	CheckData[1]=0x00;
	CheckData[2]=0x00;
	CheckData[3]=0x00;
	CheckData[4]=0x82;
	CheckData[5]=0x00;
	CheckData[6]=0x00;	
	Finished_Receive=1;
//    Finished_Receive=Receive_From;
	Write_Comm_to_Ram();
		
	}
	na_timer1->np_timerstatus=0;

//	na_timer_dram->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;

}

void myisr2(int contextin)
{

	leddd=(leddd&0x000d)|ledd[2];
	na_led_pio->np_piodata=leddd;
	ledd[2]=(~ledd[2])&0x0002;
	//	na_uart1->np_uarttxdata=0xff;
	//Transmit();
	na_timer_dram->np_timerstatus=0;

//	na_timer1->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;

}

//双口ram读写越界检测函数
void Check_Ram_Write();
void Check_Ram_Read();

//延迟函数
void delay(int number);

//自适应算法使用的变量
unsigned short* Flash_Add_Sh;
unsigned char Phase_Number;
unsigned char Time_Phase;
unsigned char Green_Phase[17];

//方案缓冲区
unsigned char Flash__Scheme_First[24];
unsigned short aaa,bbb;

//流量标志变量
unsigned char flow_data_last=0;
unsigned short even_flow=0;
int flow=0;

//读写流量函数
unsigned long read_flow_add();
unsigned long read_flow_add_bake();
unsigned long read_last_flow_add();
void write_flow_add();
void copy_flow_add();
void Accept_Far_Info();  //接受主机发送来的控制信息
unsigned short read_even_flow();
unsigned char read_flow_data_last();


//用于测试的变量函数
unsigned long mytemp;
unsigned long mytempbake;
unsigned short Flash_Mark_Address;
unsigned char* oonchipdata;
void getdataflow();

int now_flow_add=0;
unsigned long valid_flow_add;
//新增加的新中新标志
unsigned char Synjones_flag;
unsigned char Synjones_detail;
unsigned char Main_Flag;

int main()
{
	int count=0;
	unsigned char* p_Rx;
	unsigned char* p_Tx;
	int context1=0;
	int context2=0;
	int context3=0;
	int lednumber=0;
	int i=0;
	int j=0;
	int k=0;
	int m=0;
	int n=0;
	int u;
	int y;
	int flag;
	int num;
	int mark=0;
	int data_82=0;

	unsigned short* data1;
	unsigned short* data2;


	//初始化接收缓冲区
	for(y=4;y<300;y++)
	{
		CheckData[y]=0;
	}

	//初始化定时器    定时器间隔  1秒
	na_timer1->np_timerperiodl=(short)((TIME) & 0X0000FFFF);
	na_timer1->np_timerperiodh=(short)(((TIME)>>16) & 0X0000FFFF);
	nr_installuserisr(na_timer1_irq,myisr,context2);
	na_timer1->np_timerstatus=0;
	na_timer1->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;


	//初始化定时器2   定时器2间隔  5秒
	na_timer_dram->np_timerperiodl=(short)(TIME*5 & 0X0000FFFF);
	na_timer_dram->np_timerperiodh=(short)((TIME*5>>16) & 0X0000FFFF);
	nr_installuserisr(na_timer_dram_irq,myisr2,context3);
	na_timer_dram->np_timerstatus=0;
	na_timer_dram->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;


	//初始化接收标志
	Receive_From=0;
	Finished_Receive=0;
	//初始化crc校验变量
	CheckByte_Write=0;
	CheckByte_Read=0;

	//初始化0x23 0x24指针
	WriteGate1=(unsigned char*)(BASE_ADD+0x23);
	WriteGate2=(unsigned char*)(BASE_ADD+0x24);

	//初始化0x23 0x24寄存器
	*WriteGate1=0;
	*WriteGate2=0;

	//用于测试
here:    if((*WriteGate1!=0) && (*WriteGate2!=0))
    {
	   nr_uart_txstring("0x23 0x24 is wrong!555555");
    	*WriteGate1=0;
    	*WriteGate2=0;
        goto here;
    }

	//初始化尾地址指针
	Now_Tail_High=(unsigned char*)(BASE_ADD+0x21);
	Now_Tail_Low =(unsigned char*)(BASE_ADD+0x22);

	//初始化尾地址寄存器
	*Now_Tail_High=(unsigned char)(0x80>>8 & 0x00ff);
	*Now_Tail_Low =(unsigned char)(0x80 & 0x00ff);

	//赋值测试
	Now_Tail_High_test=*Now_Tail_High;
	Now_Tail_Low_test=*Now_Tail_Low;

	//初始化双口ram读写变量
	Now_Head_Add=((unsigned int)(*Now_Tail_High)<<8)+(unsigned int)(*Now_Tail_Low);
	Now_Tail_Add=Now_Head_Add;
	Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+0x80);
	Now_Ram_Read_Add=(unsigned char*)(BASE_ADD+0x80);
	Now_Ram_Read_End_Add=(unsigned char*)(BASE_ADD+0x80);


    //初始化关于FLASH的三个地址
    Conf_Phase1_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x00);
    Conf_Phase2_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x120);
    Conf_Stage_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x242);
    Conf_Controlstage_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0xe82);
    Conf_Daydesign_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x13a2);
    Conf_Daydesigntable_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1ce2);
    Conf_YaoKong_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0X1D20);
    Conf_CurNumber_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1d28);
    Conf_Solution_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1d48);

    //初始化关于flash的三个备份地址
    Conf_Phase1_Address_Backup=(unsigned short*)(FLASH_BASE_ADD_bake+0x00);
    Conf_Phase2_Address_Backup=(unsigned short*)(FLASH_BASE_ADD_bake+0x120);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -