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

📄 lcodu_msg_bak1224.c

📁 是关于arm7的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//usart.c  for lc ODU
//*----------------------------------------------------------------------------
//* File Name           : lcodu_msg.c
//* Object              : handle the idu to odu communication
//* Creation            : wp   22/10/2007
//* Modif               :
//*----------------------------------------------------------------------------
#include <stdio.h>
#include "usart.h"
//#include "AT91SAM7S128.h"
#include "board.h"
//#include "crc.h"
#include "vars.h"
#include <stdlib.h>
#include "hardctrl.h"
#include "spi.h"

//#define AT91C_MASTER_CLOCK 48000000

extern  void AT91F_disable_interrupt(void);
extern  void AT91F_enable_interrupt(void);

extern void Delay (unsigned int a);
extern void sw_reset(void);

unsigned char rx_buf[256]; //接收缓冲区
unsigned char tx_buf[256]; //发送缓冲区
unsigned char infor_msg[256];
//unsigned char send_msg[256];
//static unsigned char rx_buf1[256]; //另一用途接收缓冲区
//unsigned char tx_buf1[128]; //另一用途发送缓冲区
unsigned int hd_flag=0;//接收数据阶段标志
unsigned int rx_index,rx_len,rx_flag,rx_index1;  //接收、发送数组下标及长度
unsigned int rx_rd_pt;//receiving buffer reading pointer
unsigned int tx_wr_pt;//sending buffer writing pointer
unsigned int rx1_rd_pt;//the other receiving buffer reading pointer
unsigned int tx1_wr_pt;//the other sending buffer writing pointer
unsigned int send_point;//发送数据DMA指针
unsigned int send_point1;//the other发送数据DMA指针

unsigned char cmd_id;
unsigned char cmd_cmp;
unsigned char subject_id;

AT91PS_USART  u_pUSART0 = AT91C_BASE_US0;
AT91PS_USART  u_pUSART1 = AT91C_BASE_US1;

#define ACK_MSG_HEAD(comp,sub,len) {tx_buf[0]=SENDERID;tx_buf[1]=0x00;tx_buf[2]=comp;tx_buf[3]=sub;tx_buf[4]=len;}
#define ODU_MSG_HEAD(cmd,sub,len)  {tx_buf[0]=SENDERID;tx_buf[1]=cmd; tx_buf[2]=0x00;tx_buf[3]=sub;tx_buf[4]=len;}
#define ODU_MSG_DATA(lenth,y) {ack=lenth;        for(i=0;i<lenth;i++) tx_buf[i+5]=y[i];}
#define ODU_MSG_INT_DATA(x)   {ltob.ul=x; ack=4; for(i=0;i<4;i++) tx_buf[i+5]=ltob.ch[3-i];}

unsigned char send_triger;  //for debug^^^^^^^^^^^^^^^^^for debug
void send_msg_USART0(){

  if(tx_wr_pt!=send_point) {
    //Alive_counter=AT91C_BASE_RTTC->RTTC_RTVR;
    //v_counter=0;
      
    if(send_point<tx_wr_pt){
      while(u_pUSART0->US_TCR!=0){};
      u_pUSART0->US_TPR=send_point+(unsigned int)us0_send_dma;
      u_pUSART0->US_TCR=tx_wr_pt-send_point;
      send_point=tx_wr_pt;
      //send_triger=1;
    }
    else
    { 
      while(u_pUSART0->US_TCR!=0){};
      u_pUSART0->US_TPR=send_point+(unsigned int)us0_send_dma;
      u_pUSART0->US_TCR=MAX_SEND_BUF-send_point;
      send_point=0;
      //send_triger=1;
      while(u_pUSART0->US_TCR!=0){};
      u_pUSART0->US_TPR=(unsigned int)us0_send_dma;
      u_pUSART0->US_TCR=tx_wr_pt;
      send_point=tx_wr_pt;
    }
  }
}

