📄 lcodu_msg.c
字号:
//AR4
break;
case 0x57:
//AT3
break;
case 0x59:
//TxRF 2175
break;
case 0x5B:
//RxRF 3537.5
break;
case 0x60:
//Tx PA Control
break;
case 0x62:
//RxAGC Control
break;
case 0x65:
//AT4
break;
#endif
case 0x55:
//ODU_MSG_INT_DATA(v_att0)
break;
case 0x56:
//ATT1
ODU_MSG_INT_DATA(v_att1)
break;
case 0x58:
//tx frequency lo
ODU_MSG_INT_DATA(v_tx_f_lo)
break;
case 0x5a:
//rx frequency lo
ODU_MSG_INT_DATA(v_rx_f_lo)
break;
case 0x66:
tx_buf[5]=diplexer_suffix;
ack=1;
break;
#if(0)
case 0xB0:
//config
break;
case 0xB1:
//config
break;
case 0xB2:
//config
break;
case 0xB3:
//config
break;
case 0xB4:
//config
break;
case 0xB5:
//config
break;
case 0xB6:
//config
break;
case 0xB7:
//config
break;
case 0x97:
break;
case 0x99:
break;
case 0xA7:
break;
case 0xA9:
break;
#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); //ACK
}
else
ACK_MSG_HEAD(0x00,subject,len); //NACK
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)
{
}
/*将从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,j;
j=0;
for(i=0;(i+j) < (rx_len-2);i++)
{
if(rx_buf[i+j+1]==ESCAPE)
{
j++;
}
infor_msg[i]=rx_buf[i+j+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) //只有选择IDU时才往IDU发命令
{
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)//连IDU时转发
{
us1_send_dma[tx1_wr_pt++]=rx_buf1[j];
if(tx1_wr_pt>=MAX_SEND_BUF) tx1_wr_pt=0;
}
/*
else //连PC时转发
{ us0_send_dma[tx_wr_pt++]=rx_buf1[j];
if(tx_wr_pt>=MAX_SEND_BUF) tx_wr_pt=0;
}*/
}
rx_index1=0;
}
}
unsigned int recv_msg()
{
}
//*-----------------------------------------------------------------------------
//* Function Name : odu_to_idu_com
//* Object : the entrance of the communication process.
//* autor : wang ping
//* Input Parameters : none
//* Output Parameters : none
//*-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -