357 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
//-------------------------------------------------------------------------------------------------------
 | 
						||
//本文件是雷管驱动的底层程序,不对外
 | 
						||
//-------------------------------------------------------------------------------------------------------
 | 
						||
 | 
						||
#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();
 | 
						||
}
 |