📄 clk_deal.c
字号:
unsigned char get_clock_stat(struct cmd_para_save *get_clock){
//C14取得指定输入时钟源的状态
unsigned char xdata clksource;
unsigned char xdata return_value;
clksource = get_clock -> clock_state_num;
return_value = get_clock_state(clksource);
if (!GetResRdyTbl(10))
SetResRdyTbl(10);
return (return_value);
}
void report_clock_stat(unsigned char clk_state){
//C14回应函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x43;
tx_buf[4] = 0x31;
tx_buf[5] = 0x34;
tx_buf[6] = '0';
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = '3';
if (clk_state == 0x0A){
tx_buf[10] = '2';
tx_buf[11] = '0';
tx_buf[12] = '0';
}
else {
tx_buf[10] = '0';
tx_buf[11] = (clk_state & 0x0F) + 0x30;
tx_buf[12] = ((clk_state >> 4) & 0x0F) +0x30;
}
tx_buf[13] = '*';
tx_buf_pointer = 0;
while(tx_buf[tx_buf_pointer] != '*'){
SBUF = tx_buf[tx_buf_pointer];
while(tx_done == 0);
tx_done = 0;
tx_buf_pointer++;
}
SBUF = tx_buf[tx_buf_pointer]; //发送最后一个字符'*'
while(tx_done == 0);
tx_done = 0;
}
void set_clock_switch(unsigned char clksource){
//设置时钟倒换函数
switch (clksource){
case 0: S_reg = 0x81; //配置时钟源为光口0线路时钟
clk_source = 0;
break;
case 1: S_reg = 0x82; //配置时钟源为光口1线路时钟
clk_source = 1;
break;
case 2: S_reg = 0x86; //配置时钟源为光口2线路时钟
clk_source = 2;
break;
case 3: S_reg = 0x87; //配置时钟源为光口3线路时钟
clk_source = 3;
break;
case 7: S_reg = 0x89; //配置时钟源为第二外时钟
clk_source = 7;
break;
case 6: S_reg = 0x8B; //配置时钟源为第一外时钟源
clk_source = 6;
break;
case 8: S_reg = 0xC0; //配置时钟源自由振荡模式
clk_source = 8;
break;
case 9: S_reg = 0xE0; //配置时钟源为保持模式
clk_source = 9;
break;
default:break;
}
}
void clk_switch(void){
//主用时钟源丢失,自动倒换函数
unsigned char xdata temp;
temp = get_clock_state(clkarray[0]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[0]);
clk_prio = 0;
}
else {
temp = get_clock_state(clkarray[1]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[1]);
clk_prio = 1;
}
else {
temp = get_clock_state(clkarray[2]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[2]);
clk_prio = 2;
}
else {
temp = get_clock_state(clkarray[3]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[3]);
clk_prio = 3;
}
else {
temp = get_clock_state(clkarray[4]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[4]);
clk_prio = 4;
}
else {
temp = get_clock_state(clkarray[5]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[5]);
clk_prio = 5;
}
else {
temp = get_clock_state(clkarray[6]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[6]);
clk_prio = 6;
}
else {
temp = get_clock_state(clkarray[7]);
if (temp >> 4 == 1){
set_clock_switch(clkarray[7]);
clk_prio = 7;
}
}
}
}
}
}
}
}
}
void get_clk_prio(unsigned char clksource){
//得出主用源时钟的优先级
unsigned char xdata temp;
clk_prio = 8;
temp = 8;
while (temp){
if (clksource == clkarray[temp - 1]){
clk_prio = temp - 1;
}
temp--;
}
}
void check_switch_clk(void){
//主用时钟源不是最高优先级时钟,自动倒换函数
unsigned char xdata temp;
unsigned char xdata clk_pr;
unsigned char xdata flg;
flg = 8;
for (clk_pr = 6; clk_pr >= 1; clk_pr--){
if (clk_prio > clk_pr){ //得到优先级的时钟状态
temp = get_clock_state(clkarray[clk_pr]);
if (temp >> 4){
clkprio_array[clk_pr] += 1; //时钟源有效计数值加1
if (clkprio_array[clk_pr] > 300){ //计满5分钟
flg = clk_pr;
clkprio_array[clk_pr] = 0;
}
}
else clkprio_array[clk_pr] = 0; //时钟源无效清除计数
}
}
temp = get_clock_state(clkarray[0]); //得到优先级0的时钟状态
if (temp >> 4){
clkprio_array[0] += 1; //时钟源有效计数值加1
if (clkprio_array[0] > 300){ //计满5分钟
flg = 0;
clkprio_array[0] = 0;
}
}
else clkprio_array[0] = 0; //时钟源无效清除计数
if (flg < 8){
set_clock_switch(clkarray[flg]); //自动倒换时钟源
}
/* if (clk_prio > 6){ //得到优先级6的时钟状态
temp = get_clock_state(clkarray[6]);
if (temp >> 4){
clkprio_array[6] += 1; //时钟源有效计数值加1
if (clkprio_array[6] > 300){ //计满5分钟
flg = 6;
clkprio_array[6] = 0;
}
}
else clkprio_array[6] = 0; //时钟源无效清除计数
}
if (clk_prio > 5){
temp = get_clock_state(clkarray[5]);
if (temp >> 4){
clkprio_array[5] += 1;
if (clkprio_array[5] > 300){
flg = 5;
clkprio_array[5] = 0;
}
}
else clkprio_array[5] = 0;
}
if (clk_prio > 4){
temp = get_clock_state(clkarray[4]);
if (temp >> 4){
clkprio_array[4] += 1;
if (clkprio_array[4] > 300){
flg = 4;
clkprio_array[4] = 0;
}
}
else clkprio_array[4] = 0;
}
if (clk_prio > 3){
temp = get_clock_state(clkarray[3]);
if (temp >> 4){
clkprio_array[3] += 1;
if (clkprio_array[3] > 300){
flg = 3;
clkprio_array[3] = 0;
}
}
else clkprio_array[3] = 0;
}
if (clk_prio > 2){
temp = get_clock_state(clkarray[2]);
if (temp >> 4){
clkprio_array[2] += 1;
if (clkprio_array[2] > 300){
flg = 2;
clkprio_array[2] = 0;
}
}
else clkprio_array[2] = 0;
}
if (clk_prio > 1){
temp = get_clock_state(clkarray[1]);
if (temp >> 4){
clkprio_array[1] += 1;
if (clkprio_array[1] > 300){
flg = 1;
clkprio_array[1] = 0;
}
}
else clkprio_array[1] = 0;
}
temp = get_clock_state(clkarray[0]); //得到优先级0的时钟状态
if (temp >> 4){
clkprio_array[0] += 1; //时钟源有效计数值加1
if (clkprio_array[0] > 300){ //计满5分钟
flg = 0;
clkprio_array[0] = 0;
}
}
else clkprio_array[0] = 0; //时钟源无效清除计数
if (flg < 8){
set_clock_switch(clkarray[flg]); //自动倒换时钟源
}
*/
}
void clk_check_frequence(void){
//出现主用时钟源丢失以后,将时钟源改为自由振荡并加频偏,
//解决时钟死锁长时间出现误码的现象
if (clk_check_flg[0] == 1) //光口出现告警标志
{
if (clk_check_flg[1] > 0) //出现告警,重新进行时钟计数
{
clk_check_flg[1] = 1;
}
else if ((S_reg & 0xC0) != 0xC0) //时钟源不工作在自由振荡状态,更改时钟配置
{
// clk_frequence_stat = S_reg;
S_reg &= 0xDF;
S_reg |= 0xC0; //先将时钟源配置到自由振荡
// Frep_reg = 0x80; //添加频偏
clk_check_flg[1] = 1;
clk_frequence_stat = clkmode_reg;
clkmode_reg = 1;
}
clk_check_flg[0] = 0;
}
if (clk_check_flg[1] > 0) //开始时钟计数
{
if (clk_check_flg[1] > 5) //计满5秒钟,将时钟配置改回来
{
S_reg &= 0x3F;
S_reg |= 0x80;
// Frep_reg = 0x40;
clk_check_flg[1] = 0;
clkmode_reg = clk_frequence_stat;
}
else clk_check_flg[1] += 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -