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();
 | ||
| }
 | 
