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