📄 clk_deal.c
字号:
#include <REG54.H>
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "cmd_para_save.h"
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned long int xdata commandid; //表示命令代码的变量
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
unsigned char xdata clksource_reg = 0; //保存强制转换的时钟源
unsigned char xdata clk_force = 0xFF; //强制转换的时钟源代号
unsigned char xdata clk_source = 8; //主用时钟源代号寄存器,缺省自由振荡
unsigned char xdata clkmode_reg = 0; //保存是强制模式还是自动运行
unsigned char xdata clkarray_flg = 0; //是否填写优先级表标志位
unsigned char xdata clk_prio = 8; //时钟优先级标志
unsigned int xdata clkprio_array[7] = {0,0,0,0,0,0,0}; //时钟优先级恢复计数
unsigned char xdata clkarray[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //时钟优先级存储数组
unsigned char xdata clk_check_flg[2] = {0,0};
//时钟频偏检测标志数组,第一位表示光口号,第二位表示计数值
unsigned char xdata clk_frequence_stat;
extern unsigned char xdata start_flg[4];
unsigned char set_clock_source(struct cmd_para_save *set_clock){
//C10强制配置时钟源函数
unsigned char xdata clksource;
unsigned char xdata return_value;
unsigned char xdata flg;
commandid = 0x00433130;
clksource = set_clock -> force_clock_source;
switch (clksource){
case 0: flg = Reflos_reg1 & 0x80; //查看7820中T11即光口0线路时钟
if (flg == 0){
//S_reg = 0x81; //配置时钟源为光口0线路时钟
clksource_reg = 0x81;
clk_force = 0;
return_value = 0;
}
else {
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2;
}
break;
case 1: flg = Reflos_reg1 & 0x40; //查看T12即光口1线路时钟
if (flg == 0){
//S_reg = 0x82; //配置时钟源为光口1线路时钟
clksource_reg = 0x82;
clk_force = 1;
return_value = 0;
}
else {
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2;
}
break;
case 2: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x80; //查看T16即光口2线路时钟
if (flg == 0 & start_flg[0] == 0){
//S_reg = 0x86; //配置时钟源为光口2线路时钟
clksource_reg = 0x86;
clk_force = 2;
return_value = 0;
}
else {
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2;
}
break;
case 3: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x40; //查看T17即光口3线路时钟
if (flg == 0 & start_flg[0] == 0){
//S_reg = 0x87; //配置时钟源为光口3线路时钟
clksource_reg = 0x87;
clk_force = 3;
return_value = 0;
}
else {
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2;
}
break;
case 7: flg = Reflos_reg2 & 0x08; //查看7820中T21即第二外时钟源
if (flg == 0){
//S_reg = 0x89; //配置时钟源为第二外时钟
clksource_reg = 0x89;
clk_force = 7;
return_value = 0;
}
else { //时钟源丢失
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2; //返回值2执行失败
}
break;
case 6: flg = Reflos_reg2 & 0x02; //查看7820中T31即第一外时钟源
if (flg == 0){
//S_reg = 0x8B; //配置时钟源为第一外时钟源
clksource_reg = 0x8B;
clk_force = 6;
return_value = 0;
}
else {
clksource_reg = 0;
clk_force = 0xFF;
return_value = 2;
}
break;
case 8: //S_reg = 0xC0; //配置时钟源自由振荡模式
clksource_reg = 0xC0;
clk_force = 8;
return_value = 0; //返回值0执行成功
break;
case 9: //S_reg = 0xE0; //配置时钟源为保持模式
clksource_reg = 0xE0;
clk_force = 9;
return_value = 0; //返回值0执行成功
break;
default:clksource_reg = 0;
clk_force = 0xFF;
return_value = 2; //非法配置返回值2不成功
break;
}
if (!GetResRdyTbl(1))
SetResRdyTbl(1);
return (return_value);
}
unsigned char set_clock_mode(struct cmd_para_save *set_clock){
//C11设置时钟源运行模式
unsigned char xdata clk_mode;
unsigned char xdata return_value;
clk_mode = set_clock -> clock_source_mode;
commandid = 0x00433131;
clkmode_reg = clk_mode; //save clk mode
if (clkmode_reg){ //if clk run force mode
if (clksource_reg != 0){ //if clk mode no error
S_reg = clksource_reg; //run clk mode
clk_source = clk_force;
return_value = 0;
}
else return_value = 2;
}
else return_value = 0; //clk run auto mode
if (!GetResRdyTbl(1))
SetResRdyTbl(1);
return (return_value);
}
unsigned char set_clock_prio(struct cmd_para_save *set_clock){
//C12配置时钟源优先级表
unsigned char xdata clksource;
unsigned char xdata clkprio;
commandid = 0x00433132;
clksource = set_clock -> clock_source;
clkprio = set_clock -> clock_prio;
if (clkprio >=0 & clkprio <= 7){
clkarray[clkprio] = clksource;
clkarray_flg = 1;
if (!GetResRdyTbl(1))
SetResRdyTbl(1);
return(0);
}
else {
if (!GetResRdyTbl(1))
SetResRdyTbl(1);
return(2);
}
}
unsigned char get_clock_working(void){
//C13取得当前输入时钟源状态
unsigned char xdata return_value;
unsigned char xdata clkport;
// clkport = S_reg & 0x60;
if (Mode_reg == 0x02){
return_value = 9;
}
else if(Mode_reg == 0x03){
return_value = 8;
}
else {
clkport = S_reg & 0x0F;
switch (clkport){
case 1: return_value = 0;
break;
case 2: return_value = 1;
break;
case 6: return_value = 2;
break;
case 7: return_value = 3;
break;
case 9: return_value = 7;
break;
case 11: return_value = 6;
break;
default: return_value = 10;
break;
}
}
if (!GetResRdyTbl(11))
SetResRdyTbl(11);
return (return_value);
}
void report_clock_working(unsigned char clksource){
//C13回应函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x43;
tx_buf[4] = 0x31;
tx_buf[5] = 0x33;
tx_buf[6] = '0';
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = '3';
if (clksource == 10){
tx_buf[10] = '2';
}
else tx_buf[10] = '0';
tx_buf[11] = clksource + 0x30;
tx_buf[12] = clkmode_reg + 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;
}
unsigned char get_clock_state(unsigned char clksource){
//取得时钟源状态函数
unsigned char xdata flg;
unsigned char xdata return_value;
switch (clksource) {
case 0: flg = Reflos_reg1 & 0x80; //查看7820中T11即光口0线路时钟
if (flg == 0x80){ //时钟源丢失
return_value = 0x00; //高8位表示该时钟源状态,低8位表示时钟源编号
}
else return_value = 0x10;
break;
case 1: flg = Reflos_reg1 & 0x40; //查看T12即光口1线路时钟
if (flg == 0x40){
return_value = 0x01;
}
else return_value = 0x11;
break;
case 2: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x80;
//flg = Reflos_reg1&0x04; //查看T16即光口2线路时钟
if (flg == 0x80){
return_value = 0x02;
}
else return_value = 0x12;
break;
case 3: flg = (f2rc7820_rd(F2Reflos_reg1)) & 0x40;
//flg = Reflos_reg1&0x02; //查看T17即光口3线路时钟
if (flg == 0x40){
return_value = 0x03;
}
else return_value = 0x13;
break;
case 7: flg = Reflos_reg2 & 0x08; //查看7820中T21即第二外时钟源
if (flg == 0x08){ //时钟源丢失
return_value = 0x07; //高8位表示该时钟源状态,低8位表示时钟源编号
}
else return_value = 0x17;
break;
case 6: flg = Reflos_reg2 & 0x02; //查看7820中T31即第一外时钟源
if (flg == 0x02){
return_value = 0x06;
}
else return_value = 0x16;
break;
case 8: return_value = 0x18;
break;
case 9: return_value = 0x19;
break;
default: return_value = 0x0A;
break;
}
return (return_value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -