📄 rs232.c
字号:
ArpPhases = ARP_FIRST_REQUEST; /* 没有ARP成功的或者已经老化IP可再次进行ARP */
}
break;
default:
ArpPhases = ARP_FIRST_REQUEST;
break;
}
break;
case 8:
StartTimer(ucTimerNum,200); /* 检测以太网的LINK状态 */
Page3();
RTL8019asRead(RW3_CONFIG0,ucResult);
Page0();
if((R3_CONFIG0_JP | R3_CONFIG0_BNC) == (ucResult & 0x0f))
{
if(TRUE == EthernetLinkFlag)
{
EthernetLinkFlag = FALSE;
for(ucValue = 0; ucValue < IpModeNum;ucValue++)
{
ArpCache_Buf[ucValue].ucStatus = 'f';
}
ARPFinishFlag = FALSE;
IPOrMacConfiltFlag = FALSE; /* 没有LINK时应该立即停止快闪(如果正在快闪) */
StopArpCounter();
}
}
else
{
if(FALSE == EthernetLinkFlag)
{
EthernetLinkFlag = TRUE;
IPConflitTestFlag = TRUE;
ArpCachePoniter = 0;
if(IPConflitTestFlag) /* 刚LINK上,需要进行IP冲突检测 */
{
StopArpCounter();
ArpPhases = ARP_FIRST_REQUEST;
/* ARP条件: 静态IP模式*/
memcpy(&IPAddress_buf[0],&NetParameter.IP_Local_buf[0],IP_LEN);
memcpy(&SubNetMask_buf[0],&NetParameter.SubMask_buf[0],IP_LEN);
memcpy(&GateWay_buf[0],&NetParameter.Gateway[0],IP_LEN);
DelayMs(TL0 & 0x0f); /* 取随机数避免2边同时发送,产生碰撞 */
ArpRequest(&IPAddress_buf[0]); /* 启动IP冲突检测 */
IpOrRouter();
}
}
}
break;
case 9:
StartTimer(ucTimerNum,(rand() & 0x7ff +1000)); /* UART芯片保护校验 */
/* Ethernet 芯片保护校验 */
Page2();
RTL8019asRead(R2_PSTART,ucResult);
RTL8019asRead(R2_PSTOP,ucValue);
RTL8019asRead(R2_RCR,ucValue1);
if((0x4c != ucResult) || (0x80 != ucValue) || (0xcc != ucValue1))
{
RTL8019asInit();
}
else
{
RTL8019asRead(R2_TCR,ucResult);
RTL8019asRead(R2_DCR,ucValue);
RTL8019asRead(R2_IMR,ucValue1);
if((0xe0 != ucResult) || (0xd8 != ucValue) || (0x0f != (ucValue1 & 0x7f)))
{
RTL8019asInit();
}
}
Page0();
break;
case 12: /* IP冲突检测 */
StopTimer(ucTimerNum);
ucResult = (TL0 & 0x0f);
DelayMs(ucResult + 1); /* 启动发送ARP包,取随机数避免2边同时发送,产生碰撞.加1是防止为0,意外停止定时器 */
StopArpCounter();
IPConflitTestFlag = TRUE; /* 进行IP冲突检测 */
ArpRequest(&IPAddress_buf[0]);
break;
case 13:
StartTimer(ucTimerNum,3000); /* 1分钟 */
if(++gusStopRun >= (6800 + (rand() & 0xff)))
{
memset(&gsaSystemTimer[0],0x00,sizeof(gsaSystemTimer));
EthernetLinkFlag = FALSE;
Led = OFF;
EA = FALSE; //关闭中断总开关
}
break;
case 11:
StopTimer(ucTimerNum);
break;
default:
break;
}
}
}
}
ET0 = FALSE; // 禁止timer0中断
gusMsTick = 0;
gbMSTick = FALSE;
ET0 = TRUE; // 使能timer0中断
}
/*********************************************************************
函数名: UWORK8 StartTimer( UWORK8 ucTimer, UWORK16 usTimerValue )
功能: 启动相对定时器
输入: ucTick
输出: None
返回: TRUE or FALSE
日期: 2004/02/09
*********************************************************************/
UWORK8 StartTimer( UWORK8 ucTimer, UWORK16 usTimerValue )
{
if( ucTimer >= 12 )
{
return ERROR;
}
gsaSystemTimer[ucTimer] = (usTimerValue << 1);
return OK;
}
/*********************************************************************
函数名: bit StopTimer( UWORK8 ucTimer )
功能: 停止相对定时器
输入: ucTick
输出: None
返回: TRUE or FALSE
日期: 2004/02/09
*********************************************************************/
bit StopTimer( UWORK8 ucTimer )
{
if( ucTimer >= 12 )
{
return FALSE;
}
gsaSystemTimer[ucTimer] = 0;
return TRUE;
}
/*********************************************************************
函数名: Serial0_ISR()
功能: 串口0中断接收/发送数据程序
输入: 有字符从超级终端输入
输出: 解释输入的字符
返回: None
日期: 2004/02/09
*********************************************************************/
void Serial0_ISR() interrupt 4 using 1
{
UWORK8 ucValue;
if (TRUE == RI)
{
ucValue = SBUF; /* 从串口0缓冲读一个字节 */
RI = FALSE; //清除串口接收中断标志
Rcv_flag = TRUE;
Rcv_buf[RcvCount] = ucValue;
RcvCount++;
RcvLen = RcvCount;
RcvDelayCount = 0;
}
else if(TRUE == TI) //发送处理程序 */
{
TI = FALSE; // 清除串口发送中断标志 /* 清发送中断标志 */
}
}
/*********************************************************************
函数名: void SerialSendStart(UWORK8 *pucData,UWORK8 ucSendLen)
功能: 启动串口发送
输入: 向空调发送命令
参数: 发送数据指针;数据长度
输出: 启动串口发送数据
返回: none
日期: 2007/01/26
*********************************************************************/
void SerialSendbuf(UWORK8 *pucData,UWORK16 ucSendLen)
{
UWORK16 m;
ES = FALSE; // 禁止串口中断
Rs485En = TRUE; //485通信使能
for(m = 0; m < ucSendLen; m++)
{
TI = 0;
SBUF = *pucData;
while(TI == 0);
pucData++;
}
Rs485En = FALSE; //485通信使能
ES = TRUE; // 使能串口中断
}
/*********************************************************************
函数名: ExInt0_ISR()
功能: INT0中断服务程序
输入: 以太网芯片发出中断请求
输出: 接收,发送数据
返回: None
日期: 2004/08/18
*********************************************************************/
void ExInt0_ISR() interrupt 0 using 2
{
UWORK8 ucValue,ucRtlCR;
_nop_();
_nop_();
IE0 = FALSE; // 清除外部中断0标志位
RTL8019asRead(RW0_CR,ucRtlCR); /* 保存CR */
Page0();
RTL8019asRead(RW0_ISR,ucValue); /* 读取中断状态寄存器 */
RTL8019asWrite(RW0_ISR,0xff); /* 必须清除掉所有中断标志 */
ucValue &= (RW0_ISR_TXE | RW0_ISR_RXE | RW0_ISR_PTX | RW0_ISR_PRX); /* 发送完成,接收完成和发送错误,接收错误中断 */
/* 处理中断寄存器,在此不封装成一个函数,因为涉及到调用的花销以及指定寄存器组 */
if(ucValue & RW0_ISR_PTX) /* 数据包发送正确无误 */
{
EthernetBuf0DataFlag = 0; // 清除缓冲0有数据标志
}
if(ucValue & RW0_ISR_PRX) /* 接收数据正确无误 */
{
RTL8019asRcvNum++;
}
if(ucValue & RW0_ISR_TXE) /* 发送出现错误 */
{
EthernetBuf0DataFlag = 0; //清除缓冲0有数据标志
}
RTL8019asWrite(RW0_CR,ucRtlCR); /* 处理中断结束,恢复CR*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -