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

📄 fpga.c

📁 重要代码,FPGA CYCLONE FLASH DRIVER
💻 C
📖 第 1 页 / 共 5 页
字号:
				{
					Add_transparence=0;
                    Add_transparence_valid=0;
				}
				break;
			case 1 :
				if(Add_Bit==1)
				{
					Add_transparence=2;
                    Add_transparence_valid=0;
				}
				else
				{
					Add_transparence=0;
                    Add_transparence_valid=0;
				}
				break;
			case 2:
				if(Add_Bit==1)
				{
					Add_transparence=3;
                    Add_transparence_valid=0;
				}
				else
				{
					Add_transparence=0;
                    Add_transparence_valid=0;
				}
				break;
			case 3:
				if(Add_Bit==1)
				{
					Add_transparence=4;
                    Add_transparence_valid=0;
				}
				else
				{
					Add_transparence=0;
                    Add_transparence_valid=0;
				}
				break;
			case 4:
				if(Add_Bit==1)
				{
					Add_transparence=0;
                    Add_transparence_valid=1;
				}
				else
				{
					Add_transparence=0;
                    Add_transparence_valid=0;
				}
				break;
			}

}


/**************************************************************************

crc-16校验

***************************************************************************/
unsigned short Cal_Crc(unsigned char *ptr,unsigned int len)
{
 unsigned char i;
 unsigned short  crc=0;
 while(len--!=0){
	for(i=0x80;i!=0;i/=2){
		if((crc&0x8000)!=0){
			crc*=2;
			crc^=0x1021;
			               }
		else
		  crc*=2;
	    if((*ptr&i)!=0)
	      crc^=0x1021;
		                }
		ptr++;
	            }
  	return(crc);
}


/*************************************************************************



**************************************************************************/
void Write_Comm_to_Ram()
{
	int i,m;
	unsigned char temp;
	 
mark:          *Now_Tail_High=*Rx_Tail_High[Now_MarkRx_Number];
		       *Now_Tail_Low=*Rx_Tail_Low[Now_MarkRx_Number];
		       if((((*Now_Tail_High)<<8)+(*Now_Tail_Low)+1)>=0x7f1)
	                    {   //当前尾地址超过0X7F1,返回初始地址
	                      Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+0X80);
	                      Now_Head_Add=0x080;
	                    }
	           if((((*Now_Tail_High)<<8)+(*Now_Tail_Low)+1)<=0x80)
	                    {   //当前尾地址超过0X7F1,返回初始地址
	                      Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+0X80);
	                      Now_Head_Add=0x080;
	                    }
               if(First!=0)
	                { 
	                    if((((*Now_Tail_High)<<8)+(*Now_Tail_Low)+1)>=0x7f1)
	                    {   //当前尾地址超过0X7F1,返回初始地址
	                      Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+0X80);
	                      Now_Head_Add=0x080;
	                    }
	                    else
	                    {  //当前地址偏移处于正常范围
	                      Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+((*Now_Tail_High)<<8)+(*Now_Tail_Low)+1);
				          Now_Head_Add=(((unsigned int)(*Now_Tail_High)<<8)+(unsigned int)(*Now_Tail_Low)+1);
				        }
			        }

					Now_Tail_Add=Now_Head_Add-1;

					for(m=0;m<Data_Number-6;m++)
					{
						  if(++Now_Tail_Add>=0x7f1)
						  Now_Tail_Add=0x080;
					}

