📄 main.c
字号:
if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
{send_sd4_frame(list.previous_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else
{
send_sd4_frame(ADDRESS) ;//只有自己一个主站
status=USE_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
}
if(YZ_response_flag==1)
{
YZ_response_flag=0;
if(YZ_SD1->Frame_Contorl==0x20)//有主站进入
{
list.next_stationaddress=YZ_SD1->Source_Address;
}
TH0=TH0_VALUE;
TL0=TL0_VALUE;
TR0=1;
YZ_sync_timer=SYNC_TIME;
}
if(YZ_sync_timer_flag==1)
{
TR0=0;
YZ_sync_timer_flag=0;
YZ_SD4=( SD4_Message_Formate * )YZ_s_buffer;
if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
{ send_sd4_frame(list.previous_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else
{
send_sd4_frame(ADDRESS);
status=USE_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
}
}
if(YZ_status_bef==CHECK_PASS_TOKEN)
{
if(YZ_no_response_flag==1)
{ YZ_pass_token_timer++;
YZ_no_response_flag=0;
if(YZ_pass_token_timer<=1) //passtoken not success retry
{
YZ_SD4=( SD4_Message_Formate * )YZ_s_buffer;
if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
{ send_sd4_frame(list.previous_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
{
send_sd4_frame(list.next_stationaddress);
status=CHECK_PASS_TOKEN;
YZ_status_bef=PASS_TOKEN;
}
}
else //发送两次没成功认为下一主站不在
{ YZ_pass_token_timer=0;
if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0)) //UPDATA LIST
list.previous_stationaddress=0;
else
list.next_stationaddress=127;
send_sd4_frame(ADDRESS);
status=USE_TOKEN;
YZ_status_bef=CHECK_PASS_TOKEN;
}
}
}
break;
case AWAIT_STATUS_RESPONSE:
//YZ_slot_timer=3;
TR0=1;
//TH0=TH0_VALUE;
//TL0=TL0_VALUE;
if(YZ_slot_timer_flag==1)//TIME OUT
{YZ_slot_timer=SLOT_TIME;
YZ_slot_timer_flag=0;
YZ_no_response_flag=1;
TR0=0;
status=PASS_TOKEN;
YZ_status_bef=AWAIT_STATUS_RESPONSE;
}
if((YZ_uart_complete==UART_COMPLETE)&&(YZ_slot_timer_flag==0))
{
if(YZ_r_buffer[0]==SD1)// FDL 状态请求
{
comm_error=receive_parity_check(YZ_uart_num);
if(comm_error==0)
{
YZ_SD1=( SD1_Message_Formate * )YZ_r_buffer;
if(YZ_SD1->Source_Address==YZ_current_gap_address)
{YZ_response_flag=1;
TR0=0;
status=PASS_TOKEN;
YZ_status_bef=AWAIT_STATUS_RESPONSE;
}
}
}
YZ_uart_num=0;
YZ_uart_complete=0;
}
break;
case CHECK_PASS_TOKEN:
TR0=1;
if(YZ_slot_timer_flag==1)
{YZ_slot_timer=SLOT_TIME;
YZ_slot_timer_flag=0;
TR0=0;
status=PASS_TOKEN;
YZ_status_bef=CHECK_PASS_TOKEN;
YZ_no_response_flag=1;
}
if(YZ_token_passed==1)
{
TR0=0;
YZ_token_passed=0;
status=ACTIVE_IDLE;
YZ_status_bef=CHECK_PASS_TOKEN;
}
break;
default:
break;
}
}
}
void uart_timer_set(void)
{
TCON=0x00;
PCON=PCON_VALUE; //波特率选择
IP=IP_VALUE; //设置各中断优先级
TMOD=TMOD_VALUE; //设置各定时器的工作方式
T2CON=T2CON_VALUE;
SCON=SCON_VALUE; //设置串行工作方式
TH1=TL1=BAUD_VALUE; //设定波特率的值
TR1=TRUE;
TI=RI=FALSE;
TH0=TH0_VALUE;
TL0=TL0_VALUE;
YZ_uart_num=0;
YZ_uart_complete=0;
}
//发送一个字节
void uart_send(unsigned char s)
{
SBUF=s;
while(TI!=TRUE)
;
TI=FALSE;
}
//字节校验
void byte_parity(unsigned char num)
{
unsigned char data YZ_cy;
unsigned char data YZ_z=0x80;
unsigned char data YZ_i;
if(num==7) YZ_z=0x40;
YZ_cy=0;
for(YZ_i=num;YZ_i;YZ_i--)
{
if((YZ_parity&YZ_z)!=0)
YZ_cy=!YZ_cy;
YZ_z>>=1;
}
YZ_parity=YZ_cy;
}
unsigned char receive_parity_check(unsigned char YZ_r_number)
{unsigned char parity_result;
for(YZ_i=0;YZ_i<YZ_r_number;YZ_i++)
{YZ_parity=YZ_r_buffer[YZ_i];
byte_parity(8);
if(r_buffer_rb8[YZ_i]==YZ_parity)
parity_result=0;
else
{ parity_result=1;
break;
}
}
return parity_result ;
}
void send_sd1_frame(unsigned char destination_adderss,unsigned char frame_control)
{
SD1_Message_Formate * YZ_SD1;
YZ_SD1=( SD1_Message_Formate * )YZ_s_buffer;
YZ_SD1->Start_Detimiter1=SD1;
YZ_SD1->Destination_Adderss=destination_adderss;
YZ_SD1->Source_Address=ADDRESS;
YZ_SD1->Frame_Contorl=frame_control;
YZ_SD1->Frame_check_squence=((YZ_SD1->Destination_Adderss+YZ_SD1->Source_Address+YZ_SD1->Frame_Contorl)%256);
YZ_SD1->End_Delimiter=ED;
for(YZ_i=0;YZ_i<6;YZ_i++)
{YZ_parity=YZ_s_buffer[YZ_i];
byte_parity(8);
s_buffer_tb8[YZ_i]=YZ_parity;
}
frame_send(6);
}
void send_sd4_frame(unsigned char destination_address)
{
SD4_Message_Formate * YZ_SD4;
YZ_SD4=( SD4_Message_Formate * )YZ_s_buffer;
YZ_SD4->Start_Detimiter4=SD4;
YZ_SD4->Destination_Adderss=destination_address;
YZ_SD4->Source_Address=ADDRESS;
for(YZ_i=0;YZ_i<3;YZ_i++)
{YZ_parity=YZ_s_buffer[YZ_i];
byte_parity(8);
s_buffer_tb8[YZ_i]=YZ_parity;
}
frame_send(3);
}
/**************************************************************************************************
Name: void time_delay(unsigned int)
Description: time delay, 11.0592M 1 ≌ 2mS
Calls: none
**************************************************************************************************/
void time_delay(unsigned int s)
{
unsigned int p;
for(p=s;p;p--)
{
for(YZ_i=166;YZ_i;YZ_i--);
}
}
//发送一帧数据
void frame_send(unsigned char t)//发送数据桢
{
EA=FALSE;
RTS0=!RTS0;
for(YZ_i=0;YZ_i<t;YZ_i++)
{TB8=s_buffer_tb8[YZ_i];
uart_send(YZ_s_buffer[YZ_i]);
}
RTS0=!RTS0;
EA=TRUE;
}
void uart_int(void) interrupt 4 using 2
{
unsigned char data u;
u=SBUF;
YZ_r_buffer[YZ_uart_num]=u;
if(status==CHECK_PASS_TOKEN) //检查令牌
{
YZ_token_passed=1;
}
//if(status==LISTEN_TOKEN)
// YZ_idle_timer=6*SLOT_TIME+(2*ADDRESS*SLOT_TIME);
switch (YZ_r_buffer[0])
{
case SD1:
r_buffer_rb8[YZ_uart_num]=RB8;
YZ_uart_num++;
if((YZ_uart_num==2)&&(YZ_r_buffer[YZ_uart_num-1]!=ADDRESS))
YZ_uart_num=0;
if((YZ_uart_num==6)&&(YZ_r_buffer[YZ_uart_num-1]==ED))
YZ_uart_complete=UART_COMPLETE;
if(YZ_uart_num>6)
YZ_uart_num=0;
break;
case SD2:
r_buffer_rb8[YZ_uart_num]=RB8;
YZ_uart_num++;
if((YZ_uart_num==5)&&(YZ_r_buffer[YZ_uart_num-1]!=ADDRESS))
YZ_uart_num=0;
if(YZ_r_buffer[YZ_uart_num-1]==ED)
YZ_uart_complete=UART_COMPLETE;
break;
case SD4:
r_buffer_rb8[YZ_uart_num]=RB8;
YZ_uart_num++;
if(YZ_uart_num==3)
YZ_uart_complete=UART_COMPLETE;
break;
case SC:
r_buffer_rb8[YZ_uart_num]=RB8;
YZ_uart_num++;
YZ_uart_complete=UART_COMPLETE;
break;
default:
YZ_uart_num=0;
break;
}
RI=FALSE;
}
void timer0_int(void) interrupt 1 using 3 //10MS
{ TF0=FALSE;
TH0=TH0_VALUE;
TL0=TL0_VALUE;
if((status==LISTEN_TOKEN)||(status==ACTIVE_IDLE))
{
//status=LISTEN_TOKEN;
YZ_idle_timer--;
if(YZ_idle_timer==0)
{
YZ_idle_timer_flag=1;
}
}
if(status==PASS_TOKEN)
{
YZ_sync_timer--;
if(YZ_sync_timer==0)
YZ_sync_timer_flag=1;
}
if(status==AWAIT_STATUS_RESPONSE)
{
YZ_slot_timer--;
if(YZ_slot_timer==0)
YZ_slot_timer_flag=1;
}
//if(status==PASS_TOKEN)
//{
//YZ_slot_timer--;
//
//if(YZ_slot_timer==0)
// YZ_slot_timer_flag=1;
//}
if(status==USE_TOKEN)
{
status=CHECK_ACCESS_TIME;
}
if(status==AWAIT_RESPONSE)
{
YZ_sync_timer--;
if(YZ_sync_timer==0)
YZ_sync_timer_flag=1;
}
if(status==CHECK_PASS_TOKEN)
{
YZ_slot_timer--;
if(YZ_slot_timer==0)
YZ_slot_timer_flag=1;
}
}
unsigned char *sd2data_write_formate()
{ SD2_Message_HEADER xdata *sd2_header;
SD2_PDU_REQUEST_HEADER xdata*sd2_pdu_header;
SD2_PARAMETER_REQUEST_BLOCK xdata*sd2_paramer;
SD2_VARIABLE_AREA_BLOCK xdata*sd2_variable;
SD2_WRITEDATA_REQUEST_BLOCK xdata*sd2_data;
SD2_END xdata*sd2_over;
unsigned char sum=0,i;
unsigned char xdata * outbuf;
outbuf = (unsigned char xdata *)malloc(40);
if (outbuf == NULL)
{
return NULL;
}
sd2_header=(SD2_Message_HEADER xdata * )(outbuf);
sd2_header->Start_Detimiter2=0x68;
sd2_header->Length_Byte=0x21 ;
sd2_header->Length_Byte_repeated= 0x21 ;
sd2_header->Start_Detimiter2_repeated=0x68;
sd2_header->Destination_Adderss=0x02 ;
sd2_header->Source_Address=ADDRESS;
sd2_header->Frame_Contorl=0x6c ;
sd2_pdu_header=(SD2_PDU_REQUEST_HEADER xdata* )(outbuf+7);
sd2_pdu_header->PROTE_ID=0x32;
sd2_pdu_header->ROSCTR=0x01;
sd2_pdu_header->RED_ID=0x0000;
sd2_pdu_header->PDU_REF= 0x0101 ;
sd2_pdu_header->PAR_LG= 0x000e ;//参数长度
sd2_pdu_header->DAT_LG= 0x0006 ; //数据长度
sd2_paramer=(SD2_PARAMETER_REQUEST_BLOCK xdata*)(outbuf+17);
sd2_paramer->SERVICE_ID=0x05;
sd2_paramer->NUMBER_OF_VARIABLE= 0x01 ;
sd2_paramer->VARIABLE_SPEC=0x12;
sd2_paramer->V_ADDR_LG=0x0a;
sd2_variable=(SD2_VARIABLE_AREA_BLOCK xdata* )(outbuf+21);
sd2_variable->SYNTAX_ID=0x10;
sd2_variable->TYPE= 0x04 ;
sd2_variable->NUMBER_OF_ELEMENT=0x0001;
sd2_variable->SUBAREA=0x0001;
sd2_variable->AREA=0x84;
sd2_variable->OFFSET[0]=0x00;
sd2_variable->OFFSET[1]=0x00;
sd2_variable->OFFSET[2]=0x00;
sd2_data=(SD2_WRITEDATA_REQUEST_BLOCK xdata* )(outbuf+31);
sd2_data->RESERVED=0x00;
sd2_data->D_TYPE=0x04;
sd2_data->VAR_LG=0x0010;
sd2_data->VARIABLE_VALUE=0x00;
sd2_data->FILL_BIT=0x01;
sd2_over=(SD2_END*)(outbuf+37);
for(i=4;i<37;i++)
{sum=(sum+(*(outbuf+i))%256);
}
sd2_over->FCS=sum;
sd2_over->END=ED;
return outbuf;
}
void init_dymicram()
{
init_mempool((void xdata *)0x300, 100);
// Start the memory pool for incoming and outgoing Ethernet
// frames at0x3000, with length = 1500 bytes. Memory below 500
// is used for program variables
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -