📄 lcodu_msg_bak1224.c
字号:
//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 + -