void send_msg_USART1(){

  if(tx1_wr_pt!=send_point1) {
    //Alive_counter=AT91C_BASE_RTTC->RTTC_RTVR;
    //v_counter=0;
      
    if(send_point1<tx1_wr_pt){
      while(u_pUSART1->US_TCR!=0){};
      u_pUSART1->US_TPR=send_point1+(unsigned int)us1_send_dma;
      u_pUSART1->US_TCR=tx1_wr_pt-send_point1;
      send_point1=tx1_wr_pt;
      //send_triger=1;
    }
    else
    { 
      while(u_pUSART1->US_TCR!=0){};
      u_pUSART1->US_TPR=send_point1+(unsigned int)us1_send_dma;
      u_pUSART1->US_TCR=MAX_SEND_BUF-send_point1;
      send_point1=0;
      //send_triger=1;
      while(u_pUSART1->US_TCR!=0){};
      u_pUSART1->US_TPR=(unsigned int)us1_send_dma;
      u_pUSART1->US_TCR=tx1_wr_pt;
      send_point1=tx1_wr_pt;
    }
  }
}


/*将ACK帧写入PDA内存*/
/*
void send_ack()
{ unsigned char datalink_buf[5];
   datalink_buf[0]=0x7e;
   datalink_buf[1]=0xff;
   datalink_buf[2]=0x00;
   datalink_buf[3]=0xff;
   datalink_buf[4]=0x7e;
   //write_frame_USART0(datalink_buf,5);
   send_msg(datalink_buf,5);
}
*/
/*将需要传输的信息打包,组成一个应用层信息帧*/
/*void msg_pack(unsigned char type,unsigned char id,unsigned char ack,unsigned char exinfor)  //application layer
{
}*/

unsigned char crc_fun(unsigned char msg[],unsigned int len)
{
  int i;
  unsigned char crc_result;
  
  crc_result=0;
  
  for(i=0;i<len;i++)
    crc_result+=msg[i];
  
  return crc_result;
}
/*将有效帧根据协议进行命令处理*/
unsigned int check_crc(unsigned int len)  //命令应答处理
{
   //unsigned char type,id,ack,para_id;
   unsigned char crc_cksum;
   
   crc_cksum=infor_msg[len-1];
   
       if(crc_cksum==crc_fun(infor_msg,len-1))
       { 
         hd_flag=0;  //准备接收下一帧
         return 1;
       }
       
          //v_counter++;  //通信错误计数器加1
          hd_flag=1;  ////若收到非法帧,则将刚收到的0x7e作为起始字符。
          rx_len=0;
          rx_buf[0]=DELIMITER;
          rx_index=1;
          return 0;
}

unsigned char pack_config_infor(unsigned char subject)
{
   unsigned char i,ack;
   ack=0;
   switch(subject)
   {
   case 0x01:
     ODU_MSG_DATA(4,rfu_boot_version)
     break;
   case 0x02:
     ODU_MSG_DATA(4,rfu_sw_version)
     break;
   case 0x03:
     ODU_MSG_DATA(5,odu_part_num)
     break;
   case 0x05:
     ODU_MSG_DATA(3,odu_serial_num)
     break;
   case 0x8:
     ODU_MSG_DATA(3,rfu_asm_date)
     break;
   case 0x0a:
     break;
   case 0x0b:
     ODU_MSG_INT_DATA(v_tx_freqmin)
     break;
   case 0x0c:
     ODU_MSG_INT_DATA(v_tx_freqmax)
     break;
   case 0x0d:
     ODU_MSG_INT_DATA(v_rx_freqmin)
     break;
   case 0x10:
     ODU_MSG_INT_DATA(v_rx_freqmax)
     break;
   case 0x11:
     ODU_MSG_INT_DATA(v_c_step)
     break;
   case 0x12:
     ODU_MSG_INT_DATA(v_tx_frequency)
     break;
   case 0x13:
     ODU_MSG_INT_DATA(v_rx_frequency)
     break;
   case 0x14:
     ODU_MSG_INT_DATA(diplexer_tx_loss)
     break;
   case 0x15:
     ODU_MSG_INT_DATA(diplexer_rx_loss)
     break;
     
   case 0x96:
     ODU_MSG_DATA(5,rfu_part_num)
     break;
   case 0x98:
     ODU_MSG_DATA(3,rfu_serial_num)
     break;
   case 0x9a:
     ODU_MSG_DATA(5,iftx_part_num)
     break;
   case 0x9b:
     ODU_MSG_DATA(3,iftx_serial_num)
     break;
   case 0x9c:
     ODU_MSG_DATA(5,ifrx_part_num)
     break;
   case 0x9d:
     ODU_MSG_DATA(3,ifrx_serial_num)
     break;
   case 0x9e:
     ODU_MSG_DATA(5,syntx_part_num)
     break;
   case 0x9f:
     ODU_MSG_DATA(3,syntx_serial_num)
     break;
   case 0xa0:
     ODU_MSG_DATA(5,synrx_part_num)
     break;
   case 0xa1:
     ODU_MSG_DATA(3,synrx_serial_num)
     break;
   case 0xa2:
     ODU_MSG_DATA(5,dcc_part_num)
     break;
   case 0xa3:
     ODU_MSG_DATA(3,dcc_serial_num)
     break;
   case 0xa4:
     ODU_MSG_DATA(5,bb_part_num)
     break;
   case 0xa5:
     ODU_MSG_DATA(3,bb_serial_num)
     break;
   case 0xa6:
     ODU_MSG_DATA(5,diplexer_part_num)
     break;
   case 0xa8:
     ODU_MSG_DATA(3,diplexer_serial_num)
     break;
   case 0xaa:
     ODU_MSG_DATA(5,trxtx_part_num)
     break;
   case 0xab:
     ODU_MSG_DATA(3,trxtx_serial_num)
     break;
   case 0xac:
     ODU_MSG_DATA(5,trxrx_part_num)
     break;
   case 0xad:
     ODU_MSG_DATA(3,trxrx_serial_num)
     break;
   default:
     break;
   }
   return ack;
}

