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