Files
checker_slave/source/elec_det/driver/LGDriver.c
2023-10-06 18:47:05 +08:00

357 lines
7.7 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 "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();
}