📄 rscom.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : AUX VRV
COMPILER : AVR GCC/ICC
MODULE : rscom.c
VERSION : 1.0.0
DATE : 2006/01/02
AUTHOR : 朱坤
DESCRIPTION : 与五型外机通信(T0, SCI)
MODIFICATIONS :
******************************************************************************/
#include "rscom.h"
#include "ports.h"
#include "timer.h"
#include "main.h"
#include "buz.h"
#include "fan.h"
#include "adc.h"
#include "pzf.h"
#include "rem.h"
#include "pump.h"
#include "swing.h"
#ifdef EnSTYLE5
#define CRC_CALCULATE 1
#define CRC_CHECK 0
u8 *ScByteCnt; /* 字节计数 */
u8 ScAddrErrCnt; /* 地址冲突检测计时 */
u8 ScCnt; /* 字节计数 */
u8 WaitBeforeTx; /* 发送之前的等待时间 */
u8 ScBufAdr[16]; /* 缓冲区(16字节) */
u8 ScComTm; /* 若内机一直处于发送状态,强制为接收状态 */
u8 ScFlag; /* 标志位 */
#define fScRxOk 7 /* 1: 接收数据就绪 */
#define fScTx 6 /* 1: Tx, 0: Rx */
#define fScSOC 5 /* 1: SOC */
#define fScMSA 4 /* 1: MSA CMD LEN */
#define fScDAT 3 /* 1: DAT */
#define fScREQ 2 /* 请求发送 */
u8 ScMonCnt; /* 外机通信故障计时 */
static u8 TmpVar; /* 处理16位数据时暂时存储 */
#if 0
const u8 sstl[] = {0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* 00H-0FH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* 10H-1FH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* 20H-2FH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* 30H-3FH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* 40H-4FH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* 50H-5FH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* 60H-6FH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* 70H-7FH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* 80H-8FH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* 90H-9FH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* A0H-AFH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* B0H-BFH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40, /* C0H-CFH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* D0H-DFH */
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40,
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41, /* E0H-EFH */
0x00,0x0C1,0x81,0x40,0x01,0x0C0,0x80,0x41,
0x01,0x0C0,0x80,0x41,0x00,0x0C1,0x81,0x40}; /* F0H-FFH */
const u8 ssth[] = {0x000,0x0C0,0x0C1,0x001,0x0C3,0x003,0x002,0x0C2,
0x0C6,0x006,0x007,0x0C7,0x005,0x0C5,0x0C4,0x004, /* 00H-0FH */
0x0CC,0x00C,0x00D,0x0CD,0x00F,0x0CF,0x0CE,0x00E,
0x00A,0x0CA,0x0CB,0x00B,0x0C9,0x009,0x008,0x0C8, /* 10H-1FH */
0x0D8,0x018,0x019,0x0D9,0x01B,0x0DB,0x0DA,0x01A,
0x01E,0x0DE,0x0DF,0x01F,0x0DD,0x01D,0x01C,0x0DC, /* 20H-2FH */
0x014,0x0D4,0x0D5,0x015,0x0D7,0x017,0x016,0x0D6,
0x0D2,0x012,0x013,0x0D3,0x011,0x0D1,0x0D0,0x010, /* 30H-3FH */
0x0F0,0x030,0x031,0x0F1,0x033,0x0F3,0x0F2,0x032,
0x036,0x0F6,0x0F7,0x037,0x0F5,0x035,0x034,0x0F4, /* 40H-4FH */
0x03C,0x0FC,0x0FD,0x03D,0x0FF,0x03F,0x03E,0x0FE,
0x0FA,0x03A,0x03B,0x0FB,0x039,0x0F9,0x0F8,0x038, /* 50H-5FH */
0x028,0x0E8,0x0E9,0x029,0x0EB,0x02B,0x02A,0x0EA,
0x0EE,0x02E,0x02F,0x0EF,0x02D,0x0ED,0x0EC,0x02C, /* 60H-6FH */
0x0E4,0x024,0x025,0x0E5,0x027,0x0E7,0x0E6,0x026,
0x022,0x0E2,0x0E3,0x023,0x0E1,0x021,0x020,0x0E0, /* 70H-7FH */
0x0A0,0x060,0x061,0x0A1,0x063,0x0A3,0x0A2,0x062,
0x066,0x0A6,0x0A7,0x067,0x0A5,0x065,0x064,0x0A4, /* 80H-8FH */
0x06C,0x0AC,0x0AD,0x06D,0x0AF,0x06F,0x06E,0x0AE,
0x0AA,0x06A,0x06B,0x0AB,0x069,0x0A9,0x0A8,0x068, /* 90H-9FH */
0x078,0x0B8,0x0B9,0x079,0x0BB,0x07B,0x07A,0x0BA,
0x0BE,0x07E,0x07F,0x0BF,0x07D,0x0BD,0x0BC,0x07C, /* A0H-AFH */
0x0B4,0x074,0x075,0x0B5,0x077,0x0B7,0x0B6,0x076,
0x072,0x0B2,0x0B3,0x073,0x0B1,0x071,0x070,0x0B0, /* B0H-BFH */
0x050,0x090,0x091,0x051,0x093,0x053,0x052,0x092,
0x096,0x056,0x057,0x097,0x055,0x095,0x094,0x054, /* C0H-CFH */
0x09C,0x05C,0x05D,0x09D,0x05F,0x09F,0x09E,0x05E,
0x05A,0x09A,0x09B,0x05B,0x099,0x059,0x058,0x098, /* D0H-DFH */
0x088,0x048,0x049,0x089,0x04B,0x08B,0x08A,0x04A,
0x04E,0x08E,0x08F,0x04F,0x08D,0x04D,0x04C,0x08C, /* E0H-EFH */
0x044,0x084,0x085,0x045,0x087,0x047,0x046,0x086,
0x082,0x042,0x043,0x083,0x041,0x081,0x080,0x040};/* F0H-FFH */
#endif
#if 0
#ifdef AVRGCC
SIGNAL(SIG_USART_TRANS)
#else
#pragma interrupt_handler SCI_Int_Txc:iv_USART_TXC
void SCI_Int_Txc(void) /* 五型外机通信发送处理 */
#endif
{
ScFlag = 0; /* 切换到接收 */
/* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
UCSRB = (1<<RXCIE)|(1<<RXEN);
}
#endif
#ifdef AVRGCC
SIGNAL(SIG_USART_DATA)
#else
#pragma interrupt_handler SCI_Int_Tx:iv_USART_DRE
void SCI_Int_Tx(void) /* 五型外机通信发送处理 */
#endif
{
/* Tx 发送 */
if (ValBit(ScFlag,fScTx)){
if (ValBit(ScFlag,fScSOC)){
if (ValBit(ScFlag,fScDAT)){
UDR = 0x0D;
//if (--ScCnt == 0){
ScFlag = 0; /* 切换到接收 */
//}
} else {
if (--ScCnt == 0){
if (ValBit(ScFlag,fScMSA)){
//ScCnt = 2;
SetBit(ScFlag,fScDAT);
} else {
ScCnt = (u8)((*ScByteCnt & 0x0F) + 2);
if (ScCnt > 13){
ScFlag = 0;
}
SetBit(ScFlag,fScMSA);
}
}
UDR = *ScByteCnt;
ScByteCnt++; /* 下一字节 */
}
} else {
UDR = 0x7E;
SetBit(ScFlag,fScSOC);
ScCnt = 3;
ScByteCnt = ScBufAdr; /* 设置缓冲区指针 */
ScComTm = 0; /* 清除监控计时 */
}
} else {
ScFlag = 0; /* 切换到接收 */
UCSRB = (1 << RXCIE)|(1 << RXEN);
}
}
#ifdef AVRGCC
SIGNAL(SIG_USART_RECV)
#else
#pragma interrupt_handler SCI_Int_Rx:iv_USART_RX
void SCI_Int_Rx(void) /* 五型外机通信接收处理 */
#endif
{
/* Rx 接收 */
if (ValBit(ScFlag,fScRxOk)){
UDR; /* 清除 */
} else if (ValBit(ScFlag,fScSOC)){
*ScByteCnt = UDR;
if (--ScCnt == 0){
if (ValBit(ScFlag,fScMSA)){
ScFlag = (u8)(1 << fScRxOk); /* 已接收完整帧 */
} else {
SetBit(ScFlag,fScMSA);
ScCnt = (u8)((*ScByteCnt & 0x0F) + 2);
if (ScCnt > 13) ScFlag = 0;
}
}
ScByteCnt++; /* 下一字节 */
} else if (UDR == 0x7E){ /* 检测到总线不空就不允许发送 */
TIMSK &= ~(1 << OCIE0);
UCSRB = (1 << RXCIE)|(1 << RXEN);
ScFlag = (u8)(1 << fScSOC);
ScCnt = 3;
ScByteCnt = ScBufAdr; /* 设置缓冲区指针 */
ScComTm = 0; /* 清除监控计时 */
}
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMB_Int
INPUT/OUTPUT : None
DESCRIPTION : timer B Interrupt Service Routine
COMMENTS : 五型外机通信启动
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE0)
#else
#pragma interrupt_handler TIMB_Int:iv_TIMER0_COMP
void TIMB_Int(void) /* 五型外机通信启动处理 */
#endif
{
if (WaitBeforeTx-- == 0){
if (ValBit(ScFlag,fScREQ)){ /* 如果有发送请求,启动发送 */
TIMSK &= (u8)~(1 << OCIE0);
ScFlag = (1 << fScTx); /* 启动发送 */
ScComTm = 0; /* 如果处于发送状态超时,强制退出 */
/* UCSRA: RXC TXC UDRE FE DOR PE U2X MPCM */
UCSRA = 0x00; /* */
UBRRH = 0x00; /* 9600 N,8,1 允许发送 */
UBRRL = 51; /* 9600 @8MHz */
/* UCSRC: URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL */
UCSRC = (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);
/* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
UCSRB = (1 << UDRIE)|(1 << TXEN);
}
} else{
OCR0 += (u8)(1024/32); /* 下次中断时间 1.024mS*/
}
}
void Init_TIMB(void)
{
ScFlag = 0x00; /* 清除所有标志 */
/* UCSRA: RXC TXC UDRE FE DOR PE U2X MPCM */
UCSRA = 0x00; /* */
UBRRH = 0x00; /* 9600 N,8,1 允许发送 */
UBRRL = 51; /* 9600 @8MHz */
/* UCSRC: URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL */
UCSRC = (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);
/* UCSRB: RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 */
UCSRB = (1 << RXCIE)|(1 << RXEN);
//ScAddrErrCnt = 0;
}
void ScCom_Sub(void)
{
u8 i,j;
BOOLEAN f;
if (ScMonCnt > 60){ /* 外机通信故障监控计时(秒)*/
SetBit(Errorflg,fSComErr); /* 外机通信故障 */
OutSideValve = 0; /* 关阀 */
ScMonCnt = 0;
}
/* 如果超过10秒没没检测到地址冲突,清除标志 */
if (ScAddrErrCnt > 9) ClrBit(Errorflg,fRsAddrErr);
if (ScComTm == 255){ /* 监控计时 */
ScComTm = 0x00;
Init_TIMB();
}
if (ValBit(ScFlag,fScRxOk)){ /* 1: 接收Ok */
if (CRCchk(CRC_CHECK,ScBufAdr) && /* CRC 检查 */
(!ValBit(ScBufAdr[0],4)) && /* 1: W--W T--T */
((ScBufAdr[1] & NJNOMASK) != 0) && /* 内机地址 != 0 */
((ScBufAdr[1] == WJ_NJNo)|| /* 比较地址(W--N、T--N) */
/* 广播地址 */
((ScBufAdr[1] & NJNOMASK) == WJ_NJNoBROADCAST))){
ScMonCnt = 0; /* 与外机通信故障计时 */
ClrBit(Errorflg,fSComErr); /* 1:与外机通信故障 */
/* 收到与本机地址相同的应答帧,则认为有内机地址冲突 */
if (((ScBufAdr[1] & NJNOMASK) != WJ_NJNoBROADCAST) &&
(ValBit(ScBufAdr[0],3))){
ScAddrErrCnt = 0;
SetBit(Errorflg,fRsAddrErr);
}
if (!ValBit(Errorflg,fRsAddrErr)){ /* 内机地址冲突时不处理任何命令 */
if (((ScBufAdr[0] & 0x0E0) == 0) && /* 特控器命令不影响 */
((ScBufAdr[1] & NJNOMASK) != WJ_NJNoBROADCAST)){ /* 广播地址不影响 */
WJType = (u8)((ScBufAdr[2] & 0x0F0) >> 4); /* 1: 定频,0:变频 */
}
if (((ScBufAdr[2] & 0x0F) != 0) &&
((ScBufAdr[2] & 0x0F) <= 11) &&
(!ValBit(ScBufAdr[0],3)) /*&&*/ /* 应答帧 */
/*(ScAddrErrCnt > 5)*/){ /* 5秒内不处理 */
j = (u8)(ScBufAdr[0] & 0x07); /* 命令编号 */
switch(j){
case 1:
if ((u8)(ScBufAdr[0] & 0x0E8) != 0){ /* 0: 无效的特控器地址 */
ScBufAdr[1] = 31; /* 不发送 */
break;
} else {
/* 只处理G1-G2, I20-I39 */
if ((ScBufAdr[3] == 1) || (ScBufAdr[3] == 2)){
ScBufAdr[3] = (u8)((ScBufAdr[3] + 1) * 10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -