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

📄 lcodu_msg_bak1224.c

📁 是关于arm7的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
      ltob.ch[3]=infor_msg[5]; ltob.ch[2]=infor_msg[6];
      ltob.ch[1]=infor_msg[7]; ltob.ch[0]=infor_msg[8];
      if(ltob.ul!=(unsigned int)v_tx_f_lo) ack=1;
      v_tx_f_lo=ltob.ul;
      Set_TX_RX_RF(TX_RF,(v_tx_f_lo/1000));
      v_tx_frequency=v_tx_f_lo*v_c_m_tx+v_c_tx_if;
      
      if(ack==1) ack=at91f_flash_write(EADDR_F_TX,4,(unsigned char *)ltob.ch);
      if(ack!=0) { v_odu_alarm[1]|=ALARM_EEPROM; alarm_flag=1;}
      else v_odu_alarm[1]&=NORMAL_EEPROM;
      break;
   case 0x5b:
      ltob.ch[3]=infor_msg[5]; ltob.ch[2]=infor_msg[6];
      ltob.ch[1]=infor_msg[7]; ltob.ch[0]=infor_msg[8];
      if(ltob.ul!=(unsigned int)v_rx_f_lo) ack=1;
      v_rx_f_lo=ltob.ul;
      Set_TX_RX_RF(RX_RF,(v_rx_f_lo/1000));
      v_rx_frequency=v_rx_f_lo*v_c_m_rx+v_c_rx_if;
      
      if(ack==1) ack=at91f_flash_write(EADDR_F_RX,4,(unsigned char *)ltob.ch);
      if(ack!=0) { v_odu_alarm[1]|=ALARM_EEPROM; alarm_flag=1;}
      else v_odu_alarm[1]&=NORMAL_EEPROM;
      break;
   case 0x66:
     diplexer_suffix=infor_msg[5];
     break;
   default:
     ack=1;
     break;
   }
   if(ack==0) ACK_MSG_HEAD(0x04,subject,0x00)
   else ACK_MSG_HEAD(0x00,subject,0x00)
   
   load_msg(tx_buf,5);
}



void get_cmd_pro(unsigned char subject,unsigned char component)
{
  unsigned char len,ack;
  unsigned char i;
  
  if(( component & 0x04 )==0x04 ) 
  {  
     ack=0;
     len=pack_config_infor(subject);
     if(len==0)
     {
       switch(subject)
       {
       case 0x40:
         ODU_MSG_INT_DATA(adc_det_in)
         break;
       case 0x41:
         ODU_MSG_INT_DATA(adc_det_out)
         break;
       case 0x42:
         ODU_MSG_INT_DATA(v_rssi)
         break;
       case 0x43:
         ODU_MSG_INT_DATA(adc_rssi)
         break;
       case 0x44:
         ODU_MSG_INT_DATA(v_dac_spi)
         break;
       case 0x55:
         ODU_MSG_INT_DATA(v_att0)
         break;
       case 0x56:
         ODU_MSG_INT_DATA(v_att1)
         break;
       case 0x59:
         ODU_MSG_INT_DATA(v_tx_f_lo)
         break;
       case 0x5b:
         ODU_MSG_INT_DATA(v_rx_f_lo)
         break;
       case 0x66:
         tx_buf[5]=diplexer_suffix;
         ack=1;
         break;
       default:
         break;
       }
       len=ack;
     }
     if(len>0)
     {
       ACK_MSG_HEAD(0x04,subject,len);
     }
     else
       ACK_MSG_HEAD(0x00,subject,len);
     
     len+=5;
     load_msg(tx_buf,len);
  }
}

void read_memory_pro(unsigned int addr,unsigned int bytes,unsigned char component)
{
   unsigned char buf[50];
   unsigned int i;
   if(bytes>50)  return;
     
     component<<=3;
     at91f_flash_read(addr,bytes,buf);
     ACK_MSG_HEAD(component,0x00,bytes);
     for(i=0;i<bytes;i++)
       tx_buf[i+5]=buf[i];
     i+=5;
    load_msg(tx_buf,i);
   
}

unsigned int cmd_handle()
{
    unsigned char cmdid,component,subject;
    unsigned int i,j,address;
    unsigned char buf[60];

    int k;
    cmdid=infor_msg[1];
    component=infor_msg[2];
    subject=infor_msg[3];
    
    if(cmdid==0x01)
      set_cmd_pro(subject,component);
    else if(cmdid==0x02)
      get_cmd_pro(subject,component);
    else if(cmdid==0x07)//----------------------read memory
    { component>>=3;
      component&=0x03;
      i=(infor_msg[5]<<8)+infor_msg[6];
      if(component==2)   
      {
        address=i+BASE2;
      }
      else if(component==3)
        address=i+BASE3;
      else return 0;
      
      j=infor_msg[7];
      read_memory_pro(address,j,component);
    }
    else if(cmdid==0x08)//--------------------write memory
    {
      component>>=3;
      component&=0x03;
      i=(infor_msg[5]<<8)+infor_msg[6];
      j=infor_msg[4]-2;
      if(component==2)
      {
        address=i+BASE2;
        for(i=0;i<j;i++) buf[i]=infor_msg[i+7];
        
        k=at91f_flash_write(address,j,buf);
        if(k==false) { v_odu_alarm[1]|=ALARM_EEPROM; alarm_flag=1;}
        else v_odu_alarm[1]&=NORMAL_EEPROM;
      }
      
      else return 0;
      
      //write_memory_pro();
    }
    else return 0;
    return 1;
}