//	                 Now_Tail_Add=(unsigned char*)(((unsigned int)(*Now_Tail_High)<<8)+(unsigned int)(*Now_Tail_Low)+Now_Data_Length+3);
	                //分别给有效的接收寄存器赋值
		             Rx_Head_High_test=(unsigned char)((unsigned int)(Now_Head_Add)>>8);
                     Rx_Head_Low_test=(unsigned char)((unsigned int)(Now_Head_Add) & 0x00ff);
                     Rx_Tail_High_test=(unsigned char)((unsigned int)(Now_Tail_Add)>>8);
                     Rx_Tail_Low_test=(unsigned char)((unsigned int)(Now_Tail_Add) & 0x00ff);


                     if(Now_Head_Add<0x80 || Now_Tail_Add>0x7f1)
                     {
	                    return;
	                 }

				     *Rx_Head_High[Now_MarkRx_Number]= Rx_Head_High_test;
		             *Rx_Head_Low[Now_MarkRx_Number]=Rx_Head_Low_test;
		             *Rx_Tail_High[Now_MarkRx_Number]=Rx_Tail_High_test;
		             *Rx_Tail_Low[Now_MarkRx_Number]=Rx_Tail_Low_test;


		            //当前数据存储区的首地址,尾地址
		             if(*WriteGate1==0 && *WriteGate2==0)
		             {
		                *WriteGate1=0;     //FPGA修改首尾地址
		                *WriteGate2=1;
		                if(*WriteGate1==0 && *WriteGate2==1)
		                {
			            
		                *Now_Tail_High=*Rx_Tail_High[Now_MarkRx_Number];
		                *Now_Tail_Low=*Rx_Tail_Low[Now_MarkRx_Number];
		                /////////////////////////////////////////////////
		               
		                *WriteGate1=0;
		                *WriteGate2=0;
		                }
		                else
		                {
			               goto mark;
			            }

		             }else
		             {
                        goto mark;
                     }

			        First=1;
			        for(i=4;i<Data_Number-2;i++)
			        {
				        temp=CheckData[i];
				        if(CheckData[4]==0x82){
					             *Now_Ram_Write_Add=temp;
										     }
			         	*Now_Ram_Write_Add=temp;
				        Check_Ram_Write();
			        }

			if(Finished_Receive!=0)
			{
			  *MarkRx[Now_MarkRx_Number]=Finished_Receive;
		      if(++Now_MarkRx_Number==6)
		      {
		         Now_MarkRx_Number=0;
		      }
			  Finished_Receive=0;
	    	}
			else
			  *MarkRx[Now_MarkRx_Number]=0x87;
}

/**************************************************************************

串口1的中断服务函数

****************************************************************************/
void ReceiveISRUart1(int context)
{
	unsigned int sr;
	sr=na_uart1->np_uartstatus;
	if(sr & np_uartstatus_rrdy_mask)
	{
		if(Receive_From!=1)
		  Receive_From=1;
		if(uart_use!=na_uart1)
		  uart_use=na_uart1;
//		na_uart1->np_uartcontrol=0;                          //禁止各种中断
		RxBuf[RxHead]=na_uart1->np_uartrxdata;               //读出接收寄存器的值//
//		na_uart1->np_uarttxdata=RxBuf[RxHead];               //反回串口显示读入的数据
		na_uart1->np_uartstatus=0;                           //清除状态寄存器,从新开始新的发送、接收
//		na_uart1->np_uartcontrol=np_uartcontrol_irrdy_mask;  //使能开接收中断
		if((++RxHead)>(RXBUFSIZE-1))                         //检查环形缓冲区是否满
		  RxHead=0;
    }
}

/***************************************************************************

串口2的中断服务函数

****************************************************************************/
void ReceiveISRUart2(int context)
{
	unsigned int sr;
	sr=na_uart2->np_uartstatus;
	if(sr & np_uartstatus_rrdy_mask)
	{
		if(Receive_From!=2)
		  Receive_From=2;
		if(uart_use!=na_uart2)
		  uart_use=na_uart2;
//		na_uart2->np_uartcontrol=0;                          //禁止各种中断
		RxBuf[RxHead]=na_uart2->np_uartrxdata;               //读出接收寄存器的值
//		na_uart2->np_uarttxdata=RxBuf[RxHead];               //反回串口显示读入的数据
		na_uart2->np_uartstatus=0;                           //清除状态寄存器,从新开始新的发送、接收
//		na_uart2->np_uartcontrol=np_uartcontrol_irrdy_mask;  //使能开接收中断
		if((++RxHead)>(RXBUFSIZE-1))                         //检查环形缓冲区是否满
		  RxHead=0;
    }
}

/******************************************************************************

判断发送标志位,由此决定是返回0,还是1

*******************************************************************************/

int Check_Tx_Mark_Bit()
{
	int i;
	unsigned char* Now_Read_Tail;

	Now_Ram_Read_Add=(unsigned char*)((unsigned int)BASE_ADD+(unsigned
int)((*(Tx_Head_High[Transmit_Number]))<<8)+(unsigned int)(*(Tx_Head_Low[Transmit_Number])));
	if(*Now_Ram_Read_Add==0xFD)
	{
//	  na_uart2->np_uarttxdata=0x55;
	  return 1;
    }
	else
	  if(*Now_Ram_Read_Add==0x94 ||*Now_Ram_Read_Add==0x95 ||*Now_Ram_Read_Add==0x96 ||
	     *Now_Ram_Read_Add==0x98 ||*Now_Ram_Read_Add==0x99 ||*Now_Ram_Read_Add==0xCF ||
	     *Now_Ram_Read_Add==0xc6)
	   {
		i=4;
		Now_Read_Tail=(unsigned char*)((unsigned int)BASE_ADD+(unsigned
int)((*Tx_Tail_High[Transmit_Number])<<8)+(unsigned int)(*Tx_Tail_Low[Transmit_Number]));
		while(Now_Ram_Read_Add<=Now_Read_Tail)
		{
			CheckData[i++]=*Now_Ram_Read_Add;
			Check_Ram_Read();
		}
	    return 3;
	   }
	  else
	    if(*Now_Ram_Read_Add==0xc2)
	       return 4;
	    else
	     if(*Now_Ram_Read_Add==0x86)
	     {
			i=4;
			Now_Read_Tail=(unsigned char*)((unsigned int)BASE_ADD+(unsigned
int)((*Tx_Tail_High[Transmit_Number])<<8)+(unsigned int)(*Tx_Tail_Low[Transmit_Number]));
			while(Now_Ram_Read_Add<=Now_Read_Tail)
			{
				CheckData[i++]=*Now_Ram_Read_Add;
				Check_Ram_Read();
			}
	        return 5;
	     }
	     else
	        return 2;
}

