Files
CMS79F5335_Demo/范例程序(C语言)/IH-CMS79F53X5-C-V1.0/Communicate.c
2026-10-19 15:33:00 +08:00

498 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**************************************************************************
**************************************************************************/
#include "Define_Global.h"
#if !_MODE_IHDEBUG_ && !_MODE_COMM_NO_
/**************************************************************************
* 函数名称:Communicate
* 函数功能:芯片通信
* 入口参数:无
* 出口参数:无
* 备 注:中断调用
**************************************************************************/
void Communicate()
{
//收码相关寄存器定义
static unsigned char TimeRece_High,TimeRece_Low,CountRece;
static CommType DataRece;
static bit B_Rece_Old;
//发码相关寄存器定义
static unsigned char TimeSend,CountSend;
static CommType DataSend;
static bit B_Send_Start,B_Send_Bak;
volatile unsigned char i;
/**********************************************************************
收码
**********************************************************************/
if(!B_Comm_No) //无通信,不收码
{
if(!Pin_CommIn && !Pin_CommIn && !Pin_CommIn && !Pin_CommIn && !Pin_CommIn)
{
TimeRece_Low++; //低电平计时
if(!B_Rece_Old)
{
TimeRece_High = 0;
}
else
{ //下降沿接收数据
B_Rece_Old = 0; //收码电平旧值(低)
if(1 == TimeRece_Low)
{ //第一次下降沿
CountRece = 32;
}
else
{ //非第一次下降沿
DataRece.all <<= 1;
if(TimeRece_Low >= TimeRece_High)
{ //低电平>高电平为1,否则为0
DataRece.one[0] |= 0x01;
}
TimeRece_High = 0;
TimeRece_Low = 1;
if(0 == --CountRece)
{
B_Deal_DataRece = 1; //收码数据处理
Buf_DataRece[3] = DataRece.one[3];
Buf_DataRece[2] = DataRece.one[2];
Buf_DataRece[1] = DataRece.one[1];
Buf_DataRece[0] = DataRece.one[0];
}
}
}
}
else if(Pin_CommIn && Pin_CommIn && Pin_CommIn && Pin_CommIn && Pin_CommIn)
{
B_Rece_Old = 1; //收码电平旧值(高)
if(TimeRece_High >= 5000/C_TimeUS_Int) //5ms
{ //长时间高电平,重新收码
TimeRece_Low = 0;
CountRece = 32;
}
else
{
TimeRece_High++; //高电平计时
}
}
}
/**********************************************************************
发码
**********************************************************************/
if(B_Comm_Have) //有通信,才发码
{
if(B_Send_Start)
{
if(0 == --TimeSend)
{ //已发完一位码
Pin_CommOut = 0; //输出低电平
if(0 == CountSend)
{
B_Send_Start = 0; //发码完成
TimeSend = 0;
}
else
{ //发送下一位数据
CountSend--;
TimeSend = 2000/C_TimeUS_Int; //2ms
if(DataSend.one[3] & 0x80)
{
B_Send_Bak = 1; //发1
}
else
{
B_Send_Bak = 0; //发0
}
DataSend.all <<= 1;
}
}
else
{ //还没有发完一位码
if(B_Send_Bak)
{
i = 500/C_TimeUS_Int; //0.5ms
}
else
{
i = 1500/C_TimeUS_Int; //1.5ms
}
if(TimeSend > i)
{
Pin_CommOut = 0; //输出低电平
}
else
{
Pin_CommOut = 1; //输出高电平
}
}
}
else
{
if(TimeSend >= 10000/C_TimeUS_Int) //10ms
{
B_Send_Start = 1; //发码开始
TimeSend = 1;
CountSend = 32; //发码数据位数:32bit
DataSend.one[3] = Buf_DataSend[3];
DataSend.one[2] = Buf_DataSend[2];
DataSend.one[1] = Buf_DataSend[1];
DataSend.one[0] = Buf_DataSend[0];
B_Refrsh_DataSend = 1; //发码数据刷新
}
else
{
TimeSend++;
}
if(TimeSend >= 500/C_TimeUS_Int) //0.5ms
{
Pin_CommOut = 1; //输出高电平
}
else
{
Pin_CommOut = 0; //输出低电平
}
}
}
}
/**************************************************************************
* 函数名称:Deal_CommData
* 函数功能:通信数据处理
* 入口参数:无
* 出口参数:无
* 备 注:主循环调用
**************************************************************************/
void Deal_CommData()
{
static unsigned int Time_NoComm;
static unsigned char Num_CommSend;
volatile unsigned char i,j;
/**********************************************************************
发码数据处理
**********************************************************************/
if(B_Comm_Have && B_Refrsh_DataSend)
{ //发码数据刷新
i = 0;
if(B_Pan_Error) SetBit(i,0); //检锅故障(未接线盘)
if(B_Pan_No) SetBit(i,1); //无锅
if(B_Pan_Have) SetBit(i,2); //有锅
if(B_Pan_Steel) SetBit(i,3); //钢锅
if(B_Pan_Iron) SetBit(i,4); //铁锅
if(B_Zero_No) SetBit(i,5); //无过零
if(B_Zero_60Hz) SetBit(i,6); //过零频率 = 60Hz
if(B_Protect_BackPress) SetBit(i,7); //过压保护
Status1_Work = i; //刷新工作状态1
//-----------------------------------------------------------------
i = 0;
if(B_Protect_Stop) SetBit(i,0); //保护停止加热
if(B_PPGStop_CheckPan) SetBit(i,1); //加热暂停但检锅
if(B_PPGStop_NoCheck) SetBit(i,2); //加热暂停不检锅
if(Status_PPGDP & 0x02) SetBit(i,3); //抖频开启
if(Status_LxLow & 0x02) SetBit(i,4); //连续低功率开启
Status2_Work = i; //刷新工作状态2
//-----------------------------------------------------------------
switch(Num_CommSend)
{
case 0:
{
Buf_DataSend[3] = 0xA0; //命令字
Buf_DataSend[2] = Status1_Work; //工作状态1
Buf_DataSend[1] = Status2_Work; //工作状态2
}
break;
case 1:
{
Buf_DataSend[3] = 0xA1; //命令字
Buf_DataSend[2] = Flag1_Error; //硬件故障标志1
Buf_DataSend[1] = Flag2_Error; //硬件故障标志2
}
break;
case 2:
{
Buf_DataSend[3] = 0xA2; //命令字
Buf_DataSend[2] = Status_PPGStop; //保护状态
i = (AD_Volatage >> 4) & 0xF0; //市电电压AD(高4位)
i |= (AD_Current >> 8) & 0x0F; //工作电流AD(高4位)
Buf_DataSend[1] = i;
}
break;
case 3:
{
Buf_DataSend[3] = 0xA3; //命令字
Buf_DataSend[2] = AD_Volatage; //市电电压AD(低8位)
Buf_DataSend[1] = AD_Current; //工作电流AD(低8位)
}
break;
case 4:
{
Buf_DataSend[3] = 0xA4; //命令字
Buf_DataSend[2] = AD_TmprPan; //锅底温度AD
Buf_DataSend[1] = AD_TmprIgbt; //IGBT温度AD
}
break;
case 5:
{
Buf_DataSend[3] = 0xA5; //命令字
Buf_DataSend[2] = AD_TmprTop; //顶部温度AD
Buf_DataSend[1] = AD_VRef; //内部基准电压(1.2V)AD
}
break;
case 6:
{
Buf_DataSend[3] = 0xA6; //命令字
Buf_DataSend[2] = Vol.flo.integer; //市电电压 - 80V
Buf_DataSend[1] = Count_Syn; //检锅振荡个数
}
break;
case 7:
{
Buf_DataSend[3] = 0xA7; //命令字
Buf_DataSend[2] = Time_Syn >> 8; //检锅振荡脉宽(高8位)
Buf_DataSend[1] = Time_Syn; //检锅振荡脉宽(低8位)
}
break;
case 8:
{
Buf_DataSend[3] = 0xA8; //命令字
Buf_DataSend[2] = PowerReal >> 8; //实际输出功率(高8位)
Buf_DataSend[1] = PowerReal; //实际输出功率(低8位)
}
break;
case 9:
{
Buf_DataSend[3] = 0xA9; //命令字
Buf_DataSend[2] = Buf_PPGTMR >> 8; //当前PPG导通值(高8位)
Buf_DataSend[1] = Buf_PPGTMR; //当前PPG导通值(低8位)
}
break;
case 10:
{
Buf_DataSend[3] = 0xAA; //命令字
Buf_DataSend[2] = Count_BackPress >> 8; //1级过压保护计数(高8位)
Buf_DataSend[1] = Count_BackPress; //1级过压保护计数(低8位)
}
break;
case 11:
{
Buf_DataSend[3] = 0xAB; //命令字
Buf_DataSend[2] = Count_IgbtProtect >> 8; //IGBT硬件保护计数(高8位)
Buf_DataSend[1] = Count_IgbtProtect; //IGBT硬件保护计数(低8位)
}
break;
case 12:
{
Buf_DataSend[3] = 0xAC; //命令字
Buf_DataSend[2] = Elec.flo.integer; //电量高位
Buf_DataSend[1] = Elec.flo.radix; //电量低位
}
break;
default:break;
}
i = (unsigned)Buf_DataSend[1] + Buf_DataSend[2] + Buf_DataSend[3];
Buf_DataSend[0] = (unsigned)~i; //校验和
//-----------------------------------------------------------------
B_Refrsh_DataSend = 0; //发码数据刷新完成
if(++Num_CommSend >= 13) //发码切换
{
Num_CommSend = 0;
}
}
/**********************************************************************
收码数据处理
**********************************************************************/
if(!B_Comm_No && B_Deal_DataRece)
{
B_Deal_DataRece = 0; //收码数据处理完成
i = (unsigned)Buf_DataRece[1] + Buf_DataRece[2] + Buf_DataRece[3];
i = (unsigned)~i;
j = (unsigned)Buf_DataRece[3] & 0xF0;
if((i == Buf_DataRece[0]) && ((0xB0 == j) || (0xD0 == j))) //数据校验
{
B_Comm_Have = 1; //有通信
B_Comm_Error = 0; //清通信故障标志
Time_NoComm = 0; //清无通信计时
if(0xB0 == Buf_DataRece[3])
{
Flag1_Work = Buf_DataRece[2]; //工作标志1
Flag2_Work = Buf_DataRece[1]; //工作标志2
}
else if(0xB1 == Buf_DataRece[3])
{
PowerWork = Buf_DataRece[2]; //加热功率值
}
else if(0xB2 == Buf_DataRece[3])
{
Num_LxLowOn = Buf_DataRece[2]; //连续低功率开个数
Num_LxLowOff = Buf_DataRece[1]; //连续低功率关个数
}
else if(0xD0 == Buf_DataRece[3])
{
i = (unsigned)~Buf_DataRece[1];
if(Buf_DataRece[2] == i)
{
SlopeCurr_Adjust = Buf_DataRece[2]; //电流斜率调整值
}
}
}
//-----------------------------------------------------------------
if(TestOne(Flag1_Work,0))
{
B_Heat_En = 1; //加热使能
B_Fan_En = 1; //风扇使能
}
else
{
B_Heat_En = 0; //加热关闭
B_Fan_En = 0; //风扇关闭
}
if(TestOne(Flag1_Work,1))
{
B_Fan_En = 1; //风扇使能
}
else
{
B_Fan_En = 0; //风扇关闭
}
if(TestOne(Flag1_Work,2))
{
B_Buzz_En = 1; //蜂鸣器使能
}
else
{
B_Buzz_En = 0; //蜂鸣器关闭
}
if(TestOne(Flag1_Work,3))
{
if(!B_Buzz_Out)
{
Buzz_Short_One(); //蜂鸣器短鸣1声(200ms)
}
}
if(TestOne(Flag1_Work,4))
{
if(!B_Buzz_Out)
{
Buzz_Long_One(); //蜂鸣器长鸣1声(400ms)
}
}
if(TestOne(Flag1_Work,5))
{
B_HeatStop_CheckPan = 1; //不加热但检锅
}
else
{
B_HeatStop_CheckPan = 0;
}
if(TestOne(Flag1_Work,6))
{
B_HeatStop_NoCheck = 1; //不加热不检锅
}
else
{
B_HeatStop_NoCheck = 0;
}
if(TestOne(Flag1_Work,7))
{
B_PPGDP_Dis = 1; //PPG抖频禁止
}
else
{
B_PPGDP_Dis = 0;
}
//-----------------------------------------------------------------
if(TestOne(Flag2_Work,0))
{
B_PanOver_Dis = 1; //锅底NTC超温判断禁止
}
else
{
B_PanOver_Dis = 0;
}
if(TestOne(Flag2_Work,1))
{
B_PanFail_Dis = 1; //锅底NTC失效判断禁止
}
else
{
B_PanFail_Dis = 0;
}
if(TestOne(Flag2_Work,7))
{
B_PPGDP_Can = 1; //PPG抖频强制使能
}
else
{
B_PPGDP_Can = 0;
}
}
/**********************************************************************
通信状态确认
**********************************************************************/
if(B_Comm_Have)
{ //已确认有通信
if(++Time_NoComm > 2000/C_TimeMS_Main) //2s
{
Time_NoComm = 0;
B_Comm_Error = 1; //通信故障
Buzz_Short_One(); //蜂鸣器短鸣1声
}
}
else if(!B_Comm_No)
{ //未确认有无通信
if(++Time_NoComm > 250/C_TimeMS_Main) //250ms
{
Time_NoComm = 0;
B_Comm_No = 1; //无通信
}
}
else
{ //已确认无通信
Time_NoComm = 0;
}
}
/**************************************************************************
**************************************************************************/
#endif