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

📄 lcodu_msg.c

📁 是关于arm7的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#endif
#if(0)
             case 0xC0:
                //TxIF 	 Calibrate

                break;
              case 0xC1:
                //TxRF	 Calibrate
         
                break;
              case 0xC2:
                //RxIF	 Calibrate
              
                break;
#endif
              case 0xC3:
                //RSL	 Calibrate
                stempi=(signed int)v_e_rssi_deltar;
                ODU_MSG_INT_DATA(stempi);
                break;
              case 0xC4:
                //ODU options
                report_odu_options();
                ACK_MSG_HEAD(0x04,subject,0);
                load_msg(tx_buf,5);
                return;
       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);
  }
}

/*处理读flash命令*/
//*-----------------------------------------------------------------------------
//* Function Name       : read_memory_pro
//* Object              : handle the read memory command,and give the response
//* autor               : wang ping  
//* Input Parameters    : addr:the beginning address of the content to read in 
//*                       AT91C_IFLASH.
//*                       bytes:the number of bytes to read.
//*                       component:the component ID in commands field
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
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;
     component+=0x04;
     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);
   
}

/*命令应答处理*/
//*-----------------------------------------------------------------------------
//* Function Name       : cmd_handle
//* Object              : the entrance of the command handling process.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
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];
      if(j>50) return 0;
      read_memory_pro(address,j,component);
    }
    else if(cmdid==0x08)//--------------------write memory
    {
      component>>=3;
      component&=0x03;
      i=(infor_msg[5]<<8)+infor_msg[6];
      if(infor_msg[4]<2) return 0;
      j=infor_msg[4]-2;
      if(j>50) return 0;
      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;
      
      ACK_MSG_HEAD(0x14,0x00,0x00);
      load_msg(tx_buf,5);
      //write_memory_pro();
    }
    else return 0;
    return 1;
}

unsigned int unpack();
/*从PDA提取信息帧*/

//*-----------------------------------------------------------------------------
//* Function Name       : recv_msg
//* Object              : Get a frame from the selected receiving DMA buffer.
//*                       revert the escape bytes,and save the frame in tx_buf[]
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : flag=0:Did not receive a frame.flag=1:received a frame
//*-----------------------------------------------------------------------------
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(escape_flag==1)
        {
            rx_buf[rx_index++]=ch;
            escape_flag=0;
        }
        else
        {
            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)
             {  
              if(ch==ESCAPE) escape_flag=1;
              else
                  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中取到的信息帧去掉头、尾*/
//*-----------------------------------------------------------------------------
//* Function Name       : unpack
//* Object              : take out the two dilimiters from tx_buf[] and then save 
//*                       the information in infor_msg[].
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : i:the length of the information in infor_msg[]
//*-----------------------------------------------------------------------------
unsigned int unpack()  //解包程序
{
   //unsigned char *ch;
   unsigned int i;
   
   for(i=0;i<rx_len-2;i++)
   { 
      infor_msg[i]=rx_buf[i+1];
     
      if(i>255) return 0;
   }
   return i;
}

/*将应用层信息计算校验和,对0xf5、0xf6进行转义处理,产生需要传输的帧*/
//*-----------------------------------------------------------------------------
//* Function Name       : load_msg
//* Object              : add the two dilimiters to the message and calculate the
//*                       checksum,handle the especial bytes,then load the new
//*                       frame to the DMA Tx buffer of both the USART ports.
//* autor               : wang ping  
//* Input Parameters    : msg:the information to be loaded;len:the number of bytes
//* Output Parameters   : snum:the length of the frame loaded in DMA tx buffer
//*-----------------------------------------------------------------------------
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;

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

#if(0)
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();
}
#endif

//*-----------------------------------------------------------------------------
//* Function Name       : load_msg
//* Object              : loading the receiver buffer to the other USART TX DMA
//*                       buffer.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
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;
  }

}


//*-----------------------------------------------------------------------------
//* Function Name       : odu_to_idu_com
//* Object              : the entrance of the communication process.
//* autor               : wang ping  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void odu_to_idu_com()
{ unsigned int i;
  if(recv_msg()==1) 
  { 
    rx_tx_display();
    i=unpack();
     
     if(i>0)
     {
       if(check_crc(i))
         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 + -