void report_config_infor_pro(unsigned char subject)
{ unsigned char len;
  len=pack_config_infor(subject);
  if(len!=0) 
  {  ODU_MSG_HEAD(0x03,subject,len);
     len+=5;
     load_msg(tx_buf,len);
  }
}

void report_status_pro(unsigned char subject)
{
  unsigned char ack,i;
  ack=0;
  switch(subject)
  {
     case 0x21:
         ODU_MSG_INT_DATA(v_temp_value)
         break; 
     case 0x22:
         ODU_MSG_INT_DATA(v_temp_max)
         break; 
     case 0x23:
         ODU_MSG_INT_DATA(v_temp_max)
         break; 
     case 0x24:
         ODU_MSG_INT_DATA(v_tx_power)
         break; 
     default:
       break;
  }
  if(ack>0)  
  {
     ODU_MSG_HEAD(0x03,subject,ack);
     ack+=5;
     load_msg(tx_buf,ack);
  }
}

void report_alarm_pro()
{
   ODU_MSG_HEAD(0x01,0,2);
   tx_buf[5]=v_odu_alarm[0];
   tx_buf[6]=v_odu_alarm[1];
   load_msg(tx_buf,7);
}

void set_cmd_pro(unsigned char subject,unsigned char component)
{  unsigned char ack;
   unsigned char i;
   
   ack=0;
   
   switch(subject)
   {
   case 0x30:
     i=infor_msg[5];
     if(i==0) v_txmute=0;
     else if(i==1) v_txmute=1;
     ack=set_mute(i);
     break;
   case 0x31:
     i=infor_msg[5];
     v_txmute_auto=i;
     break;
   case 0x32:   //reset rfu
     Delay(5000000);
     reset_pro(1);
     break;
   case 0x33:
      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!=v_tx_frequency) ack=1;
      v_tx_frequency=ltob.ul;
      v_tx_f_lo=(v_tx_frequency-v_c_tx_if)/(float)v_c_m_tx;  
      Set_TX_RX_RF(TX_RF,(v_tx_f_lo/1000));
      
      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 0x34:
      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!=v_rx_frequency) ack=1;
      v_rx_frequency=ltob.ul;
      v_rx_f_lo=(v_rx_frequency-v_c_rx_if)/(float)v_c_m_rx;  
      Set_TX_RX_RF(RX_RF,(v_rx_f_lo/1000));
      
      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 0x35:
      i=infor_msg[8];
      set_att(0,i);
      break;
   case 0x38:
     v_temp_max=v_temp_value;
     break;
   case 0x55:
     i=infor_msg[8];
     set_att(0,i);
   case 0x56:
     i=infor_msg[8];
      set_att(1,i);
   case 0x59:

⌨️ 快捷键说明

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