/*******************************************************************************

特征参数的处理

********************************************************************************/
void Handle_Para()
{
	int i;

	Now_Ram_Read_Add=(unsigned char*)((unsigned int)BASE_ADD+(unsigned int)
	((*Tx_Head_High[Transmit_Number])<<8)+(unsigned int)(*Tx_Head_Low[Transmit_Number]));

    for(i=0; i<17; i++)
    {
	  if(i==0)      //新中新增补标志
	   Synjones_flag=*Now_Ram_Read_Add;
	  if(i==1)
	   Synjones_detail=*Now_Ram_Read_Add;
	  if(i==12)     //本机路口编号
	   Parameter[0]=*Now_Ram_Read_Add;
	  if(i==13)
	   Parameter[1]=*Now_Ram_Read_Add;
	  if(i==14)    //对应的主机路口编号
	   Parameter[2]=*Now_Ram_Read_Add;
	  if(i==15)
	   Parameter[3]=*Now_Ram_Read_Add;
	  if(i==16)    //主从机标志,1为主机,0为从机
	   Main_Flag=*Now_Ram_Read_Add;
	  if(i==0)
	   Test_Package_Data[i]=0xf1;
	  else         //特征参数测试包赋值
	   Test_Package_Data[i]=*Now_Ram_Read_Add;
	  Check_Ram_Read();
    }
}

/*******************************************************************************

把方案信息写进ram

********************************************************************************/
void Write_Ram()
{
	int i;
	unsigned char true_number;
	unsigned char* Valid_Address;

	true_number=(CheckData[5]-1)*7+CheckData[6];
	Valid_Address=(true_number-1)*40+(unsigned char*)Conf_Solution_Address_Flash;

	memcpy(&CheckData[5],Valid_Address,40);

	CheckData[4]=0xc6;
	Data_Number=47;
	Finished_Receive=Receive_From;
	Write_Comm_to_Ram();
//	Finished_Receive=1;
}

/*****************************************************************************

往FLASH写流量、故障信息

******************************************************************************/
void Write_Flash_Flow()
{
	int flag;
	int i;
	unsigned short temp=0;
//	unsigned char flow_data[69];
	unsigned short* flow_add_temp;


	volatile unsigned short *fb  = (unsigned short *) na_cfi_flash_0_base;
	#ifdef nasys_main_flash
	  if (-1 == (int)fb)
	    fb = nasys_main_flash;
	#endif

	Now_Flow_Information_Add=(unsigned short*)read_last_flow_add();

	Now_Ram_Read_Add=(unsigned char*)((unsigned int)BASE_ADD+(unsigned int)
	((*Tx_Head_High[Transmit_Number])<<8)+(unsigned int)(*Tx_Head_Low[Transmit_Number]));
    Now_Ram_Read_End_Add=(unsigned char*)((unsigned int)BASE_ADD+(unsigned int)
	((*Tx_Tail_High[Transmit_Number])<<8)+(unsigned int)(*Tx_Tail_Low[Transmit_Number]));
	Check_Ram_Read();

	for(i=0;i<69;i++)
	{
		flow_data[i]=*Now_Ram_Read_Add;
		Check_Ram_Read();
	}
//	for(i=5;i<70;i++)
//	{
//		flow_data[i]=(i-5)%64;
//	}

//	getdataflow();
//	even_flow=read_even_flow();

	write_flow_add();

	flow_add_temp=Now_Flow_Information_Add;

	for(i=0;i<2;i++)
	{
		if((unsigned int)Now_Flow_Information_Add%0x10000==0 && Flash_Bit==0)
		{
			flag=nr_flash_erase_sector((unsigned short*)na_cfi_flash_0_base,(unsigned
short*)Now_Flow_Information_Add);
		}
		if(++Now_Flow_Information_Add==Flow_Information_End)
		  Now_Flow_Information_Add=Flow_Information_Base;
	}

⌨️ 快捷键说明

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