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