Files
checker_slave/source/elec_det/driver/LGDriver.c

357 lines
7.7 KiB
C
Raw Normal View History

//-------------------------------------------------------------------------------------------------------
//本文件是雷管驱动的底层程序,不对外
//-------------------------------------------------------------------------------------------------------
#include "LGDriverAPI.h"
#include "LGDriver.h"
#include "board.h"
#define Long_Time 650
#define Short_Time 400
//============================================================================
//接收波形转换
//============================================================================
static void LG_Receive_Switch(void)
{
LGDRV_PHA_H();
Lib_delay_us(1000);
LGDRV_PHA_L();
Lib_delay_us(1000);
}
static u8 LG_ReceiveBit() //扫描用接收位
{
u8 ReturnBit = 0, ValueCnt = 0;
u16 OffsetTime = 0;
LGDRV_PHA_H();
ValueCnt = Lib_CountFeedBackData(&OffsetTime);
LGDRV_PHA_L(); //这个放到了Lib_CountFeedBackData里面了
if(ValueCnt > 0)
{
ReturnBit = 1;
PA11_1();
// if(950 > OffsetTime)
// Lib_delay_us(950 - OffsetTime);
// else
// Lib_delay_us(950);
Lib_delay_us(950);
PA11_0();
}
else
{
ReturnBit = 0;
// if(500 > OffsetTime)
// Lib_delay_us(500 - OffsetTime);
// else
// Lib_delay_us(500);
Lib_delay_us(500);
}
return ReturnBit;
}
//============================================================================
//发送一个字节
//输入参数:要发送的数据
//============================================================================
static void LG_SendByte(u8 dat)
{
u8 i;
u16 time_h, time_l;
for(i = 0; i < 8; i++)
{
if(dat & 0x80)
{
time_h = Short_Time;
time_l = Long_Time;
}
else
{
time_h = Long_Time;
time_l = Short_Time;
}
LGDRV_PHA_H();
Lib_delay_us(time_h);
LGDRV_PHA_L();
Lib_delay_us(time_l);
dat <<= 1;
}
}
//============================================================================
//发送一个字节 校时专用,仅高低时间和通用发送有差异
//输入参数:要发送的数据
//============================================================================
static void LG_SendByte_CaliTime(u16 dat)
{
u16 i;
//u16 time_h = 496 - Close_Pmos_Delay * 2, time_l = 496 - Open_Pmos_Delay * 2; //150ms=150ms 1000=1000.07 12000=12000.70
for(i = 0; i < dat; i++)
{
LGDRV_PHA_H();
Lib_delay_us(496);
LGDRV_PHA_L();
Lib_delay_us(Lib_SetDelayData(Lib_CaliTime));
Lib_ResetWdg();
}
}
//============================================================================
//接收一个字节
//返回值:接收到的数据
//============================================================================
static u8 LG_ReceiveByte(void)
{
u8 BitValue, ReturnData = 0, i;
for (i = 0; i < 8; i++)
{
BitValue = LG_ReceiveBit();
ReturnData <<= 1;
ReturnData += BitValue;
}
return ReturnData;
}
//============================================================================
//接收参数
//返回值:接收到的数据
//============================================================================
u8 LG_ReceiveParameter(u8 *Parameter, u8 Length)
{
u8 i = 0;
u8 ret = 0;
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(1);
//接收转换
LG_Receive_Switch();
for(i = 0; i < Length; i++)
{
Parameter[i] = LG_ReceiveByte();
}
ret = LG_ReceiveBit();
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(0);
LGDRV_PHA_H();
return ret;
}
//接收单bitAck
u8 LG_ReceiveAck(void)
{
u8 ret = 0;
u8 i;
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(1);
//接收转换
LG_Receive_Switch();
for(i = 0; i < 1; i++)
{
ret += LG_ReceiveBit();
}
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(0);
LGDRV_PHA_H();
return ret;
}
//接收单bit数据
u16 LG_ReceiveSingleBit(u8 *Parameter, u16 Length, u8 bit)
{
u16 i;
u8 j = 0;
u16 ret = 0;
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(1);
//接收转换
LG_Receive_Switch();
for(i = 0; i < Length; i++)
{
j = LG_ReceiveBit();
if(j > 0)
{
Parameter[i] |= bit;
ret++;
}
else
{
Parameter[i] &= ~bit;
}
}
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(0);
LGDRV_PHA_H();
return ret;
}
//延时起爆波形:总计发送660个波形雷管数量状态位+补发波形 总计660个波形 雷管累计到652个波形会起爆
u16 LG_ReceiveDetBomming(u8 *pStatus, u16 Length, u8 allow)
{
u16 j = 0;
u16 i = 0;
u16 ret = 0, tmp = 0;
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(0);
//接收转换
LG_Receive_Switch();
//按实际雷管数据接收数据位
for(i = 0; i < (Length + 1); i++)
{
j = LG_ReceiveBit();
if(j > 0)
{
tmp++;
//记录起爆反馈状态
pStatus[i] |= 0x04; //cBoomStatus
}
else
{
//记录起爆反馈状态
pStatus[i] &= ~0x04; //~cBoomStatus
}
}
//存储实际雷管数量
ret = tmp;
//OUTA输出高低电压标志 1:输出电压 0:输出高电压
Lib_SetPowerOutAhSwitch(0);
//起爆数量不对 且 不允许起爆JQ版本
#if 0
//直接起爆不判断数量YM版本
if((Length > tmp) && ((Length - tmp) > allow))
{
//中止起爆,主循环查询更新状态
LGDRV_PHA_H();
return ret;
}
#endif
//预留2 0正常模式真实对码真实起爆1真实对码模拟起爆2全0对码真实起爆3全0对码模拟起爆
if((1 == ConfigData.Reserved2) || (3 == ConfigData.Reserved2))
{
if(0xFF == allow)
{
LGDRV_PHA_H();
return ret;
}
}
for(i = 0; i < (660 - (Length + 1)); i++) //必爆651 发送660
{
LGDRV_PHA_H();
Lib_delay_us(600);
LGDRV_PHA_L();
Lib_delay_us(400);
Lib_ResetWdg();
}
LGDRV_PHA_H();
return ret;
}
//发送延时起爆用来清除波形计数--接收1个bit
void LG_CleanWave_Receive(void)
{
//接收转换
LG_Receive_Switch();
LG_ReceiveBit();
}
//============================================================================
//发送功能指令
//输入参数:要发送的功能码数据
//============================================================================
void LG_SendCommand(u8 Function, u8 *Parameter, u8 Length)
{
u8 i = 0;
LGDRV_PHA_H();
Lib_delay_ms(11);
/*******开始信号********/
LGDRV_PHA_L();
Lib_delay_us(1500);
LGDRV_PHA_H();
/***********************/
LG_SendByte(Function);//发送指令
for(i = 0; i < Length; i++)
{
LG_SendByte(Parameter[i]);//发送参数
}
LGDRV_PHA_H();
}
//校时指令
void LG_SendCorrectTimeCommand(u8 Function, u16 time)
{
LGDRV_PHA_H();
Lib_delay_ms(11);
LGDRV_PHA_L();
Lib_delay_us(1500);
LGDRV_PHA_H();
LG_SendByte(Function);
time += 100;
LG_SendByte_CaliTime(time);
LGDRV_PHA_H();
}