unsigned int unpack();
/*从PDA提取信息帧*/
unsigned char recv_msg(void)
{ 
  unsigned char ch,flag;
  flag=0;
  //read_char_USART0(); /*for debuging^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^for debug*/

  unsigned int recv_point,read_point;//接受数据DMA指针
 
 if(us_port==0)
 { recv_point=MAX_RECV_BUF-u_pUSART0->US_RCR;
   read_point=rx_rd_pt;
 }
 else 
 {
   recv_point=MAX_RECV_BUF-u_pUSART1->US_RCR;
   read_point=rx1_rd_pt;
 }
 
 
  if(recv_point==read_point) return flag;
  
  else 
  { 
     while (recv_point!=read_point)
     {
    
         if(us_port==0)
         {  ch=us0_recv_dma[rx_rd_pt++];
     	    if(rx_rd_pt==MAX_RECV_BUF)  rx_rd_pt=0;
     	    read_point=rx_rd_pt;
         }
  	 else
  	{
  	    ch=us1_recv_dma[rx1_rd_pt++];
  	    if(rx1_rd_pt==MAX_RECV_BUF)  rx1_rd_pt=0;
  	    read_point=rx1_rd_pt;
  	}
     
      
      if(ch==DELIMITER) 
      {
        if(hd_flag==0) 
        { rx_index=0;
          rx_len=0;
          hd_flag++;
          rx_buf[rx_index++]=ch;
  
        }
        else if(hd_flag==1)
       { 
          hd_flag++;
          rx_buf[rx_index++]=ch;
          rx_index1=rx_index;
          rx_flag=1;
          
          rx_len=rx_index;
          if(rx_len>4) 
          {
            flag=1;
            break;
          }//收到有效帧,解帧
          else 
          { hd_flag=1;            //若收到非法帧,则将刚收到的0x7e作为起始字符。
            rx_len=0;
            //v_counter++;     //通信错误计数器加1
            rx_buf[0]=DELIMITER;
         
            rx_index=1;
            break;//wp changes 1/11/2007
          }
          
       }
       else 
         hd_flag=0;
      }
      else if(hd_flag==1)
      {  
         //rx_buf1[rx_index1++]=ch; /*for back*/
      
         rx_buf[rx_index++]=ch;
      }
      //else rx_buf[rx_index++]=ch;
      if(rx_index>255) 
      {
        rx_index1=rx_index;
        rx_flag=1;
        return flag;
      }
    }
  }
  //if(flag==1) unpack();
  return flag;
}

/*将从PDA中取到的信息帧去掉头、尾,将特殊字符还原*/
unsigned int unpack()  //解包程序
{
   //unsigned char *ch;
   unsigned int i,j;
   j=0;
   
   //while(rx_buf[i]!=0x7e)
   for(i=0;i<rx_len-2-j;i++)
   { 
      infor_msg[i]=rx_buf[i+j+1];
      if(infor_msg[i]==ESCAPE)
      {
        j++;
        infor_msg[i]=rx_buf[i+j+1];
        
      }
      
      if(i>255) return 0;
   }
   return i;
}

/*将应用层信息计算校验和,对0x7e、0x7d进行转义处理,产生需要传输的帧*/
unsigned int load_msg(unsigned char *msg,unsigned int len)  //data link layer
{
   unsigned int snum,j;
   unsigned char checksum;
   unsigned char datalink_buf[256];
   checksum=crc_fun(msg,len);
   datalink_buf[0]=DELIMITER;
   j=0;
   msg[len++]=checksum&0x00ff;

   for(snum=0;snum<len;snum++)
   { 
     datalink_buf[snum+j+1]=msg[snum];
     if(msg[snum]==DELIMITER)
     {
       datalink_buf[snum+j+1]=ESCAPE;
       j++;
       datalink_buf[snum+j+1]=DELIMITER;
     }
     else if(msg[snum]==ESCAPE)
     {
       datalink_buf[snum+j+1]=ESCAPE;
       j++;
       datalink_buf[snum+j+1]=ESCAPE;
     }
   }
   snum=snum+j+1;              
   datalink_buf[snum++]=DELIMITER;
   //write_frame_USART0(datalink_buf,snum);
   send_msg(datalink_buf,snum);
   
  //printf("\n");
   return (snum);
}

void send_msg(unsigned char *chbuf,unsigned int snum)
{ unsigned int j;

  AT91F_disable_interrupt();
   
  /*将发送信息帧写入PDA*/
   for(j=0;j<snum;j++)
  {  //if(us_port==0)
     {
         us0_send_dma[tx_wr_pt++]=chbuf[j];
         if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
      }
     //else
     {    us1_send_dma[tx1_wr_pt++]=chbuf[j];
         if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
     }
  }
  AT91F_enable_interrupt();
}

void rx_tx_display()
{
int j;
if(rx_flag){
    rx_flag=0;
   for(j=0;j<rx_index1;j++)
   {  if(us_port==0)
     {
         us1_send_dma[tx1_wr_pt++]=rx_buf[j];
         if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
      }
     else
     {    us0_send_dma[tx_wr_pt++]=rx_buf[j];
         if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
     }
   }
   rx_index1=0;
  }

}

void odu_to_idu_com()
{ unsigned int i;
  if(recv_msg()==1) 
  { 
    rx_tx_display();
    i=unpack();
     
     if(i>0)
     {
       if(check_crc(i))
         cmd_handle();  
         //msg_handle(i-2);
     }
  }
  
   rx_tx_display();
  
   send_msg_USART0();
  
   send_msg_USART1();
}

⌨️ 快捷键说明

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