diff --git a/coder_2channel.uvoptx b/checher_slave.uvoptx similarity index 88% rename from coder_2channel.uvoptx rename to checher_slave.uvoptx index d0daa00..a38ef89 100644 --- a/coder_2channel.uvoptx +++ b/checher_slave.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 4 + 0 @@ -114,18 +114,18 @@ - Segger\JL2CM3.dll + BIN\UL2CM3.DLL 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM) + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 JL2CM3 - -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM) + -U69655983 -O78 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM) 0 @@ -499,7 +499,7 @@ core - 1 + 0 0 0 0 @@ -891,6 +891,18 @@ 0 0 + + 4 + 33 + 1 + 0 + 0 + 0 + .\source\interface\if_can.c + if_can.c + 0 + 0 + @@ -901,7 +913,7 @@ 0 5 - 33 + 34 1 0 0 @@ -913,7 +925,7 @@ 5 - 34 + 35 1 0 0 @@ -925,7 +937,7 @@ 5 - 35 + 36 1 0 0 @@ -937,6 +949,218 @@ + + elec_det + 1 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + .\source\elec_det\base\delay.c + delay.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + .\source\elec_det\base\utility.c + utility.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\adc_cfg.c + adc_cfg.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\dac_cfg.c + dac_cfg.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\gpio_cfg.c + gpio_cfg.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\hardware.c + hardware.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\jw3425iic.c + jw3425iic.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\power.c + power.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + .\source\elec_det\hardware\timer_cfg.c + timer_cfg.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + .\source\elec_det\driver\EWDriver.c + EWDriver.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + .\source\elec_det\driver\JQDriver.c + JQDriver.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + .\source\elec_det\driver\LGDriver.c + LGDriver.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + .\source\elec_det\driver\XTDriver.c + XTDriver.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + .\source\elec_det\interface\BaseChecker.c + BaseChecker.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + .\source\elec_det\interface\JQChecker.c + JQChecker.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + .\source\elec_det\interface\XTChecker.c + XTChecker.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + .\source\elec_det\elec_det.c + elec_det.c + 0 + 0 + + + rtt 0 @@ -944,8 +1168,8 @@ 0 0 - 6 - 36 + 7 + 54 1 0 0 @@ -956,8 +1180,8 @@ 0 - 6 - 37 + 7 + 55 1 0 0 @@ -976,8 +1200,8 @@ 0 0 - 7 - 38 + 8 + 56 1 0 0 @@ -988,8 +1212,8 @@ 0 - 7 - 39 + 8 + 57 1 0 0 @@ -1000,8 +1224,8 @@ 0 - 7 - 40 + 8 + 58 1 0 0 @@ -1012,8 +1236,8 @@ 0 - 7 - 41 + 8 + 59 1 0 0 @@ -1024,8 +1248,8 @@ 0 - 7 - 42 + 8 + 60 1 0 0 @@ -1036,8 +1260,8 @@ 0 - 7 - 43 + 8 + 61 1 0 0 @@ -1048,8 +1272,8 @@ 0 - 7 - 44 + 8 + 62 1 0 0 @@ -1060,8 +1284,8 @@ 0 - 7 - 45 + 8 + 63 1 0 0 @@ -1072,8 +1296,8 @@ 0 - 7 - 46 + 8 + 64 1 0 0 @@ -1084,8 +1308,8 @@ 0 - 7 - 47 + 8 + 65 1 0 0 @@ -1096,8 +1320,8 @@ 0 - 7 - 48 + 8 + 66 1 0 0 @@ -1108,8 +1332,8 @@ 0 - 7 - 49 + 8 + 67 1 0 0 @@ -1120,8 +1344,8 @@ 0 - 7 - 50 + 8 + 68 1 0 0 @@ -1132,8 +1356,8 @@ 0 - 7 - 51 + 8 + 69 1 0 0 @@ -1144,8 +1368,8 @@ 0 - 7 - 52 + 8 + 70 1 0 0 @@ -1156,8 +1380,8 @@ 0 - 7 - 53 + 8 + 71 1 0 0 @@ -1168,8 +1392,8 @@ 0 - 7 - 54 + 8 + 72 1 0 0 @@ -1180,8 +1404,8 @@ 0 - 7 - 55 + 8 + 73 1 0 0 @@ -1192,8 +1416,8 @@ 0 - 7 - 56 + 8 + 74 2 0 0 @@ -1207,13 +1431,13 @@ soft - 1 + 0 0 0 0 - 8 - 57 + 9 + 75 1 0 0 @@ -1224,8 +1448,8 @@ 0 - 8 - 58 + 9 + 76 1 0 0 @@ -1236,8 +1460,8 @@ 0 - 8 - 59 + 9 + 77 1 0 0 @@ -1248,8 +1472,8 @@ 0 - 8 - 60 + 9 + 78 1 0 0 @@ -1260,8 +1484,8 @@ 0 - 8 - 61 + 9 + 79 1 0 0 @@ -1272,8 +1496,8 @@ 0 - 8 - 62 + 9 + 80 1 0 0 @@ -1284,8 +1508,8 @@ 0 - 8 - 63 + 9 + 81 1 0 0 @@ -1296,8 +1520,8 @@ 0 - 8 - 64 + 9 + 82 1 0 0 @@ -1308,8 +1532,8 @@ 0 - 8 - 65 + 9 + 83 1 0 0 @@ -1320,8 +1544,8 @@ 0 - 8 - 66 + 9 + 84 1 0 0 @@ -1332,8 +1556,8 @@ 0 - 8 - 67 + 9 + 85 1 0 0 @@ -1352,20 +1576,8 @@ 0 0 - 9 - 68 - 1 - 0 - 0 - 0 - .\source\task\prot_mcu.c - prot_mcu.c - 0 - 0 - - - 9 - 69 + 10 + 86 1 0 0 @@ -1376,20 +1588,8 @@ 0 - 9 - 70 - 1 - 0 - 0 - 0 - .\source\task\moter.c - moter.c - 0 - 0 - - - 9 - 71 + 10 + 87 1 0 0 @@ -1400,8 +1600,8 @@ 0 - 9 - 72 + 10 + 88 1 0 0 @@ -1412,32 +1612,8 @@ 0 - 9 - 73 - 1 - 0 - 0 - 0 - .\source\task\tran_for_checker.c - tran_for_checker.c - 0 - 0 - - - 9 - 74 - 1 - 0 - 0 - 0 - .\source\task\tran_for_coder2.c - tran_for_coder2.c - 0 - 0 - - - 9 - 75 + 10 + 89 1 0 0 @@ -1448,44 +1624,8 @@ 0 - 9 - 76 - 1 - 0 - 0 - 0 - .\source\task\handle.c - handle.c - 0 - 0 - - - 9 - 77 - 1 - 0 - 0 - 0 - .\source\task\handle_for_checker.c - handle_for_checker.c - 0 - 0 - - - 9 - 78 - 1 - 0 - 0 - 0 - .\source\task\handle_for_coder.c - handle_for_coder.c - 0 - 0 - - - 9 - 79 + 10 + 90 1 0 0 @@ -1496,26 +1636,14 @@ 0 - 9 - 80 + 10 + 91 1 0 0 0 - .\source\task\process.c - process.c - 0 - 0 - - - 9 - 81 - 1 - 0 - 0 - 0 - .\source\task\input.c - input.c + .\source\task\tran_for_slave.c + tran_for_slave.c 0 0 @@ -1528,8 +1656,8 @@ 0 0 - 10 - 82 + 11 + 92 1 0 0 @@ -1543,13 +1671,13 @@ coder - 1 + 0 0 0 0 - 11 - 83 + 12 + 93 1 0 0 @@ -1560,8 +1688,8 @@ 0 - 11 - 84 + 12 + 94 1 0 0 @@ -1572,8 +1700,8 @@ 0 - 11 - 85 + 12 + 95 1 0 0 @@ -1584,8 +1712,8 @@ 0 - 11 - 86 + 12 + 96 1 0 0 @@ -1596,8 +1724,8 @@ 0 - 11 - 87 + 12 + 97 1 0 0 @@ -1608,8 +1736,8 @@ 0 - 11 - 88 + 12 + 98 1 0 0 @@ -1628,8 +1756,8 @@ 0 0 - 12 - 89 + 13 + 99 5 0 0 @@ -1648,8 +1776,8 @@ 0 0 - 13 - 90 + 14 + 100 5 0 0 @@ -1660,8 +1788,8 @@ 0 - 13 - 91 + 14 + 101 5 0 0 diff --git a/coder_2channel.uvprojx b/checher_slave.uvprojx similarity index 90% rename from coder_2channel.uvprojx rename to checher_slave.uvprojx index 3c1a6d4..e8a35b5 100644 --- a/coder_2channel.uvprojx +++ b/checher_slave.uvprojx @@ -10,20 +10,20 @@ app 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 - STM32F103RE + STM32F103RC STMicroelectronics Keil.STM32F1xx_DFP.2.1.0 http://www.keil.com/pack/ - IRAM(0x20000000,0x10000) IROM(0x08000000,0x80000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + IRAM(0x20000000,0xC000) IROM(0x08000000,0x40000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RE$Flash\STM32F10x_512.FLM)) + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)) 0 - $$Device:STM32F103RE$Device\Include\stm32f10x.h + $$Device:STM32F103RC$Device\Include\stm32f10x.h @@ -33,7 +33,7 @@ - $$Device:STM32F103RE$SVD\STM32F103xx.svd + $$Device:STM32F103RC$SVD\STM32F103xx.svd 0 0 @@ -49,7 +49,7 @@ 1 .\Objects\app\ - coder_2channel_app + checker_slave_app 1 0 1 @@ -138,7 +138,7 @@ 1 BIN\UL2CM3.DLL - "" () + @@ -185,6 +185,7 @@ 0 0 0 + 0 0 0 8 @@ -245,12 +246,12 @@ 0 0x20000000 - 0x10000 + 0xc000 1 0x8000000 - 0x80000 + 0x40000 0 @@ -275,7 +276,7 @@ 1 0x8004000 - 0x80000 + 0x40000 1 @@ -300,7 +301,7 @@ 0 0x20000020 - 0x10000 + 0xc000 0 @@ -338,7 +339,7 @@ --diag_suppress=550,177 --locale=english STM32F10X_HD,USE_STDPERIPH_DRIVER,RT_THREAD - .\source\interface;.\source\core;.\source\stm32lib\inc;.\source\main;.\source\RTT;.\source\rt_thread\include;.\source\rt_thread;.\source\soft;.\source\task;.\source\dev;.\source\codec;.\source\coder + .\source\interface;.\source\core;.\source\stm32lib\inc;.\source\main;.\source\RTT;.\source\rt_thread\include;.\source\rt_thread;.\source\soft;.\source\task;.\source\dev;.\source\codec;.\source\coder;.\source\elec_det @@ -351,7 +352,7 @@ 0 0 0 - 0 + 4 @@ -557,6 +558,11 @@ 1 .\source\interface\if_gpioout.c + + if_can.c + 1 + .\source\interface\if_can.c + @@ -579,6 +585,147 @@ + + elec_det + + + delay.c + 1 + .\source\elec_det\base\delay.c + + + utility.c + 1 + .\source\elec_det\base\utility.c + + + adc_cfg.c + 1 + .\source\elec_det\hardware\adc_cfg.c + + + dac_cfg.c + 1 + .\source\elec_det\hardware\dac_cfg.c + + + gpio_cfg.c + 1 + .\source\elec_det\hardware\gpio_cfg.c + + + hardware.c + 1 + .\source\elec_det\hardware\hardware.c + + + jw3425iic.c + 1 + .\source\elec_det\hardware\jw3425iic.c + + + power.c + 1 + .\source\elec_det\hardware\power.c + + + timer_cfg.c + 1 + .\source\elec_det\hardware\timer_cfg.c + + + EWDriver.c + 1 + .\source\elec_det\driver\EWDriver.c + + + JQDriver.c + 1 + .\source\elec_det\driver\JQDriver.c + + + LGDriver.c + 1 + .\source\elec_det\driver\LGDriver.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + XTDriver.c + 1 + .\source\elec_det\driver\XTDriver.c + + + BaseChecker.c + 1 + .\source\elec_det\interface\BaseChecker.c + + + JQChecker.c + 1 + .\source\elec_det\interface\JQChecker.c + + + XTChecker.c + 1 + .\source\elec_det\interface\XTChecker.c + + + elec_det.c + 1 + .\source\elec_det\elec_det.c + + + rtt @@ -757,21 +904,11 @@ task - - prot_mcu.c - 1 - .\source\task\prot_mcu.c - prot_uc.c 1 .\source\task\prot_uc.c - - moter.c - 1 - .\source\task\moter.c - commend.c 1 @@ -782,50 +919,20 @@ 1 .\source\task\transmit.c - - tran_for_checker.c - 1 - .\source\task\tran_for_checker.c - - - tran_for_coder2.c - 1 - .\source\task\tran_for_coder2.c - tran_for_coder2ch.c 1 .\source\task\tran_for_coder2ch.c - - handle.c - 1 - .\source\task\handle.c - - - handle_for_checker.c - 1 - .\source\task\handle_for_checker.c - - - handle_for_coder.c - 1 - .\source\task\handle_for_coder.c - mod_signals.c 1 .\source\task\mod_signals.c - process.c + tran_for_slave.c 1 - .\source\task\process.c - - - input.c - 1 - .\source\task\input.c + .\source\task\tran_for_slave.c @@ -956,7 +1063,7 @@ boot 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 @@ -995,7 +1102,7 @@ 1 .\Objects\boot\ - coder_2channel_boot + checker_slave_boot 1 0 1 @@ -1131,6 +1238,7 @@ 0 0 0 + 0 0 0 8 @@ -1297,7 +1405,7 @@ 0 0 0 - 0 + 4 @@ -1605,6 +1713,62 @@ 1 .\source\interface\if_gpioout.c + + if_can.c + 1 + .\source\interface\if_can.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + @@ -1627,6 +1791,165 @@ + + elec_det + + + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + delay.c + 1 + .\source\elec_det\base\delay.c + + + utility.c + 1 + .\source\elec_det\base\utility.c + + + adc_cfg.c + 1 + .\source\elec_det\hardware\adc_cfg.c + + + dac_cfg.c + 1 + .\source\elec_det\hardware\dac_cfg.c + + + gpio_cfg.c + 1 + .\source\elec_det\hardware\gpio_cfg.c + + + hardware.c + 1 + .\source\elec_det\hardware\hardware.c + + + jw3425iic.c + 1 + .\source\elec_det\hardware\jw3425iic.c + + + power.c + 1 + .\source\elec_det\hardware\power.c + + + timer_cfg.c + 1 + .\source\elec_det\hardware\timer_cfg.c + + + EWDriver.c + 1 + .\source\elec_det\driver\EWDriver.c + + + JQDriver.c + 1 + .\source\elec_det\driver\JQDriver.c + + + LGDriver.c + 1 + .\source\elec_det\driver\LGDriver.c + + + XTDriver.c + 1 + .\source\elec_det\driver\XTDriver.c + + + BaseChecker.c + 1 + .\source\elec_det\interface\BaseChecker.c + + + JQChecker.c + 1 + .\source\elec_det\interface\JQChecker.c + + + XTChecker.c + 1 + .\source\elec_det\interface\XTChecker.c + + + elec_det.c + 1 + .\source\elec_det\elec_det.c + + + rtt @@ -2583,7 +2906,7 @@ 2 2 2 - 2 + 0 @@ -3125,7 +3448,7 @@ 2 2 2 - 2 + 0 @@ -3136,21 +3459,11 @@ - - prot_mcu.c - 1 - .\source\task\prot_mcu.c - prot_uc.c 1 .\source\task\prot_uc.c - - moter.c - 1 - .\source\task\moter.c - commend.c 1 @@ -3161,50 +3474,20 @@ 1 .\source\task\transmit.c - - tran_for_checker.c - 1 - .\source\task\tran_for_checker.c - - - tran_for_coder2.c - 1 - .\source\task\tran_for_coder2.c - tran_for_coder2ch.c 1 .\source\task\tran_for_coder2ch.c - - handle.c - 1 - .\source\task\handle.c - - - handle_for_checker.c - 1 - .\source\task\handle_for_checker.c - - - handle_for_coder.c - 1 - .\source\task\handle_for_coder.c - mod_signals.c 1 .\source\task\mod_signals.c - process.c + tran_for_slave.c 1 - .\source\task\process.c - - - input.c - 1 - .\source\task\input.c + .\source\task\tran_for_slave.c @@ -3269,7 +3552,7 @@ 2 2 2 - 2 + 0 @@ -3348,7 +3631,7 @@ 2 2 2 - 2 + 0 @@ -3426,4 +3709,13 @@ + + + + checher_slave + 1 + + + + diff --git a/source/ReadMe.txt b/source/ReadMe.txt index 33258f4..ce794f3 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -177,6 +177,7 @@ 心跳数据在收到回复之后也会继续发送 芯片异常时不检测电容 str_is_print_str 函数中,len为0时返回0 - +2023.10.6 + 移植与雷管通信相关代码,编译通过 \ No newline at end of file diff --git a/source/codec/codec.c b/source/codec/codec.c index 5fea64b..b8e2bdd 100644 --- a/source/codec/codec.c +++ b/source/codec/codec.c @@ -12,6 +12,7 @@ #include "crc.h" #include "dev_flash.h" #include "codec.h" +#include "elec_det.h" @@ -199,6 +200,76 @@ protuc_codec_export(ym_coder,protu_decode2,protu_encode2); +// 小板协议解码 +array_def *protm_decode(protu_def *p,array_def *data) +{ + array_def *r=arr_creat(); + param_check(r); + str_set(p->str_err,"ok"); + if(arr_length(data)<10) + { + DBG_WARN("recv data len too less."); + DBG_WARN("data=%s",str_temp(arr_string(data))); + str_set(p->str_err,"recv data len too less."); + return r; + } + uint8_t src=arr_get(data,4); + uint8_t dst=arr_get(data,5); + if((src!=0)||(dst!=elec_local_addr())){ + DBG_WARN("src_addr/dst_addr not allowed."); + DBG_WARN("data=%s",str_temp(arr_string(data))); + str_set(p->str_err,"src_addr/dst_addr not allowed."); + return r; + } + uint16_t len=arr_get(data,2)|(arr_get(data,3)<<8); + uint8_t crc=crc_crc8(arr_data(data),arr_length(data)-1); + if(len!=arr_length(data)) + { + // 如果长度不相等则产生了数据丢失 + DBG_WARN("recv data have lossed."); + str_set(p->str_err,"recv data have lossed."); + return r; + } + uint16_t no=arr_get(data,7)|(arr_get(data,8)<<8); + uint16_t h_no=p->cmd_no; + if(no!=h_no) + { + // 发送一条指令等待其返回,此时流水号应相同 + //DBG_WARN("slave_addr=%d cmd_no error:h_no=%d,no=%d.",src,h_no,no); + //str_set(p->str_err,"cmd no err."); + //return r; + } + if(crc!=arr_get(data,-1)) + { + DBG_WARN("recv data crc check error:%02x,%02x.",crc,arr_get(data,-1)); + str_set(p->str_err,"crc check err."); + } + p->cmd=arr_get(data,6); + arr_delete(r); + return arr_mid(data,9,len-10); +} +// 编码 +array_def *protm_encode(protu_def *p,array_def *data) +{ + array_def *t=arr_creat(); + param_check(t); + uint16_t len=arr_length(data)+10; + arr_append(t,'Y'); + arr_append(t,'e'); + arr_append(t,len&0xff); + arr_append(t,len>>8); + arr_append(t,elec_local_addr());// 源地址 + arr_append(t,0);// 目标地址 + arr_append(t,p->cmd);// 命令码 + arr_append(t,p->cmd_no&0xff); + arr_append(t,p->cmd_no>>8); + arr_appends_from(t,data); + arr_append(t,crc_crc8(arr_data(t),arr_length(t))); + return t; +} + +protuc_codec_export(ym_slave,protm_decode,protm_encode); + diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c index 79823ed..e060b43 100644 --- a/source/dev/dev_flash.c +++ b/source/dev/dev_flash.c @@ -37,8 +37,6 @@ scheme 109~110 #define FLASH_APP_SECTOR_NUM (50) #define FLASH_BUFF_SECTOR (58) #define FLASH_BUFF_SECTOR_NUM (50) -#define FLASH_BUFF_SECTOR (58) -#define FLASH_BUFF_SECTOR_NUM (50) #define FLASH_PARAM_SECTOR (108) #define FLASH_PARAM_SECTOR_NUM (1) #define FLASH_SCHEME_SECTOR (109) diff --git a/source/elec_det/base/define.h b/source/elec_det/base/define.h new file mode 100644 index 0000000..8e9feae --- /dev/null +++ b/source/elec_det/base/define.h @@ -0,0 +1,139 @@ +#ifndef DEFINE_H_ +#define DEFINE_H_ +#include +#include +#include +#include +#include "stm32f10x.h" +#include "misc.h" +#include "stm32f10x_adc.h" +#include "stm32f10x_dma.h" +#include "stm32f10x_gpio.h" +#include "stm32f10x_usart.h" +#include "stm32f10x_rcc.h" +#include "stm32f10x_tim.h" +#include "stm32f10x_dac.h" +#include "stm32f10x_i2c.h" +#define UNUSED(X) (void)X + +#define SoftVersion 0x000D + + +#if __IF_PORT_UART +//是否使用通信缓存 +#define APP_COMM_USE_FIFO 0 +//命令通信接口 +#define APP_COMD_CAN 0 +#define APP_COMD_USART 1 + +#else + +//是否使用通信缓存 +#define APP_COMM_USE_FIFO 1 +//命令通信接口 +#define APP_COMD_CAN 1 +#define APP_COMD_USART 1 + +#endif + + +typedef enum{ + FUN_E = ((uint8_t)0),//使能 + FUN_D = ((uint8_t)1) //失能 +}FUNState_e; + +typedef union{ +uint32_t ul_data; +uint16_t us_data; +uint8_t uc_data; +uint16_t us_buf[2]; +uint8_t uc_buf[4]; +}Seq_Buf_En; + + + + + + +#define APP_BEG_ADDR 0x8004000 +#define APP_END_ADDR 0x8024000 + +//#define APP_TEST_BOARD_CFG 0x803E800 +#define MC_CODE_ADDR 0x803B000 +#define APP_TEST_PLAN_ADDR 0x803F000 +#define APP_TEST_BOOTFLAG_ADDR 0x803F800 + +#define FCM_END_ADDR 0x8040000 +#define FMC_PAGE_SIZE ((uint16_t)0x800U) + +#define APP_TEST_PLANINFO_SIZE 2048 + + + +//系统事件定义 +#define U1_RX_FRAME_EVENT 0x01 +#define UART_MC_FRAME_EVENT 0x02 +#define CAN_MC_FRAME_EVENT 0x04 +#define TRANS_FRAME_EVENT 0x08 + +#define UART_TX_END_EVENT 1 + +#define EP1_CMD_FRAME_EVENT 1 +#define EPJ_CMD_FRAME_EVENT 1 +#define EP2_CMD_FRAME_EVENT 1 + +#define USART_APP_EXCE_EVENT 1 +#define EP_HEARTBEAD_EVENT 5 + + +/******************总线电压倍率*****/ +#define VH_Mutli 21 +#define VM_Mutli 21 +#define BOAED_SEQ_NUM_SIZE 20 +extern struct rt_event usart1_rx_event; +#pragma pack(1) +typedef struct { +uint32_t bootflag; //更新标志 +uint16_t resistor_diff;// +uint16_t hard_v; +uint32_t mc_ICodeCrc32; +uint8_t sqNum[BOAED_SEQ_NUM_SIZE]; +}BoardInfo_st; + +typedef union{ +BoardInfo_st boardinfo; +uint32_t ul_buf[32]; +}BoardInfo_un; + +typedef struct { + + uint8_t app_run_flag; + uint8_t device_id; + uint16_t chip_temp; + uint16_t v2p5_adc; + uint16_t v1p25_adc; + uint16_t adc_shake; + uint16_t bus_5p5v; + uint16_t bus_26v; + uint16_t hard_v; + uint16_t soft_v; + uint16_t resistor_diff; + uint32_t plan_id; + +}BoartCheck_st; + +#pragma pack() + +extern BoartCheck_st board_st; +extern BoardInfo_un boardinfo_un; + +//检测小板初始化 +void Ye_BoardInit(void); +/* + 测试小板上电自检 +*/ +void Ye_BoardCheck(void); +// +uint8_t UidCode_YM2JQ(uint8_t* pstJQUID, uint8_t* pstYMUID); + uint32_t GetPasswordByUidCode(uint8_t* uidcode); +#endif diff --git a/source/elec_det/base/delay.c b/source/elec_det/base/delay.c new file mode 100644 index 0000000..1834262 --- /dev/null +++ b/source/elec_det/base/delay.c @@ -0,0 +1,63 @@ +#include "base/delay.h" +#include "stdbool.h" +#include "rtthread.h" + + + +//此函数已在别处实现 +//void delay_us(uint32_t nus) +//{ +//} + +void delay_ms(uint32_t nms) +{ + while(nms > 0) + { + nms--; + delay_us(1000); //普通方式延时,此时ucos无法启动调度. + } + +} +void delay_nop(uint32_t nop) +{ + while(nop > 0) + { + nop--; + __NOP(); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/elec_det/base/delay.h b/source/elec_det/base/delay.h new file mode 100644 index 0000000..28ec8b1 --- /dev/null +++ b/source/elec_det/base/delay.h @@ -0,0 +1,41 @@ +#ifndef __DELAY_H_ +#define __DELAY_H_ +#include "base/define.h" +#include + + +void Systick_init(uint32_t tick); +void delay_ms(uint32_t nms); +void delay_us(uint32_t nus); +void delay_nop(uint32_t nop); +#define delay_os_ms(ms) rt_thread_delay(ms) +#endif + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/elec_det/base/utility.c b/source/elec_det/base/utility.c new file mode 100644 index 0000000..3d812a1 --- /dev/null +++ b/source/elec_det/base/utility.c @@ -0,0 +1,458 @@ + + +#include "utility.h" +float myatof(const char* str) +{ + + uint32_t int_nu = 0; + uint32_t flot_nu = 0; + float val; + float f_count = 1; + while((*str != 0) && (*str != '.')) + { + if(*str > '9' && *str < '0') + { + str++; + continue; + } + int_nu = int_nu*10+(*str - 48); + str++; + } + + if(*str == 0) + { + val = int_nu; + return val; + } + str++; + while(*str != 0) + { + if(*str > '9' && *str < '0') + { + str++; + continue; + } + flot_nu = flot_nu*10+(*str - 48); + f_count *= 10; + str++; + } + val = flot_nu; + val = val / f_count + int_nu; + return val; +} + +/** +*@brief string to uint16_t +*@param str:src string, base: +*@return num:convert result +*/ +uint16_t atoi16(const char* str,uint16_t base) +{ + unsigned int num = 0; + while (*str !=0) + num = num * base + c2d(*str++); + return num; +} + +/** +*@brief string to uint32 +*@param str:src string, base: +*@return num:convert result +*/ +uint32_t atoi32(const char* str,uint16_t base) +{ + uint32_t num = 0; + while (*str !=0) + num = num * base + c2d(*str++); + return num; +} + +/** +*@brief uint16 data to string +*@param n:src num, str[5]:string buffer len:string size +*@return void +*/ +void itoa(uint16_t n,uint8_t str[5], uint8_t len) +{ + + uint8_t i=len-1; + + memset(str,0x20,len); + do{ + str[i--]=n%10+'0'; + + }while((n/=10)>0); + + return; +} + + +/** +*@brief dec or hex string convert to uint32_t +*@param str:src string, ret: the pointer of result +*@return success = 1, fail = 0 +*/ +int validatoi(const char* str, int base,uint32_t* ret) +{ + int c; + const char* tstr = str; + if(str == 0 || *str == '\0') + { + return 0; + } + while(*tstr != '\0') + { + c = c2d(*tstr); + if( (c >= 0) && (c < base)) + { + tstr++; + } + else + { + return 0; + } + } + + *ret = atoi32(str,base); + return 1; +} + +/** +*@brief new char to replace the old char +*@param str:src string,oldchar:dst char,newchar:src char +*@return void +*/ +void replacetochar(char * str, char oldchar,char newchar) +{ + int x; + for (x = 0; str[x]; x++) + if (str[x] == oldchar) str[x] = newchar; +} + +/** +*@brief char to num +*@param c:src char +*@return convert result +*/ +char c2d(const uint8_t c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return 10 + c -'a'; + if (c >= 'A' && c <= 'F') + return 10 + c -'A'; + + return (char)0; +} +/** +*@brief num to char +*@param c:src num +*@return convert result +*/ +char d2c(const uint8_t c) +{ + if ( c <= 9) + { + return c + '0'; + } + if (c >= 0x0a && c <= 0x0f) + { + return c + 'a' - 10; + } + return 0; +} + +/** +*@brief 2bytes swap +*@param i:src num +*@return convert result +*/ +uint16_t swaps(uint16_t i) +{ + uint16_t ret=0; + ret = (i & 0xFF) << 8; + ret |= ((i >> 8)& 0xFF); + return ret; +} +/** +*@brief 4 bytes swap, bytes order 4 3 2 1 convert to 1 2 3 4 +*@param i:src num +*@return convert result +*/ +uint32_t swapl(uint32_t l) +{ + uint32_t ret=0; + ret = (l & 0xFF) << 24; + ret |= ((l >> 8) & 0xFF) << 16; + ret |= ((l >> 16) & 0xFF) << 8; + ret |= ((l >> 24) & 0xFF); + return ret; +} + +/** +*@brief get substring +*@param src:src string s1: target begin s2: target end sub: result pointer +*@return void +*/ +void mid(const char* src, const char* s1, const char* s2, char* sub) +{ + char* sub1; + char* sub2; + uint16_t n; + + sub1=strstr(src,s1); + sub1+=strlen(s1); + sub2=strstr(sub1,s2); + n=sub2-sub1; + strncpy(sub,sub1,n); + sub[n]=0; +} +/** +*@brief bytes array conver to string +*@param *data: ponit src bytes len: array length str: resuter string pointer +*@return void +*/ + +void bytes2hexString(const char* data, uint32_t len, char* str) +{ + char c_temp; + while(len > 0) + { + c_temp = ((*data) &0xF0) >> 4; + if(c_temp < 10) + { + *str = c_temp + '0'; + } + else + { + *str = (c_temp - 10) + 'A'; + } + + c_temp = ((*data) &0x0F); + str++; + if(c_temp < 10) + { + *str = c_temp + '0'; + } + else + { + *str = (c_temp - 10)+ 'A'; + } + str++; + data++; + len--; + } + *(str++) = '\0'; + +} +/* +Hex Datas to Bytes +*/ +uint8_t HexStrings2Byte(char**strs,uint16_t size,uint8_t* buf,uint16_t buf_size) +{ + char* str; + uint8_t data = 0; + uint16_t count = 0; + while((size > 0) && (count < buf_size)) + { + str = strs[count++]; + size--; + data = 0; + while(*str != '\0') + { + + if(*str == '0') + { + if((*(str+1) == 'X') || (*(str+1) == 'x')) + { + str+=2; + continue; + } + } + data <<=4; + data |=c2d(*str); + str++; + } + *buf = data; + buf++; + } + return count; +} + + +/* +Hex Datas to uint32_t +*/ +uint32_t HexStrings2UInt(char*str) +{ + + uint32_t data = 0; + uint16_t count = 0; + data = 0; + while(*str != '\0' && count < 10) + { + + if(*str == '0') + { + if((*(str+1) == 'X') || (*(str+1) == 'x')) + { + str+=2; + continue; + } + } + data <<=4; + data |=c2d(*str); + str++; + count++; + } + return data; +} + +//冒泡排序16位数据 +void Bubble_Sort_u16(uint16_t* buf,uint32_t len) +{ + uint32_t ul_temp1 = 0; + uint32_t ul_temp2 = 0; + uint16_t us_temp; + if(len < 2) + return; + for(ul_temp2 = 0; ul_temp2 < len-1; ul_temp2++) + { + for(ul_temp1 = 0; ul_temp1 < len-1-ul_temp2; ul_temp1++) + { + if(buf[ul_temp1] > buf[ul_temp1+1]) + { + us_temp = buf[ul_temp1]; + buf[ul_temp1] = buf[ul_temp1 + 1]; + buf[ul_temp1 + 1] = us_temp; + } + } + } + +} +//数据左移 +void BufMoveLeft(uint8_t* srcbuf,uint16_t offset,uint16_t data_len) +{ + uint8_t index = 0; + while(data_len > 0) + { + srcbuf[index] = srcbuf[index+offset]; + data_len--; + index++; + } +} +//数据右移 +void BufMoveRight(uint8_t* srcbuf,uint16_t offset,uint16_t data_len) +{ + while(data_len > 0) + { + data_len--; + srcbuf[data_len+offset] = srcbuf[data_len] ; + } +} + + +//@brief 计算数组的CRC8值 +//@param *srcbuf 数据源指针 +//@param len 数据源长度 +//@rtvl 返回计算结果 +uint8_t CheckXOR_8(uint8_t* srcbuf,uint16_t len) +{ + uint8_t crc = 0x00; + while(len--) + { + crc ^= *srcbuf++; + } + return crc; +} + + +//@brief 计算数组异或校验值 +//@param *Ptr 数据源 +//@param num 计算长度 +//@rtvl 返回计算结果 +uint8_t CheckCRC_8(uint8_t* Ptr,uint16_t num) +{ + uint8_t crc = 0; + uint16_t j,i; + + for (j = 0; j < num; j++) + { + crc ^= *(Ptr+j); + for ( i = 0; i < 8; i++) + { + if ((crc & 0x01) != 0) + { + crc >>= 1; + crc ^= 0x8c; + } + else + { + crc >>= 1; + } + } + } + return crc; +} + //@brief 计算CRC32 +//@param *srcbuf 数据源 +//@param len 计算长度 +//@rtvl 返回计算结果 +uint32_t Crc32Calu(uint32_t* buf, uint32_t len) +{ + uint32_t temp,crc = 0xFFFFFFFF; + + uint32_t i,j; + i = 0; + if(((uint32_t)buf %4) != 0) + { + return 1; + } + while(i 0) + { + if(*us_max < *aus_buf) + { + *us_max = *aus_buf; + } + if(*us_min > *aus_buf) + { + *us_min = *aus_buf; + } + aus_buf++; + us_size--; + } +} diff --git a/source/elec_det/base/utility.h b/source/elec_det/base/utility.h new file mode 100644 index 0000000..f4cad87 --- /dev/null +++ b/source/elec_det/base/utility.h @@ -0,0 +1,60 @@ +#ifndef _UTILITY_H +#define _UTILITY_H +#include +#include +#include "stm32f10x.h" + +float myatof(const char* str); +uint16_t atoi16(const char* str,uint16_t base); /* Convert a string to integer number */ +uint32_t atoi32(const char* str,uint16_t base); /* Convert a string to integer number */ +void itoa(uint16_t n,uint8_t* str, uint8_t len); +int validatoi(const char* str, int base, uint32_t* ret); /* Verify character string and Convert it to (hexa-)decimal. */ +char c2d(uint8_t c); +char d2c(uint8_t c); +uint16_t swaps(uint16_t i); +uint32_t swapl(uint32_t l); + +void replacetochar(char * str, char oldchar, char newchar); + +void mid(const char* src, const char* s1, const char* s2, char* sub); + +void bytes2hexString(const char* data, uint32_t len, char* str); +//冒泡排序16位数据 +void Bubble_Sort_u16(uint16_t* buf,uint32_t len); +//数据左移 +void BufMoveLeft(uint8_t* srcbuf,uint16_t offset,uint16_t data_len); +//数据右移 +void BufMoveRight(uint8_t* srcbuf,uint16_t offset,uint16_t data_len); +/* +Hex Datas to Bytes +*/ +uint8_t HexStrings2Byte(char**strs,uint16_t size,uint8_t* buf,uint16_t buf_size); +/* +Hex Datas to uint32_t +*/ +uint32_t HexStrings2UInt(char*str); +//@brief 计算数组异或校验值 +//@param *srcbuf 数据源 +//@param len 计算长度 +//@rtvl 返回计算结果 +uint8_t CheckCRC_8(uint8_t* Ptr,uint16_t num); + //@brief 计算CRC32 +//@param *srcbuf 数据源 +//@param len 计算长度 +//@rtvl 返回计算结果 +uint32_t Crc32Calu(uint32_t* buf, uint32_t len); +/* +@brief 获取数组中的最大值和最小值 +@param *aus_buf 缓存数组 +@param us_size 数组长度 +@param *us_max 最大值 +@param *us_min 最小值 +*/ + +void GetMaxAndMinValue(uint16_t* aus_buf,uint16_t us_size,uint16_t* us_max,uint16_t* us_min); +//@brief 计算数组的CRC8值 +//@param *srcbuf 数据源指针 +//@param len 数据源长度 +//@rtvl 返回计算结果 +uint8_t CheckXOR_8(uint8_t* srcbuf,uint16_t len); +#endif diff --git a/source/elec_det/driver/EWDriver.c b/source/elec_det/driver/EWDriver.c new file mode 100644 index 0000000..aa35916 --- /dev/null +++ b/source/elec_det/driver/EWDriver.c @@ -0,0 +1,1530 @@ +#include "EWDriver.h" +#include "base/delay.h" +#include "base/utility.h" +#include "hardware/gpio_cfg.h" +#include "base/utility.h" +#include "hardware/adc_cfg.h" +#include "hardware/power.h" +#include "ewdriver.h" +#include "hardware/timer_cfg.h" + +static volatile EWBus_Mod_en bus_mod = OFF_MOD; +static volatile CurrentSample_Range_eu buscurrent_range = Current_Max; +#define FB_Read_AD_Sample_C 30 +#if FIREBUS_ADC_BUF_LEN < FB_Read_AD_Sample_C +#error "EWDriver ADC define error" +#endif + +#define SMod_Read_Idle_Filter 90 +#define DMod_Read_Idle_Filter 80 + +volatile uint16_t* EW_Read_AD_V = FireBus_ADC_Buf; +static volatile uint16_t SMod_Read_Idle_C; +static uint16_t firebus_idle_diff = SMod_Read_Idle_Filter; + +const static uint16_t data2bit_signal[]={200,234,275,323,380,446}; +static uint16_t datapulus[6][2]; +//发送起始信号 +#define SMod_Begin_Plus() SMod_2Bit_Plus(4) +//发送结束信号 +#define SMod_End_Plus() SMod_2Bit_Plus(5) +uint8_t EW_CommBuf[EW_DMODE_FRAME_SIZE]; +uint16_t EW_DMOD_Peroid = 300; +uint16_t EW_DMOD_READ_Timeout = 6000; +//发送唤醒信号 +static void SMod_Wake_Plus(void) +{ + EW_SINGLE_MOD_M; + delay_us(200); + EW_SINGLE_MOD_H; + delay_us(600); + +} +//发送2Bit数据信号 +static void SMod_2Bit_Plus(uint8_t data) +{ + if(data > 5) + return; + EW_SINGLE_MOD_M; + delay_us(datapulus[data][0]); + EW_SINGLE_MOD_H; + delay_us(datapulus[data][1]); +} + +//读取1bit数据 +static uint8_t SMod_ReadBit(uint16_t wait_us) +{ + uint32_t ul_temp = 0; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_SINGLE_MOD_M; + delay_us(wait_us); + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + EW_SINGLE_MOD_H; + Bubble_Sort_u16((uint16_t*)EW_Read_AD_V,FB_Read_AD_Sample_C); + ul_temp = EW_Read_AD_V[FB_Read_AD_Sample_C - 6]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 7]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 8]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 9]; + ul_temp >>= 2; + if(ul_temp > SMod_Read_Idle_C) + { + LED1_Out_On; + return 1; + } + LED1_Out_Off; + return 0; +} + +static uint8_t DMod_ReadBit(uint16_t wait_us) +{ + uint32_t ul_temp = 0; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_DIFF_MOD_M; + delay_us(wait_us); + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + EW_DIFF_MOD_L; + Bubble_Sort_u16((uint16_t*)EW_Read_AD_V,FB_Read_AD_Sample_C); + ul_temp = EW_Read_AD_V[FB_Read_AD_Sample_C - 6]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 7]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 8]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 9]; + ul_temp >>= 2; + if(ul_temp > SMod_Read_Idle_C) + { + LED1_Out_On ; + return 1; + } + LED1_Out_Off; + return 0; +} +/* +@brief 读取模块ACK +@param 超时 0.1ms +*/ +static uint8_t DMod_ReadAck(uint16_t time_out) +{ + uint32_t ul_temp = 0; + uint32_t ul_temp2 = 0; + uint16_t us_count = 0; + ul_temp = time_out*10; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_DIFF_MOD_M; + Get10usCount(); + while((ul_temp2 < ul_temp) && (us_count < 10)) + { + if(ADC_GetCurADCFast() > SMod_Read_Idle_C) + { + us_count++; + }else{ + us_count = 0; + } + ul_temp2 += Get10usCount(); + } + if(us_count < 10) + { + EW_DIFF_MOD_H; + return 0; + } + delay_ms(20); + EW_DIFF_MOD_H + return 1; + +} + +//从AD采样缓存总,计算空闲电流 +static uint16_t FireBus_UpdataIdeV(void) +{ + SMod_Read_Idle_C = 0; + SMod_Read_Idle_C = (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 6]); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 7]*3); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 8]*4); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 9]*2); + SMod_Read_Idle_C /= 10; + SMod_Read_Idle_C += firebus_idle_diff; + return SMod_Read_Idle_C; +} +//采集空闲电流 +static uint16_t SMod_GetIdleV(void) +{ + firebus_idle_diff = SMod_Read_Idle_Filter; + SMod_ReadBit(80);//获取采样电流 + return FireBus_UpdataIdeV(); +} +static uint16_t DMod_GetIdleV(void) +{ + firebus_idle_diff = DMod_Read_Idle_Filter; + DMod_ReadBit(300);//获取采样电流 + return FireBus_UpdataIdeV(); +} +static uint16_t SMod_GetIdle2V(void) +{ + uint32_t ul_temp = 0; + firebus_idle_diff = SMod_Read_Idle_Filter; + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + return FireBus_UpdataIdeV(); +} + +static uint16_t DMod_GetIdle2V(void) +{ + uint32_t ul_temp = 0; + firebus_idle_diff = DMod_Read_Idle_Filter; + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + return FireBus_UpdataIdeV(); +} + + + +//采集到应答信号返0 否则返1 +static uint8_t SMod_WaitAck(uint16_t time_out) +{ + + while(time_out > 0) + { + time_out--; + if(SMod_ReadBit(80) > 0) + { + delay_us(350); + return 0; + } + delay_us(350); + } + return 1; + +} + + +void EW_BusDef_Init(void) +{ + uint16_t us_temp = 80; + uint8_t count = 0; + for(count = 0; count < 6;count++) + { + datapulus[count][0] = us_temp; + datapulus[count][1] = data2bit_signal[count] - us_temp-12;//-4为延时偏移,实测。 + } +} + + +/* +@brief 单端发送4Bytes 数据 +@param *buf 4字节数据缓存指针 +@param type 数据帧类型 +@param bg_count 起始信号个数 +@param end_count 结束信号个数 +*/ +void SMod_FireBusSend4BytesFrame(uint8_t* buf,EW_SINGLE_FRAME_TYPE_en type ,uint8_t bg_count,uint8_t end_count) +{ + uint8_t uc_plus_type[17]; + uint8_t uc_data; + uint32_t ul_count1 = 0; + uint32_t ul_count2 = 0; + uc_plus_type[ul_count1++] = (uint8_t)type; + while(ul_count1 < 17) + { + ul_count2 = 0; + uc_data = *buf; + while(ul_count2 < 4) + { + uc_plus_type[ul_count1++] = (uc_data & 0xC0)>>6; + uc_data <<= 2; + ul_count2++; + } + buf++; + } + SMod_Wake_Plus(); + /******************/ + while(bg_count > 0) + { + bg_count --; + SMod_Begin_Plus(); + } + for(ul_count1 = 0; ul_count1 < 17; ul_count1++) + { + SMod_2Bit_Plus(uc_plus_type[ul_count1]); + } + while(end_count > 0) + { + end_count --; + SMod_End_Plus(); + } +} +/* +@brief 单端模式发送数据 +@param *buf 数据缓存指针 +@param bg_count 起始信号个数 +@param end_count 结束信号个数 +*/ +uint8_t SMod_SendData(uint8_t* buf, uint16_t len,uint8_t bg_count,uint8_t end_count) +{ + uint16_t us_count = 0; + uint8_t* databuf = (uint8_t*)rt_malloc(len+4); + uint8_t crc = 0; + if(databuf == RT_NULL) + { + + return 1; + } + len--; + rt_memcpy(databuf,buf,len); + while((len % 4) != 3) + { + databuf[len++] = 0; + } + databuf[len] = CheckXOR_8(databuf,len); + len++; + if(len == 4) + { + SMod_FireBusSend4BytesFrame(databuf,COMPLETE_FRAME,bg_count,end_count); + goto SMod_Data_Send_End; + } + SMod_FireBusSend4BytesFrame(databuf,BEGIN_FRAME,bg_count,end_count); + us_count += 4; + while(us_count < (len-4)) + { + delay_ms(40); + SMod_FireBusSend4BytesFrame(databuf+us_count,DATA_FRAME,bg_count,end_count); + us_count += 4; + } + delay_ms(40); + SMod_FireBusSend4BytesFrame(databuf+us_count,END_FRAME,bg_count,end_count); +SMod_Data_Send_End: + rt_free(databuf); + return 0; +} + +/* +@brief 单端接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 应答信号超时个数 +*/ +uint8_t SMod_FireBusReadDatas(uint8_t* buf, uint8_t len, uint16_t time_out) +{ + uint32_t ul_temp = 0; + uint8_t uc_data; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + delay_ms(1); + + //采集空闲电流 + SMod_GetIdleV(); + delay_us(350); + SMod_GetIdleV(); + delay_us(350); + if(SMod_WaitAck(time_out) > 0) + { + Power_SetSampleCurrentRange(range); + return 1; + } + while(len > 0) + { + ul_temp = 0; + uc_data = 0; + len--; + while(ul_temp < 8) + { + uc_data <<= 1; + uc_data += SMod_ReadBit(80); + delay_us(500); + ul_temp++; + } + *buf = uc_data; + buf++; + } + Power_SetSampleCurrentRange(range); + return 0; +} + +/* +@brief 获取巡检数据 +@param count 巡检脉冲数 +@param buf 数据缓存区 +@rtv 无 +*/ +void FireBus_ReadInspect_Data(uint16_t count,uint8_t* buf) +{ + uint16_t index; + uint8_t data; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC);//采样电阻全开,快速放电 + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + //delay_us(500); + //总线跳转到中电平 + EW_SINGLE_MOD_M; + //延时等待电流稳定 + //COM_PH2_Out = 0; + delay_us(240); + //获取中电平电流 + SMod_GetIdle2V(); + EW_SINGLE_MOD_H + delay_us(700); + rt_memset(buf,0,((count+7 ) >> 3)); + index = 0; + while(index < count) + { + data = *(buf+(index >> 3)); + if( SMod_ReadBit(80) > 0) + { + data |= (0x01 << (index & 0x07)); + }; + EW_SINGLE_MOD_H + delay_us(800); + *(buf+(index >> 3)) = data; + index++; + } + Power_SetSampleCurrentRange(range); +} + +/*************************************************************/ +static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t time_out,uint16_t ad_line,uint16_t* max_ad) +{ + uint32_t ul_ad_sample; + uint32_t ul_index = 0; + uint16_t us_adc_buf[6]; + uint32_t ul_count = 0; + uint32_t uc_step = 0; + uint32_t ul_h_count = 0,ul_l_count = 0; + *max_ad = 0; + for(ul_count =0; ul_count < 5; ul_count++) + { + us_adc_buf[ul_count++] = ADC_GetCurADCFast(); + } + //数据发送时,以高脉冲在先,然后是低电平, + do{ + time_out--; + ul_ad_sample = ADC_GetCurADCFast(); + if(ul_ad_sample > *max_ad) + *max_ad = ul_ad_sample; +// if(ul_ad_sample > ad_line) +// { +// PBout(I2IC_SCL_Pin_Nu) = 1 ; +// }else{ +// PBout(I2IC_SCL_Pin_Nu) = 0; +// } + us_adc_buf[ul_count++] = ul_ad_sample; + ul_count %= 0x06; + ul_h_count = 0; + ul_l_count = 0; + for(ul_index =0; ul_index < 6; ul_index++) + { + if(us_adc_buf[ul_index] > ad_line) + { + ul_h_count++; + }else{ + ul_l_count++; + } + } + if(uc_step == 0 && ul_h_count > 5)//启动周期计数 + { + (*plus_h)++; + (*plus_t)++; + uc_step = 1; + }else if(uc_step == 0){ + continue;//未启动 + } + if(uc_step == 1) + { + if(ul_h_count > 5) + { + PBout(I2IC_SCL_Pin_Nu) = 1 ; + (*plus_h)++; + uc_step = 1; + }else if(ul_l_count > 5) //由高变低 + { + PBout(I2IC_SCL_Pin_Nu) = 0; + uc_step = 2; + } + } + else if(uc_step == 2 && ul_h_count > 5)//由低变高 + { + PBout(I2IC_SCL_Pin_Nu) = 1 ; + break; + } + (*plus_t)++; + + }while(time_out > 0); + if(time_out < 1)//等待起始信号超时 + { + return 1; + } + return 0; +} +/* +@brief 单端第二版,差分接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 超时脉冲数(约1bit数据时间) +@rtv 0 成功 否则失败 +*/ +static uint16_t us_plus_H,us_plus_H2;//高电平采用次数 +static uint16_t us_plus_T,us_plus_T2;//采样周期 +uint16_t idle_line = 0; +uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) +{ + uint32_t ul_ad_sample; + uint32_t ul_check_falg; //奇校验 + uint32_t us_time_out = time_out; + uint32_t ul_data = 0; + uint32_t us_dataT_Or;//数据周期 + uint32_t us_temp1,us_temp2; + uint16_t ad_max = 0,ad_max_temp = 0; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HIGH); + delay_us(2000); + //总线跳转到中电平 + EW_DIFF_MOD_M; + //延时等待电流稳定 + delay_us(800); + //COM_PH2_Out = 0; + PBout(I2IC_SCL_Pin_Nu) = 0; + delay_us(200); + //获取中电平电流 + PBout(I2IC_SCL_Pin_Nu) = 1 ; + DMod_GetIdle2V(); + PBout(I2IC_SCL_Pin_Nu) = 0 ; + //读取指定长度数据 + //读取单字节数据 + ul_data = 0; + //等待起始信号唤醒信号 + us_plus_H = 0; + us_plus_T = 0; + us_time_out = 2000 + time_out; + do{ + + ul_ad_sample = ADC_GetCurADCFast(); + if(ad_max < ul_ad_sample) + ad_max = ul_ad_sample; + if(ul_ad_sample > SMod_Read_Idle_C) + { + us_plus_H++; + }else{ + us_plus_H = 0; + } + delay_us(2); + us_time_out--; + } + while((us_plus_H < 4) && (us_time_out > 0)); + if(us_time_out < 1)//等待起始信号超时 + { + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 1; + } + + while(len > 0) + { + //等待数据帧起始信号 + us_time_out = 10; + us_plus_T2 = 0xFFFF; + us_plus_H2 = 0; + while(us_time_out > 0) + { + us_plus_H = 0; + us_plus_T = 0; + idle_line = SMod_Read_Idle_C; +// idle_line = ad_max - SMod_Read_Idle_C; +// idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + { + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 2; + } + if(us_plus_H2 > (us_plus_T2- us_plus_H2)) + { + us_temp1 = us_plus_T << 1; //2倍 + us_temp2 = us_plus_T + (us_plus_T >> 1);//1.5倍 + if((us_plus_T2 > us_temp2) && (us_plus_T2 < us_temp1)) + { + break; + } + } + us_plus_T2 = us_plus_T; + us_plus_H2 = us_plus_H; + us_time_out--; + } + //采集8bit数据+1位校验 + ul_data = 0; + ul_check_falg = 0; + us_time_out = 0; + us_plus_T2 = 0; + us_dataT_Or = us_plus_T;//保存数据周期 + do{ + ul_data <<= 1; + if(us_plus_H > (us_plus_T- us_plus_H)) //高电平时间大于低电平 1 + { + ul_data |= 0x01; + ul_check_falg ^= 0x01; + }else{//检测是否是结束信号 0 + us_temp1 = us_plus_T2 << 1; //2倍 + us_temp2 = us_plus_T2 + (us_plus_T2 >> 1);//1.5倍 + if((us_plus_T > us_temp2) && (us_plus_T < us_temp1)) + { + break; + } + } + //约束数据周期范围 +// if(((us_dataT_Or+4) < us_plus_T) +// || ((us_dataT_Or - 4) > us_plus_T)) +// { +// SetSampleCurrentRange(range); +// EW_SINGLE_MOD_H; +// return 3; +// } + us_plus_T2 = us_plus_T; + us_plus_H2 = us_plus_H; + us_plus_H = 0; + us_plus_T = 0; + //idle_line = ad_max - SMod_Read_Idle_C; + //idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; + idle_line = SMod_Read_Idle_C; + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + { + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 4; + } + ad_max = (uint16_t)(ad_max * 0.7f + ad_max_temp*0.3f); + us_time_out++; + }while(us_time_out < 13); + if(ul_check_falg == 0) + { + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 5; + } + if(us_time_out != 9) + { + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 6; + } + ul_data >>= 2; + *buf = (uint8_t)ul_data; + buf++; + len--; + } + delay_us(time_out >> 1); + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + return 0; +} + + +/* +@brief 差分模式数据发送 +@param buf 发送数据缓存 +@param len 发送长度 +@param pre 数据脉冲周期 + +*/ +static void DMod_SendBytesSelf(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag, + uint8_t (*crc_fun)(uint8_t *,uint16_t)) +{ + uint16_t us_count = 0; + uint8_t uc_checkc_flag = 0; + uint8_t uc_datatemp = 0; + uint16_t beg_send_pre,beg_H_plus,end_H_plus,data1_H_plus,data0_H_plus; + beg_send_pre = pre+(pre >> 1)+(pre >> 2);//1.75倍数据周期 + beg_H_plus = (uint16_t)(beg_send_pre * 0.65f)+1; + end_H_plus = (uint16_t)(beg_send_pre * 0.35f)+1; + data1_H_plus = (uint16_t)(pre * 0.65f); + data0_H_plus = (uint16_t)(pre * 0.35f); + //buf[len] = CheckCRC_8(buf,len); + buf[len] = crc_fun(buf,len); + len++; + /* + 1.发送3个结束信号用作芯片唤醒 + 2.循环发送缓存数据中的数据 + 2-1 发送1个起始信号 + 2-2 发送8bit数据信号 + 2-3 发送1bit校验信号 + 2-4 发送1个结束信号 + 2-5 调整循环变量,满足循环从2-1再次执行,否则退出 + 3 补发送一个结束信号 + */ + //发送唤醒脉冲 + __disable_irq(); + while(us_count < 3) + { + EW_DIFF_MOD_L; + delay_us( beg_send_pre - end_H_plus); + EW_DIFF_MOD_H; + delay_us(end_H_plus); + us_count++; + } + while(len > 0) + { + us_count = 0; + uc_checkc_flag = 0; + len--; + //发送起始信号 + EW_DIFF_MOD_L; + delay_us(beg_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - beg_H_plus); + uc_datatemp = *buf; + //8bit数据信号+1bit校验 + while(us_count < 9) + { + if((uc_datatemp & 0x80) > 0) + { + EW_DIFF_MOD_L; + delay_us(data1_H_plus); + EW_DIFF_MOD_H; + delay_us( pre - data1_H_plus); + uc_checkc_flag ^= 0x01; + }else{ + EW_DIFF_MOD_L; + delay_us(data0_H_plus); + EW_DIFF_MOD_H; + delay_us( pre - data0_H_plus); + } + uc_datatemp <<= 1; + us_count++; + if(us_count == 8) + { + uc_checkc_flag ^= 0x01; + uc_datatemp &= 0x7F; + uc_datatemp |= (uc_checkc_flag << 7); + } + } + buf++; + //发结束始信号 + EW_DIFF_MOD_L; + delay_us(end_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - end_H_plus); + } + //补发结束信号 + EW_DIFF_MOD_L; + delay_us(end_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - end_H_plus); + if(rw_flag > 0) + { + EW_DIFF_MOD_L; + } + __enable_irq(); + delay_ms(3);//保障芯片总线空闲监听退出 +} + + + +void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag) +{ + DMod_SendBytesSelf(buf,len,pre,rw_flag,CheckCRC_8); +} + + +/* +* 函数会在 buf[len] 的位置添加一个校验数据 +* 所以传入的buf的实际长度要求至少比len长1 +*/ +void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag) +{ + DMod_SendBytesSelf(buf,len,EW_DMOD_Peroid,rw_flag,CheckXOR_8); +} + + +uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times) +{ + uint8_t ret; +// for(int i=0;i> 3)); + index = 0; + while(index < count) + { + data = *(buf+(index >> 3)); + if( DMod_ReadBit(300) > 0) + { + data |= (0x01 << (index & 0x07)); + }; + EW_DIFF_MOD_L + delay_us(800); + *(buf+(index >> 3)) = data; + index++; + } + Power_SetSampleCurrentRange(range); + delay_ms(1); + EW_DIFF_MOD_H; +} + + +/***********************************************************/ + + +volatile uint8_t EW_Trim_Flag = 0; +static void EW_TrimPlusCallback(uint8_t flag) +{ + if(flag == 1) + { + EW_DIFF_MOD_L; + }else if(flag > 1){ + EW_DIFF_MOD_H; + } + EW_Trim_Flag = flag; +} +static void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) +{ + FireBus_ClkAmend(cycle,duty,count,EW_TrimPlusCallback); + EW_Trim_Flag = 0; + while(EW_Trim_Flag != 3) + { + delay_ms(20); + } + delay_ms(1); + EW_DIFF_MOD_H +} + +/* +@breif 通信测试 +*/ +uint8_t EW_CommTest(uint8_t* buf,uint16_t len,uint16_t cycle) +{ + uint8_t auc_buf[16]; + uint16_t us_head = 1; + us_head = (us_head << 6)& 0xFFC0; + us_head += EW_COMM_TEST; + auc_buf[0] = us_head & 0xFF; + auc_buf[1] = (us_head >> 8) & 0xFF; + if(len > 13) + { + len = 13; + } + memcpy(auc_buf+2,buf,len); + len += 2; + DMod_SendBytes(auc_buf,len,cycle,1); + memset(buf,0,len); + delay_ms(2); + return DMod_FireBusReadDatasV2(buf,len+1,500); +} +/* +@brief 使能MTP写 +@param addr 通信地址 +@param 使能开关 +@rtv 执行结果 +*/ +uint8_t EW_EnWriteMTP(uint16_t addr ,uint8_t en_flag) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 40; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = en_flag; + DMod_SendBytes((uint8_t*)EW_CommBuf,3,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 写入数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 63; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = mtpaddr; + if(len > 10) + { + len = 10; + } + EW_CommBuf[3] = len; + memcpy((void*)(EW_CommBuf+4),buf,len); + DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + len = (len>>2)*8+4; + delay_ms(len); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)(EW_CommBuf+2),2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 读出数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 62; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = mtpaddr; + if(len > 10) + { + len = 10; + } + EW_CommBuf[3] = len; + memcpy((void*)(EW_CommBuf+4),buf,len); + DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 1; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)buf,len+1,EW_DMOD_READ_Timeout); + if(buf[len] != CheckCRC_8(buf,len)) + { + return 1; + } + return uc_ack; +} +/* +@brief 运行BootLoader程序 +@param addr 通信地址 +@param reboot 仅重启标准 1 有效 +@rtv 返回执行结果 0 成功 +*/ +uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot) +{ + uint32_t ul_bootflag = 0x55AA6699; + addr<<=6; + addr = (addr & 0xFFC0) | 61; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + if(reboot == 1) + { + ul_bootflag = 0x9966AA55; + } + memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); + return 0; +} +/* +@brief 写运行配置,写入MTP中 +@param addr 通信地址 +@param runcfg 配置结构体 +@rtv 返回执行结果 +*/ +uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 20; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&runcfg,3); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(4); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + +/* +@brief 快速分配通信地址 +@param 通信地址 +@param UID +@param uid_len UID长度 +@param ack_data 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 21; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),uid,uid_len); + DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + + +/* +@brief 快速分配通信地址 +@param 通信地址 +@param 设置延时 +@param UID +@param UID长度 +@param 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 22; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = pwd_flag; + memcpy(((void*)(EW_CommBuf+3)),&delay,2); + memcpy((void*)(EW_CommBuf+5),uid,uid_len); + uid_len +=5; + DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2(ack_data,5,EW_DMOD_READ_Timeout); + if(ack_data[4] != CheckCRC_8(ack_data,4)) + { + return 1; + } + return uc_ack; +} + + +/* +@brief 设置延时 +@param addr 通信地址 +@param 延期时间 +@rtv 返回执行结果 +*/ +uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) +{ + uint8_t uc_ack; + addr<<=6; + addr = (addr & 0xFFC0) | 23; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&delay,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + +/* +@brief 密码验证 +@param addr 通信地址 +@param 密码数据 +@param 密码长度 +@rtv 返回执行结果 +*/ +uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 24; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),pwd,pwd_len); + pwd_len += 2; + DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 密码验证 +@param addr 通信地址 +@param 延迟起爆时间*50ms +@rtv 返回执行结果 +*/ +uint8_t EW_Boom(uint16_t addr,uint8_t delay_count) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 25; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = delay_count; + DMod_SendBytes((uint8_t*)EW_CommBuf,3,EW_DMOD_Peroid,0); + return 0; +} + + +/* +@brief 分组充电 +@param addr 通信地址 +@param 充电挡位 0:直通 1 :16V 2:20V 3:2.5V +@param 分组挡位 addr = group*4 大于addr的可以充电 +@rtv 返回执行结果 +*/ +uint8_t EW_Charge(uint16_t addr,uint8_t chg_class,uint8_t group) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 26; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = chg_class; + EW_CommBuf[3] = group; + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + return 0; +} + + +/* +@brief 放电 +@param addr 通信地址 +*/ +uint8_t EW_DisCharge(uint16_t addr) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 27; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 读状态信息 +@param addr 通信地址 +@param *state 返回状态码 +@param len 数据长度 +*/ +uint8_t EW_ReadState(uint16_t addr,uint8_t* state) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr == 0) + { + return 1; + } + uc_readflag = 1; + addr<<=6; + addr = (addr & 0xFFC0) | 28; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 1; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[5] != CheckCRC_8((uint8_t*)EW_CommBuf,5)) + { + return 1; + }else{ + memcpy(state,((uint8_t*)EW_CommBuf),4); + } + return uc_ack; +} + +/* +@brief 校准地址 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_ClkAmend(uint16_t addr ,uint16_t cycle,uint16_t plus_count) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 29; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + delay_ms(5); + EW_SendTrimSquare(cycle,cycle>>1,plus_count); + return 0; +} + +/* +@brief 巡检 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_Inspect(uint16_t bgaddr ,uint16_t endaddr,uint16_t state,uint8_t* buf) +{ + + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 30; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)&EW_CommBuf[2],&bgaddr,2); + memcpy((uint8_t*)&EW_CommBuf[4],&endaddr,2); + memcpy((uint8_t*)&EW_CommBuf[6],&state,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,8,EW_DMOD_Peroid,1); + delay_ms(5); + DMod_ReadInspect_Data(endaddr-bgaddr,buf); + return 0; +} + +/* +@brief 配置验证 +@param addr 通信地址 +@param cfg_mask 源掩码信息 +@param 比较信息 (EW_Cfg & cfg_mask) == cfg_state +@param 反码状态 0 比较通过不反码 1 比较通过反码 +@param +*/ +uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint16_t cfg_state,uint8_t* rtv) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 31; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)&EW_CommBuf[2],&cfg_mask,3); + memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,2); + EW_CommBuf[8] = *rtv; + DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,1); + delay_ms(5); + *rtv = DMod_ReadAck(50); + return 0; +} + +/* +@brief 配置验证 +@param addr 通信地址 +@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 4 读电容检测时间 +@param *buf 读出测试结果 +*/ +uint8_t EW_ChecSelf(uint16_t addr,uint8_t check_class,uint8_t* buf) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(check_class == 4) + { + uc_readflag = 1; + } + if(buf == NULL && check_class ==4) + { + return 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 32; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = check_class; + DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,uc_readflag); + if( uc_readflag == 0) + { + return 0; + } + delay_ms(5); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[4] == CheckCRC_8((uint8_t*)EW_CommBuf,4)) + { + memcpy(buf,(uint8_t*)EW_CommBuf,4); + }else{ + uc_ack = 1; + } + return uc_ack; +} + +/* +@brief 保持起爆配置信息和使能起爆 +*/ +uint8_t EW_SaveFireInfo(uint16_t addr) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 33; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 读延时和状态值 +@param addr 通信地址 +@param delay 返回延时 +*/ +uint8_t EW_ReadDelay(uint16_t addr,uint16_t* delay) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 34; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,3,EW_DMOD_READ_Timeout); + if(EW_CommBuf[2] == CheckCRC_8((uint8_t*)EW_CommBuf,2)) + { + memcpy(delay,(uint8_t*)EW_CommBuf,2); + }else{ + uc_ack = 1; + } + + return uc_ack; +} + +/* +@brief 通信反码配置 +@param addr 通信地址 +@param speed 通信挡位 0:10K 1:7K 2:5K 3:4.5K 4: 4K 4+n:4-0.5*n +@param cur 电流挡位 0:1mA 1:2mA 2:4mA 3:8mA +*/ +uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur) +{ + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 35; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = speed; + EW_CommBuf[3] = cur; + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 更新网络地址 +@param addr 通信地址 +@param new_addr 新地址 +*/ +uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 36; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&new_addr,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadClkAmend(uint16_t addr,uint32_t* clk_amend) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 37; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[4] == CheckCRC_8((uint8_t*)EW_CommBuf,4)) + { + memcpy(clk_amend,(uint8_t*)EW_CommBuf,4); + }else{ + uc_ack = 1; + } + + return uc_ack; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadRunCfgVersion(uint16_t addr,uint8_t* run_cfg,uint16_t* version) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 38; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,6,EW_DMOD_READ_Timeout); + if(EW_CommBuf[5] == CheckCRC_8((uint8_t*)EW_CommBuf,5)) + { + memcpy(run_cfg,(uint8_t*)EW_CommBuf,3); + memcpy(version,(uint8_t*)EW_CommBuf+3,2); + }else{ + uc_ack = 1; + } + return uc_ack; +} + +/* +@brief 自动分配地址 +@param max_addr 分配的最大地址 +@param fac_addr 分配因子 +*/ +uint8_t EW_AutoSetAddr(uint16_t max_addr,uint16_t fac_addr) +{ + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 39; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)EW_CommBuf+2,&max_addr,2); + memcpy((uint8_t*)EW_CommBuf+4,&max_addr,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); + return 0; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param UID数据 +*/ +uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 41; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,uid_len+1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[uid_len] == CheckCRC_8((uint8_t*)EW_CommBuf,uid_len)) + { + memcpy(uid,(uint8_t*)EW_CommBuf,uid_len); + }else{ + uc_ack = 1; + } + return uc_ack; +} + + diff --git a/source/elec_det/driver/EWDriver.h b/source/elec_det/driver/EWDriver.h new file mode 100644 index 0000000..0049cb6 --- /dev/null +++ b/source/elec_det/driver/EWDriver.h @@ -0,0 +1,326 @@ +#ifndef EWDRIVER_H +#define EWDRIVER_H +#include "base/define.h" + +#define EW_DMODE_FRAME_SIZE 16 + +# +typedef enum { + SINGLE_MOD = (uint8_t)0, + DIFF_MOD = (uint8_t)1, + OFF_MOD = (uint8_t)2, +} EWBus_Mod_en; + + +typedef enum{ + BEGIN_FRAME = (uint8_t)0, + END_FRAME = (uint8_t)1, + DATA_FRAME = (uint8_t)2, + COMPLETE_FRAME = (uint8_t)3, +}EW_SINGLE_FRAME_TYPE_en; +#pragma pack(1) +//系统运行时配置 +typedef union { +struct{ +uint8_t fire_mos_sw : 2;//起爆mos开关选择 0 内部 1 外部 (默认0) +uint8_t vbus_rx_sg : 2;//接收数据信号 1 vbuss_rxh 2 vbuss_rxl 3 vbusd_rx (默认 3) +uint8_t vbus_mode : 2;//通讯类型判断 01 差分 10 单端。00 11 根据总线电压判断 (默认 01) +uint8_t reserve01 : 2;//保留 +uint8_t reset_run_step : 3;//打点周期 0 不打点 1 5ms 2 10ms 3 20ms 4 50ms 5 100ms 6 150ms 7 200ms(默认 0) +uint8_t uid_len : 3;//uid长度 uid_len + 7(默认 1) +uint8_t pwd_len : 2;//密码长度 pwd_len + 4(默认0) +uint8_t version : 5;//模块版本 +uint8_t reserve02 : 3;//保留 +uint8_t crc8 : 8;//校验位 +} runcfg_st; +uint32_t run_param; +uint8_t run_cfg_buf[4]; +}RunCfg_un; + +typedef union{ +//系统状态标志结构体 +volatile struct +{ + + uint8_t timeramend_flag : 1; //时钟校准标志 0 + uint8_t saveinfo_flag : 1; //保存延时设置信息 1 + uint8_t pswd_flag : 1; //密码验证完成标志 2 + uint8_t delay_time : 1; //延时设置完成标志 3 + + uint8_t addr_set : 1; //网络地址已设置 + uint8_t set_super_t : 1; //开启软件复位 5 + uint8_t erprom_error : 1; //系统存储错误 6 + uint8_t sys_error : 1; //系统运行异常 7 + + + uint8_t charge_8v : 1; //充电电压大于8V 8 + uint8_t charge_16V : 1; //充电电压大于16V标志 9 + uint8_t charge_20v : 1; //充电电压大于20V 10 + uint8_t fireline_flag : 1; //桥丝检测 11 + + + uint8_t charge_ctrl_flag : 1; //充放电开关检测 12 + uint8_t mosfet_flag : 1; //MOS开关检测标志 13 + uint8_t charge_cmd : 1; //已经发送充电命令 14 + uint8_t fire_flag : 1; //已点火 15 + + + uint8_t comm_frame : 1; //通讯帧结束标志 + uint8_t factory_check : 1; //工厂自检 + uint8_t comm_mode : 1; //通讯模式 + uint8_t vbusd_invert : 1; //VBUSD 的极性 + + + uint8_t comm_timeout : 1; //通信超时 + uint8_t reserve10 : 1; + uint8_t reserve09 : 1; + uint8_t reserve08 : 1; + + uint8_t reserve07 : 1; + uint8_t reserve06 : 1; + uint8_t reserve05 : 1; + uint8_t reserve04 : 1; + + uint8_t reserve03 : 1; + uint8_t reserve02 : 1; + uint8_t reserve01 : 1; + uint8_t reserve00 : 1; +} State_st; + + + volatile uint32_t data; + volatile uint16_t us_data[2]; + volatile uint8_t datas[4]; +}System_State_un; + +#pragma pack() + +#define EW_WA_CFG_WRITE 20 //写配置寄存器(掉电不保存) +#define EW_WA_SET_COMMADDR 21 //设置网络地址 +#define EW_WA_FAST_CFG 22 //快速配置地址,延时,密码验证 +#define EW_WA_SET_DELAY 23 //设置延时 +#define EW_RA_VERIFY_PWD 24 //密码验证 +#define EW_W_ON_FIRE 25 //起爆 +#define EW_W_CHARGE 26 //充电 +#define EW_W_DISCHARGE 27 //放电 +#define EW_RA_GET_STATE 28 //读状态 +#define EW_W_AMEND 29 //时钟校准 +#define EW_RA_INSPECT 30 //巡检 +#define EW_RA_CHECK_CFG 31 //配置区验证 +#define EW_R_ELECT_TEST 32 //电性能检测 +#define EW_W_SAVE_FIRE_SET 33 //保存起爆测试 +#define EW_RA_READ_DELAY 34 //读延时 +#define EW_R_TX_CFG 35 //反码配置 +#define EW_WR_UPDATE_ADDR 36 //更新网络地址 +#define EW_RA_AMEND_VALUE 37 //读校准值 +#define EW_RA_CFG_INFO 38 //读配置信息 +#define EW_W_AUTO_ADDR 39 //自动分配地址 +#define EW_EN_MTP 40 //使失能MTP +#define EW_RA_UID 41 //读UID + +#define EW_COMM_TEST 60 //通信测试没问题 +#define EW_BOOTLOADER_RUN 61 //运行bootloader +#define EW_RA_REGISTER 62 //读MTP +#define EW_WA_REGISTER 63 //写MTP + +/* +@brief 单端第二版,差分接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 超时脉冲数(约1bit数据时间) +@rtv 0 成功 否则失败 +*/ + + +uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out); + +/* +@brief 差分模式数据发送 +@param buf 发送数据缓存 +@param len 发送长度 +@param pre 数据脉冲周期 + +*/ +void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag); +void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag); +uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times); + +/* +@breif 通信测试 +*/ +uint8_t EW_CommTest(uint8_t* buf,uint16_t len,uint16_t cycle); +/* +@brief 使能MTP写 +@param addr 通信地址 +@param 使能开关 +@rtv 执行结果 +*/ +uint8_t EW_EnWriteMTP(uint16_t addr ,uint8_t en_flag); +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 写入数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len); +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 读出数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len); +/* +@brief 运行BootLoader程序 +@param addr 通信地址 +@param reboot 仅重启标准 1 有效 +@rtv 返回执行结果 0 成功 +*/ +uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot); +/* +@brief 写运行配置,写入MTP中 +@param addr 通信地址 +@param runcfg 配置结构体 +@rtv 返回执行结果 +*/ +uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg); +/* +@brief 快速分配通信地址 +@param 通信地址 +@param UID +@param uid_len UID长度 +@param ack_data 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +/* +@brief 快速分配通信地址 +@param 通信地址 +@param 设置延时 +@param UID +@param UID长度 +@param 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +/* +@brief 设置延时 +@param addr 通信地址 +@param 延期时间 +@rtv 返回执行结果 +*/ +uint8_t EW_SetDelay(uint16_t addr,uint16_t delay); +/* +@brief 密码验证 +@param addr 通信地址 +@param 密码数据 +@param 密码长度 +@rtv 返回执行结果 +*/ +uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len); +/* +@brief 密码验证 +@param addr 通信地址 +@param 延迟起爆时间*50ms +@rtv 返回执行结果 +*/ +uint8_t EW_Boom(uint16_t addr,uint8_t delay_count); +/* +@brief 分组充电 +@param addr 通信地址 +@param 充电挡位 0:直通 1 :16V 2:20V 3:2.5V +@param 分组挡位 addr = group*4 大于addr的可以充电 +@rtv 返回执行结果 +*/ +uint8_t EW_Charge(uint16_t addr,uint8_t chg_class,uint8_t group); +/* +@brief 放电 +@param addr 通信地址 +*/ +uint8_t EW_DisCharge(uint16_t addr); +/* +@brief 读状态信息 +@param addr 通信地址 +@param *delay 返回延时数据 +@param *state 返回状态码 +@param len 数据长度 +*/ +uint8_t EW_ReadState(uint16_t addr,uint8_t* state); +/* +@brief 校准地址 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_ClkAmend(uint16_t addr ,uint16_t cycle,uint16_t plus_count); +/* +@brief 巡检 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_Inspect(uint16_t bgaddr ,uint16_t endaddr,uint16_t state,uint8_t* buf); +/* +@brief 配置验证 +@param addr 通信地址 +@param cfg_mask 源掩码信息 +@param 比较信息 (EW_Cfg & cfg_mask) == cfg_state +@param 反码状态 0 比较通过不反码 1 比较通过反码 +@param +*/ +uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint16_t cfg_state,uint8_t* rtv); +/* +@brief 配置验证 +@param addr 通信地址 +@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 4 读电容检测时间 +@param *buf 读出测试结果 +*/ +uint8_t EW_ChecSelf(uint16_t addr,uint8_t check_class,uint8_t* buf); +/* +@brief 保持起爆配置信息和使能起爆 +*/ +uint8_t EW_SaveFireInfo(uint16_t addr); +/* +@brief 读延时和状态值 +@param addr 通信地址 +@param delay 返回延时 +*/ +uint8_t EW_ReadDelay(uint16_t addr,uint16_t* delay); +/* +@brief 通信反码配置 +@param addr 通信地址 +@param speed 通信挡位 0:10K 1:7K 2:5K 3:4.5K 4: 4K 4+n:4-0.5*n +@param cur 电流挡位 0:1mA 1:2mA 2:4mA 3:8mA +*/ +uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur); +/* +@brief 更新网络地址 +@param addr 通信地址 +@param new_addr 新地址 +*/ +uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr); +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadClkAmend(uint16_t addr,uint32_t* clk_amend); +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadRunCfgVersion(uint16_t addr,uint8_t* run_cfg,uint16_t* version); +/* +@brief 自动分配地址 +@param max_addr 分配的最大地址 +@param fac_addr 分配因子 +*/ +uint8_t EW_AutoSetAddr(uint16_t max_addr,uint16_t fac_addr); +#endif + + diff --git a/source/elec_det/driver/JQDriver.c b/source/elec_det/driver/JQDriver.c new file mode 100644 index 0000000..74a74b7 --- /dev/null +++ b/source/elec_det/driver/JQDriver.c @@ -0,0 +1,642 @@ +#include "JQDriver.h" +#include "base/delay.h" +#include "hardware/adc_cfg.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "hardware/timer_cfg.h" +#include "hardware/power.h" +static uint16_t jq_idle_current; + +#define JQ_IDLE_NOISE 100 + +#if JQ_Read_AD_Sample_C > FIREBUS_ADC_BUF_LEN +#error "JQDriver.c Firbus AD Sample BUFFER SIZE LIMIT" +#else +volatile uint16_t* JQ_Read_AD_V = FireBus_ADC_Buf; +#endif +static uint16_t jq_ad_last_sample; +static volatile CurrentSample_Range_eu buscurrent_range = Current_Max; + +uint16_t JQ_FreeBack_MaxCur; +uint16_t JQ_FreeBack_MaxTime; +uint16_t JQ_FreeBack_MinCur; +uint16_t JQ_FreeBack_MinTime; + +uint16_t JQ_CommEnd_MaxCur = 0; +uint8_t JQ_CommEnd_CurEn = 0; + + +uint16_t JQ_EnFreeBack_Test = 0; + +static void JQ_CommBegin() +{ + CurrentSampleR_Def; + WaitDelayEnd(200);//20ms +} +static void JQ_CommEnd() +{ + uint16_t us_temp; + StartDelayTime(); + if(JQ_CommEnd_CurEn > 0) + { + delay_os_ms(10); + us_temp = ADC_Comm1p6mA_EndCur(); + if(us_temp > JQ_CommEnd_MaxCur) + { + JQ_CommEnd_MaxCur = us_temp; + } + } + CurrentSampleR_Def; +} + +/* +@brief 采样总线反馈数据 +@param sample_count 采样次数 +*/ + +static void JQ_Sample(uint16_t sample_count) +{ + uint16_t us_adv = 0; + uint16_t ul_count = 0; + jq_ad_last_sample = GetADC_Fast(ADC_CURR_DE); + for(ul_count = 0;ul_count < sample_count; ul_count++) + { + us_adv = GetADC_Fast(ADC_CURR_DE); + JQ_Read_AD_V[ul_count] = us_adv; + jq_ad_last_sample = us_adv; + } +} + +/* +@brief 通信反码信息初始化 +*/ +void JQ_FreeBack_Prapare(uint8_t enable_flag) +{ + JQ_FreeBack_MaxCur = 0; + JQ_FreeBack_MaxTime = 0; + JQ_FreeBack_MinCur = 0xFFFF; + JQ_FreeBack_MinTime = 0xFFFF; + JQ_EnFreeBack_Test = enable_flag; +} + +//@brief 采样空闲电流 +void JQ_SampleIdleCurrent() +{ + uint16_t sample_count; + uint32_t ul_adc_v = 0; + JQBUS_W_1; + delay_ms(1); + JQ_Sample(JQ_Read_AD_Sample_C_IDLE); + Bubble_Sort_u16((uint16_t*)JQ_Read_AD_V,JQ_Read_AD_Sample_C_IDLE); + sample_count = 15; + while(sample_count < 25) + { + ul_adc_v +=JQ_Read_AD_V[sample_count++]; + } + jq_idle_current = ul_adc_v/10 + JQ_IDLE_NOISE; + delay_us(200); + JQBUS_W_0 + delay_us(2000); +} +/* +@brief 读取1bit数据 +@rtv 返回读取结果 +*/ +uint16_t JQDriver_SAMPLE_Time; + +uint8_t JQ_ReadBit(void) +{ + uint16_t sample_count = 0; + uint32_t ul_adv_sum = 0; + uint8_t uc_bit = 0; + uint16_t uc_mincur_index = 0; + JQBUS_W_1; + delay_us(150); + Get1usCount(); + JQ_Sample(JQ_Read_AD_Sample_C); + JQDriver_SAMPLE_Time = Get1usCount(); + JQBUS_W_0; + + while(sample_count < JQ_Read_AD_Sample_C) + { + if(JQ_Read_AD_V[sample_count] > jq_idle_current ) + { + uc_bit++; + ul_adv_sum += JQ_Read_AD_V[sample_count] ; + }else if(uc_bit < 2)//连续两个大于2启动检测 + { + uc_bit = 0; + ul_adv_sum = 0; + } + sample_count++; + } + if(uc_bit > 10) + { + + /***************记录反码信息*************************/ + ul_adv_sum = ul_adv_sum / uc_bit; + if( JQ_EnFreeBack_Test > 0 ) + { + if(JQ_FreeBack_MaxCur == 0) + { + JQ_FreeBack_MaxCur = JQ_FreeBack_MinCur = ul_adv_sum; + }else if(ul_adv_sum > JQ_FreeBack_MaxCur){ + JQ_FreeBack_MaxCur = ul_adv_sum; + }else if(ul_adv_sum < JQ_FreeBack_MinCur){ + JQ_FreeBack_MinCur = ul_adv_sum; + + } + + if(JQ_FreeBack_MaxTime == 0) + { + JQ_FreeBack_MaxTime = JQ_FreeBack_MinTime = uc_bit; + }else if(uc_bit > JQ_FreeBack_MaxTime) + { + JQ_FreeBack_MaxTime = uc_bit; + }else if(uc_bit < JQ_FreeBack_MinCur){ + JQ_FreeBack_MinTime = uc_bit; + } + + } + delay_us(1100); + return 1; + }else{ + delay_us(350); + return 0; + } +} +/* +@brief 发送不读反馈信号的命令 +@param buf 命令字节缓存区 +@param len 缓存区数据长度 + +*/ +void JQ_SendBroadCast(uint8_t* buf,uint16_t len) +{ + uint8_t uc_data; + uint8_t uc_bitcount; + JQ_CommBegin(); + JQBUS_W_0; + delay_ms(2); + while(len > 0) + { + + uc_bitcount = 0; + uc_data = *buf; + while(uc_bitcount < 8){ + if((uc_data & 0x80) > 0) + { + JQBUS_W_1; + delay_us(JQBUS_H_PLUS); + JQBUS_W_0; + delay_us(JQBUS_L_PLUS); + }else{ + JQBUS_W_1; + delay_us(JQBUS_L_PLUS); + JQBUS_W_0; + delay_us(JQBUS_H_PLUS); + } + uc_bitcount++; + uc_data <<= 1; + } + len--; + buf++; + } + JQBUS_IDLE; + JQ_CommEnd(); +} +//@breif 发送读取命令 +static void JQ_SendReadCmd(uint8_t* cmd_buf,uint16_t w_len) +{ + uint8_t uc_data; + uint8_t uc_bitcount; + JQBUS_W_0; + delay_ms(2); + while(w_len > 0) + { + + uc_bitcount = 0; + uc_data = *cmd_buf; + while(uc_bitcount < 8){ + if((uc_data & 0x80) > 0) + { + JQBUS_W_1; + delay_us(JQBUS_H_PLUS); + JQBUS_W_0; + delay_us(JQBUS_L_PLUS); + }else{ + JQBUS_W_1; + delay_us(JQBUS_L_PLUS); + JQBUS_W_0; + delay_us(JQBUS_H_PLUS); + } + uc_bitcount++; + uc_data <<= 1; + } + w_len--; + cmd_buf++; + } + JQBUS_RWIDLE; +} +/* +@brief 发送待反馈的命令 +@param cmd_buf 命令数据缓存区 +@param read_buf 数据反馈缓存区 +@param w_len 发送缓冲区数据长度 +@param r_len =0 读取1bit应答信号 > 0,读取数据长度 +@rtv 应答ACK +*/ +uint8_t JQ_SendRead(uint8_t* cmd_buf, uint8_t* read_buf,uint16_t w_len,uint16_t r_len) +{ + uint8_t uc_data; + uint8_t ack = 0; + uint8_t uc_bitcount; + JQ_CommBegin(); + if(w_len > 0) + { + JQ_SendReadCmd(cmd_buf,w_len); + } + Power_SetSampleRange_Seep(JQDriver_Sample_R,ADC_SPEED_HIGH); + JQ_SampleIdleCurrent(); + while(r_len > 0) + { + uc_data = 0; + uc_bitcount = 0; + while(uc_bitcount < 8) + { + uc_data <<= 1; + uc_data |= (JQ_ReadBit() & 0x01); + uc_bitcount++; + } + *read_buf = uc_data; + r_len--; + read_buf++; + } + ack = JQ_ReadBit(); + JQBUS_IDLE; + Power_SetSampleCurrentRange(Current_Max); + JQ_CommEnd(); + return ack; +} + +/* +@breif 起爆命令 +@param cmd_count 起爆命令发送次数 +@param read_buf 读取ACK数据,1bit代表一个网络号 +@param run_type 0 不读取应答信号 =1 读取应答信号 >1 读取应答信号,且强制反馈收到应答 +*/ + +void JQ_BoomCmd(uint8_t cmd_count,uint8_t* read_buf,uint8_t run_type) +{ + static uint8_t JQBoomcmd[2]={0xA9,0xB5}; + static uint8_t JQBoomEnCmd[2] = {0x7A,0xB7}; + uint16_t us_pluscount = 0; + uint8_t uc_data,uc_bitcount,send_count; + send_count = 0; + while(send_count < cmd_count) + { + JQ_SendBroadCast(JQBoomEnCmd,2); + delay_os_ms(20); + send_count++; + } + if(run_type == 0) + { + while(cmd_count > 0) + { + //JQ_SendBroadCast(JQBoomcmd,2); + delay_os_ms(20); + JQ_SendRead(JQBoomcmd,&uc_data,2,0); + cmd_count--; + } + us_pluscount = 0; + while(us_pluscount < 680) + { + JQBUS_W_1 + delay_us(1000); + JQBUS_W_0 + delay_us(400); + us_pluscount++; + } + }else{ + while(cmd_count > 0) + { + delay_os_ms(20); + JQ_SendRead(JQBoomcmd,&uc_data,2,0); + cmd_count--; + } + Power_SetSampleRange_Seep(JQDriver_Sample_R,ADC_SPEED_HIGH); + JQ_SampleIdleCurrent(); + while(us_pluscount < 680) + { + uc_data = 0; + uc_bitcount = 0; + while(uc_bitcount < 8) + { + uc_data <<= 1; + uc_data |= (JQ_ReadBit() & 0x01); + if((run_type > 1) && (uc_data& 0x01) < 1) + { + delay_us(750); + } + uc_bitcount++; + us_pluscount++; + } + *read_buf = uc_data; + read_buf++; + + } + } + Power_SetSampleCurrentRange(Current_Max); + JQBUS_IDLE; + JQ_CommEnd(); +} + +/* +@breif 起爆使能 +*/ + + +void JQ_CheckerEnBoomCmd() +{ + static uint8_t JQBoomEnCmd[2] = {0x7A,0xB7}; + JQ_SendBroadCast(JQBoomEnCmd,2); +} + +/* +@breif 起爆命令 +@param plus_count 巡检脉冲个数 +@rtv 巡检应答Ack 的脉冲个数 + +*/ + +uint16_t JQ_CheckerBoomCmd(uint16_t plus_count,uint16_t* us_shake) +{ + static uint8_t JQBoomcmd[2]={0xA9,0xB5}; + uint16_t us_pluscount = 0; + uint16_t us_ack_plus = 0; + uint16_t sample_count = 0; + uint16_t us_bitcount = 0; + uint16_t us_temp_shake; + uint16_t us_max,us_min; + JQ_CheckerEnBoomCmd(); + delay_ms(20); + JQ_SendBroadCast(JQBoomcmd,2); + Power_SetSampleRange_Seep(JQDriver_Sample_R,ADC_SPEED_HIGH); + JQ_SampleIdleCurrent(); + *us_shake = JQ_Read_AD_V[JQ_Read_AD_Sample_C_IDLE-2] - JQ_Read_AD_V[2]; + while(us_pluscount < plus_count) + { + JQBUS_W_1; + delay_us(100); + //700us 延时 + JQ_Sample(JQ_Read_AD_Sample_C); + GetMaxAndMinValue((uint16_t*)JQ_Read_AD_V,JQ_Read_AD_Sample_C,&us_max,&us_min); + us_min = us_max - us_min; + JQBUS_W_0; + sample_count = 0; + while(sample_count < JQ_Read_AD_Sample_C) + { + if(JQ_Read_AD_V[sample_count] > jq_idle_current ) + { + us_bitcount++; + }else if(us_bitcount < 2) + { + us_bitcount = 0; + } + sample_count++; + } + if(us_bitcount > 6) + { + if(us_ack_plus == 0) + { + us_ack_plus = us_pluscount; + } + else{ + us_ack_plus = ~0; + } + delay_us(50); + us_bitcount = 3; + + }else{ + if(us_min > *us_shake) + { + *us_shake = us_min; + } + delay_us(100); + us_bitcount = 3; + } + while(us_bitcount > 0) + { + JQ_Sample(JQ_Read_AD_Sample_C>>1); + GetMaxAndMinValue((uint16_t*)JQ_Read_AD_V,JQ_Read_AD_Sample_C>>1,&us_max,&us_min); + + us_min = us_max - us_min; + if(us_min > *us_shake) + { + *us_shake = us_min; + } + us_bitcount--; + } + us_pluscount++; + } + JQBUS_IDLE; + JQ_CommEnd(); + return us_ack_plus; +} + +static uint16_t amend_endflag = 0; +//@brief 总线波形翻转 +void JQ_TriggerPlus(uint8_t flag) +{ + if(flag == 1) + { + JQBUS_W_0; + }else if(flag > 1){ + JQBUS_W_1; + } + amend_endflag = flag; + +} +//@brief 时钟校准 +void JQ_TimeAmend(uint16_t cycle,uint16_t delayMs) +{ + static uint8_t cmd_buf = 0x34; + JQ_SendBroadCast(&cmd_buf,1); + delay_os_ms(2); + FireBus_ClkAmend(cycle, cycle/2, delayMs+100,JQ_TriggerPlus); + while(amend_endflag != 3) + { + delay_ms(10); + } + JQBUS_IDLE; + delay_os_ms(20); +} +//@breif 巡检 +void JQ_Inspect(uint16_t maxcount,uint8_t* buf,uint8_t state) +{ + static uint8_t cmd_buf[]={0x97,0x00,0x00,0x00}; + cmd_buf[3] = state; + JQ_SendRead(cmd_buf,buf,4,(maxcount+7)/8); +} +//@brief 启动UID扫描 +void JQ_ScanUIDBegin() +{ + static uint8_t start_readuid_cmd = 0x54; + JQ_SendBroadCast(&start_readuid_cmd,1); +} +//@brief 扫描模式读取UID +uint8_t JQ_ScanReadUID(uint16_t begnet,uint8_t* uidbuf) +{ + + static uint8_t scan_uid_cmd[]={0x59,0x00,0x00}; + uint8_t time_out = 3; + uint8_t*p_buf = uidbuf; + uint8_t ack; + rt_memset(p_buf,0,8); + while(time_out > 0) + { + scan_uid_cmd[1] = (begnet >> 8); + scan_uid_cmd[2] = begnet, + ack = JQ_SendRead(scan_uid_cmd,p_buf,3,8); + if(ack > 0) + { + return ack; + }else{ + delay_os_ms(20); + time_out--; + } + } + return 0; +} +//@brief 读延时 +uint8_t JQ_ReadDelay(uint16_t netid,uint16_t* delaybuf) +{ + static uint8_t cmd_buf[3]={0x63,0x00,0x00}; + cmd_buf[1] = (netid >> 8); + cmd_buf[2] = netid; + return JQ_SendRead(cmd_buf,(uint8_t*)delaybuf,3,2); +} +//@brief 写延时 +void JQ_WriteDelay(uint16_t netid,uint16_t delay) +{ + static uint8_t cmd_buf[5]={0x68}; + cmd_buf[1] = (netid >> 8); + cmd_buf[2] = netid; + cmd_buf[3] = (delay >> 8); + cmd_buf[4] = delay; + JQ_SendBroadCast(cmd_buf,5); +} +//@brief 验证密码 +void JQ_VerifyPWD(uint8_t* pwd) +{ + static uint8_t cmd_buf[5] = {0x76}; + rt_memcpy(&cmd_buf[1],pwd,4); + JQ_SendBroadCast(cmd_buf,5); +} +//@brief 使能起爆 +void JQ_BoomActive(void) +{ + static uint8_t cmd_buf[] = {0x7A,0xB7}; + JQ_SendBroadCast(cmd_buf,2); +} +//@brief 设置充电检测判线 +void JQ_ChargJudge(uint8_t dac) +{ + static uint8_t cmd_buf[] = {0x82,0x00}; + cmd_buf[1] = dac; + JQ_SendBroadCast(cmd_buf,2); +} +//@brief 充电 +void JQ_Chage(uint16_t bgnet) +{ + static uint8_t cmd_buf[3] = {0x89}; + cmd_buf[1] = bgnet>>8; + cmd_buf[2] = bgnet; + JQ_SendBroadCast(cmd_buf,3); +} +//@brief 放电 +void JQ_DisChage(void) +{ + static uint8_t cmd_buf[1] = {0x8A}; + JQ_SendBroadCast(cmd_buf,1); +} +//@brief 快速放电 +void JQ_FastDisChage(uint8_t sw) +{ + static uint8_t cmd_buf[2] = {0x8B}; + cmd_buf[1] = sw; + JQ_SendBroadCast(cmd_buf,2); +} +//@brief 复位 +void JQ_Reset(void) +{ + static uint8_t cmd_buf[2] = {0x55,0xAA}; + JQ_SendBroadCast(cmd_buf,2); +} +//@breif 读芯片ID +uint8_t JQ_ReadChipID(uint16_t netid,uint16_t* chipid) +{ + static uint8_t cmd_buf[3] = {0x23}; + cmd_buf[1] = netid>>8; + cmd_buf[2] = netid; + return JQ_SendRead(cmd_buf,(uint8_t*)chipid,3,2); +} +//@brief 读OTP +uint8_t JQ_ReadOTP(uint16_t netid,uint8_t otp_bgaddr,uint8_t read_count,uint8_t* readbuf) +{ + static uint8_t cmd_buf[4] = {0x2A}; + uint8_t otp_endaddr = otp_bgaddr+ read_count; + cmd_buf[1] = netid>>8; + cmd_buf[2] = netid; + cmd_buf[3] = otp_bgaddr; + while(otp_bgaddr < otp_endaddr) + { + cmd_buf[3] = otp_bgaddr; + if(JQ_SendRead(cmd_buf,readbuf,4,1) == 0) + { + break; + } + delay_os_ms(20); + readbuf++; + otp_bgaddr++; + } + return read_count - (otp_endaddr - otp_bgaddr); +} +//@brief 写OTP + +uint8_t JQ_WriteOTP(uint8_t otp_bgaddr,uint8_t write_count,uint8_t* writebuf) +{ + static uint8_t cmd_buf[3] = {0x1A}; + uint8_t otp_endaddr = otp_bgaddr+ write_count; + + while(otp_bgaddr < otp_endaddr) + { + cmd_buf[1] = otp_bgaddr; + cmd_buf[2] = *writebuf; + JQ_SendBroadCast(cmd_buf,3); + delay_os_ms(20); + writebuf++; + otp_bgaddr++; + } + return write_count - (otp_endaddr - otp_bgaddr); +} + +//写OTP使能 +void JQ_EnWOTP(void) +{ + static uint8_t cmd_buf[2] = {0x1E,0xC9}; + JQ_SendBroadCast(cmd_buf,2); +} +//@breif 读取单发状态 +uint8_t JQ_ReadState(uint16_t netid,uint8_t* state) +{ + static uint8_t cmd_buf[3] = {0x91}; + cmd_buf[1] = netid>>8; + cmd_buf[2] = netid; + return JQ_SendRead(cmd_buf,state,3,1); +} +//@braief 设置通信电压模式 +uint8_t JQ_SetPowerMode(uint16_t h_vol,uint16_t m_vol) +{ + return 0; +} diff --git a/source/elec_det/driver/JQDriver.h b/source/elec_det/driver/JQDriver.h new file mode 100644 index 0000000..5f6e834 --- /dev/null +++ b/source/elec_det/driver/JQDriver.h @@ -0,0 +1,82 @@ +#ifndef JQDRIVER_H_ +#define JQDRIVER_H_ + +#include "base/define.h" +#include "hardware/gpio_cfg.h" +#include "hardware/adc_cfg.h" +#include "base/delay.h" + + +#define JQBUS_IDLE JQBUS_W_1 +#define JQBUS_RWIDLE JQBUS_W_1 + + +#define JQBUS_H_PLUS 300 +#define JQBUS_L_PLUS 700 +#define JQ_Read_AD_Sample_C 140 +#define JQ_Read_AD_Sample_C_IDLE 80 + +extern uint16_t JQ_FreeBack_MaxCur; +extern uint16_t JQ_FreeBack_MaxTime; +extern uint16_t JQ_FreeBack_MinCur; +extern uint16_t JQ_FreeBack_MinTime; +extern uint16_t JQ_CommEnd_MaxCur ; +extern uint8_t JQ_CommEnd_CurEn ; + + +//@brief 读OTP +uint8_t JQ_ReadOTP(uint16_t netid,uint8_t otp_bgaddr,uint8_t read_count,uint8_t* readbuf); +//@breif 读取单发状态 +uint8_t JQ_ReadState(uint16_t netid,uint8_t* state); +//@brief 写延时 +void JQ_WriteDelay(uint16_t netid,uint16_t delay); +//@brief 读延时 +uint8_t JQ_ReadDelay(uint16_t netid,uint16_t* delaybuf); +//@brief 启动UID扫描 +void JQ_ScanUIDBegin(void); +//@brief 扫描模式读取UID +uint8_t JQ_ScanReadUID(uint16_t begnet,uint8_t* uidbuf); +//@brief 充电 +void JQ_Chage(uint16_t bgnet); +//@brief 放电 +void JQ_DisChage(void); +//@brief 复位 +void JQ_Reset(void); +//@brief 使能起爆 +void JQ_BoomActive(void); +//@brief 时钟校准 +void JQ_TimeAmend(uint16_t cycle,uint16_t delay_ms); +//写OTP使能 +void JQ_EnWOTP(void); +//@brief 写OTP + +uint8_t JQ_WriteOTP(uint8_t otp_bgaddr,uint8_t write_count,uint8_t* writebuf); +/* +@breif 起爆命令 +@param cmd_count 起爆命令发送次数 +@param read_buf 读取ACK数据,1bit代表一个网络号 +@param run_type 0 不读取应答信号 =1 读取应答信号 >1 读取应答信号,且强制反馈收到应答 +*/ + +void JQ_BoomCmd(uint8_t cmd_count,uint8_t* read_buf,uint8_t run_type); +/* +@breif 起爆命令 +@param plus_count 巡检脉冲个数 +@rtv 巡检应答Ack 的脉冲个数 +*/ +uint16_t JQ_CheckerBoomCmd(uint16_t plus_count,uint16_t* us_shake); +//@breif 巡检 +void JQ_Inspect(uint16_t maxcount,uint8_t* buf,uint8_t state); +//@brief 设置充电检测判线 +void JQ_ChargJudge(uint8_t dac); +//@brief 验证密码 +void JQ_VerifyPWD(uint8_t* pwd); +//@breif 读芯片ID +uint8_t JQ_ReadChipID(uint16_t netid,uint16_t* chipid); +//@brief 快速放电 +void JQ_FastDisChage(uint8_t sw); +/* +@brief 通信反码信息初始化 +*/ +void JQ_FreeBack_Prapare(uint8_t enable_flag); +#endif diff --git a/source/elec_det/driver/LGDriver.c b/source/elec_det/driver/LGDriver.c new file mode 100644 index 0000000..99c9226 --- /dev/null +++ b/source/elec_det/driver/LGDriver.c @@ -0,0 +1,356 @@ +//------------------------------------------------------------------------------------------------------- +//本文件是雷管驱动的底层程序,不对外 +//------------------------------------------------------------------------------------------------------- + +#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(); +} diff --git a/source/elec_det/driver/LGDriver.h b/source/elec_det/driver/LGDriver.h new file mode 100644 index 0000000..8d1f3e7 --- /dev/null +++ b/source/elec_det/driver/LGDriver.h @@ -0,0 +1,21 @@ +#ifndef __LGDRIVER_H +#define __LGDRIVER_H + +//--------------------static------------------------------------ +void LG_Receive_Switch(void); +u8 LG_ReceiveBit(void); +void LG_SendByte(u8 dat); +void LG_SendByte_CaliTime(u16 dat); +u8 LG_ReceiveByte(void); +//--------------------static------------------------------------ + +//接收单bitAck +u8 LG_ReceiveAck(void); +u8 LG_ReceiveParameter(u8 *Parameter, u8 Length); //接收参数 +u16 LG_ReceiveSingleBit(u8 *Parameter, u16 Length, u8 bit); //接收单bit数据 +u16 LG_ReceiveDetBomming(u8 *pStatus, u16 Length, u8 allow); //延时放电 +void LG_SendCommand(u8 Function, u8 *Parameter, u8 Length); //发送功能指令 +void LG_SendCorrectTimeCommand(u8 Function, u16 time); //校时指令 +//发送延时起爆用来清除波形计数--接收1个bit +void LG_CleanWave_Receive(void); +#endif diff --git a/source/elec_det/driver/XTDriver.c b/source/elec_det/driver/XTDriver.c new file mode 100644 index 0000000..553a925 --- /dev/null +++ b/source/elec_det/driver/XTDriver.c @@ -0,0 +1,1268 @@ +#include "XTDriver.h" +#include "hardware/adc_cfg.h" +#include "hardware/timer_cfg.h" +uint32_t XT_SquareCount = 0; //发送载波个数 +uint16_t XT_FreeBackMaxCur,XT_FreeBackMinCur,XT_FreeBackMaxTime,XT_FreeBackMinTime,XT_CommEndMaxCur; +uint8_t XT_EnFreeBack_Test,XT_CommEnd_CurEn; +volatile uint8_t XT_SendSquareFlag = 1; //发送方波标志 +volatile uint8_t XT_ReadUIDFlag = 1; //扫描标志 + + + + +#if XT_Read_AD_Sample_C > FIREBUS_ADC_BUF_LEN +#error "JQDriver.c Firbus AD Sample BUFFER SIZE LIMIT" +#else +volatile uint16_t* XT_ADC_Buf = FireBus_ADC_Buf;//AD采样缓存区 +#endif + +volatile uint8_t XT_ADCCollectStartFlag = 1; //ADC采集标志 + +uint32_t XT_ADC_BaseValue = 0; //ADC采集最低电压 +uint32_t XT_ADC_CollectValue_sum = 0; //ADC采集电压和 +#define XT_FreeBack_Noise 800 + +//static uint32_t XT_ADCCollectIncrementValue = XTCollectIncrementValue; +//static uint32_t XT_ADCCollectSumValue = XTCollectSumValue; +//static uint32_t XT_TIMCollectTimerOverflowUs = XTCollectTimerOverflowUs; + +//static uint32_t XT_ADCSingleCollectAckValue = XTSingleCollectAckValue; + +//static CurrentSample_Range_eu XT_CollectResistance = XTCollectResistance; + +/* +@brief 通信反码信息初始化 +*/ +void XT_FreeBack_Prapare(uint8_t enable_flag) +{ + XT_FreeBackMaxCur = 0; + XT_FreeBackMaxTime = 0; + XT_FreeBackMinCur = 0xFFFF; + XT_FreeBackMinTime = 0xFFFF; + XT_EnFreeBack_Test = enable_flag; +} + +static void XT_CommBegin() +{ + CurrentSampleR_Def; + WaitDelayEnd(50);//5ms +} +static void XT_CommEnd() +{ + uint16_t us_temp; + StartDelayTime(); + if(XT_CommEnd_CurEn > 0) + { + delay_os_ms(10); + us_temp = ADC_Comm1p6mA_EndCur(); + if(us_temp > XT_CommEndMaxCur) + { + XT_CommEndMaxCur = us_temp; + } + } + CurrentSampleR_Def; +} + +static void XT_SendBit(uint8_t bit) +{ + uint8_t i; + if( bit == XTBIT0 ) + { + + for(i=0;i<5;i++) + { + XTBUS_W_0; + delay_us(XT_DAT_PLUS_T); + XTBUS_W_1; + delay_us(XT_DAT_PLUS_T); + } + delay_us(XT_BIT_DELAY); //位结束符 + } + else if( bit == XTBIT1) + { + for(i=0;i<3;i++) + { + XTBUS_W_0; + delay_us(XT_DAT_PLUS_T); + XTBUS_W_1; + delay_us(XT_DAT_PLUS_T); + } + + delay_us(XT_BIT_DELAY); //位结束符 + } +} + +static void XT_SendData(uint8_t *DownData, uint8_t DownLength) +{ + uint8_t temp,i,j; + XT_CommBegin(); + //发送数据 + for(i=0;i> 7) & 0x01 ); + temp <<= 1; + } + } +} + + +volatile uint8_t XT_Trim_Flag = 0; +static void XT_TrimPlusCallback(uint8_t flag) +{ + if(flag == 1) + { + XTBUS_W_0; + }else if(flag > 1){ + XTBUS_W_1; + } + XT_Trim_Flag = flag; +} + +static void XT_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) +{ + delay_us(XTCmdAndSquareUs); + FireBus_ClkAmend(cycle,duty,count,XT_TrimPlusCallback); + XT_Trim_Flag = 0; + while(XT_Trim_Flag != 3) + { + delay_ms(20); + } + +} + +/* +@brief 直接反馈模式 +@param timeoutcnt 回读超时时间 单位0.1ms +@param ConfirmAckCount ADC 采样确认个数 +@param *executiontime +*/ +static uint8_t XT_Get_Ack(uint32_t timeoutcnt, uint8_t ConfirmAckCount,uint32_t *executiontime) +{ + uint32_t FeekValue=0,count=0; + uint32_t ul_readtime = 0,ul_runtime = 0; + uint8_t rtv = 1; + LED1_Out_On; + TimerCount_Init(); + Get100usCount(); + Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HFAST); + //延时700us + delay_us(XTCmdAndSquareUs); +// XT_ADC_BaseValue = 0; +// while(us_temp < 64) +// { +// XT_ADC_BaseValue += ADC_GetCurADCFast(); +// } +// XT_ADC_BaseValue = (XT_ADC_BaseValue>>6) + XT_FreeBack_Noise; + XT_ADC_BaseValue = XT_FreeBack_Noise; + while(ul_runtime < timeoutcnt) + { + FeekValue = ADC_GetCurADCFast(); + if(FeekValue >= XT_ADC_BaseValue) + { + count++; + } + else + { + count=0; + } + if(count>=ConfirmAckCount) + { + *executiontime = ul_readtime + GetCountTimerCnt(); + rtv = 0; + break; + } + ul_runtime = GetCountTimerCnt(); + if(ul_runtime > 60000) + { + ul_readtime += Get100usCount(); + ul_runtime = 0; + } + ul_runtime = ul_readtime+ul_runtime; + + } + LED1_Out_Off; + XTBUS_IDLE; + Power_SetSampleCurrentRange(Current_Max); + XT_CommEnd(); + return rtv; +} + + + + + +static void XT_ReceiveData(uint8_t *UpData, uint32_t ReceiveBitLength) +{ + uint8_t uc_data; + uint32_t ul_readcount,ul_adv_sum; + uint16_t us_adccount ,us_index,us_ack_count; + XTBUS_RWIDLE; + delay_us(XTCmdAndSquareUs); + + Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HIGH); + + UpData[0] = 0; + XTBUS_WR_0; + delay_us(500); + ul_readcount = 0; + while( ul_readcount < ReceiveBitLength) + { + if((ul_readcount & 0x07) == 0) + { + uc_data = 0; + } + XTBUS_WR_1; + delay_us(120); + for(us_adccount = 0; us_adccount < XT_Read_AD_Sample_C; us_adccount++) + { + XT_ADC_Buf[us_adccount] = ADC_GetCurADCFast(); + } + XTBUS_WR_0; + + for(us_index = 3; us_index < us_adccount; us_index ++) + { + if((XT_ADC_Buf[us_index] < XT_FreeBack_Noise) && (XT_ADC_Buf[us_index-1] < XT_FreeBack_Noise)) + { + break; + } + if((XT_ADC_Buf[us_index] < XT_ADC_Buf[us_index-2] ) && (XT_ADC_Buf[us_index-1] < XT_ADC_Buf[us_index-3])) + { + break; + } + } + if(us_index >= us_adccount) + { + delay_us(450); + continue; + } + us_ack_count = 0; + ul_adv_sum = 0; + while(us_index < us_adccount) + { + if(XT_ADC_Buf[us_index] > XT_FreeBack_Noise) + { + ul_adv_sum += XT_ADC_Buf[us_index]; + us_ack_count++; + }else if(us_ack_count < 2)//连续两个大于2启动检测 + { + ul_adv_sum = 0; + us_ack_count = 0; + } + us_index++; + } + + if(us_ack_count > 10) + { + + ul_adv_sum = ul_adv_sum / us_ack_count; + if( XT_EnFreeBack_Test > 0 ) + { + if(XT_FreeBackMaxCur == 0) + { + XT_FreeBackMaxCur = XT_FreeBackMinCur = ul_adv_sum; + }else if(ul_adv_sum > XT_FreeBackMaxCur){ + XT_FreeBackMaxCur = ul_adv_sum; + }else if(ul_adv_sum < XT_FreeBackMinCur){ + XT_FreeBackMinCur = ul_adv_sum; + + } + if(XT_FreeBackMaxTime == 0) + { + XT_FreeBackMaxTime = XT_FreeBackMinTime = us_ack_count; + }else if(us_ack_count > XT_FreeBackMaxTime) + { + XT_FreeBackMaxTime = us_ack_count; + }else if(us_ack_count < XT_FreeBackMinTime){ + XT_FreeBackMinTime = us_ack_count; + } + + } + uc_data |= (0x80 >> (ul_readcount & 0x07)); + } + UpData[ul_readcount>>3] = uc_data; + ul_readcount++; + delay_us(300); + + } + XTBUS_RWIDLE + XT_CommEnd(); +} + + +static void XT_ScanUID(uint8_t *UpData, uint32_t ReceiveBitLength) +{ + uint8_t uc_data; + uint32_t ul_readcount; + + uint16_t us_adccount,us_index2,us_index3; + uint16_t us_ack_count; + uint16_t us_sum1,us_sum2,us_minSum = 0xFFFF; + XTBUS_RWIDLE; + delay_us(XTCmdAndSquareUs); + + Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HFAST); + + UpData[0] = 0; + XTBUS_WR_0; + delay_us(500); + ul_readcount = 0; + while( ul_readcount < ReceiveBitLength) + { + if((ul_readcount & 0x07) == 0) + { + uc_data = 0; + } + XTBUS_WR_1; + delay_us(120); + us_sum1 = 0; + us_sum2 = 0; + for(us_adccount = 0; us_adccount < 8; us_adccount++) + { + XT_ADC_Buf[us_adccount] = ADC_GetCurADCFast(); + if(us_adccount < 4) + { + us_sum1 += XT_ADC_Buf[us_adccount]; + us_index2 = us_adccount; + }else{ + us_sum2 += XT_ADC_Buf[us_adccount]; + us_index3 = us_adccount; + } + } + + us_ack_count = 0; + + while(us_adccount < 160 && us_ack_count < 5) + { + if(us_sum1 < us_minSum) + { + us_minSum = us_sum1; + } + if(us_sum2 > (us_minSum + (XT_FreeBack_Noise << 2))) + { + us_ack_count++; + }else{ + us_ack_count = 0; + } + us_sum1 -= XT_ADC_Buf[(us_index2-3)&0x07]; + us_sum2 -= XT_ADC_Buf[(us_index3-3)&0x07]; + us_adccount++; + XT_ADC_Buf[us_adccount & 0x07] = ADC_GetCurADCFast(); + us_index2++; + us_index3++; + us_sum1 += XT_ADC_Buf[us_index2&0x07]; + us_sum2 += XT_ADC_Buf[us_index3&0x07]; + + } + if(us_ack_count < 5) + { + delay_us(600); + XTBUS_WR_0; + delay_us(300); + }else{ + XTBUS_WR_0; + delay_us(800); + uc_data |= (0x80 >> (ul_readcount & 0x07)); + } + UpData[ul_readcount>>3] = uc_data; + ul_readcount++; + } + XTBUS_RWIDLE + XT_CommEnd(); +} + +static uint8_t XT_CalCRC(uint8_t data[], uint8_t length) +{ + uint8_t c=0,temp,crc[8] = {0},nextcrc[8] = {0}; + uint8_t i,j,k; + for(i=0;i> (7-j)) & 0x1; + nextcrc[0] = temp ^ crc[7]; + nextcrc[1] = temp ^ crc[0] ^ crc[7]; + nextcrc[2] = temp ^ crc[1] ^ crc[7]; + nextcrc[3] = crc[2]; + nextcrc[4] = crc[3]; + nextcrc[5] = crc[4]; + nextcrc[6] = crc[5]; + nextcrc[7] = crc[6]; + for(k=0;k<8;k++) + { + crc[k] = nextcrc[k]; + } + } + } + for(i=0;i<8;i++) + { + c += crc[i]<>6); + *(adcvalue+1) = (RData[6]<<4) + (RData[7]>>4); + *(adcvalue+2) = (RData[7]<<6) + (RData[8]>>2); + + return 0; +} + + +//函数名称:测量储能电容 +//函数参数: +//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位, +// 并打开恒流源开关,关闭放电开关进行充电。充电完成时发出反馈,并关闭恒流源开关,打开放电开关。 +//函数返回:充电时间 +uint8_t XT_Measure_Cap(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t *chargetime) +{ + uint8_t SData[16]; + + SData[0] = XT_CMDA_MEASURE_CAP; + memcpy(SData+1,uid,uidlen); + SData[uidlen+1] = level; + SData[uidlen+2] = XT_CalCRC(SData,uidlen+2); + XT_SendData(SData,uidlen+3); + + return XT_Get_Ack(*chargetime, XTConfirmAckCount, chargetime); +} + + +//函数名称:单发充电 +//函数参数: +//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位, +// 将当前充满电标志位复位,并打开充电开关,关闭放电开关进行充电。充电完成时发出反馈,并将曾充满电标志位、当前充满电标志位置位。 +// LEVEL:0x11-1V、0x22-4V、0x33-6V、0x44-10V、0x55-12V、0x66-14V、0x77-18V、0x88-22V、0x99-26V +//函数返回:是否充满 +uint8_t XT_Charge_One(uint8_t *uid,uint8_t uidlen, uint8_t level,uint16_t busvoltage, uint8_t isgetack) +{ + uint8_t SData[16]; + uint32_t chargetime=0; + uint8_t chargeresult =1; + + SData[0] = XT_CMDA_CHARGE; + memcpy(SData+1,uid,uidlen); + SData[uidlen+1] = level; + SData[uidlen+2] = XT_CalCRC(SData,uidlen+2); + XT_SendData(SData,uidlen+3); + + PowerCalibration_set(busvoltage,XTCOMMMEDIUMVOLTAGE); //修改总线电压 + + if(!isgetack || level == 0x00) + { + return 0; + } + + //XT_GetAckInit(); + + chargeresult = XT_Get_Ack(XTSingleCollectAckTimerOverflowCnt, XTConfirmAckCount, &chargetime); + + return chargeresult; +} + + +/****************************************** +* +* B类指令(广播指令) +* +*******************************************/ + + +//函数名称:清除已读状态 +//函数参数: +//函数功能:UID已读标志位复位。 +//函数返回: +void XT_Clear_Read(void) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_CLEAR_READH; + SData[1] = XT_CMDB_CLEAR_READL; + XT_SendData(SData,2); +} + + +//函数名称:起爆 +//函数参数: +//函数功能:若起爆密码验证通过标志位、延期标定完成标志位、曾充满电标志位均为1, +// 则设置电容电压比较器档位为最低档位,并进入延期状态。延期倒计时归零时,进行起爆前反馈,然后逐位翻转起爆控制信号。之后进行起爆后反馈。若上述标志位不均为1,则对芯片进行复位,效果同软件复位指令相同 +//函数返回: +void XT_Fire() +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_FIREH; + SData[1] = XT_CMDB_FIREL; + XT_SendData(SData,2); +} + + +uint8_t XT_FireandCheck(uint8_t *delay) //delay 3字节 最大的延期时间 +{ + uint8_t SData[2]; + uint8_t fireresult = 1; + uint32_t timeout=0; + uint32_t delay_max=0; + + delay_max = (*delay<<16) + (*(delay+1)<<8) + (*(delay+2)); + + timeout = delay_max*10+5000; + + SData[0] = XT_CMDB_FIREH; + SData[1] = XT_CMDB_FIREL; + XT_SendData(SData,2); + + fireresult = XT_Get_Ack(timeout, 2, &delay_max); + return fireresult; +} + +uint8_t XT_MeasureFire(uint32_t *delay) +{ + uint8_t SData[2]; + uint8_t fireresult = 1; + uint32_t timeout=0; + uint32_t delay_max=0; + + delay_max = *delay+2; + + timeout = delay_max*10+5000; + + SData[0] = XT_CMDB_FIREH; + SData[1] = XT_CMDB_FIREL; + XT_SendData(SData,2); + + fireresult = XT_Get_Ack(timeout, 2, delay); + return fireresult; +} + +//函数名称:初始化 +//函数参数: +//函数功能:初始化寄存器。 +//函数返回: +void XT_Init(uint8_t regdata) +{ + uint8_t SData[3]; + + SData[0] = XT_CMDB_INITH; + SData[1] = XT_CMDB_INITL; + SData[2] = regdata; + XT_SendData(SData,3); +} + + +//函数名称:软件复位 +//函数参数: +//函数功能:对芯片进行复位,2,000时钟周期后可以继续接收指令。 +//函数返回: +void XT_Reset() +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_RESETH; + SData[1] = XT_CMDB_RESETL; + XT_SendData(SData,2); +} + + +//函数名称:扫描 +//函数参数: +//函数功能:读出UID、编号值、延期值、孔位值、状态字节。使用防冲突机制,当重复发送该指令时,所有在线的雷管会按照UID顺序从大到小依次反馈。 +// 指令码长度为2字节,UID长度为7~13字节,编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节,状态字节长度为1字节 +//函数返回:UID、编号值、延期值、孔位值、状态字节 +uint8_t XT_Read_Uid(uint8_t *uid, uint8_t uidlen) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_READ_UIDH; + SData[1] = XT_CMDB_READ_UIDL; + XT_SendData(SData,2); + //XT_ReceiveData(uid,((uint32_t)uidlen<<3)+66); + XT_ScanUID(uid,((uint32_t)uidlen<<3)+66); + + if(*(uid+uidlen+8) & 0x80) + return 0; + else + return 1; +} + + +//函数名称:快速延期标定 +//函数参数: +//函数功能:翻转信号接收模块的识别极性,起爆器会以正常通信相反的极性发送该指令,以控制极性识别错误的雷管恢复正确极性。 +//函数返回: +void XT_Trim_Fast(void) +{ + XT_Trim_Faset_Cycle(1000,500); +} +void XT_Trim_Faset_Cycle(uint16_t cycle,uint16_t duty) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_TRIM_FASTH; + SData[1] = XT_CMDB_TRIM_FASTL; + XT_SendData(SData,2); + + XT_SendTrimSquare(cycle,duty,1026); +} + +//函数名称:完整延期标定 +//函数参数: +//函数功能:标定第1个方波下降沿至第(DELAY+1)个方波下降沿所对应的时钟周期数,并写入TIMER模块的计数器中。标定完成标志位置位。 +//函数返回: +void XT_Trim_Complete(uint32_t delay_max) +{ + XT_Trim_Complete_Cycle(1000,500,delay_max); +} +void XT_Trim_Complete_Cycle(uint16_t cycle,uint16_t duty, uint32_t delay_max) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_TRIM_COMPLETEH; + SData[1] = XT_CMDB_TRIM_COMPLETEL; + XT_SendData(SData,2); + + XT_SendTrimSquare(cycle,duty,delay_max); +} + + +//函数名称:在线检测 +//函数参数: +//函数功能:指令后发送数量等于最大编号值的方波,每发雷管对方波进行计数,在计数到自己的编号值所对应的方波时,反馈1 +//函数返回: +uint8_t XT_Check_Online(uint16_t index_max, uint8_t *online) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_CHECK_ONLINEH; + SData[1] = XT_CMDB_CHECK_ONLINEL; + XT_SendData(SData,2); + XT_ReceiveData(online, index_max+8); + + return 0; +} + + +//函数名称:验证起爆密码 +//函数参数: +//函数功能:验证起爆密码。验证正确时反馈并将起爆密码验证通过标志位置位,否则不反馈 +//函数返回: +uint8_t XT_Check_Bmid(uint8_t *bmid, uint8_t bmidlen) +{ + uint8_t SData[10],RData[1]={0}; + + SData[0] = XT_CMDB_CHECK_BMIDH; + SData[1] = XT_CMDB_CHECK_BMIDL; + + memcpy(SData+2,bmid,bmidlen); + XT_SendData(SData,2+bmidlen); + + XT_ReceiveData(RData, 1); + + if(*RData & 0x80) + return 0; + else + return 1; +} + + +//函数名称:获取全部验证状态 +//函数参数: +//函数功能:若曾充满电标志位、延期标定完成标志位、起爆密码验证通过标志位均为1则不反馈,否则反馈 +//函数返回: +uint8_t XT_Check_Fire_All(void) +{ + uint8_t SData[2],RData[1]={0}; + + SData[0] = XT_CMDB_CHECK_FIRE_ALLH; + SData[1] = XT_CMDB_CHECK_FIRE_ALLL; + XT_SendData(SData,2); + + XT_ReceiveData(RData, 1); + + if(*RData & 0x80) + return 1; + else + return 0; +} + + +//函数名称:逐发获取验证状态 +//函数参数: +//函数功能:指令后发送数量等于最大编号值的方波。 +// 每发雷管对方波进行计数,在计数到自己的编号值所对应的方波时, +// 若当前充满电标志位、延期标定完成标志位、起爆密码验证通过标志位均为1则反馈,否则不反馈 +//函数返回: +uint8_t XT_Check_Fire_Each(uint32_t index_max, uint8_t *check) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDB_CHECK_FIRE_EACHH; + SData[1] = XT_CMDB_CHECK_FIRE_EACHL; + XT_SendData(SData,2); + XT_ReceiveData(check, index_max); + + return 0; +} + + +//函数名称:设置反馈电流大小 +//函数参数: +//函数功能:CRC校验通过时,将SETTING常驻寄存器的[3:2]位改为LEVEL所指定的档位。不改变EEPROM。若要改变EEPROM,应使用写配置区指令。 +//函数返回: +void XT_Set_Current(uint8_t level) +{ + uint8_t SData[3]; + + SData[0] = XT_CMDB_SET_CURRENTH; + SData[1] = level; + SData[2] = XT_CalCRC(SData,2); + XT_SendData(SData,3); +} + + +//函数名称:广播充电 +//函数参数: +//函数功能:CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,将当前充满电标志位复位, +// 并打开充电开关,关闭放电开关进行充电。充电完成时将曾充满电标志位、当前充满电标志位置位。 +// LEVEL:0x11-1V、0x22-4V、0x33-6V、0x44-10V、0x55-12V、0x66-14V、0x77-18V、0x88-22V、0x99-26V +//函数返回: +void XT_Charge_All(uint8_t level) +{ + uint8_t SData[3]; + + SData[0] = XT_CMDB_CHARGE; + SData[1] = level; + SData[2] = XT_CalCRC(SData,2); + XT_SendData(SData,3); +} + +//函数名称:检查配置区 +//函数参数: +//函数功能:CRC校验通过时,若配置区中的UID/起爆密码长度及版本号两个字段同指令中的值相同则不反馈,否则反馈 +//函数返回: +uint8_t XT_Check_Config(uint8_t *config) +{ + uint8_t SData[4],RData[1]={0}; + + SData[0] = XT_CMDB_CHECK_CONFIG; + SData[1] = *(config); + SData[2] = *(config+1); + SData[3] = XT_CalCRC(SData,3); + XT_SendData(SData,4); + + XT_ReceiveData(RData, 1); + + if(*RData & 0x80) + return 1; + else + return 0; +} + + +/****************************************** +* +* C类指令(测试指令) +* +*******************************************/ + +//函数名称:写UID +//函数参数: +//函数功能:将UID写入EEPROM。写入完成后有反馈 +//函数返回: +uint8_t XT_Write_Uid(uint8_t *uid, uint8_t uidlen) +{ + uint8_t SData[14]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_UID; + memcpy(SData+1,uid,uidlen); + XT_SendData(SData,uidlen+1); + + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:写起爆密码 +//函数参数: +//函数功能:将起爆密码写入EEPROM。写入完成后有反馈 +//函数返回: +uint8_t XT_Write_Bmid(uint8_t *bmid, uint8_t bmidlen) +{ + uint8_t SData[9]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_BMID; + memcpy(SData+1,bmid,bmidlen); + XT_SendData(SData,bmidlen+1); + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:写管壳码 +//函数参数: +//函数功能:将管壳码写入EEPROM。写入完成后有反馈 +//函数返回: +uint8_t XT_Write_Shell(uint8_t *shell) +{ + uint8_t SData[14]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_SHELL; + memcpy(SData+1,shell,13); + + XT_SendData(SData,14); + + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:写现场值_C +//函数参数: +//函数功能:将编号值、延期值、孔位值写入EEPROM。写入完成后有反馈。编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节 +//函数返回: +uint8_t XT_Write_Field_All(uint8_t *field) +{ + uint8_t SData[8]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_FIELD; + + memcpy(SData+1,field,13); + + XT_SendData(SData,8); + + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:写配置区 +//函数参数: +//函数功能:将LEN、SETTING、REV写入EEPROM及相应的常驻寄存器。写入完成后有反馈 +//函数返回: +uint8_t XT_Write_Config(uint8_t *config) +{ + uint8_t SData[4]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_CONFIG; + memcpy(SData+1,config,3); + XT_SendData(SData,4); + + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:写测量参数值 +//函数参数: +//函数功能:将CCSC、AMP、R1、Rdson写入EEPROM。写入完成后有反馈 +//函数返回: +uint8_t XT_Write_Param(uint8_t *param) +{ + uint8_t i,SData[5]; + uint32_t writetime=0; + + SData[0] = XT_CMDC_WRITE_PARAM; + + for(i=0;i<4;i++) + { + SData[i+1] = *(param+i); + } + memcpy(SData+1,param,4); + + XT_SendData(SData,5); + + return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime); +} + + +//函数名称:测量储能电容C +//函数参数: +//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,并打开恒流源开关,关闭放电开关进行充电。充电完成时发出反馈,并关闭恒流源开关,打开放电开关。 +//函数返回:充电时间 +uint8_t XT_Measure_Cap_All(uint8_t level, uint32_t *chargetime) +{ + uint8_t SData[2]; + + SData[0] = XT_CMDC_MEASURE_CAP; + SData[1] = level; + XT_SendData(SData,2); + return XT_Get_Ack(*chargetime, XTConfirmAckCount, chargetime); +} + + +//函数名称:锁定 +//函数参数: +//函数功能:向EEPROM中LOCK字段写入0x8B,锁定标志位置位。写入完成后有反馈。锁定后C类指令不再识别,仅可写入现场值 +//函数返回: +void XT_Lock(void) +{ + uint8_t SData[1]; + + SData[0] = XT_CMDC_LOCK; + XT_SendData(SData,1); + delay_us(700); + XTBUS_W_0; + delay_us(500); + XTBUS_W_1; + delay_os_ms(50); +} + + +//函数名称:读测量参数值_C +//函数参数: +//函数功能:读出CCSC、AMP、R1、Rdson +//函数返回: +uint8_t XT_Read_Param_All(uint8_t *param) +{ + uint8_t SData[1]; + + SData[0] = XT_CMDC_READ_PARAM; + XT_SendData(SData,1); + XT_ReceiveData(param, 34); + + if(*(param+4) & 0x80) + return 0; + else + return 1; +} + + +//函数名称:读配置区 +//函数参数: +//函数功能:读出CKCFG、LEN、SETTING、REV +//函数返回: +uint8_t XT_Read_Config(uint8_t *config) +{ + uint8_t SData[1]; + + SData[0] = XT_CMDC_READ_CONFIG; + XT_SendData(SData,1); + XT_ReceiveData(config, 34); + + if(*(config+4) & 0x80) + return 0; + else + return 1; +} + + +//函数名称:读管壳码_C +//函数参数: +//函数功能:读出管壳码。管壳码长度为13字节。反馈完成后会继续反馈一位1作为结束符 +//函数返回: +uint8_t XT_Read_Shell_All(uint8_t *shell) +{ + uint8_t SData[1]; + + SData[0] = XT_CMDC_READ_SHELL; + XT_SendData(SData,1); + XT_ReceiveData(shell, 106); + + if(*(shell+13) & 0x80) + return 0; + else + return 1; +} + + +//函数名称:测量药头电阻_C +//函数参数: +//函数功能:收到指令时打开药头电阻测量电路开关。等待40个载波后,发出ADC复位信号,再经过1个载波后,发出开始ADC采样信号,随后的8个载波中反馈ADC采样的值。然后再发出ADC复位信号,如上重复三次 +//函数返回: +uint8_t XT_Measure_Res_All(uint8_t *adcvalue) +{ + uint8_t SData[1],RData[9]={0}; + + SData[0] = XT_CMDC_MEASURE_RES; + XT_SendData(SData,1); + XT_ReceiveData(RData, 70); + + *adcvalue = (RData[5]<<2) + (RData[6]>>6); + *(adcvalue+1) = (RData[6]<<4) + (RData[7]>>4); + *(adcvalue+2) = (RData[7]<<6) + (RData[8]>>2); + + return 0; +} + + +uint8_t XT_Get_UID_R(uint8_t *uid, uint8_t uidlen) //算桥丝电阻 +{ + uint8_t adcvalue[3]; + uint16_t qsadc=0,count=1; + + XT_Measure_Res(uid,uidlen,adcvalue); + + qsadc = adcvalue[1]; + if(adcvalue[0]>0x00 && adcvalue[0]<0xF0) + { + qsadc += adcvalue[0]; + count++; + } + if(adcvalue[2]>0x00 && adcvalue[2]<0xF0) + { + qsadc += adcvalue[2]; + count++; + } + qsadc = qsadc / count; + return (qsadc & 0xFF); +// if(qsadc < 0xF0) +// return 0; +// else +// return 1; +} + + +uint8_t XT_Get_R() //算桥丝电阻 +{ + uint8_t adcvalue[3]; + uint16_t qsadc=0,count=1; + + XT_Measure_Res_All(adcvalue); + + qsadc = adcvalue[1]; + if(adcvalue[0]>0x00 && adcvalue[0]<0xF0) + { + qsadc += adcvalue[0]; + count++; + } + if(adcvalue[2]>0x00 && adcvalue[2]<0xF0) + { + qsadc += adcvalue[2]; + count++; + } + qsadc = qsadc / count; + return (qsadc & 0xFF); +// if(qsadc < 0xF0) +// return 0; +// else +// return 1; +} + +uint8_t XT_Get_UID_C(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t time_out,float *CapacitanceValue) //算储能电容 +{ + uint8_t exeresult=1; + uint32_t chargetime=time_out; + uint8_t param[5]={0}; + float CSCC=0; + + exeresult = XT_Measure_Cap(uid, uidlen, level, &chargetime); + if(exeresult) + { + return 1; + } + + __disable_irq(); + delay_ms(10); + __enable_irq(); + + exeresult = XT_Read_Param(uid,uidlen, param); + if(exeresult) + { + return 1; + } + + CSCC = 0.390625f * param[0] + 120; + + if(level == 0x11) + { + *CapacitanceValue = CSCC * chargetime /10000.0f; + } + else if(level == 0x22) + { + *CapacitanceValue = CSCC * chargetime / 40000.0f; + } + else if(level == 0x33) + { + *CapacitanceValue = CSCC * chargetime / 100000.0f; + } + + return 0; +} + +uint8_t XT_Get_C(uint8_t level,uint32_t time_out ,float *CapacitanceValue) //算储能电容 +{ + uint8_t exeresult=1; + uint32_t chargetime=time_out; + uint8_t param[5]={0}; + float CSCC=0; + + exeresult = XT_Measure_Cap_All(level, &chargetime); + if(exeresult) + { + return 1; + } + + delay_os_ms(20); + + exeresult = XT_Read_Param_All(param); + if(exeresult) + { + return 1; + } + + CSCC = 0.390625f * param[0] + 120; + + if(level == 0x11) + { + *CapacitanceValue = CSCC * chargetime /10000.0f; + } + else if(level == 0x22) + { + *CapacitanceValue = CSCC * chargetime / 40000.0f; + } + else if(level == 0x33) + { + *CapacitanceValue = CSCC * chargetime / 100000.0f; + } + + return 0; +} + diff --git a/source/elec_det/driver/XTDriver.h b/source/elec_det/driver/XTDriver.h new file mode 100644 index 0000000..d8ccd84 --- /dev/null +++ b/source/elec_det/driver/XTDriver.h @@ -0,0 +1,187 @@ +#ifndef XTDRIVER_H +#define XTDRIVER_H + +#include "base/define.h" +#include "hardware/gpio_cfg.h" +#include "hardware/adc_cfg.h" +#include "base/delay.h" +#include "hardware/power.h" +#include + + + +#define XTBUS_IDLE XTBUS_W_1 +#define XTBUS_RWIDLE XTBUS_WR_1 + +#define XT_Read_AD_Sample_C 120 + +#define XT_ADC_SAMPLE_TIME 589u //采样 XT_Read_AD_Sample_C 所需时间 + + + +#define XTREGISTERVOLTAGE 80 +#define XTCOMMHIGHVOLTAGE 100 //10V 1200米干线可以,1400米干线电压不够 +#define XTCHARGEINSTRUCTIONVOLTAGE 160 +#define XTCOMMMEDIUMVOLTAGE 80 +#define XTCHARGEVOLTAGE 260 //充电20V 1200米电压不够, 充电18V 1200米分档充能充满 + +#define XTBIT0 0 +#define XTBIT1 1 + +#define XTFIRSTDELAY 138 +#define XTFIRSTCYCLE 108 +#define XTSECONDDELAY 128 +#define XTSECONDCYCLE 118 +#define XTTHRIDDELAY 123 +#define XTTHRIDCYCLE 118 +#define XTOTHERDELAY 123 +#define XTOTHERCYCLE 113 + + +#define XT_DAT_PLUS_T 100 +#define XT_BIT_DELAY 180 + +#define XT_TRIM_DELAY 293 +#define XTTRIMCYCLE 693 + +//#define XTFIRSTDELAY 140 //1200米低温可能芯片识别不出来指令 +//#define XTFIRSTCYCLE 140 +//#define XTSECONDDELAY 110 +//#define XTSECONDCYCLE 110 +//#define XTTHRIDDELAY 110 +//#define XTTHRIDCYCLE 110 +//#define XTOTHERDELAY 110 +//#define XTOTHERCYCLE 110 +//#define XTBITDELAY 180 +//#define XTTRIMDELAY 293 +//#define XTTRIMCYCLE 693 + + +#define XTCmdAndSquareUs 700 //指令与方波的时间间隔 +#define XTTimOverflowUs 100 //TIM定时器溢出时间 +#define XTSquareLowTimNum 12 //方波低电平TIM溢出数 这个时间让电容充电 100us后才会开始充电 //原值7 越长反馈幅度越大,最大15 +#define XTSquareCollectTimNum 1 //方波高电平内采样TIM溢出数 +#define XTSquareHighTimNum 7 //方波高电平TIM溢出数 确保比芯片反馈完多100us,最小7,最大15,短点好 + +#define XTCollectResistance 2 //2 - R10_4ma_54ma_MC 3-R1_33ma_540ma_MC +#define XTCollectADCChannel AN_MAL_CH //AN_UA_CH AN_MAL_CH + +#define XTCollectIncrementValue 150 //最小200mV 低温下扫描间隔长一点70ms,300ms一个,短了电压会不够 抢反馈 +#define XTCollectSumValue 1500 +#define XTSingleCollectAckValue 800 //单发检测 +#define XTConfirmAckCount 10 + +#define XTCollectTimerPrescaler 72 //1us +#define XTCollectTimerOverflowUs 600 //600us //450us //要将反馈全部包进去,反馈开始时间最晚在边沿后350us +#define XTSingleCollectTimerPrescaler 7200 //0.1ms +#define XTSingleCollectTimerOverflowMs 500 //50ms +#define XTSingleCollectAckTimerOverflowCnt 20000 //2s //单发充电完成 +#define XTWriteBitTimerOverflowCnt 500 //50ms 指令应答超时 + +#define XT_ADC_BUF_LEN 140 + +//************************************************************************// +#define XT_CMDA_WRITE_FIELD 0xEC //写现场值 +#define XT_CMDA_READ_FIELD 0xEF //读现场值 +#define XT_CMDA_READ_SHELL 0xF4 //读管壳码 +#define XT_CMDA_READ_PARAM 0xF1 //读测量参数值 +#define XT_CMDA_MEASURE_RES 0xF8 //测量药头电阻 +#define XT_CMDA_MEASURE_CAP 0xDB //测量储能电容 +#define XT_CMDA_CHARGE 0xDD //单发充电 + +#define XT_CMDB_CLEAR_READH 0x1F //清除已读状态高8位 +#define XT_CMDB_CLEAR_READL 0x2A //清除已读状态低8位 +#define XT_CMDB_FIREH 0x3C //起爆高8位 +#define XT_CMDB_FIREL 0xC8 //起爆低8位 +#define XT_CMDB_INITH 0x1A //初始化寄存器高8位 +#define XT_CMDB_INITL 0x61 //初始化寄存器低8位 +#define XT_CMDB_RESETH 0x19 //软件复位高8位 +#define XT_CMDB_RESETL 0x66 //软件复位低8位 +#define XT_CMDB_READ_UIDH 0x33 //扫描高8位 +#define XT_CMDB_READ_UIDL 0x34 //扫描低8位 +#define XT_CMDB_TRIM_FASTH 0x2E //快速延期标定高8位 +#define XT_CMDB_TRIM_FASTL 0x2D //快速延期标定低8位 +#define XT_CMDB_TRIM_COMPLETEH 0x2D //完整延期标定高8位 +#define XT_CMDB_TRIM_COMPLETEL 0x33 //完整延期标定低8位 +#define XT_CMDB_CHECK_ONLINEH 0x2B //在线检测高8位 +#define XT_CMDB_CHECK_ONLINEL 0x4B //在线检测低8位 +#define XT_CMDB_CHECK_BMIDH 0x28 //验证起爆密码高8位 +#define XT_CMDB_CHECK_BMIDL 0x7F //验证起爆密码低8位 +#define XT_CMDB_CHECK_FIRE_ALLH 0x27 //获取全部验证状态高8位 +#define XT_CMDB_CHECK_FIRE_ALLL 0x52 //获取全部验证状态低8位 +#define XT_CMDB_CHECK_FIRE_EACHH 0x24 //获取逐发验证状态高8位 +#define XT_CMDB_CHECK_FIRE_EACHL 0x55 //获取逐发验证状态低8位 +#define XT_CMDB_SET_CURRENTH 0x42 //设置反馈电流大小 +#define XT_CMDB_CHARGE 0x41 //广播充电 +#define XT_CMDB_CHECK_CONFIG 0x70 //检查配置区 + +#define XT_CMDC_WRITE_UID 0x1E //写UID +#define XT_CMDC_WRITE_BMID 0x1D //写起爆密码 +#define XT_CMDC_WRITE_SHELL 0x1B //写管壳码 +#define XT_CMDC_WRITE_FIELD 0x18 //写现场值_C +#define XT_CMDC_WRITE_CONFIG 0x14 //写配置区 +#define XT_CMDC_WRITE_PARAM 0x12 //写测量参数值 +#define XT_CMDC_MEASURE_CAP 0x11 //测量储能电容_C +#define XT_CMDC_LOCK 0x3E //锁定 +#define XT_CMDC_READ_PARAM 0x37 //读测量参数值_C +#define XT_CMDC_READ_CONFIG 0x34 //读配置区 +#define XT_CMDC_READ_SHELL 0x2C //读管壳码_C +#define XT_CMDC_MEASURE_RES 0x2F //测量药头电阻_C + + +extern uint16_t XT_FreeBackMaxCur,XT_FreeBackMinCur,XT_FreeBackMaxTime,XT_FreeBackMinTime,XT_CommEndMaxCur; +extern uint8_t XT_EnFreeBack_Test,XT_CommEnd_CurEn; + +//************************************************************************// +/* +@brief 通信反码信息初始化 +*/ +void XT_FreeBack_Prapare(uint8_t enable_flag); +void XT_SendSquare(uint32_t num); +uint8_t XT_Power_Init(void); +void XT_BUS_CTRL( uint8_t NewState ); +uint8_t XT_Write_Field(uint8_t *uid, uint8_t uidlen, uint8_t *field); +uint8_t XT_Read_Field(uint8_t *uid, uint8_t uidlen, uint8_t *field); +uint8_t XT_Read_Shell(uint8_t *uid, uint8_t uidlen, uint8_t *shell); +uint8_t XT_Read_Param(uint8_t *uid, uint8_t uidlen, uint8_t *param); +uint8_t XT_Measure_Res(uint8_t *uid, uint8_t uidlen, uint8_t *adcvalue); +uint8_t XT_Measure_Cap(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t *chargetime); + +uint8_t XT_Charge_One(uint8_t *uid,uint8_t uidlen, uint8_t level,uint16_t busvoltage, uint8_t isgetack); +void XT_Clear_Read(void); +void XT_Fire(void); +uint8_t XT_FireandCheck(uint8_t *delay); +uint8_t XT_MeasureFire(uint32_t *delay) ; +void XT_Init(uint8_t regdata); +void XT_Reset(void); +uint8_t XT_Read_Uid(uint8_t *uid, uint8_t uidlen); +void XT_Trim_Fast(void); +void XT_Trim_Faset_Cycle(uint16_t cycle,uint16_t duty); +void XT_Trim_Complete(uint32_t delay_max); +void XT_Trim_Complete_Cycle(uint16_t cycle,uint16_t duty, uint32_t delay_max); +uint8_t XT_Check_Online(uint16_t index_max, uint8_t *online); +uint8_t XT_Check_Bmid(uint8_t *bmid, uint8_t bmidlen); +uint8_t XT_Check_Fire_All(void); +uint8_t XT_Check_Fire_Each(uint32_t index_max, uint8_t *check); +void XT_Set_Current(uint8_t level); +void XT_Charge_All(uint8_t level); +uint8_t XT_Check_Config(uint8_t *config); +uint8_t XT_Write_Uid(uint8_t *uid, uint8_t uidlen); +uint8_t XT_Write_Bmid(uint8_t *bmid, uint8_t bmidlen); +uint8_t XT_Write_Shell(uint8_t *shell); +uint8_t XT_Write_Field_All(uint8_t *field); +uint8_t XT_Write_Config(uint8_t *config); +uint8_t XT_Write_Param(uint8_t *param); +uint8_t XT_Measure_Cap_All(uint8_t level, uint32_t *chargetime); +void XT_Lock(void); +uint8_t XT_Read_Param_All(uint8_t *param); +uint8_t XT_Read_Config(uint8_t *config); +uint8_t XT_Read_Shell_All(uint8_t *shell); +uint8_t XT_Measure_Res_All(uint8_t *adcvalue); +uint8_t XT_Get_UID_R(uint8_t *uid, uint8_t uidlen); +uint8_t XT_Get_R(void); + +uint8_t XT_Get_UID_C(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t time_out,float *CapacitanceValue) ; +uint8_t XT_Get_C(uint8_t level, uint32_t time_out, float *CapacitanceValue); + +#endif diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c new file mode 100644 index 0000000..c65add8 --- /dev/null +++ b/source/elec_det/elec_det.c @@ -0,0 +1,248 @@ +#include "board.h" +#include "bytearray.h" +#include "mystdlib.h" + +#include "elec_det.h" +#include "base/delay.h" +#include "base/utility.h" +#include "hardware/adc_cfg.h" +#include "hardware/dac_cfg.h" +#include "hardware/gpio_cfg.h" +#include "hardware/jw3425iic.h" +#include "hardware/power.h" +#include "hardware/timer_cfg.h" +#include "driver/EWDriver.h" +#include "driver/JQDriver.h" +#include "driver/XTDriver.h" +#include "interface/BaseChecker.h" +#include "interface/JQChecker.h" +#include "interface/XTChecker.h" + + +#define PLAN_MAX_TASK 64 + + +typedef struct{ + CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//ṹָ + +}self_def; + + +static self_def g_self; + + +// ȡַ +uint8_t elec_local_addr(void) +{ + static uint8_t addr=0; + if(addr==0) + addr=Gpio_GetDeivceAddr(); + return addr; +} + + +// led1״̬ +void elec_led1_power(int power) +{ + LED1_Out=power?1:0; +} + +// led2״̬ +void elec_led2_power(int power) +{ + LED2_Out=power?1:0; +} + + + +// ȡ +array_def *elec_check_result(void) +{ + array_def *r=arr_creat(); + + return arr_temp(r); +} + + +// дӲ汾 +int elec_write_hardversion(int version) +{ + board_st.hard_v=version; + return 0; +} + + + +// дУ׼ֵ +int elec_write_resistor_cbv(int cbv) +{ + board_st.resistor_diff=cbv; + return 0; +} + + +// ˿ֵ +array_def *elec_check_resistor(void) +{ + /* + 1 ͨ1-4ͨ˿ + 2 ͨ2-3ͨ˿ + 3 ͨ1-3ͨ迹 + 4 ͨ2-4ͨ迹 + */ + uint16_t aus_sample[5]; + uint16_t us_resistor; + uint8_t uc_index = 0; + AD_SampleResistor(aus_sample); + for(uc_index = 0; uc_index < 5; uc_index++) + { + aus_sample[uc_index] -= board_st.resistor_diff; + } + // ȡвģʽ + switch(0) + { + case 0: us_resistor = aus_sample[0];break; + case 1: us_resistor = aus_sample[1];break; + case 2: us_resistor = aus_sample[2];break; + default : us_resistor = 0;break; + } + array_def *r=arr_creat(); + arr_append(r,0); + arr_append(r,us_resistor&0xff); + arr_append(r,(us_resistor >> 8) & 0xff); + return arr_temp(r); +} + + + + + +// У鷽,0ɹ +static int elec_check_scheme(void) +{ + uint32_t ul_crc32; + + ul_crc32 = Crc32Calu((uint32_t*)APP_TEST_PLAN_ADDR,(APP_TEST_PLANINFO_SIZE-4)); + if(ul_crc32 != (*(uint32_t*)(APP_TEST_PLAN_ADDR+APP_TEST_PLANINFO_SIZE-4))) + { + board_st.plan_id = ~0; + LED1_Out_Off; + return 1; + } + return 0; +} + + + + +// ط +static void elec_load_scheme(void) +{ + self_def *s=&g_self; + uint8_t uc_index = 0; + uint32_t ul_len; + CheckerTask_Info_st* pinfo_st = (CheckerTask_Info_st*)(APP_TEST_PLAN_ADDR+256); + for(uc_index = 0; uc_index < PLAN_MAX_TASK; uc_index++) + { + s->task_info_array[uc_index] = 0; + } + uc_index = 0; + while((pinfo_st->runindex != 0xFF) && (uc_index < PLAN_MAX_TASK)) + { + s->task_info_array[uc_index++] = pinfo_st; + ul_len = pinfo_st->param_rtv_count & 0x0F; + ul_len = (ul_len<<1)+5; + + pinfo_st = (CheckerTask_Info_st*)((uint8_t*)pinfo_st + ul_len); + } + +} + + +// м +array_def *elec_check_with_scheme(array_def *uid_psw) +{ + self_def *s=&g_self; + const uint8_t* ptaskindex = (uint8_t*)(APP_TEST_PLAN_ADDR+4); + CheckerTask *tasks_fun_table[]={jqtaskArray,xttaskArray}; + CheckerTask_Info_st *task_par=0; + uint8_t chip_type=0; + uint8_t taskid=0; + CheckerTask task_fun=0; + uint8_t res=0; + array_def *r=arr_creat(); + chip_type=(board_st.plan_id >> 12 ) & 0x0F; + if(chip_type>=LENGTH(tasks_fun_table)){ + arr_append(r,1); + return arr_temp(r); + } + memset(&checker_runcfg,0,sizeof(Checker_RunCfg_st)); + int task_index=0; + int err_flag=0; + LED1_Out_Off; + while((ptaskindex[task_index]!=0xff)&&(task_index=CHECKER_MAXID_COUNT){ + break; + } + task_par= s->task_info_array[task_index]; + if(task_par==0){ + break; + } + task_fun=tasks_fun_table[chip_type][taskid]; + if(task_fun==0){ + break; + } + + // װز + rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st)); + checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F; + checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F; + rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2); + + // ִ + for(int i=0;i<1+task_par->retry_time;i++) + { + checker_runcfg.excue_rtv=1; + task_fun(); + Checker_Excueindex(task_index); + if(checker_runcfg.excue_rtv==0) + break; + } + + // Ѱһ + if((checker_runcfg.excue_rtv != 0) + && (checker_runcfg.task_info.error_jumpto != 0) + && (checker_runcfg.task_info.error_jumpto != 0xFF) + ) + { + uint8_t uc_index = task_index+1;//ʱһֱ˳ִ + task_index = checker_runcfg.task_info.error_jumpto; + while(uc_index < task_index) + { + Checker_MaskResult(1,uc_index);//IJδִ + //ֵ±꣬IJķֵ洢ռ䱣 + checker_runcfg.rtv_index += (s->task_info_array[uc_index]->param_rtv_count >> 4) & 0x0F; + uc_index++; + } + }else{ + task_index++;//ֱ˳ִ + } + } + + arr_append(r,0); + arr_appends(r,checker_runcfg.Task_Result,8); + arr_appends(r,checker_runcfg.Task_Excute,8); + arr_appends(r,checker_runcfg.Test_Rtv,checker_runcfg.rtv_index*2); + return arr_temp(r); +} + + + + diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h new file mode 100644 index 0000000..1d3b448 --- /dev/null +++ b/source/elec_det/elec_det.h @@ -0,0 +1,31 @@ +#ifndef elec_det_h__ +#define elec_det_h__ + + +#include "stdint.h" + + + + + +uint8_t elec_local_addr(void); + +void elec_led1_power(int power); + +void elec_led2_power(int power); + + + + + + + + + + + + +#endif + + + diff --git a/source/elec_det/hardware/adc_cfg.c b/source/elec_det/hardware/adc_cfg.c new file mode 100644 index 0000000..f61a782 --- /dev/null +++ b/source/elec_det/hardware/adc_cfg.c @@ -0,0 +1,633 @@ +#include "adc_cfg.h" +#include "gpio_cfg.h" +#include "base/delay.h" +#include "timer_cfg.h" +#include "base/utility.h" +#include "power.h" +uint16_t ad0_adc_sample[AD_SCAN_SAMPLE*AD_SCAN_COUNT]; +#define ADC1_SAMPLE_BUF_LEN 200 +#define ADC1_SAMPLE_BUF_LEN2 20 + +volatile uint16_t FireBus_ADC_Buf[FIREBUS_ADC_BUF_LEN]; + + +uint16_t adc1_sample_buf[ADC1_SAMPLE_BUF_LEN]; +void AdcDef_Init(void) +{ + + ADC_InitTypeDef ADC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE ); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); + + RCC_ADCCLKConfig(RCC_PCLK2_Div6); //12MHz + + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin= VCC_2V5_Pin | VCC_1V25_Pin | V_LA_M_Pin | V_LA_H_Pin | R_AD_01_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_InitStructure); + GPIO_Write(GPIOA,GPIO_InitStructure.GPIO_Pin); + + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin= AD_OUTA_Pin | AD_OUTB_Pin | AN_UA_Pin | AN_MAL_Pin | AN_CAP_AD_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_InitStructure); + GPIO_Write(GPIOC,GPIO_InitStructure.GPIO_Pin); + + ADC_DeInit(ADC1); + ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; + ADC_InitStructure.ADC_ScanConvMode = ENABLE; + ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; + ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; + ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStructure.ADC_NbrOfChannel = AD_SCAN_SAMPLE; + ADC_Init(ADC1, &ADC_InitStructure); + ADC_TempSensorVrefintCmd(ENABLE); + + + + ADC_RegularChannelConfig(ADC1, VCC_2V5_CH, 1, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, VCC_1V25_CH, 2, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, V_LA_M_CH, 3, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, V_LA_H_CH, 4, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, AD_OUTA_CH, 5, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, AD_OUTB_CH, 6, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 7, ADC_SampleTime_71Cycles5); + ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 8, ADC_SampleTime_71Cycles5); + + DMA_DeInit(DMA1_Channel1); + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ad0_adc_sample; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStructure.DMA_BufferSize = AD_SCAN_SAMPLE*AD_SCAN_COUNT; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; + DMA_InitStructure.DMA_M2M = DISABLE; + DMA_Init(DMA1_Channel1,&DMA_InitStructure); + DMA_Cmd(DMA1_Channel1,ENABLE); + + ADC_Cmd(ADC1, ENABLE); + ADC_ResetCalibration(ADC1); + while(ADC_GetResetCalibrationStatus(ADC1)); + + ADC_StartCalibration(ADC1); + while(ADC_GetCalibrationStatus(ADC1)); + + ADC_DMACmd(ADC1,ENABLE); + ADC_SoftwareStartConvCmd(ADC1, ENABLE); + + + + ADC_DeInit(ADC2); + ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; + ADC_InitStructure.ADC_ScanConvMode = DISABLE; + ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; + ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; + ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStructure.ADC_NbrOfChannel = 1; + ADC_Init(ADC2, &ADC_InitStructure); + + ADC_Cmd(ADC2, ENABLE); + ADC_ResetCalibration(ADC2); + while(ADC_GetResetCalibrationStatus(ADC2)); + + ADC_StartCalibration(ADC2); + while(ADC_GetCalibrationStatus(ADC2)); + + ADC_DMACmd(ADC2,ENABLE); + ADC_SoftwareStartConvCmd(ADC2, ENABLE); +} + + +void StartADC2Channel(uint32_t channel, uint32_t speed) +{ + + ADC_RegularChannelConfig(ADC2,channel,1,speed); + ADC_SoftwareStartConvCmd(ADC2,ENABLE); + delay_us(100); +} + +void StartADC1Channel(uint32_t channel) +{ + + ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_71Cycles5); + ADC_SoftwareStartConvCmd(ADC1,ENABLE); + delay_us(100); + //adc_calibration_enable(ADC0); +} + +/* +使用该函数,对ADC2触发一次采样,到用该函数前,应调用一次StartADC1Channel(ch) +*/ +uint32_t GetADC2_Fast(void) +{ + uint16_t time_out = 10000; + uint16_t temp = 0; + ADC_ClearFlag(ADC2,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(ADC2,ENABLE);//启动转换 + while((time_out > 0) && ( ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC) == RESET)) + { + time_out--; + } + temp = ADC_GetConversionValue(ADC2) & 0x0FFF; + return temp; +} +/* +使用该函数,对ADC触发一次采样,到用该函数前,应调用一次StartADC0Channel(ch) +*/ +uint16_t GetADC_Fast(ADC_TypeDef* adc_periph) +{ + uint16_t time_out = 10000; + uint16_t temp = 0; + ADC_ClearFlag(adc_periph,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(adc_periph,ENABLE);//启动转换 + while((time_out > 0) && ( ADC_GetFlagStatus(adc_periph,ADC_FLAG_EOC) == RESET)) + { + time_out--; + } + temp = ADC_GetConversionValue(adc_periph) & 0x0FFF; + return temp; +} + +uint32_t GetADC1_Fast(void) +{ + return GetADC_Fast(ADC1); +} + + +uint32_t GetADC2_Value(uint32_t channel) +{ + StartADC2Channel(channel,ADC_SPEED_MIDLE); + return GetADC2_Fast(); +} + +/* + ADC_RegularChannelConfig(ADC1, VCC_2V5_CH, 1, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, VCC_1V25_CH, 2, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, V_LA_M_CH, 3, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, V_LA_H_CH, 4, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, AD_OUTA_CH, 5, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, AD_OUTB_CH, 6, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 7, ADC_SampleTime_71Cycles5); + ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 8, ADC_SampleTime_71Cycles5); + +*/ +void GetADC1_Value(uint32_t channel,uint16_t* buf,uint16_t len) +{ + uint8_t i = 0; + uint16_t* buf_head = 0; + switch(channel) + { + case VCC_2V5_CH: buf_head = ad0_adc_sample;break; + case VCC_1V25_CH: buf_head = ad0_adc_sample+1;break; + case V_LA_M_CH: buf_head = ad0_adc_sample+2;break; + case V_LA_H_CH: buf_head = ad0_adc_sample+3;break; + case AD_OUTA_CH: buf_head = ad0_adc_sample+4;break; + case AD_OUTB_CH: buf_head = ad0_adc_sample+5;break; + case ADC_Channel_16:buf_head = ad0_adc_sample+6;break; + case ADC_Channel_17:buf_head = ad0_adc_sample+7;break; + default:buf_head = 0;break; + } + if(buf_head == 0) + return; + if(len > AD_SCAN_COUNT) + len = AD_SCAN_COUNT; + for(i=0; i < len ; i++) + { + buf[i] = buf_head[i*AD_SCAN_SAMPLE]; + } + + +} + +float Get_Temperature(void) +{ + uint32_t ad_v; + GetADC1_Value(ADC_Channel_16,(uint16_t*)&ad_v,1); + float temper = (1.43f - ad_v*3.3f/4096) * 1000 / 4.3f + 25; + return temper; +} + + +/*************************ADC App****************************************/ +/* +@brief 稳定获取总线电流 +@rtv 返回电流值 0.1uA +*/ +uint16_t ADC_GetBaseStableCur(void) +{ + uint16_t us_count = 0; + uint16_t us_temp = 0; + uint32_t ul_base; + StartADC2Channel(AN_UA_CH,ADC_SPEED_SLOW); + Power_SetSampleCurrentRange(R100_0uA_160uA_UC); + delay_ms(100); + while(us_count < ADC1_SAMPLE_BUF_LEN) + { + adc1_sample_buf[us_count] = GetADC_Fast(ADC_CURR_DE); + delay_us(20); + if(us_count == 0) + { + ul_base = adc1_sample_buf[us_count] ; + }else{ + ul_base += adc1_sample_buf[us_count] ; + ul_base >>= 1; + } + us_count++; + } + + for(us_count = 0; us_count < ADC1_SAMPLE_BUF_LEN; us_count++) + { + ul_base = (ul_base*8 + adc1_sample_buf[us_count]*2 )/10; + adc1_sample_buf[us_count] = ul_base; + } + Bubble_Sort_u16(adc1_sample_buf,us_count); + + us_count = (ADC1_SAMPLE_BUF_LEN>>2); + us_temp = ADC1_SAMPLE_BUF_LEN - (ADC1_SAMPLE_BUF_LEN>>2); + while(us_count < us_temp) + { + ul_base += adc1_sample_buf[us_count++]; + } + us_temp -= (ADC1_SAMPLE_BUF_LEN>>2); + ul_base = ul_base / us_temp; + ul_base = Power_ConvCur(ul_base,R100_0uA_160uA_UC); + return ul_base; +} + + +/* +@brief 稳定获取总线电流 +@rtv 返回电流值 0.1uA +*/ +uint16_t ADC_Comm1p6mA_EndCur(void) +{ + uint16_t us_count = 0; + uint16_t us_temp = 0; + uint32_t ul_base; + StartADC2Channel(AN_UA_CH,ADC_SPEED_SLOW); + Power_SetSampleCurrentRange(R10_0p1mA_1p6mA_UC); + delay_ms(1); + while(us_count < ADC1_SAMPLE_BUF_LEN2) + { + adc1_sample_buf[us_count] = GetADC_Fast(ADC_CURR_DE); + delay_us(1); + if(us_count == 0) + { + ul_base = adc1_sample_buf[us_count] ; + }else{ + ul_base += adc1_sample_buf[us_count] ; + ul_base >>= 1; + } + us_count++; + } + + for(us_count = 0; us_count < ADC1_SAMPLE_BUF_LEN2; us_count++) + { + ul_base = (ul_base*8 + adc1_sample_buf[us_count]*2 )/10; + adc1_sample_buf[us_count] = ul_base; + } + Bubble_Sort_u16(adc1_sample_buf,us_count); + + us_count = (ADC1_SAMPLE_BUF_LEN2>>2); + us_temp = ADC1_SAMPLE_BUF_LEN2 - (ADC1_SAMPLE_BUF_LEN2>>2); + while(us_count < us_temp) + { + ul_base += adc1_sample_buf[us_count++]; + } + us_temp -= (ADC1_SAMPLE_BUF_LEN2>>2); + ul_base = ul_base / us_temp; + ul_base = Power_ConvCur(ul_base,R10_0p1mA_1p6mA_UC); + return ul_base; +} + +/* +@brief 电流降到指定电流下的时间 +@param 执行时间 单位0.1ms +@rtv 最大波动AD值 +*/ +uint16_t AD_CurMonitor(uint32_t ul_times) +{ + uint32_t ul_count = 0, ul_count2; + uint16_t us_count = 0; + uint16_t aus_adc[20]; + uint16_t us_maxadv,us_minadv = 0; + uint16_t ul_shake = 0; + LED1_Out = 0; + for(ul_count2 =0; ul_count2 < 20;ul_count2++) + { + aus_adc[ul_count2] = ADC_GetCurADCFast(); + } + LED1_Out = 1; + ul_count2 = 0; + while(ul_times > 0) + { + ul_count = 0; + Get100usCount(); + while(ul_count< 50000 && ul_count < ul_times) + { + us_maxadv = 0; + us_minadv = 0xFFF; + + for(us_count = 0; us_count < 20;us_count++) + { + if(aus_adc[us_count] > us_maxadv) + { + us_maxadv = aus_adc[us_count]; + } + if(aus_adc[us_count] < us_minadv) + { + us_minadv = aus_adc[us_count]; + } + } + ul_count2 %= 20; + aus_adc[ul_count2++] = ADC_GetCurADCFast(); + if(us_maxadv < us_minadv) + { + us_minadv = 4096; + }else{ + us_minadv = us_maxadv - us_minadv; + } + if(ul_shake < us_minadv) + { + ul_shake = us_minadv; + if(ul_shake > 500){ + LED1_Out = 0; + delay_us(50); + LED1_Out = 1; + } + } + delay_us(40); + ul_count = GET_COUNTTIM_VAL(); + } + if(ul_count >= ul_times) + { + LED1_Out = 0; + return ul_shake; + } + ul_times -= ul_count; + } + LED1_Out= 0; + return ul_shake; +} + +/* +@brief 电流降到指定电流下的时间 +@param 采样超时 +@param end_adv 检测启动和结束判线 +@param 最大电流ad +@param 电流下降过程中最大向上波动 +@rtv 时间采集值0.1ms +*/ + + +uint16_t AD_GetChgEnergy(uint16_t sample_timeout, uint16_t end_adv,uint16_t* max_cul,uint16_t *shake_adv) +{ + uint16_t aus_adc_v[5]; + uint16_t aus_adv_shake[20]; + uint16_t time_out; + uint16_t us_count = 0; + uint16_t us_shake_count = 0; + uint16_t us_shake_minadc,us_shake_maxadc; + uint8_t start_flag = 0,shake_flag = 0; + Get100usCount(); + ADC_ClearFlag(ADC_CURR_DE,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(ADC_CURR_DE, ENABLE); //启动转换 + aus_adc_v[4] = 0xFFFF; + *max_cul = 0; + *shake_adv = 0; + LED1_Out = 0; + if(end_adv == 0 || end_adv == 0xFFFF) + { + return 0; + } + while(GetCountTimerCnt() < sample_timeout) + { + time_out = 2000; + while((time_out > 0) && ( ADC_GetFlagStatus(ADC_CURR_DE,ADC_FLAG_EOC) == RESET)) + { + time_out--; + } + aus_adc_v[us_count] = ADC_GetConversionValue(ADC_CURR_DE) & 0x0FFF; + aus_adv_shake[us_shake_count] = aus_adc_v[us_count]; + ADC_ClearFlag(ADC_CURR_DE,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(ADC_CURR_DE, ENABLE); //启动转换 + us_count++; + us_shake_count++; + us_count %= 5; + us_shake_count %= 20; + if((us_shake_count == 0) && (start_flag > 0)) + { + shake_flag ++; + } + if(shake_flag == 2) + { + LED1_Out = 1; + shake_flag = 1; + time_out = 0; + us_shake_maxadc = 0; + us_shake_minadc = 0x0FFF; + while(time_out < 20) + { + if(aus_adv_shake[time_out] > us_shake_maxadc) + { + us_shake_maxadc = aus_adv_shake[time_out]; + } + if(aus_adv_shake[time_out] < us_shake_minadc) + { + us_shake_minadc = aus_adv_shake[time_out]; + } + time_out++; + } + us_shake_minadc = us_shake_maxadc - us_shake_minadc; + if(us_shake_minadc > 900) + { + us_shake_minadc = 0; + } + if(*shake_adv < us_shake_minadc) + { + *shake_adv = us_shake_minadc; + } + } + + if(us_count == 0) + { + Bubble_Sort_u16(aus_adc_v,5); + if((aus_adc_v[0] > end_adv) && start_flag == 0) + { + start_flag = 1; + Get100usCount();//未启动重新设置计数器 + } + //连续5个都大于判线值 + else if(start_flag >0 ) + { + if(*max_cul < aus_adc_v[2]) + { + *max_cul = aus_adc_v[2]; + } + if(aus_adc_v[4] < end_adv) + { + LED1_Out = 0; + return Get100usCount(); + } + }else if(start_flag == 0) + { + if(GetCountTimerCnt() > 10000) + { + return 0; + } + } + + } + } + return 40000; +} + +/*获取桥丝电阻*/ +void AD_SampleResistor(uint16_t* channels_re) +{ + uint16_t aus_sample[32]; + uint8_t uc_index = 0; + const static float resistor_cur = 2.49f; + const static float res_mutli = 79.7; + /* + Gpio_ResistorSwitch + @param 0 全关 + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 + + */ + float f_r1,f_r2,f_r3,f_r4; + ADC_ResistorChannelSet(ADC_SPEED_MIDLE); + Gpio_ResistorSwitch(1); + delay_ms(50); + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetResistorADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + f_r1 = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + f_r1 += aus_sample[uc_index]; + } + f_r1 = (((f_r1 /res_mutli)*1000)/4096)*3.3f/resistor_cur/16; + + Gpio_ResistorSwitch(2); + delay_ms(50); + + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetResistorADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + f_r2 = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + f_r2 += aus_sample[uc_index]; + } + f_r2 = (((f_r2 /res_mutli)*1000)/4096)*3.3f/resistor_cur/16; + + Gpio_ResistorSwitch(3); + delay_ms(50); + + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetResistorADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + f_r3 = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + f_r3 += aus_sample[uc_index]; + } + f_r3 = (((f_r3 /res_mutli)*1000)/4096)*3.3f/resistor_cur/16; + + Gpio_ResistorSwitch(4); + delay_ms(50); + + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetResistorADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + f_r4 = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + f_r4 += aus_sample[uc_index]; + } + f_r4 = (((f_r4 /res_mutli)*1000)/4096)*3.3f/resistor_cur/16; + + Gpio_ResistorSwitch(0); + + channels_re[0] = (uint16_t) (((f_r1+f_r2-f_r3-f_r4)/2+0.005f)*100); + channels_re[1] = (uint16_t) ((f_r1+0.005f)*100); + channels_re[2] = (uint16_t) ((f_r2+0.005f)*100); + channels_re[3] = (uint16_t) ((f_r3+0.005f)*100); + channels_re[4] = (uint16_t) ((f_r4+0.005f)*100); + +} + +/*测量电容电压*/ +uint16_t AD_SampleCap(uint16_t delay) +{ + uint32_t ul_ad = 0,ul_ad2 = 0; + uint8_t uc_index = 0; + uint16_t aus_sample[32]; + Gpio_CAPSwitch(1); + ADC_CAPVolChannelSet(ADC_SPEED_MIDLE); + delay_ms(1500); + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetCAPVolADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + ul_ad = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + ul_ad += aus_sample[uc_index]; + } + // + ul_ad >>= 4; + + while(delay > 0) + { + delay_os_ms(100); + delay--; + } + + for(uc_index = 0; uc_index < 32; uc_index++) + { + aus_sample[uc_index] = ADC_GetCAPVolADCFast(); + } + Bubble_Sort_u16(aus_sample,uc_index); + ul_ad2 = 0; + for(uc_index = 8; uc_index < 24; uc_index++) + { + ul_ad2 += aus_sample[uc_index]; + } + //ul_ad2 = ((ul_ad2 *25*11*100/board_st.v2p5_adc/16)+5)/10; + ul_ad2 >>= 4; + + if(ul_ad < ul_ad2) + { + ul_ad = 0; + }else{ + ul_ad = ul_ad - ul_ad2; + ul_ad = ((Power_ADVGetCalVal_106(ul_ad)*11)/100+5)/10 ;//((ul_ad *25*11*1000/board_st.v2p5_adc )+5)/10; + } + Gpio_CAPSwitch(0); + return ul_ad; +} diff --git a/source/elec_det/hardware/adc_cfg.h b/source/elec_det/hardware/adc_cfg.h new file mode 100644 index 0000000..6561504 --- /dev/null +++ b/source/elec_det/hardware/adc_cfg.h @@ -0,0 +1,97 @@ +#ifndef ADC_CFG_H_ +#define ADC_CFG_H_ +#include "base/define.h" + + + + + + +#define AN_UA_CH ADC_Channel_12 //AD2 +#define AN_MAL_CH ADC_Channel_13 //AD2 +#define RAD_01_CH ADC_Channel_2 //AD2 +#define AN_CAP_AD_CH ADC_Channel_15 //AD2 + + + +#define VCC_2V5_CH ADC_Channel_1 //AD1 +#define VCC_1V25_CH ADC_Channel_3 //AD1 +#define V_LA_M_CH ADC_Channel_6 //AD1 +#define V_LA_H_CH ADC_Channel_7 //AD1 +#define AD_OUTA_CH ADC_Channel_10 //AD1 +#define AD_OUTB_CH ADC_Channel_11 //AD1 + + +#define ADC_CURR_DE ADC2 + + + +#define AD_SCAN_COUNT 16 +#define AD_SCAN_SAMPLE 8 + +#define FIREBUS_ADC_BUF_LEN 160 +extern volatile uint16_t FireBus_ADC_Buf[FIREBUS_ADC_BUF_LEN]; + +#define ADC_SPEED_SLOW ADC_SampleTime_239Cycles5 +#define ADC_SPEED_MIDLE ADC_SampleTime_71Cycles5 +#define ADC_SPEED_HIGH ADC_SampleTime_13Cycles5 +#define ADC_SPEED_HFAST ADC_SampleTime_7Cycles5 +void AdcDef_Init(void); +void StartADC2Channel(uint32_t channel, uint32_t speed); +#define ADC_CurChnnelSet(channel,speed) StartADC2Channel(channel,speed) +//桥丝电阻测量通道 +#define ADC_ResistorChannelSet(speed) StartADC2Channel(RAD_01_CH,speed); +//电容电压测量 +#define ADC_CAPVolChannelSet(speed) StartADC2Channel(AN_CAP_AD_CH,speed); + +void StartADC1Channel(uint32_t channel); +void StartADC2ChannelV2(uint32_t channel); +uint32_t GetADC2_Fast(void); +//电流采集通道 +#define ADC_GetCurADCFast() GetADC2_Fast() +//桥丝电阻采集通道 +#define ADC_GetResistorADCFast() GetADC2_Fast() +//电容电压采集通道 +#define ADC_GetCAPVolADCFast() GetADC2_Fast() + +uint32_t GetADC1_Fast(void); + +uint32_t GetADC2_Value(uint32_t channel); +#define ADC_GetCurADC(chnnel) GetADC2_Value(channel) + +void GetADC1_Value(uint32_t channel,uint16_t* buf,uint16_t len); +float Get_Temperature(void); +/* +@brief 稳定获取总线电流 +@rtv 返回电流值 0.1uA +*/ +uint16_t ADC_Comm1p6mA_EndCur(void); +/* +@brief 稳定获取总线电流 +*/ +uint16_t ADC_GetBaseStableCur(void); +/* +@brief 电流降到指定电流下的时间 +@param 采样超时 +@param end_adv 检测启动和结束判线 +@param 最大电流ad +@param 电流下降过程中最大向上波动 +@rtv 时间采集值0.1ms +*/ +uint16_t AD_GetChgEnergy(uint16_t sample_timeout, uint16_t end_adv,uint16_t* max_cul,uint16_t *shake_adv); +/* +@brief 电流降到指定电流下的时间 +@param 执行时间 单位0.1ms +@rtv 最大波动AD值 +*/ +uint16_t AD_CurMonitor(uint32_t us_times); +/* +使用该函数,对ADC触发一次采样,到用该函数前,应调用一次StartADC0Channel(ch) +*/ +uint16_t GetADC_Fast(ADC_TypeDef* adc_periph); + +/*获取桥丝电阻*/ +void AD_SampleResistor(uint16_t* channels_re); +/*测量电容电压*/ +uint16_t AD_SampleCap(uint16_t delay); +#endif diff --git a/source/elec_det/hardware/dac_cfg.c b/source/elec_det/hardware/dac_cfg.c new file mode 100644 index 0000000..2a5b3d3 --- /dev/null +++ b/source/elec_det/hardware/dac_cfg.c @@ -0,0 +1,69 @@ +#include "dac_cfg.h" +#include "gpio_cfg.h" +/* +@brief 默认初始化 +*/ +void DAC_Definit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + DAC_InitTypeDef DAC_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); + + GPIO_InitStructure.GPIO_Pin = C_H_DAC_Pin|C_M_DAC_Pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + + DAC_DeInit(); + DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; + DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; + + + DAC_Init(DAC_Channel_1, &DAC_InitStructure); + + + DAC_Init(DAC_Channel_2, &DAC_InitStructure); + + DAC_Cmd(DAC_Channel_1, ENABLE); + + DAC_Cmd(DAC_Channel_2, ENABLE); + + + + C_H_DAC_Set(4000); + /* configure the DAC1 */ + C_M_DAC_Set(4000); +} +/* +@brief 设置高电平电压 +@param dac_val DAC0输出值 0-4096 +*/ +void C_H_DAC_Set(uint16_t dac_val) +{ + DAC_SetChannel1Data(DAC_Align_12b_R, dac_val); + DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE); +// dac_output_buffer_enable(DAC0); +// dac_data_set(DAC0,DAC_ALIGN_12B_R,dac_val); +// dac_trigger_enable(DAC0); +// dac_enable(DAC0); +// dac_software_trigger_enable(DAC0); +} +/* +@brief 设置高电平电压 +@param dac_val DAC1输出值 0-4096 +*/ +void C_M_DAC_Set(uint16_t dac_val) +{ + DAC_SetChannel2Data(DAC_Align_12b_R, dac_val); + DAC_SoftwareTriggerCmd(DAC_Channel_2,ENABLE); +// dac_output_buffer_enable(DAC1); +// dac_data_set(DAC1,DAC_ALIGN_12B_R,dac_val); +// dac_trigger_enable(DAC1); +// dac_enable(DAC1); +// dac_software_trigger_enable(DAC1); +} + + diff --git a/source/elec_det/hardware/dac_cfg.h b/source/elec_det/hardware/dac_cfg.h new file mode 100644 index 0000000..b7556bb --- /dev/null +++ b/source/elec_det/hardware/dac_cfg.h @@ -0,0 +1,22 @@ +#ifndef DAC_CFG_H +#define DAC_CFG_H +#include "base/define.h" + +#define C_H_DAC_CH DAC_OUT_0 +#define C_H_DAC_CM DAC_OUT_1 + +/* +@brief 设置高电平电压 +@param dac_val DAC0输出值 0-4096 +*/ +void C_H_DAC_Set(uint16_t dac_val); +/* +@brief 设置高电平电压 +@param dac_val DAC1输出值 0-4096 +*/ +void C_M_DAC_Set(uint16_t dac_val); +/* +@brief 默认初始化 +*/ +void DAC_Definit(void); +#endif diff --git a/source/elec_det/hardware/gpio_cfg.c b/source/elec_det/hardware/gpio_cfg.c new file mode 100644 index 0000000..46e3bfd --- /dev/null +++ b/source/elec_det/hardware/gpio_cfg.c @@ -0,0 +1,138 @@ +#include "gpio_cfg.h" +#include "base/delay.h" +void CtrlGpio_DefInit(void) +{ + + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); + + GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); + //GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); + + PAout(LAVC_M_Pin_Nu) = 0; + + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin=LAVC_M_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOA,&GPIO_InitStructure); + GPIO_ResetBits(GPIOA,GPIO_InitStructure.GPIO_Pin); + + GPIO_InitStructure.GPIO_Pin = SEG0_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; + GPIO_Init(GPIOA,&GPIO_InitStructure); + + + PBout(R10_ON_Pin_Nu) = 1; + PBout(R510_ON_Pin_Nu) = 0; + PBout(LED1_Pin_Nu) = 0; + PBout(IO_APD12_Pin_Nu) = 0; + PBout(LED2_Pin_Nu) = 0; + PBout(OUTAL_Pin_Nu) = 0; + PBout(OUTBL_Pin_Nu) = 0; + PBout(OUTAH_Pin_Nu) = 0; + PBout(IO_CAP_AD_Pin_Nu) = 0; + + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin=\ + R10_ON_Pin|R510_ON_Pin|LED1_Pin|IO_APD12_Pin|LED2_Pin|OUTAL_Pin|OUTBL_Pin|OUTAH_Pin|IO_CAP_AD_Pin; + + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOB,&GPIO_InitStructure); + + GPIO_ResetBits(GPIOB,GPIO_InitStructure.GPIO_Pin); + + GPIO_InitStructure.GPIO_Pin = FIRE_TEST_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOB,&GPIO_InitStructure); + + PCout(R100_ON_Pin_Nu) = 0; + PCout(OUTBH_Pin_Nu) = 0; + PCout(POWER_ON_Pin_Nu) = 0; + PCout(IO_APD22_Pin_Nu) = 0; + PCout(IO_APD21_Pin_Nu) = 0; + PCout(IO_APD11_Pin_Nu) = 0; + + + GPIO_InitStructure.GPIO_Pin=\ + R100_ON_Pin|OUTBH_Pin|POWER_ON_Pin|IO_APD22_Pin|IO_APD21_Pin|IO_APD11_Pin; + + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOC,&GPIO_InitStructure); + + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin=SEG4_Pin|SEG3_Pin|SEG1_Pin|SEG2_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOC,&GPIO_InitStructure); + + +} +/* +@brief 获取设备地址 +@param 无 +@rtv 设备地址 +*/ +uint8_t Gpio_GetDeivceAddr(void) +{ + uint16_t ul_addr ; + ul_addr = (PCin(SEG4_Pin_Nu) & 0x01) <<4; + ul_addr |= ((PCin(SEG3_Pin_Nu) & 0x01) <<3); + ul_addr |= ((PCin(SEG2_Pin_Nu) & 0x01) <<2); + ul_addr |= ((PCin(SEG1_Pin_Nu) & 0x01) <<1); + ul_addr |= (PAin(SEG0_Pin_Nu) & 0x01); + return ul_addr; +// return 1; +} + + +/* +@brief 4限制电阻测量通道切换 +@param 0 全关 + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 +*/ +void Gpio_ResistorSwitch(uint8_t uc_r) +{ + /* + 1 2 + 3 4 + */ + switch(uc_r) + { + //1-4通,过桥丝电阻 + case 1: PCout(IO_APD11_Pin_Nu) = 1;PBout(IO_APD12_Pin_Nu) = 0;PCout(IO_APD22_Pin_Nu) = 1;PCout(IO_APD21_Pin_Nu) = 0; break; + //2-3通,过桥丝测电阻 + case 2: PCout(IO_APD11_Pin_Nu) = 0;PBout(IO_APD12_Pin_Nu) = 1;PCout(IO_APD22_Pin_Nu) = 0;PCout(IO_APD21_Pin_Nu) = 1; break; + //1-3通, 测阻抗 + case 3: PCout(IO_APD11_Pin_Nu) = 1;PBout(IO_APD12_Pin_Nu) = 1; PCout(IO_APD22_Pin_Nu) = 0; PCout(IO_APD21_Pin_Nu) = 0; break; + //2-4通,测阻抗 + case 4: PCout(IO_APD11_Pin_Nu) = 0; PBout(IO_APD12_Pin_Nu) = 0; PCout(IO_APD22_Pin_Nu) = 1; PCout(IO_APD21_Pin_Nu) = 1; break; + //全关 + default: PCout(IO_APD11_Pin_Nu) = 0; PBout(IO_APD12_Pin_Nu) = 0;PCout(IO_APD22_Pin_Nu) = 0; PCout(IO_APD21_Pin_Nu) = 0; break; + } +} + +/* +@brief 测量电容电压压降GPIO配置 +*/ + +void Gpio_CAPSwitch(uint8_t uc_sw) +{ + Gpio_ResistorSwitch(0); + if(uc_sw > 0) + { + PBout(IO_CAP_AD_Pin_Nu) = 1; + }else{ + PBout(IO_CAP_AD_Pin_Nu) = 0; + } +} diff --git a/source/elec_det/hardware/gpio_cfg.h b/source/elec_det/hardware/gpio_cfg.h new file mode 100644 index 0000000..1d69c26 --- /dev/null +++ b/source/elec_det/hardware/gpio_cfg.h @@ -0,0 +1,304 @@ +#ifndef GPIO_CFG_H_ +#define GPIO_CFG_H_ +#include "base/define.h" + +//具体实现思想,参考<>第五章(87页~92页). +//IO口操作宏定义 +#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) +#define MEM_ADDR_(addr) *((volatile unsigned long *)(addr)) +#define BIT_ADDR_(addr, bitnum) MEM_ADDR_(BITBAND(addr, bitnum)) +//IO口地址映射 +#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C +#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C +#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C +#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C +#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C +#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C +#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C + +#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 +#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 +#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 +#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 +#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 +#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 +#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 + +//IO口操作,只对单一的IO口! +//确保n的值小于16! +#define PAout(n) BIT_ADDR_(GPIOA_ODR_Addr,n) //输出 +#define PAin(n) BIT_ADDR_(GPIOA_IDR_Addr,n) //输入 + +#define PBout(n) BIT_ADDR_(GPIOB_ODR_Addr,n) //输出 +#define PBin(n) BIT_ADDR_(GPIOB_IDR_Addr,n) //输入 + +#define PCout(n) BIT_ADDR_(GPIOC_ODR_Addr,n) //输出 +#define PCin(n) BIT_ADDR_(GPIOC_IDR_Addr,n) //输入 + +#define PDout(n) BIT_ADDR_(GPIOD_ODR_Addr,n) //输出 +#define PDin(n) BIT_ADDR_(GPIOD_IDR_Addr,n) //输入 + +#define PEout(n) BIT_ADDR_(GPIOE_ODR_Addr,n) //输出 +#define PEin(n) BIT_ADDR_(GPIOE_IDR_Addr,n) //输入 + +#define PFout(n) BIT_ADDR_(GPIOF_ODR_Addr,n) //输出 +#define PFin(n) BIT_ADDR_(GPIOF_IDR_Addr,n) //输入 + +#define PGout(n) BIT_ADDR_(GPIOG_ODR_Addr,n) //输出 +#define PGin(n) BIT_ADDR_(GPIOG_IDR_Addr,n) //输入 + +#define VCC_2V5_Pin GPIO_Pin_1 +#define VCC_2V5_Pin_Nu 1 +#define VCC_2V5_GPIO_Port GPIOA + +#define R_AD_01_Pin GPIO_Pin_3 +#define R_AD_01_Nu 3 +#define R_AD_01_Port GPIOA + +#define VCC_1V25_Pin GPIO_Pin_3 +#define VCC_1V25_Pin_Nu 3 +#define VCC_1V25_GPIO_Port GPIOA + + +#define C_H_DAC_Pin GPIO_Pin_4 +#define C_H_DAC_Pin_Nu 4 +#define C_H_DAC_GPIO_Port GPIOA + +#define C_M_DAC_Pin GPIO_Pin_5 +#define C_M_DAC_Pin_Nu 5 +#define C_M_DAC_GPIO_Port GPIOA + +#define V_LA_M_Pin GPIO_Pin_6 +#define V_LA_M_Pin_Nu 6 +#define V_LA_M_GPIO_Port GPIOA + +#define V_LA_H_Pin GPIO_Pin_7 +#define V_LA_H_Pin_Nu 7 +#define V_LA_H_GPIO_Port GPIOA + +#define LAVC_M_Pin GPIO_Pin_8 +#define LAVC_M_Pin_Nu 8 +#define LAVC_M_GPIO_Port GPIOA + +#define USART1_TX_Pin GPIO_Pin_9 +#define USART1_TX_Pin_Nu 9 +#define USART1_TX_GPIO_Port GPIOA + +#define USART1_RX_Pin GPIO_Pin_10 +#define USART1_RX_Pin_Nu 10 +#define USART1_RX_GPIO_Port GPIOA + +#define CAN1_RX_Pin GPIO_Pin_10 +#define CAN1_RX_Pin_Nu 11 +#define CAN1_RX_GPIO_Port GPIOA + +#define CAN1_TX_Pin GPIO_Pin_11 +#define CAN1_TX_Pin_Nu 12 +#define CAN1_TX_GPIO_Port GPIOA + +#define SEG0_Pin GPIO_Pin_15 +#define SEG0_Pin_Nu 15 +#define SEG0_GPIO_Port GPIOA + + +#define R10_ON_Pin GPIO_Pin_0 +#define R10_ON_Pin_Nu 0 +#define R10_ON_GPIO_Port GPIOB + + +#define R510_ON_Pin GPIO_Pin_1 +#define R510_ON_Pin_Nu 1 +#define R510_ON_GPIO_Port GPIOB + +#define LED1_Pin GPIO_Pin_2 +#define LED1_Pin_Nu 2 +#define LED1_GPIO_Port GPIOB + +#define IO_CAP_AD_Pin GPIO_Pin_5 +#define IO_CAP_AD_Pin_Nu 5 +#define IO_CAP_AD_Port GPIOB + +#define FIRE_TEST_Pin GPIO_Pin_8 +#define FIRE_TEST_Pin_Nu 8 +#define FIRE_TEST_Port GPIOB + +#define IO_APD12_Pin GPIO_Pin_9 +#define IO_APD12_Pin_Nu 9 +#define IO_APD12_GPIO_Port GPIOB + +#define I2IC_SCL_Pin GPIO_Pin_10 +#define I2IC_SCL_Pin_Nu 10 +#define I2IC_SCL_GPIO_Port GPIOB + +#define I2IC_SDA_Pin GPIO_Pin_11 +#define I2IC_SDA_Pin_Nu 11 +#define I2IC_SDA_GPIO_Port GPIOB + + +#define LED2_Pin GPIO_Pin_12 +#define LED2_Pin_Nu 12 +#define LED2_GPIO_Port GPIOB + +#define OUTAL_Pin GPIO_Pin_13 +#define OUTAL_Pin_Nu 13 +#define OUTAL_GPIO_Port GPIOB + +#define OUTBL_Pin GPIO_Pin_14 +#define OUTBL_Pin_Nu 14 +#define OUTBL_GPIO_Port GPIOB + +#define OUTAH_Pin GPIO_Pin_15 +#define OUTAH_Pin_Nu 15 +#define OUTAH_GPIO_Port GPIOB + + +#define AD_OUTA_Pin GPIO_Pin_0 +#define AD_OUTA_Pin_Nu 0 +#define AD_OUTA_Port GPIOC + +#define AD_OUTB_Pin GPIO_Pin_1 +#define AD_OUTB_Pin_Nu 1 +#define AD_OUTB_Port GPIOC + +#define AN_UA_Pin GPIO_Pin_2 +#define AN_UA_Pin_Nu 2 +#define AN_UA_Port GPIOC + +#define AN_MAL_Pin GPIO_Pin_3 +#define AN_MAL_Pin_Nu 3 +#define AN_MAL_Port GPIOC + +#define R100_ON_Pin GPIO_Pin_4 +#define R100_ON_Pin_Nu 4 +#define R100_ON_GPIO_Port GPIOC + +#define AN_CAP_AD_Pin GPIO_Pin_5 +#define AN_CAP_AD_Pin_Nu 5 +#define AN_CAP_AD_Port GPIOC + +#define OUTBH_Pin GPIO_Pin_6 +#define OUTBH_Pin_Nu 6 +#define OUTBH_GPIO_Port GPIOC + +#define POWER_ON_Pin GPIO_Pin_7 +#define POWER_ON_Pin_Nu 7 +#define POWER_ON_GPIO_Port GPIOC + +#define SEG4_Pin GPIO_Pin_8 +#define SEG4_Pin_Nu 8 +#define SEG4_GPIO_Port GPIOC + +#define SEG3_Pin GPIO_Pin_9 +#define SEG3_Pin_Nu 9 +#define SEG3_GPIO_Port GPIOC + +#define SEG1_Pin GPIO_Pin_10 +#define SEG1_Pin_Nu 10 +#define SEG1_GPIO_Port GPIOC + +#define SEG2_Pin GPIO_Pin_11 +#define SEG2_Pin_Nu 11 +#define SEG2_GPIO_Port GPIOC + +#define U3_TXD_Pin GPIO_Pin_10 +#define U3_TXD_Pin_Nu 10 +#define U3_TXD_GPIO_Port GPIOC + +#define U3_RXD_Pin GPIO_Pin_11 +#define U3_RXD_Pin_Nu 11 +#define U3_RXD_GPIO_Port GPIOC + +#define IO_APD22_Pin GPIO_Pin_13 +#define IO_APD22_Pin_Nu 13 +#define IO_APD22_GPIO_Port GPIOC + + +#define IO_APD21_Pin GPIO_Pin_14 +#define IO_APD21_Pin_Nu 14 +#define IO_APD21_GPIO_Port GPIOC + +#define IO_APD11_Pin GPIO_Pin_15 +#define IO_APD11_Pin_Nu 15 +#define IO_APD11_GPIO_Port GPIOC + + + + + + + + + + +#define LED2_Out PBout(LED2_Pin_Nu) +#define LED1_Out PBout(LED1_Pin_Nu) +#define LED1_Out_On PBout(LED1_Pin_Nu)=0 +#define LED1_Out_Off PBout(LED1_Pin_Nu)=1 + +//电源开关 + +#define POWER_ON {PCout(POWER_ON_Pin_Nu) = 1;} +#define POWER_OFF {PCout(POWER_ON_Pin_Nu) = 0;} + +//桥驱动 +#define HMOS_SWITCH_W_1 {PAout(LAVC_M_Pin_Nu)=0; PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;} +#define HMOS_SWITCH_W_0 {PAout(LAVC_M_Pin_Nu)=0; PBout(OUTBL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTAL_Pin_Nu)=1;PCout(OUTBH_Pin_Nu)=1;} + +#define HMOS_SWITCH_RW_1 {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} +#define HMOS_SWITCH_RW_0 {PAout(LAVC_M_Pin_Nu)=0; PBout(OUTBL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTAL_Pin_Nu)=1;PCout(OUTBH_Pin_Nu)=1;} + +#define HMOS_SWITCH_GND {PCout(OUTBH_Pin_Nu)=0; PAout(LAVC_M_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0;delay_nop(50);PBout(OUTBL_Pin_Nu)=1;PBout(OUTAL_Pin_Nu)=1;} +#define HMOS_SWITCH_OFF {PCout(OUTBH_Pin_Nu)=0; PAout(LAVC_M_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0;delay_nop(50);PBout(OUTBL_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;} +#define HMOS_FAST_DISCHG {PCout(POWER_ON_Pin_Nu) = 0; PCout(OUTBH_Pin_Nu)=0; PAout(LAVC_M_Pin_Nu)=0;PBout(OUTBL_Pin_Nu)=0;delay_nop(50);PBout(OUTAH_Pin_Nu)=1;PBout(OUTAL_Pin_Nu)=1;} +#define HMOS_SWITCH_ON {PAout(LAVC_M_Pin_Nu)=0;PCout(OUTBH_Pin_Nu)=0; PBout(OUTAL_Pin_Nu)=0;delay_nop(50);PBout(OUTBL_Pin_Nu)=1;PBout(OUTAH_Pin_Nu)=1;} + +//芯跳桥驱动 +#define XTBus_POWER_Out HMOS_SWITCH_W_1//总线模式开关 +#define XTBUS_ON HMOS_SWITCH_ON +#define XTBUS_OFF HMOS_SWITCH_OFF +#define XTBUS_W_1 HMOS_SWITCH_W_1 +#define XTBUS_W_0 HMOS_SWITCH_W_0 +#define XTBUS_WR_1 HMOS_SWITCH_W_1 +#define XTBUS_WR_0 HMOS_SWITCH_W_0 + +//JQ 桥驱动 + +#define JQBus_POWER_Out HMOS_SWITCH_W_1 //总线模式开关 +#define JQBUS_ON HMOS_SWITCH_ON +#define JQBUS_OFF HMOS_SWITCH_OFF +#define JQBUS_W_1 HMOS_SWITCH_W_1 +#define JQBUS_W_0 HMOS_SWITCH_W_0 + +//EW 桥驱动 +#define EW_SINGLE_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} +#define EW_SINGLE_MOD_H HMOS_SWITCH_W_1 + +#define EW_DIFF_MOD_M {PCout(OUTBH_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; delay_nop(50); PBout(OUTBL_Pin_Nu)=1;PAout(LAVC_M_Pin_Nu)=1;} +#define EW_DIFF_MOD_H HMOS_SWITCH_W_1 +#define EW_DIFF_MOD_L HMOS_SWITCH_W_0 +#define EW_BUS_OFF HMOS_SWITCH_OFF + + +void CtrlGpio_DefInit(void); +/* +@brief 获取设备地址 +@param 无 +@rtv 设备地址 +*/ +uint8_t Gpio_GetDeivceAddr(void); + +/* +@brief 4限制电阻测量通道切换 +@param 0 全关 + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 +*/ +void Gpio_ResistorSwitch(uint8_t uc_r); +/* +@brief 测量电容电压压降GPIO配置 +*/ +void Gpio_CAPSwitch(uint8_t uc_sw); +#endif + diff --git a/source/elec_det/hardware/hardware.c b/source/elec_det/hardware/hardware.c new file mode 100644 index 0000000..78ba9ae --- /dev/null +++ b/source/elec_det/hardware/hardware.c @@ -0,0 +1,89 @@ +#include "base/define.h" +#include "gpio_cfg.h" +#include "adc_cfg.h" +//#include "usartapp.h" +//#include "console_usart.h" +#include "base/delay.h" +#include "power.h" +//#include "database.h" +#include "timer_cfg.h" +#include "base/utility.h" +//#include "yecan.h" +#include "hardware/jw3425iic.h" +BoartCheck_st board_st; +BoardInfo_un boardinfo_un; + +void test_timer_function() +{ + static uint8_t flag_ = 0; + LED1_Out = flag_; + flag_ ^= 0x01; +} + +//检测小板初始化 +void Ye_BoardInit(void) +{ + + AdcDef_Init(); + DAC_Definit(); +// ConsoleUsart_Init(); +// YeCanInit(); + CtrlGpio_DefInit(); + DelayTimer_Init(); + TimerCount_Init(); + CurrentSampleR_Def + I2C_init(); + delay_ms(500); + +} +/* + 测试小板上电自检 +*/ +void Ye_BoardCheck(void) +{ + uint16_t aus_buf[AD_SCAN_COUNT]; + board_st.app_run_flag = 1; + board_st.device_id = Gpio_GetDeivceAddr(); + board_st.chip_temp = (uint16_t)(Get_Temperature()*10); + board_st.soft_v = SoftVersion; + board_st.hard_v = boardinfo_un.boardinfo.hard_v; + board_st.resistor_diff = boardinfo_un.boardinfo.resistor_diff; + board_st.plan_id = *((uint32_t*)APP_TEST_PLAN_ADDR); + + + GetADC1_Value(VCC_1V25_CH,aus_buf,AD_SCAN_COUNT); + Bubble_Sort_u16(aus_buf,AD_SCAN_COUNT); + board_st.v1p25_adc = aus_buf[AD_SCAN_COUNT>>1]; + + GetADC1_Value(VCC_2V5_CH,aus_buf,AD_SCAN_COUNT); + Bubble_Sort_u16(aus_buf,AD_SCAN_COUNT); + board_st.v2p5_adc = aus_buf[AD_SCAN_COUNT>>1]; + + GetADC1_Value(ADC_Channel_16,aus_buf,AD_SCAN_COUNT); + Bubble_Sort_u16(aus_buf,AD_SCAN_COUNT); + board_st.adc_shake = aus_buf[AD_SCAN_COUNT-1] - aus_buf[0]; + + + LED1_Out = 1; + if(0 != PowerCalPrapare()) + { + board_st.v1p25_adc = 0; + LED1_Out = 0; + } + PowerCalibration_set(POWER_DEF_V,45); + delay_ms(100); + board_st.bus_5p5v = Power_GetHPowerV(); +// +#ifdef CHECKER_DEV + PowerCalibration_set(260,50); + delay_ms(100); +#else + PowerCalibration_set(90,45); +#endif + board_st.bus_26v = Power_GetHPowerV(); +// + PowerCalibration_set(POWER_DEF_V,45); + + +} + diff --git a/source/elec_det/hardware/jw3425iic.c b/source/elec_det/hardware/jw3425iic.c new file mode 100644 index 0000000..509a449 --- /dev/null +++ b/source/elec_det/hardware/jw3425iic.c @@ -0,0 +1,731 @@ +#include "jw3425iic.h" +#include "gpio_cfg.h" +#include "base/delay.h" +#include "interface/basechecker.h" +#include "base/utility.h" + + + +void IIC_SDA_DIR(uint8_t dir) +{ + GPIO_InitTypeDef GPIO_InitStructure; + if(dir == 0) + { + + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; + + }else{ + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; + } + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Pin= I2IC_SDA_Pin; + GPIO_Init(GPIOB,&GPIO_InitStructure); +} + +void I2C_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + /* enable GPIOB clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin=I2IC_SCL_Pin | I2IC_SDA_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOB,&GPIO_InitStructure); + IIC_SDA(1); + IIC_SCL(1); +} +void I2C_Definit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + /* enable GPIOB clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); + //GPIO 配置 + GPIO_InitStructure.GPIO_Pin=I2IC_SCL_Pin | I2IC_SDA_Pin; + GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; + GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; + GPIO_Init(GPIOB,&GPIO_InitStructure); +} +//产生IIC起始信号 +void IIC_Start(void) +{ + SDA_OUT(); //sda线输出 + IIC_SDA(1); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY); + IIC_SDA(0);//START:when CLK is high,DATA change form high to low + delay_us(IIC_PLUS_DELAY); + IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 +} +//产生IIC停止信号 +void IIC_Stop(void) +{ + SDA_OUT();//sda线输出 + IIC_SCL(0); + IIC_SDA(0);//STOP:when CLK is high DATA change form low to high + delay_us(IIC_PLUS_DELAY); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY); + IIC_SDA(1);//发送I2C总线结束信号 +} + +//等待应答信号到来 +//返回值:1,接收应答失败 +// 0,接收应答成功 +uint8_t IIC_Wait_Ack(void) +{ + uint32_t ucErrTime=0; + SDA_IN(); //SDA设置为输入 + IIC_SDA(1); + delay_us(1); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY>>1); + while(READ_SDA) + { + ucErrTime++; + if(ucErrTime>I2C_OPERATION_OUTTIME) + { + IIC_Stop(); + return 1; + } + } + IIC_SCL(0);//时钟输出0 + return 0; +} +//产生ACK应答 +void IIC_Ack(void) +{ + IIC_SCL(0); + SDA_OUT(); + IIC_SDA(0); + delay_us(IIC_PLUS_DELAY); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY); + IIC_SCL(0); +} +//不产生ACK应答 +void IIC_NAck(void) +{ + IIC_SCL(0); + SDA_OUT(); + IIC_SDA(1); + delay_us(IIC_PLUS_DELAY); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY); + IIC_SCL(0); +} +//IIC发送一个字节 +//返回从机有无应答 +//0,有应答 +//1,无应答 +uint8_t IIC_Send_Byte(uint8_t txd) +{ + uint8_t t; + SDA_OUT(); + for(t=0;t<8;t++) + { + IIC_SCL(0);//拉低时钟开始数据传输 + delay_us(IIC_PLUS_DELAY>>1); + IIC_SDA((txd&0x80)>>7); + txd<<=1; + delay_us(IIC_PLUS_DELAY>>1); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY); + } + IIC_SCL(0); + delay_us(IIC_PLUS_DELAY >>1); + + return IIC_Wait_Ack(); +} + +//读1个字节,ack=1时,发送ACK,ack=0,发送nACK +uint8_t IIC_Read_Byte(unsigned char ack) +{ + unsigned char i,receive=0; + SDA_IN();//SDA设置为输入 + for(i=0;i<8;i++ ) + { + IIC_SCL(0); + delay_us(IIC_PLUS_DELAY); + IIC_SCL(1); + delay_us(IIC_PLUS_DELAY>>1); + receive<<=1; + if(READ_SDA)receive++; + delay_us(IIC_PLUS_DELAY >> 1); + } + if (!ack) + IIC_NAck();//发送nACK + else + IIC_Ack(); //发送ACK + return receive; +} + + + + + +/* @param bi_dir: option using in transceive */ +int32_t I2C_master_write(uint16_t address, uint8_t *src, uint32_t size, uint32_t *nwriten, uint8_t bi_dir) +{ + uint32_t timeout = 0; + uint8_t ack = 0; + *nwriten = 0; + __disable_irq(); + IIC_Start(); + //发送地址 + ack = IIC_Send_Byte(( address<<1)); + if(ack) + { + goto iic_send_stop; + } + while (*nwriten < size) { + ack = IIC_Send_Byte(src[*nwriten]); + if(ack) + { + break; + } + (*nwriten)++; + } + +iic_send_stop: + if(bi_dir ==0)//bi_dir == 1时不发送停止信号 + { + IIC_Stop(); + } + __enable_irq(); + return ack; +} + +/* @param bi_dir: option using in transceive */ +int32_t I2C_master_read(uint16_t address, uint8_t *dst, uint32_t size, uint32_t *nread, uint8_t bi_dir) +{ + uint32_t i; + *nread = 0; + uint8_t ack = 0; + if (size == 0) + return 0; + __disable_irq(); + IIC_Start();//重新发送起始信号 + ack = IIC_Send_Byte(( address << 1) | 0x01);//发送读命令地址 + if(ack) + goto send_stop_err; + while(*nread < size) + { + if((*nread) == (size-1))//倒数1个字节,设置不应答 + { + dst[*nread] = IIC_Read_Byte(0); + }else{ + dst[*nread] = IIC_Read_Byte(1); + } + (*nread)++; + } +send_stop_err: + // If receive NACK or no data to write, send STOP + if (bi_dir == 0) + IIC_Stop(); + __enable_irq(); + return ack; +} + + +/* @param bi_dir: option using in transceive */ +int32_t I2C_master_write_read(uint16_t address, uint8_t*cmd, uint8_t cmd_size,uint8_t *dst, uint32_t read_size, uint32_t *nread) +{ + uint32_t ul_writen; + *nread = 0; + + if (read_size == 0) + return 0; + I2C_master_write(address,cmd,cmd_size,&ul_writen,1); + if(ul_writen != cmd_size) + { + IIC_Stop(); + return 1; + } + I2C_master_read(address, dst, read_size, nread, 1); + IIC_Stop(); + if(read_size != *nread) + { + return 1; + } + return 0; +} + + +int32_t I2C_master_writeCode(uint16_t address, uint8_t *cmd_src, uint32_t cmd_len,const uint8_t* puc_cod,uint32_t code_len ) +{ + uint8_t uc_code; + uint8_t ack = 0; + __disable_irq(); + IIC_Start(); + //发送地址 + ack = IIC_Send_Byte(( address<<1)); + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + //发送命令 + while (cmd_len > 0) { + ack = IIC_Send_Byte(*cmd_src); + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + cmd_src++; + cmd_len--; + } + //发送代码数据 + while (code_len > 0) { + uc_code = *puc_cod; + ack = IIC_Send_Byte(uc_code); + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + puc_cod++; + code_len--; + } + IIC_Stop(); + __enable_irq(); + return ack; +} + + +int32_t I2C_master_CodeEquel(uint16_t address, uint8_t *cmd_src, uint32_t cmd_len,const uint8_t* puc_cod,uint32_t code_len ) +{ + uint8_t uc_code; + uint8_t uc_rdata; + uint8_t ack = 0; + __disable_irq(); + IIC_Start(); +//发送地址 + ack = IIC_Send_Byte(( address<<1)); + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + //发送命令 + while (cmd_len > 0) { + ack = IIC_Send_Byte(*cmd_src); + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + cmd_src++; + cmd_len--; + } + IIC_Start();//重新发送起始信号 + ack = IIC_Send_Byte(( address << 1) | 0x01);//发送读命令地址 + if(ack) + { + IIC_Stop(); + __enable_irq(); + return ack; + } + while(code_len > 0) + { + uc_code = *puc_cod; + puc_cod++; + if(code_len == 1)//倒数1个字节,设置不应答 + { + uc_rdata = IIC_Read_Byte(0); + }else{ + uc_rdata = IIC_Read_Byte(1); + } + if(uc_code != uc_rdata) + { + ack = 1; + break; + } + code_len--; + } + IIC_Stop(); + __enable_irq(); + return ack; +} + + + +/******************IIC trim **********************/ +#define SLAVE_IIC_ADDR_ 0x18 +/* +@brief Vref电压校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_VrefTrim(void) +{ + uint8_t auc_cmd[]={0x10,0xEF,0x00}; + uint8_t auc_run_cmd[]={0x18,0xE7}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_cmd[2] = checker_runcfg.params[1] & 0x0F; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + if(uc_ack != 0 || checker_runcfg.params[0] == 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return ; + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} +/* +@brief Iref电压校准 +@param0 Iref1 0不更新,1更新 +@param1 Iref2 0不更新,1更新 +@param2 Iref1 校准值 +@param3 Iref2 校准值 +*/ +void MC_IrefTrim(void) +{ + uint8_t auc_cmd[]={0x12,0xED,0x00}; + uint8_t auc_run1_cmd[]={0x19,0xE6}; + uint8_t auc_run2_cmd[]={0x1A,0xE5}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_cmd[2] = (checker_runcfg.params[2] & 0x0F) | ((checker_runcfg.params[3] & 0x0F)<<4); + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return ; + } + if(checker_runcfg.params[0] != 0) + { + uc_ack |= I2C_master_write(SLAVE_IIC_ADDR_,auc_run1_cmd,sizeof(auc_run1_cmd),&ul_sendlen,0); + } + if(checker_runcfg.params[1] != 0) + { + uc_ack |= I2C_master_write(SLAVE_IIC_ADDR_,auc_run2_cmd,sizeof(auc_run2_cmd),&ul_sendlen,0); + } + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + + + +/* +@brief Iref1电压校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_RC4MTrim(void) +{ + uint8_t auc_cmd[]={0x14,0xEB,0x00}; + uint8_t auc_run_cmd[]={0x1B,0xE4}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_cmd[2] = checker_runcfg.params[1] & 0x3F; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + if(uc_ack != 0 || checker_runcfg.params[0] == 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return ; + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + +/* +@brief RC128K校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_RC128KTrim(void) +{ + uint8_t auc_cmd[]={0x15,0xEA,0x00}; + uint8_t auc_run_cmd[]={0x1C,0xE3}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_cmd[2] = checker_runcfg.params[1] & 0x1F; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + if(uc_ack != 0 || checker_runcfg.params[0] == 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return ; + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_run_cmd,sizeof(auc_run_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + +/* +@brief 设置MTP电压 +@param0 低压 +@param1 高压 +*/ +void MC_SetMTPVol(void) +{ + uint8_t auc_cmd[]={0x22,0xDD,0x00}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_cmd[2] = (checker_runcfg.params[0] & 0x03) | ((checker_runcfg.params[1] & 0x0F)<<2); + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + +/* +@brief 设置MTP电压 +@param0 MTP地址 +@param1 擦除模式 +*/ +void MC_EraseMTP(void) +{ + uint8_t auc_erase_cmd[]={0x00,0x00}; + uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; + auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return; + } + ul_sendlen = 0; + auc_erase_cmd[0] = checker_runcfg.params[1]; + switch(checker_runcfg.params[1]) + { + case 0x25: auc_erase_cmd[1] = 0xDA; break;//全片擦除 + case 0x26: auc_erase_cmd[1] = 0xD9; break;//块擦除 + case 0x27: auc_erase_cmd[1] = 0xD8; break;//页擦除 + case 0x28: auc_erase_cmd[1] = 0xD7; break;//字擦除 + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_erase_cmd,sizeof(auc_erase_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + + + +/* +@brief MTP写入数据 +@param0..N 编程数据 +*/ +void MC_IICWriteMTP(void) +{ + uint8_t auc_cmd[16]={0x29,0xD6}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + uint16_t us_index = 0; + for(us_index = 0; us_index < checker_runcfg.param_count;us_index++) + { + auc_cmd[us_index+2] = checker_runcfg.params[us_index]; + } + + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,us_index+2,&ul_sendlen,0); + + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} +/* +@brief MTP读数据 +@param0 读取MTP地址 +@param1 读取数据字节长度 +*/ +void MC_IICReadMTP(void) +{ + + uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00}; + uint8_t auc_cmd[]={0x2A,0xD5}; + uint32_t ul_readlen = 0; + uint8_t uc_ack = 0; + uint16_t us_buf[32]; + uint32_t ul_sendlen = 0; + auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; + auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; + if(checker_runcfg.params[1] > 64) + { + checker_runcfg.params[1] = 64; + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0); + delay_ms(10); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + return ; + } + uc_ack = I2C_master_write_read(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),(uint8_t*)us_buf,checker_runcfg.params[1],&ul_readlen); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + Checker_SetRtv(us_buf,checker_runcfg.rtv_count); +} + +/* +@brief MTP状态查询 +*/ +void MC_IICCheckMTPState(void) +{ + uint8_t auc_cmd[]={0x30,0xBF}; + uint32_t ul_readlen = 0; + uint8_t uc_ack = 0; + uint16_t ul_rtv; + uc_ack = I2C_master_write_read(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),(uint8_t*)&ul_rtv,1,&ul_readlen); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); +} + +/* +@brief MTP使能或失能 +@param0 0失/1使能 +*/ +void MC_IICEnMTP(void) +{ + uint8_t auc_cmd[]={0x20,0x20,0}; + uint32_t ul_sendlen = 0; + uint8_t uc_ack = 0; + if(checker_runcfg.params[0] == 0) + { + auc_cmd[2] = 0x33; + }else{ + auc_cmd[2] = 0xCC; + } + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_cmd,sizeof(auc_cmd),&ul_sendlen,0); + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); +} + + +/* +@brief MTP下载程序 +@param 更新地址 +@param 烧录长度 +*/ +void MC_IICUpdateMTP(void) +{ + uint8_t uc_ack; + uint8_t auc_enMTP_cmd[]={0x20,0x20,0xCC}; + uint8_t auc_setAddr_cmd[]={0x23,0xDC,0x00,0x00}; + uint8_t auc_setMTPOperReg_cmd[]={0x20,0xDF,0x00}; + uint8_t auc_earse_cmd[]={0x25,0xDA}; + uint8_t auc_setMTPVol[]={0x22,0xDD,0x18};//1.5V 5V + uint8_t auc_program_cmd[]={0x29,0xD6}; + uint8_t auc_readCode_cmd[]={0x2A,0xD5}; + uint32_t ul_sendlen; + uint16_t us_programLen = checker_runcfg.params[1]; + uint8_t* puc_Master_addr = (uint8_t*)(MC_CODE_ADDR + checker_runcfg.params[0]); + uint16_t ul_rtv = 0; + uint32_t ul_crc32 = 0; + + ul_crc32 = Crc32Calu((uint32_t*)MC_CODE_ADDR,16*1024); + if(ul_crc32 != boardinfo_un.boardinfo.mc_ICodeCrc32) + { + uc_ack = 1; + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 1; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + + if(checker_runcfg.params[0] == 0x1000) + { + auc_setMTPOperReg_cmd[2] = 0x04; + }else{ + auc_setMTPOperReg_cmd[2] = 0x00; + } + uc_ack = 0; + uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0); + delay_ms(5); + uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0); + delay_ms(5); + uc_ack += I2C_master_write(SLAVE_IIC_ADDR_,auc_enMTP_cmd,sizeof(auc_enMTP_cmd),&ul_sendlen,0); + delay_ms(5); + //设置MTP操作范围 + if(uc_ack > 2) + { + uc_ack = 1; + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 2; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + + auc_setAddr_cmd[2] = (checker_runcfg.params[0]>>8) & 0xFF; + auc_setAddr_cmd[3] = checker_runcfg.params[0] & 0xFF; + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPOperReg_cmd,sizeof(auc_setMTPOperReg_cmd),&ul_sendlen,0); + //设置MTP操作范围 + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 3; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(1); + //设置MTP电压 + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setMTPVol,sizeof(auc_setMTPVol),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 4; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(1); + //设置地址 + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 5; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(1); + //擦除 + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_earse_cmd,sizeof(auc_earse_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 6; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_os_ms(200); + //设置地址 + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 7; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(1); + uc_ack = I2C_master_writeCode(SLAVE_IIC_ADDR_,auc_program_cmd,sizeof(auc_program_cmd),puc_Master_addr,us_programLen); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 8; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(20); + //设置地址 + uc_ack = I2C_master_write(SLAVE_IIC_ADDR_,auc_setAddr_cmd,sizeof(auc_setAddr_cmd),&ul_sendlen,0); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 9; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + delay_ms(5); + uc_ack = I2C_master_CodeEquel(SLAVE_IIC_ADDR_,auc_readCode_cmd,sizeof(auc_readCode_cmd),puc_Master_addr,us_programLen); + if(uc_ack != 0) + { + Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); + ul_rtv = 10; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + ul_rtv = 0; + Checker_SetRtv(&ul_rtv,checker_runcfg.rtv_count); + return; +} diff --git a/source/elec_det/hardware/jw3425iic.h b/source/elec_det/hardware/jw3425iic.h new file mode 100644 index 0000000..40d9722 --- /dev/null +++ b/source/elec_det/hardware/jw3425iic.h @@ -0,0 +1,87 @@ +#ifndef JW3425IIC_H +#define JW3425IIC_H + +#include "base/define.h" +#include "gpio_cfg.h" + +#define SDA_IN() IIC_SDA_DIR(1) //PB11输入模式 +#define SDA_OUT() IIC_SDA_DIR(0)//PB11输出模式 +#define IIC_SDA(x) PBout(I2IC_SDA_Pin_Nu)=(x) +#define IIC_SCL(x) PBout(I2IC_SCL_Pin_Nu)=(x) +#define READ_SDA (PBin(I2IC_SDA_Pin_Nu)&0x01) +#define IIC_PLUS_DELAY 5 +#define I2C_OPERATION_OUTTIME 100000 + +void I2C_init(void); +void I2C_Definit(void); +void IIC_SDA_DIR(uint8_t dir); +int32_t I2C_master_write(uint16_t address, uint8_t *src, uint32_t size, uint32_t *nwriten, uint8_t bi_dir); +/* @param bi_dir: option using in transceive */ +int32_t I2C_master_read(uint16_t address, uint8_t *dst, uint32_t size, uint32_t *nread, uint8_t bi_dir); +/* @param bi_dir: option using in transceive */ +int32_t I2C_master_write_read(uint16_t address, uint8_t*cmd, uint8_t cmd_size,uint8_t *dst, uint32_t read_size, uint32_t *nread); +/* +@brief Vref电压校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_VrefTrim(void); +/* +@brief Iref电压校准 +@param0 Iref1 0不更新,1更新 +@param1 Iref2 0不更新,1更新 +@param2 Iref1 校准值 +@param3 Iref2 校准值 +*/ +void MC_IrefTrim(void); +/* +@brief Iref1电压校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_RC4MTrim(void); +/* +@brief RC128K校准 +@param0 0不更新,1更新 +@param1 校准值 +*/ +void MC_RC128KTrim(void); + +/* +@brief 设置MTP电压 +@param0 低压 +@param1 高压 +*/ +void MC_SetMTPVol(void); +/* +@brief 设置MTP电压 +@param0 MTP地址 +@param1 擦除模式 +*/ +void MC_EraseMTP(void); +/* +@brief MTP写入数据 +@param0..N 编程数据 +*/ +void MC_IICWriteMTP(void); +/* +@brief MTP读数据 +@param0 读取数据字节长度 +*/ +void MC_IICReadMTP(void); +/* +@brief MTP状态查询 +*/ +void MC_IICCheckMTPState(void); +/* +@brief MTP下载程序 +@param 更新地址 +@param 烧录长度 +*/ +void MC_IICUpdateMTP(void); +/* +@brief MTP使能或失能 +@param0 0失/1使能 +*/ +void MC_IICEnMTP(void); +#endif diff --git a/source/elec_det/hardware/power.c b/source/elec_det/hardware/power.c new file mode 100644 index 0000000..b10af92 --- /dev/null +++ b/source/elec_det/hardware/power.c @@ -0,0 +1,522 @@ +#include "power.h" +#include "base/utility.h" +#include "gpio_cfg.h" +#include "base/delay.h" +#define PowerCurr_AD_BUF_LEN 40 +#define POWER_SET_COUNT 20 +static CurrentSample_Range_eu latest_range = Current_Max; +static PowerInfo_st def_power_st; +//static uint16_t PowerCurr_AD_buf[PowerCurr_AD_BUF_LEN]; +static float f_cur_k; +static float f_cur_b; +static uint8_t uc_power_cal_flag = 0; +PowerInfo_st powerinfo_arrayst[POWER_SET_COUNT] ; + +/* +@brief 获取内部基准1.2V电压对应的AD +*/ +uint32_t Power_GetBaseVAD() +{ + // y1 = kx1+b y2=kx2+b y1-y2/x1-x2 +// uint16_t adv_buf[10]; +// uint32_t temp_v; +// GetADC0_Value(ADC_CHANNEL_17,adv_buf,10) ; +// Bubble_Sort_u16(adv_buf,10); +// return (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + + return (uint32_t)(1.2f/3.3f*4096); +} + +void Power_CurCalibration() +{ + uint16_t adv_buf[10],adv2v5,adv1v25; + uc_power_cal_flag = 1; + GetADC1_Value(VCC_2V5_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + adv2v5 = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + + GetADC1_Value(VCC_1V25_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + adv1v25 = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + + f_cur_k = 1.245f/((adv2v5 - adv1v25)+1); + f_cur_b = 2.49f-f_cur_k*adv2v5; + + +// GetADC0_Value(VCC_1V25_CH,adv_buf,10) ; +// Bubble_Sort_u16(adv_buf,10); +// adv1v25 = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; +// +// f_cur_k = 1.25f/((adv2v5 - adv1v25)+1); +// f_cur_b = 2.5f-f_cur_k*adv2v5; +} +/* +@brief 将获取的ADC值转换为电压值 +@param1 ul_adv 采样AD原始值 +@rtv 返回AD采集到的电压值 扩大1000000倍 +*/ +uint32_t Power_ADVGetCalVal_106(uint16_t ul_adv) +{ + if(uc_power_cal_flag == 0) + { + Power_CurCalibration(); + } + return (uint32_t)((f_cur_k*ul_adv+f_cur_b)*1000000); +} + + + /* +@brief 采样高电平电压 +*/ +uint32_t Power_GetHPowerV() +{ + uint32_t adv; + uint16_t adv_buf[10]; + Power_CurCalibration(); + GetADC1_Value(V_LA_H_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + adv = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + adv = Power_ADVGetCalVal_106(adv); + adv = adv*11/100000; + return adv; +} + + /* +@brief 采样总线输出电压 +*/ +uint32_t Power_GetBousV() +{ + uint32_t abus_v,bbus_v; + uint16_t adv_buf[10]; + Power_CurCalibration(); + GetADC1_Value(AD_OUTA_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + abus_v = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + + GetADC1_Value(AD_OUTB_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + bbus_v = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + + if(bbus_v > abus_v) + { + abus_v = bbus_v; + } + + abus_v = Power_ADVGetCalVal_106(abus_v); + abus_v = abus_v*11/100000; + return abus_v; +} + +/* +@brief 采样中电平电压 +*/ +uint32_t Power_GetMPowerV() +{ + int32_t adv; + uint16_t adv_buf[10]; + GetADC1_Value(V_LA_M_CH,adv_buf,10) ; + Bubble_Sort_u16(adv_buf,10); + adv = (adv_buf[4]+adv_buf[5]+adv_buf[6]+adv_buf[7])>>2; + adv = Power_ADVGetCalVal_106(adv); + adv = adv*11/100000; + return adv; +} + +/* +typedef enum{ + R510_0uA_32uA_UC = (uint8_t)0,//x201 + R510_0uA_580uA_MC = (uint8_t)1,//x11 + R100_0uA_160uA_UC = (uint8_t)2,//x201 + R100_0p2mA_3mA_MC = (uint8_t)3,//x11 + R10_0p1mA_1p6mA_UC = (uint8_t)4,//x201 + R10_2mA_30mA_MC = (uint8_t)5,//x11 + Current_Max = (uint8_t)6, + Current_SampleR_OFF = (uint8_t)9, +} CurrentSample_Range_eu; +*/ +/* +@brief 通过采样adc,换算电流 +@param adv adc 采样值 +@param rang 采样电阻 +@rtv uint32_t 电流值 0.1uA +*/ +uint32_t Power_ConvCur(uint16_t adv,CurrentSample_Range_eu range) +{ + uint32_t ul_R,ul_Mut; + uint32_t ul_adv = Power_ADVGetCalVal_106(adv); + switch(range) + { + case R510_0uA_32uA_UC: ul_R = 510; ul_Mut = 201 ; break; + case R510_0uA_580uA_MC: ul_R = 510; ul_Mut = 11; break; + case R100_0uA_160uA_UC: ul_R = 100; ul_Mut = 201; break; + case R100_0p2mA_3mA_MC: ul_R = 100; ul_Mut = 11; break; + case R10_0p1mA_1p6mA_UC: ul_R = 10; ul_Mut = 201; break; + case R10_2mA_30mA_MC: ul_R = 10; ul_Mut = 11; break; + case Current_Max: ul_R = 10; ul_Mut = 1; break; + case Current_SampleR_OFF: ul_R = 510; ul_Mut = 1;break; + default: ul_R = 510; ul_Mut = 1;break; + } + ul_adv = (ul_adv*100 / ul_R /ul_Mut+4)/10; + return ul_adv; +} +//根据电流大小的范围,设置采样电阻 +CurrentSample_Range_eu Power_SetSampleCurrentRange(CurrentSample_Range_eu range) +{ + + switch(range) + { + case R510_0uA_32uA_UC: R510_SW_ON; R100_SW_OFF; R10_SW_OFF; break; + case R510_0uA_580uA_MC: R510_SW_ON; R100_SW_OFF; R10_SW_OFF; break; + case R100_0uA_160uA_UC: R100_SW_ON; R510_SW_OFF; R10_SW_OFF; break; + case R100_0p2mA_3mA_MC: R100_SW_ON; R510_SW_OFF; R10_SW_OFF; break; + case R10_0p1mA_1p6mA_UC: R10_SW_ON; R510_SW_OFF; R100_SW_OFF; break; + case R10_2mA_30mA_MC: R10_SW_ON; R510_SW_OFF; R100_SW_OFF; break; + case Current_Max: R510_SW_ON; R100_SW_ON; R10_SW_ON;break; + case Current_SampleR_OFF: R510_SW_OFF;R100_SW_OFF; R10_SW_OFF;break; + default: range = Current_Max; R510_SW_ON; R100_SW_ON; R10_SW_ON;break; + } + latest_range = range; + return latest_range; +} + +/* +@brief 设置电阻采样通道和AD采样配置 +*/ +CurrentSample_Range_eu Power_SetSampleRange_Seep(CurrentSample_Range_eu range , uint32_t speed) +{ + switch(range) + { + case R510_0uA_32uA_UC: ADC_CurChnnelSet(AN_UA_CH,speed); break; + case R510_0uA_580uA_MC: ADC_CurChnnelSet(AN_MAL_CH,speed); break; + case R100_0uA_160uA_UC: ADC_CurChnnelSet(AN_UA_CH,speed); break; + case R100_0p2mA_3mA_MC: ADC_CurChnnelSet(AN_MAL_CH,speed); break; + case R10_0p1mA_1p6mA_UC: ADC_CurChnnelSet(AN_UA_CH,speed); break; + case R10_2mA_30mA_MC: ADC_CurChnnelSet(AN_MAL_CH,speed); break; + case Current_Max: ADC_CurChnnelSet(AN_MAL_CH,speed); break; + case Current_SampleR_OFF: ADC_CurChnnelSet(AN_MAL_CH,speed);break; + default: ADC_CurChnnelSet(AN_MAL_CH,speed);break; + } + return Power_SetSampleCurrentRange(range); +} + + +//获取总线电流 +uint32_t Power_GetCurrent(void) +{ + uint32_t adv; + uint32_t count; + CurrentSample_Range_eu range = latest_range;//档位保存 + CurrentSample_Range_eu set_range; + uint32_t adv_base = Power_GetBaseVAD(); + if(adv_base < 500) + return 0; + set_range = Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + StartADC2Channel(AN_MAL_CH,ADC_SPEED_SLOW); + delay_us(300); + GetADC_Fast(ADC_CURR_DE); + adv = 0; + for(count = 0; count < 4; count++) + { + adv += GetADC_Fast(ADC_CURR_DE); + } + adv >>= 2; + if(adv > 250){ + adv = Power_ConvCur(adv,set_range);//0.1uA + adv = (adv+4)/10; + Power_SetSampleCurrentRange(range); + return adv; + } + set_range = Power_SetSampleCurrentRange(R100_0p2mA_3mA_MC); + StartADC2Channel(AN_MAL_CH,ADC_SPEED_SLOW); + delay_us(300); + GetADC_Fast(ADC_CURR_DE); + adv = 0; + for(count = 0; count < 4; count++) + { + adv += GetADC_Fast(ADC_CURR_DE); + } + adv >>= 2; + if(adv > 250){ + adv = Power_ConvCur(adv,set_range);//0.1uA + adv = (adv+4)/10; + Power_SetSampleCurrentRange(range); + return adv; + } + + set_range = Power_SetSampleCurrentRange(R10_0p1mA_1p6mA_UC); + StartADC2Channel(AN_UA_CH,ADC_SPEED_SLOW); + delay_ms(2); + GetADC_Fast(ADC_CURR_DE); + adv = 0; + for(count = 0; count < 4; count++) + { + adv += GetADC_Fast(ADC_CURR_DE); + } + adv >>= 2; + if(adv > 250){ + adv = Power_ConvCur(adv,set_range);//0.1uA + adv = (adv+4)/10; + Power_SetSampleCurrentRange(range); + return adv; + } + set_range = Power_SetSampleCurrentRange(R100_0uA_160uA_UC); + StartADC2Channel(AN_UA_CH,ADC_SPEED_SLOW); + delay_ms(3); + GetADC_Fast(ADC_CURR_DE); + adv = 0; + for(count = 0; count < 8; count++) + { + adv += GetADC_Fast(ADC_CURR_DE); + } + adv >>= 3; + adv = Power_ConvCur(adv,set_range);//0.1uA + adv = (adv+4)/10; + Power_SetSampleCurrentRange(range); + return adv; +} + +/* +@brief 电源调压准备,计数频率和电压的线性关系 +@rtv 返回值:0 成功 其他失败 +*/ + +uint8_t PowerCalPrapare(void) +{ + //YM硬件直接由公式计算 + return 0; +} +//防止突然上电,导致电源崩溃 +static void PowerUpFilter(uint16_t tag_dac) +{ + uint16_t us_lastdac_h = DAC_GetDataOutputValue(DAC_Channel_1); + if(us_lastdac_h > (tag_dac + 200)) + { + while(us_lastdac_h > tag_dac) + { + if((tag_dac + 100) < us_lastdac_h) + { + us_lastdac_h -= 50; + C_H_DAC_Set(us_lastdac_h); + }else{ + us_lastdac_h = tag_dac; + C_H_DAC_Set(us_lastdac_h); + } + delay_ms(10); + } + } +} + +//电压调节的关系为线性函数 +void PowerCalibration(PowerInfo_st* info_st) +{ + + float vlp,vlm,v_adc_h,v_adc_m; + uint16_t us_basedac_h,us_basedac_m; + uint16_t us_lastdac_h,us_lastdac_m; + uint16_t us_powderv; + uint16_t us_timeout ; + uint32_t diff=0; + uint16_t ok_flg = 0; + uint8_t uc_down_up_flag = 0; + if(info_st->V_LAH < info_st->V_LAM ) + { + info_st->V_LAH_DAC = 0; + info_st->V_LAM_DAC = 0; + return ; + } + PAout(LAVC_M_Pin_Nu)=0;PBout(OUTAH_Pin_Nu)=0; + PBout(OUTBL_Pin_Nu)=0;PBout(OUTAL_Pin_Nu)=0; + PCout(POWER_ON_Pin_Nu) = 1; + vlp = info_st->V_LAH; + vlp /= 10; + //(VLP-1.229V)/178K + (VDAC-1.229V)/20K = 0.1229mA + v_adc_h =( 0.1229- (vlp-1.229)/178)*20+1.229; + us_timeout = 80; + info_st->V_LAH_DAC = 0; + us_basedac_h = (uint16_t)( v_adc_h/3.3 * 4096); + PowerUpFilter(us_basedac_h); + us_lastdac_h = 0; + //us_basedac_h = 250; + ok_flg = 0; + uc_down_up_flag = 0; + while(us_timeout > 0) + { + us_timeout--; + C_H_DAC_Set(us_basedac_h); + us_lastdac_h = us_basedac_h; + switch(uc_down_up_flag) + { + case 0:delay_os_ms(100);break;//首次调压 + case 1:delay_os_ms(50);break;//降压 + case 2:delay_os_ms(10);break;//升压 + } + us_powderv = Power_GetHPowerV(); + diff = us_powderv > info_st->V_LAH?us_powderv-info_st->V_LAH:info_st->V_LAH-us_powderv; + if(diff < 2) + { + ok_flg++; + if(ok_flg > 2) + { + info_st->V_LAH_DAC = us_basedac_h; + break; + }else{ + continue; + } + + } + diff = diff *2; + ok_flg = 0; + if( us_powderv > info_st->V_LAH) + { + us_basedac_h += diff; + uc_down_up_flag = 1; + }else{ + us_basedac_h -= diff; + uc_down_up_flag = 2; + } + + + if(us_basedac_h < 20) + us_basedac_h = 20; + if(us_basedac_h > 4050) + us_basedac_h = 4050; + + } + if(info_st->V_LAH_DAC == 0) + return; + + //(VM-2.5V)/20k+(VDAC-2.5V)/4.7K = 0.25mA + us_timeout = 100; + info_st->V_LAM_DAC = 0; + vlm = info_st->V_LAM ; + vlm /= 10; + v_adc_m =( 0.25- (vlm-2.5)/20)*4.7+2.5; + us_basedac_m = (uint16_t)(v_adc_m / 3.3 * 4096); + //us_lastdac_m = 250; + ok_flg = 0; + uc_down_up_flag = 0; + while( us_timeout > 0) + { + us_timeout--; + C_M_DAC_Set(us_basedac_m); + us_lastdac_m = us_basedac_m; + switch(uc_down_up_flag) + { + case 0:delay_os_ms(50);break;//首次调压 + case 1:delay_os_ms(40);break;//降压 + case 2:delay_os_ms(30);break;//升压 + default:delay_os_ms(50);break; + } + us_powderv = Power_GetMPowerV(); + diff = us_powderv > info_st->V_LAM?us_powderv-info_st->V_LAM:info_st->V_LAM-us_powderv; + if(diff < 2) + { + ok_flg++; + if(ok_flg > 2) + { + info_st->V_LAM_DAC = us_basedac_m; + break; + } + else{ + continue; + } + } + ok_flg = 0; + diff = diff *10; + if( us_powderv > info_st->V_LAM) + { + us_basedac_m += diff; + uc_down_up_flag = 1; + }else{ + uc_down_up_flag = 2; + us_basedac_m -= diff; + } + if(us_basedac_m < 100) + us_basedac_m = 100; + if(us_basedac_m > 4050) + us_basedac_m = 4050; + } + +} +//设置总线电压 +void PowerSetVoltage(PowerInfo_st* info_st) +{ + memcpy(&def_power_st,info_st,sizeof(PowerInfo_st)); + PowerUpFilter(info_st->V_LAH_DAC); + C_H_DAC_Set(info_st->V_LAH_DAC); + C_M_DAC_Set(info_st->V_LAM_DAC); + POWER_ON; + +} +//获取当前电压配置值 +void PowerGetSet(PowerInfo_st* info_st) +{ + uint16_t h_dac = DAC_GetDataOutputValue(DAC_Channel_1); + uint16_t m_dac = DAC_GetDataOutputValue(DAC_Channel_2); + info_st->V_LAH = 0; + info_st->V_LAH_DAC = h_dac; + if(h_dac == def_power_st.V_LAH_DAC) + { + info_st->V_LAH = def_power_st.V_LAH; + } + info_st->V_LAM = 0; + info_st->V_LAM_DAC = h_dac; + if(m_dac == def_power_st.V_LAM_DAC) + { + info_st->V_LAM_DAC = m_dac; + } +} +/* +@brief 设置总线电压 +@param h_v/10 设置高电平电压 +@param m_v/10 设置中电平电压 +@rtv 0 执行成功 1 执行失败 +*/ + +uint8_t PowerCalibration_set(uint16_t h_v,uint16_t m_v) +{ + uint32_t ul_index = 0; + PowerInfo_st powerinfo_st; + rt_memset(&powerinfo_st,0,sizeof(PowerInfo_st)); + while(ul_index < POWER_SET_COUNT) + { + //if( powerinfo_arrayst[ul_index].V_LAH == h_v && powerinfo_arrayst[ul_index].V_LAM == m_v) + if( powerinfo_arrayst[ul_index].V_LAH == h_v) + { + break; + } + ul_index++; + } + //在现有电压列表中能够查询到校准后的电压 + if(ul_index < POWER_SET_COUNT) + { + memcpy(&powerinfo_st,&powerinfo_arrayst[ul_index],sizeof(PowerInfo_st)); + PowerSetVoltage(&powerinfo_st); + return 0; + } + + powerinfo_st.V_LAH = h_v; + powerinfo_st.V_LAM = m_v; + PowerCalibration(&powerinfo_st); + if(powerinfo_st.V_LAH_DAC == 0 || powerinfo_st.V_LAM_DAC == 0) + { + LED1_Out = 1; + return 1; + } + //校准完成后,设置总线电压 + PowerSetVoltage(&powerinfo_st); + //查找为使用的配置缓存,将新设置的电压保存 + ul_index = 0; + while(ul_index < POWER_SET_COUNT) + { + if( powerinfo_arrayst[ul_index].V_LAH_DAC == 0 || powerinfo_arrayst[ul_index].V_LAM_DAC == 0) + { + memcpy(&powerinfo_arrayst[ul_index],&powerinfo_st,sizeof(PowerInfo_st)); + break; + } + ul_index++; + } + + return 0; +} + diff --git a/source/elec_det/hardware/power.h b/source/elec_det/hardware/power.h new file mode 100644 index 0000000..23a3948 --- /dev/null +++ b/source/elec_det/hardware/power.h @@ -0,0 +1,115 @@ +#ifndef __POWER_H__ +#define __POWER_H__ +#include "base/define.h" +#include "dac_cfg.h" +#include "adc_cfg.h" +#include "gpio_cfg.h" + +#define R10_ON_Out PBout(R10_ON_Pin_Nu) +#define R10_SW_ON R10_ON_Out=1 +#define R10_SW_OFF R10_ON_Out=0 +#define R510_ON_Out PBout(R510_ON_Pin_Nu) +#define R510_SW_ON R510_ON_Out=1 +#define R510_SW_OFF R510_ON_Out=0 +#define R100_ON_Out PCout(R100_ON_Pin_Nu) +#define R100_SW_ON R100_ON_Out=1 +#define R100_SW_OFF R100_ON_Out=0 + + + +#define POWER_DEF_V 60 + + +typedef enum{ +R510_0uA_32uA_UC = (uint8_t)0,//x201 + R510_0uA_580uA_MC = (uint8_t)1,//x11 + R100_0uA_160uA_UC = (uint8_t)2,//x201 + R100_0p2mA_3mA_MC = (uint8_t)3,//x11 + R10_0p1mA_1p6mA_UC = (uint8_t)4,//x201 + R10_2mA_30mA_MC = (uint8_t)5,//x11 + Current_Max = (uint8_t)6, + Current_SampleR_OFF = (uint8_t)9, +} CurrentSample_Range_eu; + +typedef struct { +uint16_t V_LAH; +uint16_t V_LAM; +uint16_t V_LAH_DAC; +uint16_t V_LAM_DAC; +}PowerInfo_st; + + + + + /* +@brief 采样总线输出电压 +*/ +uint32_t Power_GetBousV(void); +/* +@brief 采样高电平电压 +*/ +uint32_t Power_GetHPowerV(void); +/* +@brief 采样中电平电压 +*/ +uint32_t Power_GetMPowerV(void); +/* +@brief 获取内部基准1.2V电压对应的AD +*/ +uint32_t Power_GetBaseVAD(void); +//获取总线电流 +uint32_t Power_GetCurrent(void); +//根据电流大小的范围,设置采样电阻 +CurrentSample_Range_eu Power_SetSampleCurrentRange(CurrentSample_Range_eu range) ; +#define CurrentSampleR_Def Power_SetSampleCurrentRange(Current_Max); +/* +@brief 设置电阻采样通道和AD采样配置 +*/ +CurrentSample_Range_eu Power_SetSampleRange_Seep(CurrentSample_Range_eu range , uint32_t speed); +//检测方案,上电充能采样电阻 +#define Checker_PowerOn_Sample_R R100_0p2mA_3mA_MC +#define Checker_OnLine_Sample_R R100_0uA_160uA_UC +#define Checker_MonitorBuf_Sample_R R100_0p2mA_3mA_MC + +#define JQChecker_ChgEnger_Sample_R R100_0p2mA_3mA_MC +#define XTChecker_ChgEnger_Sample_R R10_2mA_30mA_MC +//模块通信采样电阻 +#define XTDriver_Sample_R R10_2mA_30mA_MC +#define JQDriver_Sample_R R10_2mA_30mA_MC + + +//电压调节的关系为线性函数 +void PowerCalibration(PowerInfo_st* info_st); +//设置总线电压 +void PowerSetVoltage(PowerInfo_st* info_st); +//获取当前电压配置值 +void PowerGetSet(PowerInfo_st* info_st); +/* +@brief 设置总线电压 +@param h_v/10 设置高电平电压 +@param m_v/10 设置中电平电压 +@rtv 0 执行成功 1 执行失败 +*/ + +uint8_t PowerCalibration_set(uint16_t h_v,uint16_t m_v); +/* +@brief 将获取的ADC值转换为电压值 +@param1 ul_adv 采样AD原始值 +@rtv 返回AD采集到的电压值 扩大1000000倍 +*/ +uint32_t Power_ADVGetCalVal_106(uint16_t ul_adv); + +/* +@brief 电源调压准备,计数频率和电压的线性关系 +@rtv 返回值:0 成功 其他失败 +*/ + +uint8_t PowerCalPrapare(void); +/* +@brief 通过采样adc,换算电流 +@param adv adc 采样值 +@param rang 采样电阻 +@rtv uint32_t 电流值 0.1uA +*/ +uint32_t Power_ConvCur(uint16_t adv,CurrentSample_Range_eu range); +#endif diff --git a/source/elec_det/hardware/timer_cfg.c b/source/elec_det/hardware/timer_cfg.c new file mode 100644 index 0000000..07f271f --- /dev/null +++ b/source/elec_det/hardware/timer_cfg.c @@ -0,0 +1,365 @@ +#include "base/define.h" +#include "timer_cfg.h" +#include "base/delay.h" +Timerupdatefunc p_timer4update_func = NULL; + + +/* +@brief 发送时钟校准波形 +@param pre_us 发送的周期 +@param count 发送周期的个数 +*/ +static volatile uint16_t amend_plus_count = 0; + +TimerTriger p_timertriger = NULL; +void FireBus_ClkAmend(uint16_t pre_us,uint16_t trigger_us,uint16_t count,void *p_fun) +{ + + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 + TIM_OCInitTypeDef TIM_OCInitStructure;//通道输出初始化结构 + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE ); + p_timertriger = (TimerTriger)p_fun; + amend_plus_count = count; + NVIC_DisableIRQ(TIM3_IRQn); + //TIM初始化 + TIM_TimeBaseStructure.TIM_Period = pre_us-1; //周期0~FFFF + TIM_TimeBaseStructure.TIM_Prescaler = 71 ; //时钟分频 + TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分 1us + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 + TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; + TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化 + + //TIM3通道初始化 + TIM_OCStructInit(& TIM_OCInitStructure); //默认参数 + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //工作状态 + TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设定为输出,需要PWM输出才需要这行代码 + TIM_OCInitStructure.TIM_Pulse = pre_us-trigger_us - 1; //占空长度 + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //高电平 + + TIM_OC1Init(TIM3, &TIM_OCInitStructure); + TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); + TIM_ClearFlag(TIM3,TIM_IT_CC1); + TIM_ITConfig(TIM3, TIM_IT_CC1 , ENABLE);//使能CC1中断 + TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); + TIM_ARRPreloadConfig(TIM3, ENABLE); + TIM_SetCompare3(TIM3,0); + TIM_Cmd(TIM3, ENABLE); //开启定时器 + + NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 9; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //TIM2全局中断使能 + NVIC_ClearPendingIRQ(TIM3_IRQn); + NVIC_Init(&NVIC_InitStructure); + +} + +/* +使用轮询的方式检测校准结束 +*/ +void FireBus_ClkAmendCycle(void) +{ + //使用查询的方式,关闭中断 + NVIC_DisableIRQ(TIM3_IRQn); + TIM_ITConfig(TIM3, TIM_IT_CC1 , DISABLE);//使能CC1中断 + TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); + if(p_timertriger == NULL) + { + return; + } + __disable_irq(); + while(1) + { + uint8_t flag = 0; + if( TIM_GetITStatus(TIM3,TIM_IT_Update)) + { + if(amend_plus_count > 0) + amend_plus_count--; + flag = 1; + p_timertriger(flag); + TIM3->SR = 0; + }else if(TIM_GetITStatus(TIM3,TIM_IT_CC1)) + { + flag = 2; + p_timertriger(flag); + TIM3->SR = 0; + } + if(amend_plus_count == 0) + { + flag = 3; + TIM_DeInit(TIM3); + p_timertriger(flag); + p_timertriger = NULL; + break; + } + } + __enable_irq(); +} + + +void TIM3_IRQHandler() +{ + uint8_t flag = 0; + rt_interrupt_enter(); + if( TIM_GetITStatus(TIM3,TIM_IT_Update)) + { + if(amend_plus_count > 0) + amend_plus_count--; + flag = 1; + }else if(TIM_GetITStatus(TIM3,TIM_IT_CC1)) + { + flag = 2; + } + //timer_interrupt_flag_clear(TIMER2,TIMER_FLAG_UP|TIMER_FLAG_CH2|TIMER_FLAG_CH2O); + TIM3->SR = 0; + if(p_timertriger != NULL) + { + p_timertriger(flag); + } + if(amend_plus_count == 0) + { + flag = 3; + NVIC_DisableIRQ(TIM3_IRQn); + TIM_DeInit(TIM3); + p_timertriger(flag); + p_timertriger = NULL; + } + rt_interrupt_leave(); +} + + +/* +@brief 超时定时器,单位10ms +@param ms 最大可设置6553。 +@param pfunc 超时回调函数,注意回调函数中不能做长延时任务 +*/ +void RunTimeOut_Timer(uint16_t ms,Timerupdatefunc pfunc ) +{ + NVIC_InitTypeDef NVIC_InitStructure; + //定时器初始化数据结构定义 + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE ); + p_timer4update_func = pfunc; + ms = ms*2-1; + + NVIC_DisableIRQ(TIM1_UP_IRQn); + //复位计数器 + TIM_DeInit(TIM1); + TIM_TimeBaseStructure.TIM_Period = ms; //计数上限,100*100us = 10000us = 10ms + TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;//2K; //预分频72MHz主频,分频后时钟周期0.5ms + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频 + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 + TIM_TimeBaseStructure.TIM_RepetitionCounter=0; + //初始化 + TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); + //清中断 + TIM_ClearFlag(TIM1, TIM_FLAG_Update); + TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); + + //定时器清零 + TIM_SetCounter(TIM1,0); + + TIM_ARRPreloadConfig(TIM1, DISABLE); + + //定时器启动 + TIM_Cmd(TIM1,ENABLE); + + NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //TIM2全局中断使能 + NVIC_ClearPendingIRQ(TIM1_UP_IRQn); + NVIC_Init(&NVIC_InitStructure); +} + + +//停止超时定时器计数 +void RunTimeoutStop(void) +{ + TIM_DeInit(TIM1); +} +//获取超时定时器计数值 +uint16_t GetRunTimeOutCount(void) +{ + return TIM1->CNT; +} + +void TIM1_UP_IRQHandler() +{ +// uint8_t flag = 0; + rt_interrupt_enter(); + if(TIM_GetITStatus(TIM1,TIM_IT_Update)) + { + if(p_timer4update_func != NULL) + { + TIM_Cmd(TIM1,DISABLE); + p_timer4update_func(); + + } + } + TIM1->SR = 0x00; + rt_interrupt_leave(); + +} +/* +延时定时器初始化,单次向上计数 +*/ +void DelayTimer_Init(void) +{ + //定时器初始化数据结构定义 + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE ); + TIM_DeInit(TIM2); + + TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //计数上限,100*100us = 10000us = 10ms + TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //预分频48,48MHz主频,分频后时钟周期1us + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频 + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 + TIM_TimeBaseStructure.TIM_RepetitionCounter=0; + + TIM_ARRPreloadConfig(TIM2, DISABLE); + //初始化 + TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); + StartDelayTime(); +} +/* +延时定时器初始化,单次向上计数 +*/ +void TimerCount_Init(void) +{ + //定时器初始化数据结构定义 + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE ); + TIM_DeInit(TIM2); + + TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //计数上限,100*100us = 10000us = 10ms + TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //预分频48,48MHz主频,分频后时钟周期1us + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频 + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 + TIM_TimeBaseStructure.TIM_RepetitionCounter=0; + + TIM_ARRPreloadConfig(TIM2, DISABLE); + //初始化 + TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); +} +/* +@brief 重启延时定时器 +*/ +void StartDelayTime() +{ + TIM_Cmd(TIM2,DISABLE); + TIM2->CNT = 0; + TIM2->PSC = (uint32_t)7200-1;//10K 0.1ms + TIM2->EGR |= TIM_EventSource_Update; + TIM2->SR = 0; + TIM_Cmd(TIM2,ENABLE); + +} +/* +@brief 定时器是否运行到大于当前值 +@param 当前比较值 +*/ +uint8_t isDelayEnd(uint16_t wait_time) +{ + if((TIM2->CNT > wait_time) && (TIM2->SR > 0) ) + return 0; + return 1; +} +/* +@breif 等待定时器计数值大于设定值 +@param 等待定时器的结束值,单位0.1ms +*/ +void WaitDelayEnd(uint16_t wait_time) +{ + while((TIM2->CNT < wait_time) && (TIM2->SR < 1)) + { + + } +} +/* +@brief 获取当前定时器计数值,单位1us。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get1usCount(void) +{ + uint16_t us_value ; + if(TIM2->SR > 0) + { + us_value = 65535; + }else{ + us_value = TIM2->CNT; + } + + TIM_Cmd(TIM2,DISABLE); + TIM2->CNT = 0; + TIM2->PSC = (uint32_t)71;//1M 1us + TIM2->EGR |= TIM_EventSource_Update; + TIM2->SR = 0; + TIM_Cmd(TIM2,ENABLE); + return us_value; +} + +/* +@brief 获取当前定时器计数值,单位10us。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get10usCount(void) +{ + + uint16_t us_value ; + if(TIM2->SR > 0) + { + us_value = 65535; + }else{ + us_value = TIM2->CNT; + } + + TIM_Cmd(TIM2,DISABLE); + TIM2->CNT = 0; + TIM2->PSC = (uint32_t)720-1;//100K 10us + TIM2->EGR |= TIM_EventSource_Update; + TIM2->SR = 0; + TIM_Cmd(TIM2,ENABLE); + return us_value; + + + + +} + +/* +@brief 获取当前定时器计数值,单位0.1ms。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get100usCount(void) +{ + + uint16_t us_value ; + if(TIM2->SR > 0) + { + us_value = 65535; + }else{ + us_value = TIM2->CNT; + } + + TIM_Cmd(TIM2,DISABLE); + TIM2->CNT = 0; + TIM2->PSC = (uint32_t)7200-1;//10K 100us + TIM2->EGR |= TIM_EventSource_Update; + TIM2->SR = 0; + TIM_Cmd(TIM2,ENABLE); + return us_value; + + +} + +/* +@brief 直接获取定时器的值 +*/ +uint16_t GetCountTimerCnt() +{ + return TIM2->CNT; +} + diff --git a/source/elec_det/hardware/timer_cfg.h b/source/elec_det/hardware/timer_cfg.h new file mode 100644 index 0000000..88858fc --- /dev/null +++ b/source/elec_det/hardware/timer_cfg.h @@ -0,0 +1,68 @@ +#ifndef TIMER_CFG_H_ +#include "base/define.h" +#include "stm32f10x_tim.h" +typedef void (*Timerupdatefunc)(void ); +typedef void (*TimerTriger)(uint8_t ); +//停止超时定时器计数 +void RunTimeoutStop(void); +/* +@brief 发送时钟校准波形 +@param pre_us 发送的周期 +@param count 发送周期的个数 +*/ +void FireBus_ClkAmend(uint16_t pre_us,uint16_t trigger_us,uint16_t count,void *p_fun); + +/* +@brief 超时定时器,单位0.1ms +@param ms 最大可设置6553。 +@param pfunc 超时回调函数,注意回调函数中不能做长延时任务 +*/ +void RunTimeOut_Timer(uint16_t ms,Timerupdatefunc pfunc ); +//获取超时定时器计数值 +uint16_t GetRunTimeOutCount(void); +/* +延时定时器初始化,单次向上计数 +*/ +void DelayTimer_Init(void); +/* +延时定时器初始化,单次向上计数 +*/ +void TimerCount_Init(void); + +/* +@breif 等待定时器计数值大于设定值 +@param 等待定时器的结束值,单位0.1ms +*/ +void WaitDelayEnd(uint16_t wait_time); + +/* +@brief 重启延时定时器 +*/ +void StartDelayTime(void); + +#define GET_COUNTTIM_VAL() (TIM2->CNT) + +/* +@brief 获取当前定时器计数值,单位1us。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get1usCount(void); +/* +@brief 获取当前定时器计数值,单位10us。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get10usCount(void); +/* +@brief 获取当前定时器计数值,单位0.1ms。并重启计数 +@rtv 返回上次的计数值 +*/ +uint16_t Get100usCount(void); +/* +@brief 直接获取定时器的值 +*/ +uint16_t GetCountTimerCnt(void); +/* +使用轮询的方式检测校准结束 +*/ +void FireBus_ClkAmendCycle(void); +#endif diff --git a/source/elec_det/interface/BaseChecker.c b/source/elec_det/interface/BaseChecker.c new file mode 100644 index 0000000..297a66a --- /dev/null +++ b/source/elec_det/interface/BaseChecker.c @@ -0,0 +1,216 @@ +#include "Basechecker.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "base/delay.h" +#include "hardware/gpio_cfg.h" +Checker_RunCfg_st checker_runcfg; +uint8_t Checker_FacBuf[CHECKER_FAC_BUF_LEN]; +volatile uint8_t ThreeBindResult_flag = 1; +uint16_t Checker_First_Set_Voltage = 88; +/* +@brief 标记执行结果 +@param rtv 执行返回值 1表示失败 0 表示成功 +@param taskindex 任务项目ID号 +*/ +void Checker_MaskResult(uint8_t rtv,uint8_t taskindex) +{ + uint8_t uc_index = taskindex >> 3; + uint8_t uc_bitindex = taskindex & 0x07; + if(taskindex >= CHECKER_MAXRT_COUNT) + { + return; + } + checker_runcfg.excue_rtv = rtv; + uc_bitindex = (0x01<> 3; + uint8_t uc_bitindex = taskindex & 0x07; + if(taskindex >= CHECKER_MAXRT_COUNT) + { + return; + } + uc_bitindex = (0x01< 0) + { + checker_runcfg.Test_Rtv[checker_runcfg.rtv_index++] = *pus_rtv; + pus_rtv++; + count--; + } +} + +/* +brief 准备测试用电压 +@param 设置电压值,最多支持10个参数 +*/ +void Checker_PowerPrapare(void) +{ + uint8_t uc_index = 0; + uint8_t uc_rtv = 0; + uint16_t us_h_v,us_m_v; + if(checker_runcfg.power_prapare_exe > 0 || checker_runcfg.param_count == 0){ + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return ; + } + Checker_First_Set_Voltage = checker_runcfg.params[0]; + Bubble_Sort_u16(checker_runcfg.params,checker_runcfg.param_count); + POWER_OFF; + while(uc_index < checker_runcfg.param_count) + { + us_h_v = checker_runcfg.params[uc_index]; + uc_index++; + if(us_h_v < 55) + { + uc_rtv = 1; + continue; + } + us_m_v = (us_h_v>>1) > 50 ? (us_h_v>>1):50; + uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); + + } + PowerCalibration_set(POWER_DEF_V,POWER_DEF_V-10); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 延时 +@pram1 延时时间 0.1S +@param 使能总线电流监控 +@rtv1 波动AD值 +*/ +void Checker_WaitDelay(void) +{ + uint32_t ul_delaytime = checker_runcfg.params[0]; + uint8_t us_monito_flag = checker_runcfg.params[1]; + uint16_t us_temp; + if(us_monito_flag == 0) + { + while(ul_delaytime > 0) + { + delay_os_ms(100); + ul_delaytime--; + } + }else{ + + Power_SetSampleRange_Seep(Checker_MonitorBuf_Sample_R,ADC_SPEED_MIDLE); + delay_ms(1); + us_temp = AD_CurMonitor(ul_delaytime*1000); + CurrentSampleR_Def; + } + Power_SetSampleCurrentRange(Current_Max); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); +} + +/* +@brief 电阻检测 +@param0 电阻检测模式 0 4线制 1 2线 1-4,2 2线 2-3 通 +@rtv0 电阻检测值 +*/ +void Checker_ResistorSample(void) +{ + /* + 1 通道1-4通,过桥丝 + 2 通道2-3通,过桥丝 + 3 通道1-3通,测阻抗 + 4 通道2-4通,测阻抗 + */ + uint16_t aus_sample[5]; + uint16_t us_resistor; + uint8_t uc_index = 0; + AD_SampleResistor(aus_sample); + for(uc_index = 0; uc_index < 5; uc_index++) + { + aus_sample[uc_index] -= board_st.resistor_diff; + } + switch(checker_runcfg.params[0]) + { + case 0: us_resistor = aus_sample[0];break; + case 1: us_resistor = aus_sample[1];break; + case 2: us_resistor = aus_sample[2];break; + case 3: us_resistor = aus_sample[3];break; + case 4: us_resistor = aus_sample[4];break; + default : us_resistor = 0;break; + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_resistor,checker_runcfg.rtv_count); +} + +/* +@brief 判断是否需要注码 +@rtv 0 不需要注码 1 注码 +*/ +uint8_t JQXT_Test_IsNeedBind(void) +{ + uint8_t uc_index = 0; + + if(checker_runcfg.uid_len == 0 || checker_runcfg.pwd_len == 0) + { + return 0; + } + for(uc_index = 0; uc_index < checker_runcfg.uid_len ; uc_index++) + { + if(checker_runcfg.writeuid[uc_index] != 0) + { + break; + } + } + if(uc_index != checker_runcfg.uid_len) + { + return 1; + } + + for(uc_index = 0; uc_index < checker_runcfg.pwd_len ; uc_index++) + { + if(checker_runcfg.writepwd[uc_index] != 0) + { + break; + } + } + if(uc_index != checker_runcfg.pwd_len) + { + return 1; + } + return 0; +} +/* +检测执行函数是否正常 +*/ +uint8_t Checker_FunIsValid(CheckerTask* taskArray,uint16_t run_index) +{ + uint16_t index = 0; + while((*taskArray !=0) && (index < CHECKER_MAXID_COUNT)) + { + index++; + } + if(run_index >= index) + { + return 1; + } + return 0; +} + diff --git a/source/elec_det/interface/BaseChecker.h b/source/elec_det/interface/BaseChecker.h new file mode 100644 index 0000000..ca597d2 --- /dev/null +++ b/source/elec_det/interface/BaseChecker.h @@ -0,0 +1,101 @@ +#ifndef BASECHECKER_H_ +#define BASECHECKER_H_ +#include "stm32f10x.h" + + +#define CHECKER_NET_ID 10 +#define CHECKER_DELAY_TIME 10 +#define CHECKER_MAXRT_COUNT 64 +#define CHECKER_MAXID_COUNT 100 + + + +typedef void (*CheckerTask)(void ); + +#pragma pack(1) +typedef struct { +uint8_t taskid; //任务ID +uint8_t runindex;//任务序列 +uint8_t retry_time;//重试次数 +uint8_t error_jumpto;//失败后跳转 +uint8_t param_rtv_count;//参数个数和返回值个数 +uint16_t params[10]; +}CheckerTask_Info_st; + + +typedef struct{ +CheckerTask_Info_st task_info; +uint16_t params[10];//运行参数1 +uint16_t rtv_index;//返回值下标 +uint8_t rtv_count;//当前任务返回值个数 +uint8_t param_count;//参数个数 +uint8_t excue_rtv; //任务执行结果 +uint8_t power_prapare_exe;//电源准备任务执行 +uint16_t Test_Rtv[100];//保存返回参数 +uint8_t Task_Result[8];//保存运行状态 +uint8_t Task_Excute[8];//保存执行序列号 +uint16_t netid;//电子模块最新的网络ID +uint8_t user_otp[4];//用户区OTP数据 +uint8_t writeuid[13];//注码uid +uint8_t writepwd[8];//注码密码 +uint8_t uid_len;//密码长度 XT 7 JQ 8 +uint8_t pwd_len;//密码长度 XT 4 JQ 4 +uint8_t uid_pwd_bind_flag; +uint8_t code_bind_check_flag;//三码绑定检测一起执行 +}Checker_RunCfg_st ; + +#pragma pack() + +extern Checker_RunCfg_st checker_runcfg; +#define CHECKER_WRITE_BUF 48 //(CHECKER_FAC_BUF_LEN-2) +#define CHECKER_FAC_BUF_LEN 50 //len+crc8+48bytes +extern uint8_t Checker_FacBuf[CHECKER_FAC_BUF_LEN]; +extern volatile uint8_t ThreeBindResult_flag ; +extern uint16_t Checker_First_Set_Voltage ;//方案设置内部第一个电压 +/* +@brief 标记执行结果 +@param rtv 执行返回值 1表示失败 0 表示成功 +@param taskindex 任务项目ID号 +*/ +void Checker_MaskResult(uint8_t rtv,uint8_t taskindex); +/* +@brief 标记任务序列执行 +@param taskindex 任务序列号 +*/ +void Checker_Excueindex(uint8_t taskindex); + +/* +@brief 保存测试结果值 +@param *pus_rtv 测量结果缓存 +@param count 缓存个数 +*/ +void Checker_SetRtv(uint16_t* pus_rtv, uint8_t count); + +/* +brief 准备测试用电压 +@param 设置电压值,最多支持10个参数 +*/ +void Checker_PowerPrapare(void); +/* +@brief 延时 +@pram1 延时时间 0.1S +@param 使能总线电流监控 +@rtv1 波动AD值 +*/ +void Checker_WaitDelay(void); +/* +@brief 电阻检测 +@param0 电阻检测模式 0 4线制 1 2线 1-4,2 2线 2-3 通 +@rtv0 电阻检测值 +*/ +void Checker_ResistorSample(void); +/* +@brief 判断是否需要注码 +@rtv 0 不需要注码 1 注码 +*/ +uint8_t JQXT_Test_IsNeedBind(void); +/* +检测执行函数是否正常 +*/ +uint8_t Checker_FunIsValid(CheckerTask* taskArray,uint16_t run_index); +#endif diff --git a/source/elec_det/interface/JQChecker.c b/source/elec_det/interface/JQChecker.c new file mode 100644 index 0000000..6ec197f --- /dev/null +++ b/source/elec_det/interface/JQChecker.c @@ -0,0 +1,1099 @@ +#include "driver/JQDriver.h" +#include "base/delay.h" +#include "hardware/adc_cfg.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "JQChecker.h" + +/* +@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC +@param0 总线电压 +@param1 超时时间 0.1ms +@param2 充电结束时的AD值 +@rtv1 返回总线电流低于设置AD值的时间 +*/ +void JQ_Test_PowerOn(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_rsult[2]; + uint16_t us_max; + uint16_t us_shake; + JQBUS_OFF; + uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1); + + Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH); + //POWER_ON + delay_os_ms(100); + JQBUS_ON; + delay_us(20); + us_rsult[1] = AD_GetChgEnergy(checker_runcfg.params[1],checker_runcfg.params[2], &us_max,&us_shake); + delay_os_ms(100); + us_rsult[0] = Power_GetBousV(); + Checker_SetRtv(us_rsult,checker_runcfg.rtv_count); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + + + +} +/* +@brief 设置总线电压 +@param1 总线电压 +@rtv1 总线电压 +*/ +void JQ_Test_SetBusV(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_h_v,us_m_v; + us_h_v = checker_runcfg.params[0]; + if(us_h_v < 55) + { + uc_rtv = 1; + + }else{ + us_m_v = 50; + uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); + JQBUS_ON; + delay_ms(100); + us_h_v = Power_GetBousV(); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + +} +/* +@brief 测量总线基本电压 +@rtv1 返回总线电流 单位0.01uA +*/ +void JQ_Test_BaseCur(void) +{ + uint16_t ul_cur[2]; + JQBUS_W_1 + delay_ms(250); + ul_cur[0] = ADC_GetBaseStableCur(); + JQBUS_W_0 + delay_ms(100); + ul_cur[1] = ADC_GetBaseStableCur(); + JQBUS_W_1 + delay_ms(20); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(ul_cur,checker_runcfg.rtv_count); +} +/* +@brief 扫描总线上的电子模块 1发 +@param0 使能或失能通信反码信息采集 +@param1 1 uid数据全0验证 其他不验证 +@rtv1 最大反馈电流 +@rtv2 最大反馈时间 +@rtv3 最小反馈电流 +@rtv4 最小反馈时间 +@rtv5 UID 2Bytes +@rtv6 UID 2Bytes +@rtv7 UID 2Bytes +@rtv8 UID 2Bytes +*/ +void JQ_Test_ScanUID(void) +{ + uint16_t aus_temp[8]; + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint32_t ul_temp; + for(uc_count = 0; uc_count < 4; uc_count++) + { + aus_temp[uc_count] = 0x00; + } + for(uc_count = 4; uc_count < 8; uc_count++) + { + aus_temp[uc_count] = 0x55; + } + JQ_ScanUIDBegin(); + if(checker_runcfg.params[0] > 0) + { + JQ_FreeBack_Prapare(1); + } + uc_ack = JQ_ScanReadUID(CHECKER_NET_ID,(uint8_t*)&aus_temp[4]); +// uc_rtv = JQ_ScanReadUID(checker_runcfg.jq_params[2],(uint8_t*)&aus_temp[4]); + + if(uc_ack < 1) + { + uc_rtv = 1; + } + + ul_temp = Power_ConvCur(JQ_FreeBack_MaxCur,JQDriver_Sample_R); + ul_temp = (ul_temp + 500)/1000; + + aus_temp[0] = ul_temp ; + aus_temp[1] = (uint16_t)((((589u*1000)*JQ_FreeBack_MaxTime)/JQ_Read_AD_Sample_C+400)/1000) ; + ul_temp = Power_ConvCur(JQ_FreeBack_MinCur,JQDriver_Sample_R); + ul_temp = (ul_temp + 500)/1000; + aus_temp[2] = ul_temp; + aus_temp[3] = (uint16_t)((((589u*1000)*JQ_FreeBack_MinTime)/JQ_Read_AD_Sample_C+400)/1000) ; + if(checker_runcfg.params[1] == 0) + { + for(uc_count = 4; uc_count < 8; uc_count++) + { + if(aus_temp[uc_count] != 0x00) + { + uc_rtv |= 0x01; + } + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); +} +/* +@brief 读取芯片码 +@rtv 芯片代码2字节 +*/ +void JQ_Test_ReadChipID(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_chipid; + uint8_t uc_ack; + uc_ack = JQ_ReadChipID(CHECKER_NET_ID,&us_chipid); + if(uc_ack < 1) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_chipid,checker_runcfg.rtv_count); +} +/* +@brief 密码验证 +@param0 密码原码验证使能 +*/ +void JQ_Test_PWCheck(void) +{ + uint8_t auc_pwd[4]={0,0,0,0}; + uint8_t uc_count = 0,uc_ack = 0,uc_rtv = 0; + if(checker_runcfg.params[0] > 0) + { + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,11,4,auc_pwd); + if(uc_ack != 4) + { + uc_rtv = 1; + } + uc_ack = auc_pwd[3] ; + auc_pwd[3] = auc_pwd[0]; + auc_pwd[0] = uc_ack; + uc_ack = auc_pwd[2] ; + auc_pwd[2] = auc_pwd[1]; + auc_pwd[1] = uc_ack; + } + JQ_VerifyPWD(auc_pwd); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief OTP全0检测 +@param0 UID区和密码区验证标志 1不验证 0 验证 +@param1 延时区和保留区验证 1不验证 0验证,错误标记区 +@param2 用户存储区 +*/ + +void JQ_Test_OTPCheck(void) +{ + uint8_t uc_optbuf[16]; + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + //出厂校准 + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,0,1,uc_optbuf); + if(uc_ack !=1 || uc_optbuf[0] == 0xFF || uc_optbuf[0] == 0) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return ; + } + if(checker_runcfg.params[0] < 1) + { + uc_count = 0; + while(uc_count < 16) + { + uc_optbuf[uc_count++] = 0x55; + } + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,3,12,uc_optbuf); + if(uc_ack != 12) + { + uc_rtv = 1; + } + uc_count = 0; + while(uc_count < 12) + { + if(uc_optbuf[uc_count++] != 0) + { + uc_rtv = 1; + } + } + } + if(checker_runcfg.params[1] < 1) + { + uc_count = 0; + while(uc_count < 16) + { + uc_optbuf[uc_count++] = 0x55; + } + //延时区 + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,15,2,uc_optbuf); //2Bytes + if(uc_ack != 2) + { + uc_rtv = 1; + } + //保留区 3-16损坏使用 + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,17,3,uc_optbuf+2);//3Bytes + if(uc_ack != 3) + { + uc_rtv = 1; + } + //错误标记区 + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,26,6,uc_optbuf+5);//6Bytes + if(uc_ack != 6) + { + uc_rtv = 1; + } + + uc_count = 0; + //OTP31 30 特殊处理,其高4bit不错比较 + uc_optbuf[10] &= 0x0F; + uc_optbuf[9] &= 0x0F; + while(uc_count < 11) + { + if(uc_optbuf[uc_count++] != 0) + { + uc_rtv = 1; + } + } + } + + if(checker_runcfg.params[2] < 1) + { + uc_count = 0; + while(uc_count < 16) + { + uc_optbuf[uc_count++] = 0x55; + } + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,uc_optbuf); + if(uc_ack != 4) + { + uc_rtv = 1; + } + uc_count = 0; + while(uc_count < 4) + { + if(uc_optbuf[uc_count++] != 0) + { + uc_rtv = 1; + } + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 工厂成测标志检测 +*/ +void JQ_Test_FTCheck(void) +{ + uint16_t us_opt; + uint8_t uc_rtv = 0; + uint8_t uc_ack; + us_opt = 0x00; + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,24,2,(uint8_t*)&us_opt); + if(uc_ack != 2) + { + uc_rtv = 1; + } + if(us_opt != 0xFFFF) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 读芯片状态 +@param0 比较掩码,状态与掩码与等于掩码返回正常 +*/ +void JQ_Test_ReadState(void) +{ + uint8_t state = 0x00; + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uc_ack = JQ_ReadState(CHECKER_NET_ID,&state); + if((state & checker_runcfg.params[0]) != checker_runcfg.params[0]) + { + uc_rtv = 1; + } + if(uc_ack < 1) + { + uc_rtv = 1; + } + checker_runcfg.params[0] = state; + Checker_SetRtv(checker_runcfg.params,checker_runcfg.rtv_count); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 写入OTP数据 +@param0 2字节OTP数据 +@param1 2字节OTP数据 +*/ +void JQ_Test_WriteUserInfo(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_wcount ; + uint32_t ul_temp = 0; + uint32_t ul_write = checker_runcfg.params[1]; + ul_write <<= 16; + ul_write |= checker_runcfg.params[0]; + JQ_EnWOTP(); + JQ_EnWOTP(); + + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,(uint8_t*)&ul_temp); + if(uc_ack < 1) + { + uc_rtv = 1; + } + uc_wcount = 0; + //要不全部为0,要不除去低5位一致,其他bits为0 + if(ul_temp == 0) + { + uc_wcount = 4; + } + if((ul_temp & (~0x01Fu)) == 0) + { + if((ul_temp & 0x01Fu) == (ul_write & 0x01Fu)) + { + uc_wcount = 4; + } + } + if(uc_wcount == 0 || uc_rtv == 1) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + + uc_wcount = JQ_WriteOTP(20,4,(uint8_t*)&ul_write); + if(uc_count != 4) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + ul_temp = 0; + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,(uint8_t*)&ul_temp); + if(uc_ack < 1) + { + uc_rtv = 1; + } + if(ul_temp != ul_write) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 写入OTP数据 +@param0 OTP 地址 +@param1 写入数据长度 +@param2 2Bytes OTP数据 +@param3 2Bytes OTP数据 +@param4 2Bytes OTP数据 +@param5 2Bytes OTP数据 +*/ +void JQ_Test_WriteOTP(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_wcount ; + uint8_t uc_otpaddr; + uint8_t* uc_pbuf; + uint8_t uc_optbuf[8]; + JQ_EnWOTP(); + JQ_EnWOTP(); + uc_otpaddr = checker_runcfg.params[0]; + uc_count = checker_runcfg.params[1]; + if(uc_count > 8) + uc_count = 8; + uc_pbuf = (uint8_t*)(&checker_runcfg.params[2]); + uc_wcount = JQ_WriteOTP(uc_otpaddr,uc_count,uc_pbuf); + if(uc_wcount != uc_count) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf); + if(uc_ack < 1) + { + uc_rtv = 1; + } + for(uc_wcount = 0; uc_wcount < uc_count; uc_wcount++) + { + if(uc_optbuf[uc_wcount] != uc_pbuf[uc_wcount]) + { + break; + } + } + if(uc_wcount != uc_count) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + + + +/* +@brief 读OTP +@param0 OTP地址 +@param1 OTP 数量 +*/ + +void JQ_Test_ReadOTP(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_wcount ; + uint8_t uc_otpaddr; + uint16_t uc_optbuf[16]; + uc_otpaddr = checker_runcfg.params[0]; + uc_count = checker_runcfg.params[1]; + if((uc_otpaddr+uc_count) > 32) + { + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf); + if(uc_ack < 1) + { + uc_rtv = 1; + } + Checker_SetRtv(uc_optbuf,checker_runcfg.rtv_count); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 充能统计 +@param0 充电超时0.1us +@param1 充电电流判线值,AD值 +@param2 充电末电流结束值,单位0.1uA +@param3 充电最长时间,单位100ms +@param4 充电高压保持时间,单位0.1s + +@rtv0 充能值 单位0.1ms +@rtv1 充末电流 单位0.1uA +@rtv2 充电最大电流 单位0.1Ma +@rtv3 充电抖动幅值 adv +*/ + +void JQ_Test_ChgEnergy(void) +{ + uint16_t us_sample_timeout = checker_runcfg.params[0]; + uint16_t us_adend = checker_runcfg.params[1]; + uint16_t us_chgend_cur = checker_runcfg.params[2]; + uint16_t us_timeout = checker_runcfg.params[3]; + uint32_t ul_holdtime = checker_runcfg.params[4]; + + + uint16_t us_array[4]; + uint16_t us_energy = 0; + uint16_t us_end_cur = 2000; + uint16_t us_max_cur = 0; + uint16_t us_shake = 65535; + uint32_t ul_temp; + uint8_t uc_rtv = 0; + + JQ_Chage(0); + Power_SetSampleRange_Seep(JQChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH); + delay_ms(1); + us_energy = AD_GetChgEnergy(us_sample_timeout,us_adend,&us_max_cur,&us_shake); + us_max_cur = (Power_ConvCur(us_max_cur,JQChecker_ChgEnger_Sample_R) /100+5)/10; + ADC_CurChnnelSet(AN_MAL_CH, ADC_SPEED_MIDLE); + ul_temp = AD_CurMonitor(ul_holdtime*1000); + if(ul_temp > us_shake) + { + us_shake = ul_temp; + } + us_timeout++; + while(us_timeout > 0) + { + + us_end_cur = ADC_GetBaseStableCur(); + + if(us_end_cur < us_chgend_cur) + { + break; + } + us_timeout--; + } + if(us_end_cur > us_chgend_cur) + { + uc_rtv = 1; + } + CurrentSampleR_Def; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + us_array[0] = us_energy; + us_array[1] = us_end_cur; + us_array[2] = us_max_cur; + us_array[3] = us_shake; + + Checker_SetRtv(us_array,checker_runcfg.rtv_count); + +} + +/* +@brief DAC检测 +@param DAC检测的起始值 +@param DAC检测的结束值 +*/ +void JQ_Test_CheckDAC(void) +{ + uint16_t uc_bg_dac = checker_runcfg.params[0]; + uint16_t uc_end_dac = checker_runcfg.params[1]; + uint8_t uc_rtv = 1,uc_state; + while(uc_bg_dac >= uc_end_dac) + { + JQ_ChargJudge(uc_bg_dac); + uc_state = 0; + if( JQ_ReadState(CHECKER_NET_ID,&uc_state) < 1) + { + uc_bg_dac = 0; + uc_rtv = 1; + break; + } + if(uc_state & 0x80) + { + uc_rtv = 0; + break; + } + if(uc_bg_dac == 0) + { + break; + } + uc_bg_dac--; + } + if(uc_bg_dac < uc_end_dac) + { + uc_bg_dac = 0; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&uc_bg_dac,checker_runcfg.rtv_count); +} + + +/* +@brief 写延时 +@param 延时时间 +*/ +void JQ_Test_SetDelay(void) +{ + uint16_t us_delaytime = checker_runcfg.params[0]; + JQ_WriteDelay(CHECKER_NET_ID,us_delaytime); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@brief 读延时 +@param 延时时间 +*/ +void JQ_Test_ReadDelay(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_delaytime,us_temp; + uc_rtv = JQ_ReadDelay(CHECKER_NET_ID,&us_delaytime); + uc_rtv = uc_rtv < 1?1:0; + + us_temp = (us_delaytime >> 8) & 0x0FF; + us_temp |= (us_delaytime << 8) & 0xFF00; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); +} + +/* +@brief 校准 +@param1 校准周期 +@param2 脉冲个数 +*/ +void JQ_Test_ClkTrim(void) +{ + uint16_t us_cycle = checker_runcfg.params[0]; + uint16_t us_count = checker_runcfg.params[1]; + JQ_TimeAmend(us_cycle,us_count); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@brief 放电,快速放电仅JQ2012才有 +@param0 放电功能 0 普通放电 1 快速放电 +@param1 快速放电时间 +*/ + +void JQ_Test_Discharge(void) +{ + uint16_t us_time = checker_runcfg.params[1]; + JQ_DisChage(); + if(checker_runcfg.params[0] == 1 && us_time > 0) + { + JQ_FastDisChage(1); + delay_os_ms(100*us_time); + JQ_FastDisChage(0); + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} + +/* +@brief 复位 +*/ +void JQ_Test_Reset(void) +{ + uint8_t ack = 0,uc_state; + uint8_t i = 0; + for(i = 0; i < 5;i++) + { + delay_os_ms(20); + JQ_Reset(); //软复位 + delay_os_ms(20); + ack = JQ_ReadState(0,&uc_state); //读状态 + if(ack == 0) + continue; + if((uc_state & 0x7B) == 0x18) + { + break; + } + } + delay_os_ms(20); + JQ_DisChage(); //内部放电 + if(i < 5) + { + ack = 0; + }else{ + ack = 1; + } + Checker_MaskResult(ack,checker_runcfg.task_info.runindex); +} + +/* +@brief 起爆使能 +*/ +void JQ_Test_BootEn(void) +{ + JQ_BoomActive(); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@brief 清除起爆命令 +*/ +void JQ_Test_ClearBoom() +{ + uint16_t us_temp; + JQ_CheckerBoomCmd(1,&us_temp); + +} +/* +@brief 起爆充能 +@param0 启动电流 adc +@param1 脉冲个数 +@param2 延时采集起爆充能 + +@rtv1 起爆后充电能量 +@rtv2 起爆脉冲波动 +@rtv3 起爆后充电电流 +@rtv4 起爆后充电电流波动 +*/ + +void JQ_Test_BoomEnergy(void) +{ + uint16_t us_adc_bg = checker_runcfg.params[0]; + uint16_t us_plus_count = checker_runcfg.params[1]; + uint16_t us_delay = checker_runcfg.params[2]; + uint16_t aus_rtv[4];// us_shake,max_cul,us_shake2,us_energy; + uint32_t ul_max_cur; + us_plus_count = JQ_CheckerBoomCmd(us_plus_count,&aus_rtv[1]); + if(checker_runcfg.params[1] > 652) + { + + Power_SetSampleRange_Seep(JQChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH); + delay_ms(us_delay); + aus_rtv[0] = AD_GetChgEnergy(40000,us_adc_bg,&aus_rtv[2],&aus_rtv[3]); + ul_max_cur = Power_ConvCur(aus_rtv[2],JQChecker_ChgEnger_Sample_R); + ul_max_cur = (ul_max_cur + 500)/1000;//0.01mA + aus_rtv[2] = ul_max_cur; + + }else{ + aus_rtv[0] = aus_rtv[2] = aus_rtv[3] = 0; + } + if(us_plus_count != CHECKER_NET_ID) + { + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + }else{ + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + } + + Checker_SetRtv(aus_rtv,checker_runcfg.rtv_count); + +} + +/* +@brief 使能通讯末电流采样 +*/ +void JQ_Test_EnCommEndCur(void) +{ + JQ_CommEnd_MaxCur = 0; + JQ_CommEnd_CurEn = 1; + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@brief 获取通讯末电流采样,关闭电流采样 +@rtv 返回上次采集的通讯末电流 +*/ +void JQ_Test_GetCommEndCur(void) +{ + JQ_CommEnd_CurEn = 0; + Checker_SetRtv(&JQ_CommEnd_MaxCur,checker_runcfg.rtv_count); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@brief 关总线 +*/ +void JQ_Test_PowerOff(void) +{ + JQ_Test_Discharge(); + delay_ms(20); + JQBUS_OFF; + PowerCalibration_set(POWER_DEF_V,POWER_DEF_V-10); +} +/* +@brief 缓存数据写入OTP数据 +@param0 OTP 地址 +@param1 缓存区起始 +@param2 写入数据长度 +*/ +void JQ_Test_WriteBuf2OTP(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_wcount ; + uint8_t uc_otpaddr; + uint8_t* uc_pbuf; + uint8_t uc_optbuf[16]; + JQ_EnWOTP(); + JQ_EnWOTP(); + if((checker_runcfg.params[1] + checker_runcfg.params[2] > CHECKER_WRITE_BUF) || (checker_runcfg.params[1] > 16)) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1]) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + memset(uc_optbuf,0x55,16); + uc_otpaddr = checker_runcfg.params[0]; + uc_count = checker_runcfg.params[2]; + uc_pbuf = &Checker_FacBuf[2]+checker_runcfg.params[1]; + + uc_wcount = JQ_WriteOTP(uc_otpaddr,uc_count,uc_pbuf); + if(uc_wcount != uc_count) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf); + if(uc_ack < 1) + { + uc_rtv = 1; + } + for(uc_wcount = 0; uc_wcount < uc_count; uc_wcount++) + { + if(uc_optbuf[uc_wcount] != uc_pbuf[uc_wcount]) + { + break; + } + } + if(uc_wcount != uc_count) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 写入三码数据 +*/ +void JQ_UID_PWD_Bind(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_optbuf[16]; + uint32_t ul_write_mask = 0; + + if(JQXT_Test_IsNeedBind() == 0) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + } + + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,0x03,12,(uint8_t*)uc_optbuf); + if(uc_ack < 1) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + JQ_EnWOTP(); + JQ_EnWOTP(); + for(uc_count = 0; uc_count < 8; uc_count++) + { + if((checker_runcfg.writeuid[uc_count] & uc_optbuf[uc_count]) != uc_optbuf[uc_count]) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + + } + if(checker_runcfg.writeuid[uc_count] != uc_optbuf[uc_count]) + { + ul_write_mask |= ((0x01ul)<>= 1; + } + if(uc_count != 12) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief UID PWD 验证 +*/ +void JQ_Verify_UID_PWD(void) +{ + uint8_t uc_ack; + uint8_t auc_uid_temp[8]; + uint8_t auc_pwd_temp[4]; + uint8_t uc_state; + + if(JQXT_Test_IsNeedBind() == 0) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + return; + } + + JQ_ScanUIDBegin(); + if(checker_runcfg.params[0] > 0) + { + JQ_FreeBack_Prapare(1); + } + uc_ack = JQ_ScanReadUID(CHECKER_NET_ID,auc_uid_temp); + if(uc_ack < 1) + { + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + return; + } + for(uc_ack = 0; uc_ack < 4; uc_ack++) + { + auc_pwd_temp[uc_ack] = checker_runcfg.writepwd[3-uc_ack]; + } + JQ_VerifyPWD(auc_pwd_temp); + uc_state = 0; + uc_ack = JQ_ReadState(CHECKER_NET_ID,&uc_state); + if((uc_state & 0x40) == 0) + { + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + return; + } + for(uc_ack = 0; uc_ack < 8; uc_ack++) + { + if(checker_runcfg.writeuid[uc_ack] != auc_uid_temp[7-uc_ack]) + { + break; + } + } + if(uc_ack != 8) + { + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + }else{ + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + } +} +/* +@breif 测量电容电压差 +@param0 两次测量间隔 0.1s +@rtv0 电压差值 +*/ +void JQ_Test_CapVoltage(void) +{ + uint16_t us_capv1; + + + POWER_OFF; + Power_SetSampleCurrentRange(Checker_OnLine_Sample_R); + HMOS_FAST_DISCHG; + HMOS_SWITCH_GND; + delay_os_ms(1000); + us_capv1 = AD_SampleCap(checker_runcfg.params[0]); + POWER_ON; + delay_os_ms(500); + JQBUS_ON + Power_SetSampleCurrentRange(Current_Max); + + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_capv1,checker_runcfg.rtv_count); + +} +/* +@breif OTP 读写使能 +*/ + +void JQ_Test_EnOTPW(void) +{ + JQ_EnWOTP(); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} +/* +@breif 写模块版本 前提是要使能OTP (ENWOTP) +@param0 模块版本号 +*/ +void JQ_Test_WriteVersion(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_temp = 0; + uint8_t uc_write = checker_runcfg.params[0] & 0x1F; + + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&uc_temp); + if(uc_ack < 1) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + if((uc_temp & 0x1F) == uc_write) + { + uc_rtv = 0; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + uc_temp |= uc_write; + if((uc_temp & 0x1F) != uc_write) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + JQ_EnWOTP(); + JQ_EnWOTP(); + + uc_ack = JQ_WriteOTP(20,1,(uint8_t*)&uc_temp); + if(uc_ack != 1) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + uc_write = uc_temp; + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&uc_temp); + if(uc_ack < 1) + { + uc_rtv = 1; + } + if(uc_temp != uc_write) + { + uc_rtv = 1; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 获取版本号 + +*/ +void JQ_Test_ReadVersion(void) +{ + uint16_t us_temp = 0xFF; + uint8_t uc_ack; + uint8_t uc_rtv = 0; + uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&us_temp); + if(uc_ack < 1) + { + uc_rtv = 1; + } + us_temp &= 0x1F; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); +} + +CheckerTask jqtaskArray[CHECKER_MAXID_COUNT] ={ +Checker_PowerPrapare, //0 电源准备 +JQ_Test_PowerOn, //1 上电充能 +JQ_Test_SetBusV, //2 设置总线电压 +JQ_Test_BaseCur, //3 获取总线电流 +JQ_Test_ScanUID, //4 扫描UID +JQ_Test_PWCheck, //5 密码验证 +JQ_Test_ReadChipID, //6 读取芯片代码 +JQ_Test_OTPCheck, //7 OTP检测 +JQ_Test_FTCheck, //8 工厂测试检测 +JQ_Test_ReadState, //9 读取状态 +JQ_Test_WriteUserInfo,//10 写工厂信息 +JQ_Test_ChgEnergy ,//11 充能统计 +JQ_Test_CheckDAC ,//12 充电电压检测 +Checker_WaitDelay ,//13 延时等待 +JQ_Test_SetDelay ,//14 设置延时 +JQ_Test_ReadDelay ,//15 读取延时 +JQ_Test_ClkTrim ,//16 时钟校准 +JQ_Test_Discharge ,//17 放电 +JQ_Test_Reset ,//18 复位 +JQ_Test_BootEn ,//19 起爆使能 +JQ_Test_BoomEnergy ,//20 起爆充能 +JQ_Test_EnCommEndCur ,//21 使能通讯末电流采集 +JQ_Test_GetCommEndCur ,//22 获取通讯末电流 +JQ_Test_WriteOTP ,//23 写OTP +JQ_Test_ReadOTP ,//24 读OTP +JQ_Test_ClearBoom ,//25 清除起爆计数 +JQ_Test_PowerOff ,//26 关总线 +JQ_Test_WriteBuf2OTP ,//27 将缓存区数据写入OTP +JQ_UID_PWD_Bind ,//28 三码写入错误 +JQ_Verify_UID_PWD ,//29 三码验证错误 +JQ_Test_CapVoltage ,//30 测量电容压差 +Checker_ResistorSample,//31 测量桥丝阻值 +JQ_Test_EnOTPW ,//32 使能OTP写 +JQ_Test_WriteVersion ,//33 写模块版本 +JQ_Test_ReadVersion ,//34 读取版本号 +(void*)0 //数组结束 +}; + diff --git a/source/elec_det/interface/JQChecker.h b/source/elec_det/interface/JQChecker.h new file mode 100644 index 0000000..904ce5a --- /dev/null +++ b/source/elec_det/interface/JQChecker.h @@ -0,0 +1,218 @@ +#ifndef JQCHECKER_H_ +#define JQCHECKER_H_ +#include "base/define.h" +#include "basechecker.h" + + + + +extern Checker_RunCfg_st checker_runcfg; + + + + +extern CheckerTask jqtaskArray[CHECKER_MAXID_COUNT]; + + +/* +brief 准备测试用电压 +@param 设置电压值,最多支持10个参数 +*/ +void JQ_Test_PowerPrapare(void); + +/* +@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC +@param1 总线电压 +@param2 充电结束时的AD值 +@rtv1 返回总线电流低于设置AD值的时间 +*/ +void JQ_Test_PowerOn(void); +/* +@brief 扫描总线上的电子模块 1发 +@param0 使能或失能通信反码信息采集 +@param1 1 uid数据全0验证 其他不验证 +*/ +void JQ_Test_ScanUID(void); +/* +@brief 设置总线电压 +@param1 总线电压 +@rtv1 总线电压 +*/ +void JQ_Test_SetBusV(void); +/* +@brief 测量总线基本电压 +@rtv1 返回总线电流 单位0.01uA +*/ +void JQ_Test_BaseCur(void); +/* +@brief 读取芯片码 +@rtv 芯片代码2字节 +*/ +void JQ_Test_ReadChipID(void); +/* +@brief OTP全0检测 +@param0 UID区和密码区验证标志 1不验证 0 验证 +@param1 延时区和保留区验证 1不严重 0验证,错误标记区 +@param2 用户存储区 +*/ + +void JQ_Test_OTPCheck(void); +/* +@brief 工厂成测标志检测 +*/ +void JQ_Test_FTCheck(void); +/* +@brief 读芯片状态 +@param0 比较掩码,状态与掩码与等于掩码返回正常 +*/ +void JQ_Test_ReadState(void); +/* +@brief 写入OTP数据 +@param0 2字节OTP数据 +@param1 2字节OTP数据 +*/ +void JQ_Test_WriteUserInfo(void); +/* +@brief 充能统计 +@param0 充电电流判线值,AD值 +@param1 充电末电流结束值,单位0.1uA +@param2 充电最长时间,单位100ms +@param3 充电高压保持时间,单位0.1s +@rtv0 充能值 单位0.1ms +@rtv1 充末电流 单位0.1uA +@rtv2 充电最大电流 单位0.1Ma +@rtv3 充电抖动幅值 adv +*/ + +void JQ_Test_ChgEnergy(void); +/* +@brief DAC检测 +@param DAC检测的起始值 +@param DAC检测的结束值 +*/ +void JQ_Test_CheckDAC(void); +/* +@brief 延时 +@pram1 延时时间 0.1S +@param 使能总线电流监控 +@rtv1 波动AD值 +*/ +void JQ_Test_WaitDelay(void); +/* +@brief 写延时 +@param 延时时间 +*/ +void JQ_Test_SetDelay(void); +/* +@brief 读延时 +@param 延时时间 +*/ +void JQ_Test_ReadDelay(void); +/* +@brief 校准 +@param1 校准周期 +@param2 脉冲个数 +*/ +void JQ_Test_ClkTrim(void); +/* +@brief 放电 +*/ + +void JQ_Test_Discharge(void); +/* +@brief 复位 +*/ +void JQ_Test_Reset(void); +/* +@brief 起爆使能 +*/ +void JQ_Test_BootEn(void); +/* +@brief 起爆充能 +@param1 启动电流 adc +@param2 脉冲个数 +@param3 延迟采集充能 +@param4 使能电压波动监控 +@rtv1 起爆后充电能量 +@rtv2 起爆脉冲波动 +@rtv3 起爆后充电电流 +@rtv4 起爆后充电电流波动 +*/ + +void JQ_Test_BoomEnergy(void); +/* +@brief 使能通讯末电流采样 +*/ +void JQ_Test_EnCommEndCur(void); +/* +@brief 获取通讯末电流采样,关闭电流采样 +@rtv 返回上次采集的通讯末电流 +*/ +void JQ_Test_GetCommEndCur(void); +/* +@brief 关总线 +*/ +void JQ_Test_PowerOff(void); +/* +@brief 密码验证 +@param0 密码源码验证使能 +*/ +void JQ_Test_PWCheck(void); +/* +@brief 写入OTP数据 +@param0 OTP 地址 +@param1 写入数据长度 +@param2 2Bytes OTP数据 +@param3 2Bytes OTP数据 +@param4 2Bytes OTP数据 +@param5 2Bytes OTP数据 +*/ +void JQ_Test_WriteOTP(void); +/* +@brief 读OTP +@param0 OTP地址 +@param1 OTP 数量 +*/ + +void JQ_Test_ReadOTP(void); +/* +@brief 清除起爆命令 +*/ +void JQ_Test_ClearBoom(void); +/* +@brief 缓存数据写入OTP数据 +@param0 OTP 地址 +@param1 缓存区起始 +@param2 写入数据长度 +*/ +void JQ_Test_WriteBuf2OTP(void); +/* +@brief 写入三码数据 +*/ +void JQ_UID_PWD_Bind(void); +/* +@brief UID PWD 验证 +*/ +void JQ_Verify_UID_PWD(void); +/* +@breif 测量电容电压差 +@param0 两次测量间隔 0.1s +@rtv0 电压差值 +*/ +void JQ_Test_CapVoltage(void); +/* +@breif OTP 读写使能 +*/ + +void JQ_Test_EnOTPW(void); +/* +@brief 获取版本号 + +*/ +void JQ_Test_ReadVersion(void); +/* +@breif 写模块版本 前提是要使能OTP (ENWOTP) +@param0 模块版本号 +*/ +void JQ_Test_WriteVersion(void); +#endif diff --git a/source/elec_det/interface/XTChecker.c b/source/elec_det/interface/XTChecker.c new file mode 100644 index 0000000..f639666 --- /dev/null +++ b/source/elec_det/interface/XTChecker.c @@ -0,0 +1,1390 @@ + +#include "base/delay.h" +#include "hardware/adc_cfg.h" +#include "base/utility.h" +#include "hardware/power.h" +#include "driver/XTDriver.h" +#include "XTChecker.h" +#include "hardware/timer_cfg.h" +#define XT_CHECKER_RUN_BUF 56 +uint8_t XT_Test_UID[13]="123456789ACDE"; +uint8_t XT_Test_PWD[8]="FBCDabcd"; +uint8_t XT_RunBuf[XT_CHECKER_RUN_BUF]; +/* +@brief 注码检测 +@rtv 0 已经注码,1 不能注码 2 需要注码 +*/ +static uint8_t XT_Test_CheckeThreeCode(void); +/* +@brief 三码绑定验证 +*/ +static uint8_t XT_Test_UID_PWD_Verify_(void); +/* +@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC +@param0 总线电压 +@param1 超时时间 0.1ms +@param2 充电结束时的AD值 +@rtv1 返回总线电流低于设置AD值的时间 +*/ +void XT_Test_PowerOn(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_rsult[2]; + uint16_t us_max; + uint16_t us_shake; + XTBUS_OFF; + uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1); + Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH); + //POWER_ON + delay_os_ms(100); + XTBUS_ON; + delay_us(20); + us_rsult[1] = AD_GetChgEnergy(checker_runcfg.params[1],checker_runcfg.params[2], &us_max,&us_shake); + delay_os_ms(100); + us_rsult[0] = Power_GetBousV(); + Checker_SetRtv(us_rsult,checker_runcfg.rtv_count); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + XT_Init(0x78); +} + +/* +@brief 设置总线电压 +@param1 总线电压 +@rtv1 总线电压 +*/ +void XT_Test_SetBusV(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_h_v,us_m_v; + us_h_v = checker_runcfg.params[0]; + if(us_h_v < 55) + { + uc_rtv = 1; + + }else{ + us_m_v = 50; + uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); + XTBUS_ON +// if(checker_runcfg.params[1] == 0) +// { +// XTBUS_ON; +// }else{ +// HMOS_SWITCH_RW_1; +// } + us_m_v = ((us_h_v/80)+2)*60; + delay_ms(us_m_v); + us_h_v = Power_GetBousV(); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + +} + +/* +@brief 测量总线基本电压 +@rtv1 返回总线电流 单位0.01uA +*/ +void XT_Test_BaseCur(void) +{ + uint16_t ul_cur[2]; + XTBUS_W_1 + delay_ms(200); + ul_cur[0] = ADC_GetBaseStableCur(); + XTBUS_W_0 + delay_ms(100); + ul_cur[1] = ADC_GetBaseStableCur(); + XTBUS_W_1 + delay_ms(50); +// if(ul_cur[0] < 100 || ul_cur[1] < 100) +// { +// __disable_irq(); +// while(1){}; +// } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(ul_cur,checker_runcfg.rtv_count); +} + +/* +@brief 扫描总线上的电子模块 1发 +@param0 UID长度 +@param1 使能或失能 UID对比 +*/ + +void XT_Test_ScanUID(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + uint16_t us_temp[12]; + XT_Clear_Read(); + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.params[0] == 0) + { + checker_runcfg.params[0] = checker_runcfg.uid_len; + if(checker_runcfg.params[0] == 0) + { + checker_runcfg.params[0] = 7; + } + } + + uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[0]); + + if(checker_runcfg.params[1] > 0) + { + for(uc_count = 0; uc_count < checker_runcfg.params[0];uc_count++) + { + if(checker_runcfg.writeuid[uc_count] != XT_RunBuf[uc_count]) + { + uc_rtv |= 0x01; + } + } + } + uc_count = 0; + if(uc_rtv == 0) + { + checker_runcfg.uid_len = checker_runcfg.params[0]; + memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len); + uc_count = (checker_runcfg.params[0]+8+1)/2; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + memcpy(us_temp,XT_RunBuf,24); + Checker_SetRtv(us_temp,checker_runcfg.rtv_count); +} +/* +@brief 写芯片配置 +@param0 UID长度 +@param1 密码长度 +@param2 反馈电流挡位 +@param4 版本标识 +*/ +void XT_Test_WriteChipCfg(void) +{ + uint8_t uc_rtv = 0; + XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0; + XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ; + XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0; + XT_RunBuf[2] = checker_runcfg.params[3]; + uc_rtv = XT_Write_Config(XT_RunBuf); + checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0]; + checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1]; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 芯片配置并比对 +@param0 UID长度 +@param1 密码长度 +@param2 反馈电流挡位 +@param4 版本标识 +*/ +void XT_Test_CheckChipCfg(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + memset(XT_RunBuf,0,10); + XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0; + XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ; + XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0; + XT_RunBuf[2] = checker_runcfg.params[3]; + uc_rtv = XT_Read_Config(XT_RunBuf+5); + for(uc_count = 0; uc_count < 3; uc_count++) + { + if(XT_RunBuf[uc_count] != XT_RunBuf[6+uc_count]) + { + uc_rtv |= 0x01; + } + } + XT_RunBuf[1] = XT_RunBuf[2];//验证密码/UID 和版本号 + if(XT_Check_Config(XT_RunBuf) == 0) + { + checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0]; + checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1]; + }else{ + uc_rtv |= 0x01; + } + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + +} + + +/* +@brief 模拟注码,优先写入配置项 +*/ +void XT_Test_BindTestCode(void) +{ + uint8_t uc_rtv = 0; + if(checker_runcfg.uid_len == 0) + { + checker_runcfg.uid_len = 7; + } + memcpy(XT_RunBuf,XT_Test_UID,checker_runcfg.uid_len); + uc_rtv = XT_Write_Uid(XT_RunBuf, checker_runcfg.uid_len); + if(uc_rtv == 0) + { + memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len); + } + if(checker_runcfg.pwd_len == 0) + { + checker_runcfg.pwd_len = 7; + } + memcpy(XT_RunBuf,XT_Test_PWD,checker_runcfg.pwd_len); + uc_rtv |= XT_Write_Bmid(XT_RunBuf, checker_runcfg.pwd_len); + if(uc_rtv == 0) + { + memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len); + } + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 充能统计 +@param0 充电挡位 +@param1 充电电流判线值,AD值 +@param2 充电末电流结束值,单位0.1uA +@param3 充电最长时间,单位100ms +@param4 充电高压保持时间,单位0.1s + +@rtv0 充能值 单位0.1ms +@rtv1 充末电流 单位0.1uA +@rtv2 充电最大电流 单位0.1Ma +@rtv3 充电抖动幅值 adv +*/ + +void XT_Test_ChgEnergy(void) +{ + uint8_t uc_charge_class = checker_runcfg.params[0]; + uint16_t us_sample_timeout = checker_runcfg.params[1]; + uint16_t us_adend = checker_runcfg.params[2]; + uint16_t us_chgend_cur = checker_runcfg.params[3]; + uint16_t us_timeout = checker_runcfg.params[4]; + uint32_t ul_holdtime = checker_runcfg.params[5]; + + uint16_t us_array[4]; + uint16_t us_energy = 0; + uint16_t us_end_cur = 2000; + uint16_t us_max_cur = 0; + uint16_t us_shake = 65535; + uint32_t ul_temp; + uint8_t uc_rtv = 0; + + + XT_Init(0x78); + XT_Charge_All(uc_charge_class); + if(us_adend > 10) + { + Power_SetSampleRange_Seep(XTChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH); + delay_ms(1); + us_energy = AD_GetChgEnergy(us_sample_timeout,us_adend,&us_max_cur,&us_shake); + us_max_cur = ( Power_ConvCur(us_max_cur,XTChecker_ChgEnger_Sample_R) /100+5)/10; + ADC_CurChnnelSet(AN_MAL_CH, ADC_SPEED_MIDLE); + ul_temp = AD_CurMonitor(ul_holdtime*1000); + if(ul_temp > us_shake) + { + us_shake = ul_temp; + } + }else{ + us_shake = 0; + us_max_cur = 0; + us_energy = 0; + } + + + us_timeout++; + us_array[0] = ADC_GetBaseStableCur(); + us_array[1] = ADC_GetBaseStableCur(); + us_array[2] = ADC_GetBaseStableCur(); + while(us_timeout > 0) + { + us_array[3] = ADC_GetBaseStableCur(); + Bubble_Sort_u16(us_array,3); + + us_end_cur = us_array[0]; + + if(us_end_cur < us_chgend_cur ) + { + break; + } + us_timeout--; + } + if(us_end_cur > us_chgend_cur) + { + uc_rtv = 1; + } + CurrentSampleR_Def; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + us_array[0] = us_energy; + us_array[1] = us_end_cur; + us_array[2] = us_max_cur; + us_array[3] = us_shake; + + Checker_SetRtv(us_array,checker_runcfg.rtv_count); +} + +/* +@brief 写现场值,如果UID已经写入,会将现场值读取进行比对 +@param 0 编号 +@param 1 延时 +@param 2 孔号 +*/ + +void XT_Test_WriteRunField(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8); + XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]); + XT_RunBuf[2] = 0; + XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8); + XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]); + XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8); + XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]); + + if(checker_runcfg.uid_len > 0) + { + uc_rtv = XT_Write_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf); + delay_os_ms(40); + uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10); + for(uc_count = 0; uc_count < 7; uc_count++) + { + if(XT_RunBuf[uc_count] != XT_RunBuf[uc_count+10]) + { + uc_rtv |= 0x01; + } + } + }else{ + uc_rtv = XT_Write_Field_All(XT_RunBuf); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 比对现场值 +@param0 比对网络号 +@param1 比对延时 +@param2 比对孔位 +@param3 1使能或 0失能通信反码信息采集 +@rtv1 最大反馈电流 +@rtv2 最大反馈时间 +@rtv3 最小反馈电流 +@rtv4 最小反馈时间 +*/ + +void XT_Test_CheckRunField(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + uint16_t aus_temp[4]; + uint32_t ul_temp; + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + + XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8); + XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]); + XT_RunBuf[2] = 0; + XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8); + XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]); + XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8); + XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]); + + + if(checker_runcfg.uid_len == 0) + { + memset(aus_temp,0,8); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); + return; + } + if(checker_runcfg.params[3] > 0) + { + XT_FreeBack_Prapare(1); + } + uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10); + + ul_temp = Power_ConvCur(XT_FreeBackMaxCur, XTDriver_Sample_R); //通信电流 + ul_temp = (ul_temp / 10+4)/10;//0.01mA + + aus_temp[0] = ul_temp ; + aus_temp[1] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMaxTime)/XT_Read_AD_Sample_C+400)/1000) ; + ul_temp = Power_ConvCur(XT_FreeBackMinCur, XTDriver_Sample_R); //通信电流 + ul_temp = (ul_temp / 10+4)/10;//0.01mA + aus_temp[2] = ul_temp; + aus_temp[3] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMinTime)/XT_Read_AD_Sample_C+400)/1000) ; + + if(uc_rtv == 0) + { + for(uc_count = 0; uc_count < 7; uc_count++) + { + if(XT_RunBuf[uc_count] != XT_RunBuf[10+uc_count]) + { + uc_rtv |= 0x01; + } + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); +} + +/* +@brief 桥丝通断检测,如果测试器有uid,将采用uid方式通信 +*/ +void XT_Test_Resister(void) +{ + uint16_t us_rtv = 0; + if(checker_runcfg.uid_len > 0) + { + us_rtv = XT_Get_UID_R(checker_runcfg.writeuid,checker_runcfg.uid_len); + }else{ + us_rtv = XT_Get_R(); + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_rtv,checker_runcfg.rtv_count); +} +/* +@brief 电容容量检测,如果测试器有uid,将采用uid方式通信 +@param0 检测电压参数 +@param1 超时时间 +@rtv0 电容容量 0.1uF +*/ +void XT_Test_Cap(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_temp; + uint32_t ul_time_out = checker_runcfg.params[1] ; + float f_cap = 0.0f; + if(checker_runcfg.params[0] == 0) + { + checker_runcfg.params[0] = 0x11;//默认1V挡位 + } + if(ul_time_out == 0) + { + ul_time_out = XTSingleCollectAckTimerOverflowCnt; + } + if(checker_runcfg.uid_len > 0) + { + uc_rtv = XT_Get_UID_C(checker_runcfg.writeuid,checker_runcfg.uid_len,checker_runcfg.params[0],ul_time_out,&f_cap); + }else{ + uc_rtv = XT_Get_C(checker_runcfg.params[0],ul_time_out,&f_cap); + } + + XT_Charge_All(0x00); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + us_temp = (uint16_t)(f_cap*10); + Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); +} + +/* +@brief 写管壳码 如果测试器有uid,将采用uid方式通信 +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WriteShell(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF)) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1]) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]); + uc_rtv |= XT_Write_Shell(XT_RunBuf); + if(checker_runcfg.uid_len > 0) + { + uc_rtv |= XT_Read_Shell(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+16); + }else{ + uc_rtv |= XT_Read_Shell_All(XT_RunBuf+16); + } + for(uc_count = 0; uc_count < 13;uc_count++) + { + if(XT_RunBuf[uc_count] != XT_RunBuf[13+uc_count]) + { + uc_rtv |= 0x01; + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 写UID +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WriteUID(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_count = 0; + if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF)) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1]) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.params[1] > 13) + { + checker_runcfg.params[1] = 13; + } + memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]); + + uc_rtv = XT_Write_Uid(XT_RunBuf,checker_runcfg.params[1]); + XT_Clear_Read(); + uc_rtv |= XT_Read_Uid(XT_RunBuf+16,checker_runcfg.params[1]); + if(uc_rtv == 0) + { + for(uc_count = 0; uc_count < checker_runcfg.params[1];uc_count++) + { + if(XT_RunBuf[uc_count] != XT_RunBuf[16+uc_count]) + { + uc_rtv |= 0x01; + } + } + } + if(uc_rtv == 0) + { + checker_runcfg.uid_len = checker_runcfg.params[1]; + memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 写密码 +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WritePWD(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_state; + if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF)) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1]) + { + uc_rtv = 1; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.params[1] > 13) + { + checker_runcfg.params[1] = 13; + } + memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]); + + uc_rtv = XT_Write_Bmid(XT_RunBuf,checker_runcfg.params[1]); + uc_rtv |= XT_Check_Bmid(XT_RunBuf,checker_runcfg.params[1]); + if(checker_runcfg.uid_len > 0) + { + memset(XT_RunBuf+16,0,8); + uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+16); + uc_state = XT_RunBuf[16+7]; + if( (uc_state & 0x20) == 0) + { + uc_rtv = 0x01; + } + } + + if(uc_rtv == 0) + { + checker_runcfg.pwd_len = checker_runcfg.params[1]; + memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 备份区标记检测,备份区用于存储检测标记 +@param0 0备份区标记 或 1比对 +@param1 备份区数据掩码 1Bytes +@param1 备份区写入数据 1Bytes + +*/ + +void XT_Test_CheckBackFlag(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_temp1; + if(checker_runcfg.uid_len > 0) + { + uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf); + }else{ + uc_rtv = XT_Read_Param_All(XT_RunBuf); + } + if(uc_rtv != 0) + { + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + return; + } + us_temp1 = XT_RunBuf[1]; + if(checker_runcfg.params[0] == 0) + { + us_temp1 &= (~checker_runcfg.params[1]); + us_temp1 |= checker_runcfg.params[2]; + XT_RunBuf[1] = 0x0FF & us_temp1; + uc_rtv |= XT_Write_Param(XT_RunBuf); + } + else{ + us_temp1 = us_temp1 & checker_runcfg.params[1] ; + if(us_temp1 != checker_runcfg.params[2]) + { + uc_rtv = 1; + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 读取备份区数据 +@rtv0 备份区2字节 +@rtv0 备份区2字节 +*/ +void XT_Test_ReadBackFlag(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_temp[2]; + if(checker_runcfg.uid_len > 0) + { + uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf); + }else{ + uc_rtv = XT_Read_Param_All(XT_RunBuf); + } + memcpy(us_temp,XT_RunBuf,4); + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(us_temp,checker_runcfg.rtv_count); +} + +/* +@brief 时钟校准 +@param0 校准模式 1 快速 0 全 +@param1 校准周期 +@param2 校准时长 +*/ +void XT_Test_Trim(void) +{ + uint8_t uc_rtv = 0; + if(checker_runcfg.params[0] > 0) + { + XT_Trim_Faset_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1); + }else{ + XT_Trim_Complete_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1,checker_runcfg.params[2]); + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 放电 +*/ +void XT_Test_Discharge(void) +{ + uint8_t uc_rtv = 0; + XT_Charge_All(0x00); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 失能通信末电流采集 +*/ +void XT_Test_EnCommEndCur(void) +{ + XT_CommEndMaxCur = 0; + XT_CommEnd_CurEn = 1; + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} + +/* +@brief 获取通信末电流 +*/ +void XT_Test_GetCommEndCur(void) +{ + XT_CommEnd_CurEn = 0; + Checker_SetRtv(&XT_CommEndMaxCur,checker_runcfg.rtv_count); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} + +/* +@brief 在线检测 +@param 检测网络号 +*/ +void XT_Test_OneLineCheck(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_temp; + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + uc_rtv = XT_Check_Online(400,XT_RunBuf); + if(checker_runcfg.params[0] > 400) + { + checker_runcfg.params[0] = 400; + } + if(checker_runcfg.params[1] > 400) + { + checker_runcfg.params[1] = 400; + } + if(checker_runcfg.params[0] > 0) + checker_runcfg.params[0]--; + uc_temp = checker_runcfg.params[0] >> 3; + uc_temp = XT_RunBuf[uc_temp] << (checker_runcfg.params[0] & 0x07); + if(uc_temp != 0x80) + { + uc_rtv = 0x01; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 状态检测,如果UID已经存在,使用UID读取。否则通过扫描的方式 +@param0 状态比较掩码 +@rtv0 与掩码后的状态值 +*/ +void XT_Test_CheckState(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_state = 0; + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.uid_len > 0) + { + uc_rtv = XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf); + us_state = XT_RunBuf[7]; + if((us_state & checker_runcfg.params[0]) != checker_runcfg.params[1]) + { + uc_rtv = 1; + } + }else{ + uc_rtv = 1; + us_state = 0; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_state,checker_runcfg.rtv_count); +} + +/* +@brief 起爆 +@param 起爆超时 +@param 巡检脉冲个数 +*/ +void XT_Test_Boom(void) +{ + uint8_t uc_rtv,uc_temp; + uint16_t us_index = 0; + uint16_t us_count = 0; + uint16_t us_res[2]; + uint32_t ul_maxdelay = checker_runcfg.params[0]; + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.params[1] == 0) + { + checker_runcfg.params[1] = 400; + } + uc_rtv = XT_Check_Fire_Each(checker_runcfg.params[1],XT_RunBuf); + for(us_index = 0; us_index < XT_CHECKER_RUN_BUF;us_index++) + { + if(XT_RunBuf[us_index] != 0) + { + uc_temp = XT_RunBuf[us_index]; + us_res[1] = us_index*8; + while(uc_temp > 0) + { + us_res[1]++; + if((uc_temp & 0x80) > 0) + { + us_count++; + } + uc_temp <<= 1; + } + } + } + if(us_count != 1) + { + uc_rtv = 1; + } + uc_rtv |= XT_Check_Fire_All(); + uc_rtv |= XT_MeasureFire(&ul_maxdelay); + us_res[0] = (uint16_t)ul_maxdelay; + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(us_res,checker_runcfg.rtv_count); + + +} +/* +@brief 复位 +*/ +void XT_Test_Reset(void) +{ + uint8_t uc_rtv = 0; + XT_Reset(); + delay_os_ms(40); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 关总线 +*/ +void XT_Test_PowerOFF(void) +{ + uint8_t uc_rtv = 0; + XT_Charge_All(0x00); + delay_os_ms(100); + XTBUS_OFF; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 芯片锁存 +*/ +void XT_Test_LockCmdC(void) +{ + uint8_t uc_rtv = 0; + XT_Lock(); + delay_ms(20); + XT_Clear_Read(); + if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len)) + { + uc_rtv = 0x01; + } + else{ + if((XT_RunBuf[checker_runcfg.uid_len+7] & 0x80) != 0x80)//锁存后是bit7 = 1; + { + uc_rtv = 0x01; + } + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 赋码设备失能 +*/ + +void XT_Test_CodeBindEn(void) +{ + uint8_t uc_rtv = 0; + checker_runcfg.uid_pwd_bind_flag = 0xAA; + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +static uint8_t XT_Test_InputChek_(uint16_t us_count ) +{ + uint8_t uc_rtv = 0; + uint8_t uc_flag = 0; + uint32_t ul_timeout,ul_time; + Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE); + + ul_timeout = us_count; + ul_timeout *= 100; + ul_time = 0; + Get10usCount(); + while(ul_time <= ul_timeout ) + { + ul_time += Get10usCount(); + if(ADC_GetCurADCFast() > 25) + { + uc_flag++; + if(uc_flag > 50) + { + if( ADC_GetBaseStableCur() > 120) + { + Power_SetSampleCurrentRange(Current_Max) ; + delay_ms(2); + ul_time += Get10usCount(); + XT_Clear_Read(); + if( 0 == XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len)) + { + break; + }else{ + ul_time += 250000; + Get10usCount();//XT通信超时定时器也是使用tim2,产生通信后需要请您 + Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE); + delay_ms(1); + } + + }else{ + Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE); + delay_ms(1); + } + }else{ + delay_ms(1); + } + continue; + }else{ + delay_ms(1); + } + uc_flag = 0; + } + uc_rtv = 1; + if(uc_flag > 50) + { + uc_rtv = 0; + } + return uc_rtv; +} + +/* +@brief 接入检测 +@param0 上电电压 +@param1 超时次数 +*/ + +void XT_Test_InputCheck(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_h_v = checker_runcfg.params[0]; + uint16_t us_count = checker_runcfg.params[1]; + us_h_v = checker_runcfg.params[0]; + if(us_h_v < 55) + { + uc_rtv = 1; + }else{ + uc_rtv |= PowerCalibration_set(us_h_v,50); + XTBUS_ON; + delay_ms(100); + us_h_v = Power_GetBousV(); + } + uc_rtv = XT_Test_InputChek_(us_count); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + +} +/* +@brief 密码验证 +*/ + +void XT_Test_CheckPWD(void) +{ + uint8_t uc_rtv = 0; + if(checker_runcfg.pwd_len == 0) + { + checker_runcfg.pwd_len = 7; + } + uc_rtv = XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len); + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@brief 加载配置参数 +@rtv UID长度 +@rtv 密码长度 +@rtv 版本号 +@rtv 反码数据 +*/ +void XT_Test_LoadChipCfg(void) +{ + uint8_t uc_rtv = 0; + uint16_t us_temp[4]; + memset(XT_RunBuf,0,10); + memset(us_temp,0,8); + uc_rtv = XT_Read_Config(XT_RunBuf); + if(uc_rtv == 0) + { + us_temp[0] = ((XT_RunBuf[1] >> 4) & 0x0F)+7; + us_temp[1] = (XT_RunBuf[1] & 0x0F)+4; + us_temp[2] = XT_RunBuf[3]; + us_temp[3] = (XT_RunBuf[2] >> 2) & 0x0F; + checker_runcfg.uid_len = us_temp[0]; + checker_runcfg.pwd_len = us_temp[1]; + } + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_SetRtv(us_temp,checker_runcfg.rtv_count); +} + +/* +@breif 测量电容电压差 +@param0 两次测量间隔 0.1s +@rtv0 电压差值 +*/ +void XT_Test_CapVoltage(void) +{ + uint16_t us_capv1; + POWER_OFF; + Power_SetSampleCurrentRange(Checker_OnLine_Sample_R); + HMOS_FAST_DISCHG; + HMOS_SWITCH_GND; + delay_os_ms(1000); + us_capv1 = AD_SampleCap(checker_runcfg.params[0]); + POWER_ON; + delay_os_ms(500); + XTBUS_ON + Power_SetSampleCurrentRange(Current_Max); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_capv1,checker_runcfg.rtv_count); +} +/* +@brief 注码检测 +@rtv 0 已经注码,1 不能注码 2 需要注码 +*/ +static uint8_t XT_Test_CheckeThreeCode(void) +{ + uint8_t uc_index; + /* + 已经注码验证 + */ + XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);//密码验证 + XT_Clear_Read(); + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len);//扫描UID + uc_index = XT_RunBuf[checker_runcfg.uid_len+7]; + if((uc_index & 0x80) == 0x80)//已经上锁 + { + if((uc_index & 0xA0) != 0xA0)//已经上锁,密码验证失败 + { + return 0x01; + } + //已经上锁,但UID比对错误 + if(rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len) != 0) + { + return 0x01; + } + //已经上锁,比对成功 + XTBUS_OFF; + return 0; + } + return 2; +} + +/* +@brief 写入三码数据 +*/ +void XT_Test_UID_PWD_Bind(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_ack; + uint8_t uc_count = 0; + uint8_t uc_optbuf[16]; + uint32_t ul_write_mask = 0; + + if(JQXT_Test_IsNeedBind() == 0) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + } + uc_rtv = XT_Test_CheckeThreeCode(); + if(uc_rtv != 2) + { + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + } + uc_rtv = XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len); + delay_ms(40); + + uc_rtv |= XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len); + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} +/* +@brief 三码绑定验证 +@rtv 0 验证通过 1 UID验证不通过 2 密码验证不通过 +*/ +static uint8_t XT_Test_UID_PWD_Verify_(void) +{ + uint8_t uc_rtv = 0; + uint8_t uc_state; + XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len); + XT_Clear_Read(); + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len); + uc_rtv = rt_memcmp(checker_runcfg.writeuid , XT_RunBuf,checker_runcfg.uid_len); + if(uc_rtv != 0) + { + return 0x01; + } + uc_state = XT_RunBuf[checker_runcfg.uid_len+7]; + if((uc_state & 0x20) == 0) + { + uc_rtv = 0x02; + } + return uc_rtv; +} + +/* +@brief 三码绑定验证 +*/ +void XT_Test_UID_PWD_Verify(void) +{ + uint8_t uc_rtv = XT_Test_UID_PWD_Verify_(); + if(uc_rtv != 0) + { + uc_rtv = 0x01; + } + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + + +/* +@breif 在线检测 并扫描通信 +@param0 总线电压 +@param1 超时时间1ms 最大6S +@param2 UID长度 +*/ + +void XT_OnLine_SCAN(void) +{ + uint16_t us_h_v; + uint8_t uc_rtv = 0; + PowerCalibration_set(checker_runcfg.params[0],50); + XTBUS_ON; + delay_os_ms(100); + us_h_v = Power_GetBousV(); + if((us_h_v > (checker_runcfg.params[0]+5)) || (us_h_v < (checker_runcfg.params[0]-5))) + { + XTBUS_OFF; + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + } + if(0 != XT_Test_InputChek_(checker_runcfg.params[1])) + { + XTBUS_OFF; + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + } + delay_ms(10); + XT_Init(0x78); + XT_Clear_Read(); + memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF); + if(checker_runcfg.params[2] == 0) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + return; + } + uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[2]); + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count); + +} + +/* +@brief 芯片离线检测 +@param0 超时时间 1ms +@param1 离线电流 0.1uA +@param2 稳定次数 +*/ + +void XT_OFFLine_SCAN(void) +{ + uint32_t ul_timeout = checker_runcfg.params[0]; + uint16_t us_cur = checker_runcfg.params[1]; + uint16_t us_count = checker_runcfg.params[2]; + uint16_t us_temp = 0,ul_time = 0; + ul_timeout *= 1000; + Get1usCount(); + while((us_temp < us_count) && (ul_time < ul_timeout)) + { + ul_time += Get1usCount(); + if(us_cur >= ADC_GetBaseStableCur()) + { + us_temp++; + continue; + } + us_temp = 0; + } + if(us_temp >= us_count) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + } + Checker_MaskResult(1,checker_runcfg.task_info.runindex); +} + +/* +@brief 芯片离线检测 +@param0 充电使能 +@param1 采样周期 10ms +@param2 采样次数 +*/ + +void XT_CurMonitor(void) +{ + uint16_t us_charge_en = checker_runcfg.params[0]; + uint32_t ul_timeout = checker_runcfg.params[1]; + uint16_t us_count = checker_runcfg.params[2]; + uint16_t us_temp = 0,ul_time = 0; + uint32_t ul_runTimer = 0,ul_cur,ul_1sCount; + ul_timeout *= 1000; + if(us_charge_en > 0) + { + XT_Charge_All(us_charge_en); + } + while(us_count > 0) + { + Get1usCount(); + // ul_cur = Power_GetCurrent(); + ul_cur = (uint32_t) (Get_Temperature()*100); + printf("CurM %d\r\n",ul_cur); + ul_runTimer= Get1usCount(); + + if((ul_runTimer+5) > ul_timeout) + { + continue; + } + ul_runTimer = ul_timeout - ul_timeout -5; + ul_1sCount = ul_runTimer / 1000000; + ul_runTimer = ul_runTimer - ul_1sCount*1000000; + while(ul_1sCount > 0) + { + delay_us(1000000); + } + delay_us(ul_runTimer); + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} + + + +CheckerTask xttaskArray[CHECKER_MAXID_COUNT] ={ +Checker_PowerPrapare, //0 电源准备 +XT_Test_PowerOn, //1 上电充能 +XT_Test_SetBusV, //2 设置总线电压 +XT_Test_BaseCur, //3 获取总线电流 +XT_Test_ScanUID, //4 扫描UID +XT_Test_WriteChipCfg, //5 写配置参数 +XT_Test_CheckChipCfg, //6 验证配置 +XT_Test_BindTestCode, //7 模拟注码 +XT_Test_ChgEnergy, //8 充能统计 +XT_Test_WriteRunField,//9 写现场值 网络id 延时 +XT_Test_CheckRunField,//10比对现场值 +XT_Test_Resister ,//11 桥丝通断检测 +XT_Test_Cap ,//12 电容容量统计 +Checker_WaitDelay ,//13 延时等待 +XT_Test_WriteShell ,//14 写管壳号/工厂信息 +XT_Test_WriteUID ,//15 写UID +XT_Test_WritePWD ,//16 写密码 +XT_Test_CheckBackFlag ,//17 写入/检测备份区标志 +XT_Test_ReadBackFlag ,//18 读取备份区数据 +XT_Test_Trim ,//19 校准 +XT_Test_EnCommEndCur ,//20 使能通讯末电流采集 +XT_Test_GetCommEndCur ,//21 获取通讯末电流 +XT_Test_Discharge ,//22 放电 +XT_Test_OneLineCheck ,//23 在线检测 +XT_Test_CheckState ,//24 状态检测 +XT_Test_Boom ,//25 起爆 +XT_Test_Reset ,//26 复位 +XT_Test_PowerOFF ,//27 关总线 +XT_Test_LockCmdC ,//28 芯片锁存 +XT_Test_CodeBindEn ,//29 使能赋码设备 +XT_Test_InputCheck ,//30 在线检测 +XT_Test_CheckPWD ,//31 密码验证 +XT_Test_LoadChipCfg ,//32 加载芯片配置 +XT_Test_CapVoltage ,//33 电容压差测试 +Checker_ResistorSample,//34 桥丝电阻测试 +XT_Test_UID_PWD_Bind ,//35 检测过程中注码 +XT_Test_UID_PWD_Verify,//36 验证注码 +XT_OnLine_SCAN ,//37 模块在线检测 +(void*)0 //数组结束 +}; + +/* +@brief 三码写入 +@rtv 0 执行成功 + 1 电压设置失败 + 3 UID写入失败 + 4 密码写入失败 + 5 获取UID失败 + 6 UID写入失败 + 7 锁存失败 + 8 等待接入超时 + 9 已经其他数据 +*/ + +uint8_t XT_UID_PWD_Bind(void) +{ + uint16_t us_h_v; + uint8_t uc_index = 0, uc_rtv = 0; + // 雷管厂代码为0时不锁定 + uint8_t lock=checker_runcfg.writeuid[1]; + uint8_t stat_check=0x20; + ThreeBindResult_flag = 0x00; + if(checker_runcfg.uid_pwd_bind_flag != 0xAA) + { + PowerCalibration_set(Checker_First_Set_Voltage,50); + XTBUS_ON; + delay_os_ms(100); + us_h_v = Power_GetBousV(); + if((us_h_v > (Checker_First_Set_Voltage+5)) || (us_h_v < (Checker_First_Set_Voltage-5))) + { + XTBUS_OFF; + return 1; + } + + if(0 != XT_Test_InputChek_(2000)) + { + XTBUS_OFF; + return 8; + } + delay_ms(10); + XT_Init(0x78); + delay_ms(10); + } + /* + 已经注码验证 + */ + uc_rtv = XT_Test_CheckeThreeCode(); + if(uc_rtv == 0) + { + XTBUS_OFF; + ThreeBindResult_flag = 0x55; + return 0x55; + } + else if(uc_rtv == 1) + { + XTBUS_OFF; + return 0x09; + } + + XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len); + delay_ms(40); + + XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len); + delay_ms(40); + + uc_rtv = XT_Test_UID_PWD_Verify_(); + if(uc_rtv == 0x01) + { + + XTBUS_OFF; + return 2; + }else if(uc_rtv == 0x02) + { + XTBUS_OFF; + return 4; + } + + + if(lock){ + //设置电流挡位0x11 1档。锁定前必须执行该命令 + XT_Set_Current(0x11); + delay_ms(30); + XT_Lock(); + delay_ms(40); + stat_check=0xa0;//锁存后是0xa0 + } + XT_Clear_Read(); + if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len)) + { + XTBUS_OFF; + return 5;//扫描UID不存在 + } + uc_rtv = rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len); + if(uc_rtv != 0) + { + XTBUS_OFF; + return 6; + } + uc_index = XT_RunBuf[checker_runcfg.uid_len+7]; + if((uc_index & stat_check) != stat_check) + { + XTBUS_OFF; + return 7; + } + ThreeBindResult_flag = 0x55; + XTBUS_OFF; + return 0x55; +} diff --git a/source/elec_det/interface/XTChecker.h b/source/elec_det/interface/XTChecker.h new file mode 100644 index 0000000..c492f1d --- /dev/null +++ b/source/elec_det/interface/XTChecker.h @@ -0,0 +1,250 @@ +#ifndef XTCHECKER_H_ +#define XTCHECKER_H_ +#include "base/define.h" +#include "basechecker.h" + +extern Checker_RunCfg_st checker_runcfg; +extern CheckerTask xttaskArray[CHECKER_MAXID_COUNT] ; +/* +@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC +@param1 总线电压 +@param2 充电结束时的AD值 +@rtv1 返回总线电流低于设置AD值的时间 +*/ +void XT_Test_PowerOn(void); +/* +@brief 设置总线电压 +@param1 总线电压 +@rtv1 总线电压 +*/ +void XT_Test_SetBusV(void); +/* +@brief 测量总线基本电压 +@rtv1 返回总线电流 单位0.01uA +*/ +void XT_Test_BaseCur(void); +/* +@brief 扫描总线上的电子模块 1发 +@param0 UID长度 +@param1 使能或失能 UID对比 +*/ + +void XT_Test_ScanUID(void); +/* +@brief 写芯片配置 +@param0 UID长度 +@param1 密码长度 +@param2 反馈电流挡位 +@param4 版本标识 +@rtv 芯片配置3字节 +*/ +void XT_Test_WriteChipCfg(void); +/* +@brief 读取芯片配置并比对 +@param0 UID长度 +@param1 密码长度 +@param2 反馈电流挡位 +@param4 版本标识 +*/ +void XT_Test_CheckChipCfg(void); +/* +@brief 模拟注码 +*/ +void XT_Test_BindTestCode(void); +/* +@brief 充能统计 +@param0 充电电流判线值,AD值 +@param1 充电末电流结束值,单位0.1uA +@param2 充电最长时间,单位100ms +@param3 充电高压保持时间,单位0.1s +@param4 充电挡位 +@rtv0 充能值 单位0.1ms +@rtv1 充末电流 单位0.1uA +@rtv2 充电最大电流 单位0.1Ma +@rtv3 充电抖动幅值 adv +*/ + +void XT_Test_ChgEnergy(void); +/* +@brief 写现场值,如果UID已经写入,会将现场值读取进行比对 +@param 0 编号 +@param 1 延时 +@param 2 孔号 +*/ + +void XT_Test_WriteRunField(void); +/* +@brief 比对现场值 +@param0 比对网络号 +@param1 比对延时 +@param2 比对孔位 +@param3 1使能或 0失能通信反码信息采集 +@rtv1 最大反馈电流 +@rtv2 最大反馈时间 +@rtv3 最小反馈电流 +@rtv4 最小反馈时间 +*/ + +void XT_Test_CheckRunField(void); +/* +@brief 桥丝通断检测,如果测试器有uid,将采用uid方式通信 +*/ +void XT_Test_Resister(void); +/* +@brief 电容容量检测,如果测试器有uid,将采用uid方式通信 +@pram 检测电压参数 +*/ +void XT_Test_Cap(void); +/* +@brief 写管壳码 如果测试器有uid,将采用uid方式通信 +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WriteShell(void); +/* +@brief 写UID +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WriteUID(void); +/* +@brief 写密码 +@param 命令缓存参数的起始 +@param 写入数据长度 +*/ +void XT_Test_WritePWD(void); +/* +@brief 备份区标记检测,备份区用于存储检测标记 +@param0 0备份区标记 或 1比对 +@param1 备份区数据掩码 2Bytes +@param1 备份区写入数据 2Bytes + +*/ + +void XT_Test_CheckBackFlag(void); +/* +@brief 备份区标记检测,备份区用于存储检测标记 +*/ +void XT_Test_ReadBackFlag(void); +/* +@brief 时钟校准 +@param0 校准模式 1 快速 0 全 +@param1 校准周期 +@param2 校准时长 +*/ +void XT_Test_Trim(void); +/* +@brief 放电 +*/ +void XT_Test_Discharge(void); + +/* +@brief 失能通信末电流采集 +*/ +void XT_Test_EnCommEndCur(void); +/* +@brief 获取通信末电流 +*/ +void XT_Test_GetCommEndCur(void); +/* +@brief 在线检测 +@param 检测网络号 +*/ +void XT_Test_OneLineCheck(void); +/* +@brief 状态检测,如果UID已经存在,使用UID读取。否则通过扫描的方式 +@param0 状态比较掩码 +*/ +void XT_Test_CheckState(void); +/* +@brief 起爆 +*/ +void XT_Test_Boom(void); +/* +@brief 复位 +*/ +void XT_Test_Reset(void); +/* +@brief 关总线 +*/ +void XT_Test_PowerOFF(void); +/* +@brief 芯片锁存 +*/ +void XT_Test_LockCmdC(void); +/* +@brief 赋码设备失能 +*/ + +void XT_Test_CodeBindEn(void); +/* +@brief 接入检测 +@param0 上电电压 +@param1 超时次数 +*/ +void XT_Test_InputCheck(void); +/* +@brief 密码验证 +*/ + +void XT_Test_CheckPWD(void); +/* +@brief 三码写入 +@rtv 0 执行成功 + 1 电压设置失败 + 3 UID写入失败 + 4 密码写入失败 + 5 获取UID失败 + 6 UID写入失败 + 7 锁存失败 + 8 等待接入超时 +*/ + +uint8_t XT_UID_PWD_Bind(void); +/* +@brief 加载配置参数 +@rtv UID长度 +@rtv 密码长度 +@rtv 版本号 +@rtv 反码数据 +*/ +void XT_Test_LoadChipCfg(void); +/* +@breif 测量电容电压差 +@param0 两次测量间隔 0.1s +@rtv0 电压差值 +*/ +void XT_Test_CapVoltage(void); +/* +@brief 三码绑定验证 +*/ +void XT_Test_UID_PWD_Verify(void); +/* +@brief 写入三码数据 +*/ +void XT_Test_UID_PWD_Bind(void); +/* +@breif 在线检测 并扫描通信 +@param0 总线电压 +@param1 超时时间1ms 最大6S +@param2 UID长度 +*/ + +void XT_OnLine_SCAN(void); +/* +@brief 芯片离线检测 +@param0 超时时间 1ms +@param1 离线电流 0.1uA +@param2 稳定次数 +*/ + +void XT_OFFLine_SCAN(void); +/* +@brief 芯片离线检测 +@param0 充电使能 +@param1 采样周期 10ms +@param2 采样次数 +*/ + +void XT_CurMonitor(void); +#endif diff --git a/source/interface/if_can.c b/source/interface/if_can.c new file mode 100644 index 0000000..0b9dc9f --- /dev/null +++ b/source/interface/if_can.c @@ -0,0 +1,435 @@ +#include "if_can.h" +#include "rtthread.h" +#include "rthw.h" +#include "elec_det.h" +#include "board.h" +CanRxMsg receive_message; +static YeCanRxFrame_st canrx_st; +static uint8_t Can_Device_ID = 0; +static uint32_t GetCanFilter(YeCanID_un yeid); +uint32_t ul_exid,ul_can_mask; + +rt_mutex_t can_tx_mutex; + +volatile uint8_t CAN0_TX_BUSY_Flag = 0; +/* +@brief CAN通讯初始化, 包括CANgpio 过滤器 +*/ +void YeCanInit(void) +{ + uint32_t ul_filter,ul_mask; + CAN_InitTypeDef CAN_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + YeCanID_un yeid_un; + CAN_FilterInitTypeDef CAN_FilterInitStructure; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); + //CAN GPIO 初始化 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + CAN_DeInit(CAN1); + CAN_StructInit(&CAN_InitStructure); + CAN_InitStructure.CAN_TTCM = DISABLE; + CAN_InitStructure.CAN_ABOM = DISABLE; + CAN_InitStructure.CAN_AWUM = DISABLE; + CAN_InitStructure.CAN_NART = DISABLE; + CAN_InitStructure.CAN_RFLM = DISABLE; + CAN_InitStructure.CAN_TXFP = ENABLE; + CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; + CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; + CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; + CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; + CAN_InitStructure.CAN_Prescaler = 30; + + CAN_Init(CAN1, &CAN_InitStructure); + + Can_Device_ID = elec_local_addr(); + + yeid_un.Exide = 0; + yeid_un.yecanid.ACK = 0; + yeid_un.yecanid.FunClass = 0; + yeid_un.yecanid.Reserve1 = 0; + yeid_un.yecanid.Reserve0 = 0; + yeid_un.yecanid.SegFlag = 0; + yeid_un.yecanid.SegNum = 0; + yeid_un.yecanid.srcMACID = 0x00; + + yeid_un.yecanid.destMACID = 0x1F; + ul_mask = GetCanFilter(yeid_un); + ul_can_mask =ul_mask; + yeid_un.yecanid.destMACID = Can_Device_ID; + ul_filter = GetCanFilter(yeid_un); + + CAN_FilterInitStructure.CAN_FilterNumber = 0; + CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; + CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; + CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;; + CAN_FilterInitStructure.CAN_FilterIdLow = ul_filter & 0x0FFFF;; + CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (ul_mask >> 16) & 0x0FFFF;; + CAN_FilterInitStructure.CAN_FilterMaskIdLow = ul_mask & 0x0FFFF; ; + CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; + CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; + CAN_FilterInit(&CAN_FilterInitStructure); + + yeid_un.yecanid.destMACID = 0x1E; + ul_filter = GetCanFilter(yeid_un); + CAN_FilterInitStructure.CAN_FilterNumber = 1; + CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;; + CAN_FilterInitStructure.CAN_FilterIdLow = ul_filter & 0x0FFFF;; + CAN_FilterInit(&CAN_FilterInitStructure); + + yeid_un.yecanid.destMACID = 0x1F; + ul_filter = GetCanFilter(yeid_un); + CAN_FilterInitStructure.CAN_FilterNumber = 2; + CAN_FilterInitStructure.CAN_FilterIdHigh = (ul_filter >> 16) & 0x0FFFF;; + CAN_FilterInitStructure.CAN_FilterIdLow = ul_filter & 0x0FFFF;; + CAN_FilterInit(&CAN_FilterInitStructure); + + + CAN_OperatingModeRequest(CAN1,CAN_OperatingMode_Normal); + + NVIC_InitTypeDef NVIC_InitStructure; + + NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); + CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); + can_tx_mutex = rt_mutex_create ("can0_tx_mutex",RT_IPC_FLAG_PRIO); + +} +/* +@brief 根据设置CAN 的ID协议,获取帧过滤值 +*/ +static uint32_t GetCanFilter(YeCanID_un yeid) +{ + uint32_t filter = 0; + filter = yeid.Exide << 3; + filter |= 0x04;//只接收扩展帧 + filter &= ~((uint32_t)0x003);//不限定帧类型 + return filter; +} +/* +@brief CAN发送通讯帧 +@param 源地址 +@param 主机地址 +@param 发送数据缓存 +@param 发送数据长度 +@rtv 0 成功 1 失败 +*/ +uint8_t YeCan_SendFrame(uint8_t srcaddr,uint8_t dstaddr,const uint8_t* txdata, uint16_t len) +{ + CanTxMsg transmit_message; + uint8_t mailbox_number; + YeCanID_un yeid_un; + uint32_t time_out = 0; + uint8_t uc_rtv = 0; + //can_transmission_stop(CAN1,0); + /* initialize transmit message */ + transmit_message.ExtId = 0x00; + transmit_message.StdId = 0x00; + transmit_message.RTR = CAN_RTR_DATA; + transmit_message.IDE = CAN_ID_EXT; + yeid_un.Exide = 0; + yeid_un.yecanid.srcMACID = srcaddr; + yeid_un.yecanid.destMACID = dstaddr; + yeid_un.yecanid.ACK = 0; + yeid_un.yecanid.FunClass = 1; + yeid_un.yecanid.SegFlag = 0; + yeid_un.yecanid.SegNum = 0; + if(srcaddr == 0x00 || srcaddr == 0x1f) + { + time_out = 0; + while(time_out < 5) + { + elec_led1_power(0); + rt_thread_mdelay(50); + elec_led1_power(1); + rt_thread_mdelay(50); + time_out++; + + } + } + if(can_tx_mutex != RT_NULL) + { + if(RT_EOK != rt_mutex_take (can_tx_mutex,500)) + { + return 1; + } + } + if(len <= 8) + { + transmit_message.DLC = len; + transmit_message.ExtId = yeid_un.Exide; + memcpy(transmit_message.Data,txdata,8); + + mailbox_number = CAN_Transmit(CAN1, &transmit_message); + time_out = 5000; + while( CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0) + { + time_out --; + rt_hw_us_delay(20); + } + if(time_out == 0) + { + uc_rtv = 1; + goto can0_tx_end; + } + goto can0_tx_end; + } + while(len > 8) + { + memcpy(transmit_message.Data,txdata,8); + len -= 8; + txdata += 8; + + if(yeid_un.yecanid.SegNum == 0) + { + yeid_un.yecanid.SegFlag = 0x01; + }else + { + yeid_un.yecanid.SegFlag = 0x02; + } + transmit_message.ExtId = yeid_un.Exide; + transmit_message.DLC = 8; + mailbox_number = CAN_Transmit(CAN1, &transmit_message); + time_out = 5000; + while( CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0) + { + time_out --; + rt_hw_us_delay(20); + } + if(time_out == 0) + { + uc_rtv = 1; + goto can0_tx_end; + } + yeid_un.yecanid.SegNum ++; + } + yeid_un.yecanid.SegFlag = 0x3; + memcpy(transmit_message.Data,txdata,len); + transmit_message.DLC = len; + transmit_message.ExtId = yeid_un.Exide; + mailbox_number = CAN_Transmit(CAN1, &transmit_message); + time_out = 5000; + while(CAN_TxStatus_Ok != CAN_TransmitStatus(CAN1,mailbox_number) && time_out > 0) + { + + time_out --; + rt_hw_us_delay(20); + } + if(time_out == 0) + { + + uc_rtv = 1; + } + +can0_tx_end: + CAN0_TX_BUSY_Flag = 0; + rt_mutex_release(can_tx_mutex); + return uc_rtv; +} + + +typedef struct{ + void (*end_irq)(void *t,uint32_t len); + void *t; + uint32_t rx_buff_size; +}self_def; + +static self_def g_self; + + + + +static void save_data(void) +{ + YeCanID_un yeid_un; + if(receive_message.DLC > 0) + { + yeid_un.Exide = receive_message.ExtId; + ul_exid = yeid_un.Exide << 3; + ul_exid &= ul_can_mask; + if(yeid_un.yecanid.SegFlag == 00) + { + memcpy(canrx_st.rx_databuf,receive_message.Data,receive_message.DLC); + canrx_st.rx_index = receive_message.DLC; + g_self.end_irq(g_self.t,canrx_st.rx_index); + } + else if(yeid_un.yecanid.SegFlag == 0x01) + { + canrx_st.seg_num = 0; + memcpy(canrx_st.rx_databuf,receive_message.Data,receive_message.DLC); + canrx_st.rx_index = receive_message.DLC; + }else if(yeid_un.yecanid.SegFlag == 0x02) + { + if((canrx_st.seg_num+1) == yeid_un.yecanid.SegNum ) + { + canrx_st.seg_num++; + memcpy(canrx_st.rx_databuf+canrx_st.rx_index,receive_message.Data,receive_message.DLC); + canrx_st.rx_index += receive_message.DLC; + + }else{ + //error + } + }else if(yeid_un.yecanid.SegFlag == 0x03) + { + memcpy(canrx_st.rx_databuf+canrx_st.rx_index,receive_message.Data,receive_message.DLC); + canrx_st.rx_index += receive_message.DLC; + g_self.end_irq(g_self.t,canrx_st.rx_index); + } + } +} + + + +void USB_LP_CAN1_RX0_IRQHandler(void) +{ + rt_interrupt_enter(); + CAN_Receive(CAN1, CAN_FIFO0, &receive_message); + if(g_self.end_irq&&canrx_st.rx_databuf){ + save_data(); + } + CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); + rt_interrupt_leave(); +} + + + + + + +static int init(uart_def *u,int bsp) +{ + YeCanInit(); + return 0; +} +static int deinit(uart_def *u) +{ + return 0; +} +static int set_irq(uart_def *u,void (*irq)(void *t,uint8_t d),void *t) +{ + return 0; +} +static int set_end_irq(uart_def *u,uint8_t *rx_buff,int rx_buff_size, + void (*irq)(void *t,uint32_t len),void *t) +{ + irq_disable(); + g_self.end_irq=irq; + canrx_st.rx_databuf=rx_buff; + g_self.rx_buff_size=rx_buff_size; + g_self.t=t; + irq_enable(); + return 0; +} +static int read(uart_def *u,uint8_t *b,int len) +{ + return 0; +} +static int write(uart_def *u,const uint8_t *b,int len) +{ + uint8_t src=b[4]; + uint8_t dst=b[5]; + uint8_t ret; + ret=YeCan_SendFrame(src,dst,b,len); + if(ret==0) return len; + else return 0; +} + +uart_init_export(can,init,deinit,set_irq,set_end_irq,read,write,0) + + + + +typedef struct{ + uart_def *dev[2]; + int dev_index; + int inited; + void (*end_irq)(void *t,uint32_t len); + void *t; +}h_self_def; + +static h_self_def g_hself; + +static int h_init(uart_def *u,int bsp) +{ + h_self_def *h=&g_hself; + if(h->inited) return 0; + h->dev[0]=dev_get("uart1"); + h->dev[1]=dev_get("can"); + h->dev[0]->init(h->dev[0],0); + h->dev[1]->init(h->dev[1],0); + return 0; +} + +static int h_deinit(uart_def *u) +{ + return 0; +} + + +static int h_set_irq(uart_def *u,void (*irq)(void *t,uint8_t d),void *t) +{ + return 0; +} +static void h_end_irq0(void *t,uint32_t len) +{ + h_self_def *h=&g_hself; + h->dev_index=0; + if(h->end_irq) + { + h->end_irq(h->t,len); + } +} +static void h_end_irq1(void *t,uint32_t len) +{ + h_self_def *h=&g_hself; + h->dev_index=1; + if(h->end_irq) + { + h->end_irq(h->t,len); + } +} +static int h_set_end_irq(uart_def *u,uint8_t *rx_buff,int rx_buff_size, + void (*irq)(void *t,uint32_t len),void *t) +{ + h_self_def *h=&g_hself; + irq_disable(); + h->end_irq=irq; + h->t=t; + irq_enable(); + h->dev[0]->set_end_irq(h->dev[0],rx_buff,rx_buff_size,h_end_irq0,h); + h->dev[1]->set_end_irq(h->dev[1],rx_buff,rx_buff_size,h_end_irq1,h); + return 0; +} +static int h_read(uart_def *u,uint8_t *b,int len) +{ + return 0; +} +static int h_write(uart_def *u,const uint8_t *b,int len) +{ + h_self_def *h=&g_hself; + uart_def *s=h->dev[h->dev_index]; + return s->write(s,b,len); +} + + +uart_init_export(host,h_init,h_deinit,h_set_irq,h_set_end_irq,h_read,h_write,0) + + + + diff --git a/source/interface/if_can.h b/source/interface/if_can.h new file mode 100644 index 0000000..eab95da --- /dev/null +++ b/source/interface/if_can.h @@ -0,0 +1,50 @@ +#ifndef if_can_h__ +#define if_can_h__ + +//#include "define.h" +#include "stm32f10x_can.h" + +typedef struct{ + uint32_t Reserve1 :3; + uint32_t srcMACID :5; + uint32_t Reserve0 :2; + uint32_t destMACID :5; + uint32_t ACK :1; + uint32_t FunClass :6; + uint32_t SegFlag :2; + uint32_t SegNum :8; + +}YeCanID_st; + +typedef union{ + uint32_t Exide; + YeCanID_st yecanid; +}YeCanID_un; + + + +typedef struct{ + + uint8_t *rx_databuf; //接收数据缓存 + uint8_t seg_num; //分段号 + uint8_t seg_flag;//分段标志 + uint16_t rx_index;//接收缓存下标 +}YeCanRxFrame_st; + +extern volatile uint8_t CAN0_TX_BUSY_Flag; + +/* +@brief CAN通讯初始化, 包括CANgpio 过滤器 +*/ +void YeCanInit(void); +/* +@brief CAN发送通讯帧 +@param 源地址 +@param 主机地址 +@param 发送数据缓存 +@param 发送数据长度 +@rtv 0 成功 1 失败 +*/ +uint8_t YeCan_SendFrame(uint8_t srcaddr,uint8_t dstaddr,const uint8_t* txdata, uint16_t len); + +#endif diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index c1b5fc1..254cf00 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-09-20 17:48:39" +#define BUILD_DATE "2023-10-06 18:40:44" #define SOFT_VERSION "0.03" diff --git a/source/main/main.c b/source/main/main.c index 7535abc..72d8d64 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -12,7 +12,6 @@ #include "signal.h" #include "prot_mcu.h" #include "debug.h" -#include "handle.h" #include "prot_uc.h" #include "transmit.h" #include "commend.h" @@ -20,7 +19,6 @@ #include "mymisc.h" #include "dev_backup.h" #include "compiler_info.h" -#include "moter.h" @@ -121,70 +119,9 @@ commend_export(scheme,scheme_info,"print scheme info") -typedef struct{ - int updata_run; -}updata_def; -static updata_def g_updata; -static int updata_slave(list_def *argv) -{ - void *ptr=flash_get_slave(); - tran_def *tran=app_variable("tran",0,0); - uint8_t *data=ptr; - data+=FLASH_FILE_HEAD_SIZE; - flash_file *file=ptr; - if(tran==0){ - DBG_WARN("can not find variable \"tran\""); - return -1; - } - if(list_length(argv)<2){ - cmd_print("param num too less."); - return -1; - } - list_def *addrs=str_atod_list(list_get_str(argv,1),','); - for(int i=0;ifile_size)); - g_updata.updata_run++; - } - } - cmd_print("start updata,addr=%s",str_temp(list_string(addrs))); - return 0; -} - -static void cmd_end_slot(void *obj,port_mcu *src,void *data,int ack,char *err_str) -{ - updata_def *self=obj; - if(self->updata_run>0) - { - cmd_print("addr:%d %s",port_get_addr(src),err_str); - self->updata_run--; - } -} -// 挂载命令行槽函数 -static int cmd_slot_init(void) -{ - void *tr=app_variable("tran",0,0); - if(tr){ - for(int i=0;i<20;i++){ - port_mcu *mcu=tran_get_portm(tr,i); - // 连接操作结束信号 - if(mcu) - connect(mcu,port_end_signal,0,&g_updata,cmd_end_slot); - } - } - else{ - app_valid_call("tran",(void (*)(void *))cmd_slot_init,0); - } - return 0; -} -app_init_export(cmd_slot_init); -commend_export(updatas,updata_slave,"updata slave") @@ -219,23 +156,6 @@ commend_export(reboot,reboot,"reboot mcu") -static int moter(list_def *argv) -{ - const sys_param_def *par=sys_param(); - cmd_print("moter ctl"); - if(list_length(argv)<3){ - cmd_print("param num too less."); - return -1; - } - int fre=str_atoi(list_get_str(argv,1)); - int count=str_atoi(list_get_str(argv,2)); - moter_start(fre,count); - cmd_print("moter start,fre=%d,count=%d",fre,count); - return 0; -} - - -commend_export(moter,moter,"control moter up or down|use:moter [frequency] [count]") diff --git a/source/mycopy.py b/source/mycopy.py index aafbdae..5f27f73 100644 --- a/source/mycopy.py +++ b/source/mycopy.py @@ -6,15 +6,15 @@ import prebuild as time # 定义app和boot文件路径(没有尾缀) -APP_FILE_SRC = "./Objects/app/coder_2channel_app" -BOOT_FILE_SRC = "./Objects/boot/coder_2channel_boot" -# APP_FILE_DST = "./Objects/coder_2channel_app" -APP_FILE_DST = "./python/file/coder_2channel_app" -BOOT_FILE_DST = "./Objects/coder_2channel_boot" +APP_FILE_SRC = "./Objects/app/checker_slave_app" +BOOT_FILE_SRC = "./Objects/boot/checker_slave_boot" +# APP_FILE_DST = "./Objects/checker_slave_app" +APP_FILE_DST = "./python/file/checker_slave_app" +BOOT_FILE_DST = "./Objects/checker_slave_boot" # 定义app和boot的数据库目录 -SQL_APP_PATH = "coder_stm32f1_app" -SQL_BOOT_PATH = "coder_stm32f1_boot" +SQL_APP_PATH = "checker_slave_app" +SQL_BOOT_PATH = "checker_slave_boot" diff --git a/source/rt_thread/board.c b/source/rt_thread/board.c index fc81678..c112833 100644 --- a/source/rt_thread/board.c +++ b/source/rt_thread/board.c @@ -36,7 +36,7 @@ static uint32_t _SysTick_Config(rt_uint32_t ticks) } #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) -static uint32_t g_heap[20*1024/4]; +static uint32_t g_heap[10*1024/4]; RT_WEAK void *rt_heap_begin_get(void) { return (void *)g_heap; diff --git a/source/soft/mystdlib.c b/source/soft/mystdlib.c index b832bdb..6224d60 100644 --- a/source/soft/mystdlib.c +++ b/source/soft/mystdlib.c @@ -22,7 +22,7 @@ typedef struct -#define SRAM_USER_SIZE (18*1024) +#define SRAM_USER_SIZE (9*1024) #define MEM_BLOCK_SIZE (32) #define MEM_MAX_SIZE (((SRAM_USER_SIZE))*MEM_BLOCK_SIZE/(MEM_BLOCK_SIZE+2)) #define MEM_ALLOC_TABLE_SIZE ((MEM_MAX_SIZE/MEM_BLOCK_SIZE)&(~3)) diff --git a/source/task/handle.c b/source/task/history/handle.c similarity index 100% rename from source/task/handle.c rename to source/task/history/handle.c diff --git a/source/task/handle.h b/source/task/history/handle.h similarity index 100% rename from source/task/handle.h rename to source/task/history/handle.h diff --git a/source/task/handle_for_checker.c b/source/task/history/handle_for_checker.c similarity index 100% rename from source/task/handle_for_checker.c rename to source/task/history/handle_for_checker.c diff --git a/source/task/handle_for_checker.h b/source/task/history/handle_for_checker.h similarity index 100% rename from source/task/handle_for_checker.h rename to source/task/history/handle_for_checker.h diff --git a/source/task/handle_for_coder.c b/source/task/history/handle_for_coder.c similarity index 100% rename from source/task/handle_for_coder.c rename to source/task/history/handle_for_coder.c diff --git a/source/task/handle_for_coder.h b/source/task/history/handle_for_coder.h similarity index 100% rename from source/task/handle_for_coder.h rename to source/task/history/handle_for_coder.h diff --git a/source/task/input.c b/source/task/history/input.c similarity index 100% rename from source/task/input.c rename to source/task/history/input.c diff --git a/source/task/input.h b/source/task/history/input.h similarity index 100% rename from source/task/input.h rename to source/task/history/input.h diff --git a/source/task/log.c b/source/task/history/log.c similarity index 100% rename from source/task/log.c rename to source/task/history/log.c diff --git a/source/task/log.h b/source/task/history/log.h similarity index 100% rename from source/task/log.h rename to source/task/history/log.h diff --git a/source/task/moter.c b/source/task/history/moter.c similarity index 100% rename from source/task/moter.c rename to source/task/history/moter.c diff --git a/source/task/moter.h b/source/task/history/moter.h similarity index 100% rename from source/task/moter.h rename to source/task/history/moter.h diff --git a/source/task/process.c b/source/task/history/process.c similarity index 100% rename from source/task/process.c rename to source/task/history/process.c diff --git a/source/task/process.h b/source/task/history/process.h similarity index 100% rename from source/task/process.h rename to source/task/history/process.h diff --git a/source/task/history/prot_mcu.c b/source/task/history/prot_mcu.c deleted file mode 100644 index e9242d7..0000000 --- a/source/task/history/prot_mcu.c +++ /dev/null @@ -1,470 +0,0 @@ -#include "stdio.h" -#include "rtthread.h" -#include "board.h" -#include "mystdlib.h" -#include "list.h" -#include "mystring.h" -#include "signal.h" -#include "prot_mcu.h" -#include "buff.h" -#include "bytearray.h" -#include "debug.h" -#include "crc.h" - - - -typedef struct{ - uint16_t no; - list_def *cmds;//int - uint8_t addr; - uint8_t cmd; - array_def *data; - int retry; - int timeout_ms; -}protm_slave; - - - -static int protm_slave_sub(void *a,void *b) -{ - protm_slave *a_=a; - protm_slave *b_=b; - return a_->addr-b_->addr; -} - -static int protm_slave_del(void *t) -{ - protm_slave *p=t; - CHECK_DO(p->cmds,list_delete); - return 0; -} - - -static protm_slave *protm_slave_creat(void) -{ - protm_slave *p=calloc(1,sizeof(protm_slave)); - param_check(p); - return p; -} - - - - - - - -array_def *protm_decode(protm_def *p,array_def *data); -protm_slave *protm_get_slave(protm_def *p,uint8_t addr); - - - -typedef struct{ - array_def *data; - int addr; -}send_data_def; - - -// 定义事件 -#define EVENT_RECV 0x1 -#define EVENT_SEND 0x2 -#define EVENT_TIMEOUT 0x4 - - - -struct _protm_def{ - uart_def *uart; - array_def *buff; - int num_to_recv; - rt_event_t event; - rt_timer_t timer; - int run; - char *str_err; - list_def *slaves;//protm_slave - list_def *slaves_addr;//int - list_def *send_data;//send_data_def - int in_send;//在发送状态时为1 - uint8_t recv_cmd; - uint8_t recv_src; - -}; - - - - - -static void recv_irq(void *t,uint8_t d) -{ - protm_def *p=t; - arr_append(p->buff,d); - switch(arr_length(p->buff)){ - case 2: - if(arr_get(p->buff,0)=='Y'&&arr_get(p->buff,1)=='e') - { - p->num_to_recv=4; - }else{ - arr_remove(p->buff,0,1); - p->num_to_recv=0; - } - break; - case 4: - { - int len=arr_get(p->buff,2)|(arr_get(p->buff,3)<<8); - p->num_to_recv=len; - } - break; - default: - break; - } - // 此时一帧数据已完成 - if(p->num_to_recv>0&&p->num_to_recv==arr_length(p->buff)) - { - rt_event_send(p->event,EVENT_RECV); - } -} - - - -/* -* 与从机通信的串口是串行的,一个通信事务完成之后才能开始下一个通信 -* 协议层接收的通信事务是并行的,应用层来的通信任务会被放入队列 -*/ - -static void protm_send_next(void *t); -int protm_send(protm_def *p,send_data_def *d); -static void protm_send_timeout(void *t); -static void protm_run(void *t) -{ - protm_def *p=t; - array_def *data; - array_def *decode_data; - uint32_t ev; - while(p->run) - { - rt_event_recv(p->event,0xffffffff,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&ev); - if(ev&EVENT_RECV) - { - // DBG_LOG("protmcu:recv event."); - data=arr_duplicate(p->buff); - arr_clear(p->buff); - //DBG_LOG("recv:%s",str_temp(arr_string(data))); - decode_data=protm_decode(p,data); - arr_delete(data); - emit protm_recv_signal(p,p->recv_src,p->recv_cmd,arr_temp(decode_data),str_temp(str_duplicate(p->str_err))); - irq_disable(); - p->num_to_recv=0; - irq_enable(); - protm_send_next(p); - } - else if(ev&EVENT_TIMEOUT) - { - protm_send_timeout(p); - } - if (ev&EVENT_SEND) - { - // DBG_LOG("protmcu:send event."); - if(list_length(p->send_data)>0) - { - send_data_def *a=(send_data_def *)list_get(p->send_data,0); - protm_send(p,a); - } - } - ev=0; - } -} - - -// 发送下一个 -static void protm_send_next(void *t) -{ - protm_def *p=t; - rt_timer_stop(p->timer); - list_remove(p->send_data,0); - // 如果发送列表中有数据,此时发送 - if (list_length(p->send_data)>0) - { - // DBG_LOG("protmcu:EVENT_SEND."); - rt_event_send(p->event,EVENT_SEND); - } - else{ - irq_disable(); - p->in_send=0; - irq_enable(); - } -} - - -static void protm_send_timeout_cb(void *t) -{ - protm_def *p=t; - rt_event_send(p->event,EVENT_TIMEOUT); -} - -// 接收超时 -static void protm_send_timeout(void *t) -{ - protm_def *p=t; - send_data_def *s=list_get(p->send_data,0); - protm_slave *sl=protm_get_slave(p,s->addr); - if(sl->retry>0){ - sl->retry--; - DBG_WARN("slave:%d retry left ",s->addr,sl->retry); - list_shift(p->send_data); - }else{ - DBG_WARN("slave:%d retry timeout,remove the send data.",s->addr); - list_remove(p->send_data,0); - } - // 如果发送列表中有数据,此时发送 - if (list_length(p->send_data)>0) - { - // DBG_LOG("protmcu:EVENT_SEND."); - rt_event_send(p->event,EVENT_SEND); - } - else{ - irq_disable(); - p->in_send=0; - irq_enable(); - } -} - - - - - -// 发送队列删除条目 -static int _list_send_data_del(void *t) -{ - send_data_def *a=t; - arr_delete(a->data); - return 0; -} - - -protm_def *protm_creat(uart_def *uart,int *addrs,int num) -{ - static int count=0; - char name[20]={0}; - protm_def *p=calloc(1,sizeof(protm_def)); - param_check(p); - p->uart=uart; - sprintf(name,"protm_event#%d",count); - p->event=rt_event_create(name,RT_IPC_FLAG_FIFO); - p->buff=arr_creat(); - p->run=1; - p->slaves=list_creat(sizeof(protm_slave),protm_slave_sub,protm_slave_del,0); - p->slaves_addr=list_creat_int(); - p->send_data=list_creat(sizeof(send_data_def),0,_list_send_data_del,0); - // 创建超时定时器,超过指定时间则不再等待从机返回 - p->timer=rt_timer_create("port_timer",protm_send_timeout_cb,p, - rt_tick_from_millisecond(55), - RT_TIMER_FLAG_ONE_SHOT|RT_TIMER_FLAG_SOFT_TIMER); - list_appends(p->slaves_addr,addrs,num); - sprintf(name,"protm_t#%d",count); - rt_thread_t rt_t=rt_thread_create(name,protm_run,p,512,5,20); - rt_thread_startup(rt_t); - p->uart->init(p->uart); - p->uart->set_irq(p->uart,recv_irq,p); - - count++; - return p; -} - - -// 得到指定地址的从机,找不到则添加 -protm_slave *protm_get_slave(protm_def *p,uint8_t addr) -{ - protm_slave *r=0; - for(int i=0;islaves);i++) - { - r=list_get(p->slaves,i); - if(r->addr==addr) - return r; - } - r=protm_slave_creat(); - r->addr=addr; - r->cmds=list_creat_int(); - r->no=0; - list_append(p->slaves,r); - free(r); - return list_get(p->slaves,-1); -} - - - -// 设置所有从机流水号 -void protm_set_no_all(protm_def *p,uint16_t no,list_def *cmd/*int*/) -{ - for(int i=0;islaves);i++) - { - protm_slave *s=list_get(p->slaves,i); - s->no=no; - list_clear(s->cmds); - list_append_from(s->cmds,cmd); - } -} - - -// 设置单个从机流水号 -void protm_set_no(protm_def *p,uint8_t addr,uint16_t no,list_def *cmd/*int*/) -{ - protm_slave *s=protm_get_slave(p,addr); - s->no=no; - list_clear(s->cmds); - list_append_from(s->cmds,cmd); -} - - - - - -// 解码 -array_def *protm_decode(protm_def *p,array_def *data) -{ - array_def *r=arr_creat(); - param_check(r); - str_set(p->str_err,"ok"); - if(arr_length(data)<10) - { - DBG_WARN("recv data len too less."); - str_set(p->str_err,"recv data len too less."); - return r; - } - uint8_t src=arr_get(data,4); - p->recv_src=src; - uint16_t len=arr_get(data,2)|(arr_get(data,3)<<8); - uint8_t crc=crc_crc8(arr_data(data),arr_length(data)-1); - if(len!=arr_length(data)) - { - // 如果长度不相等则产生了数据丢失 - DBG_WARN("recv data have lossed."); - str_set(p->str_err,"recv data have lossed."); - return r; - } - uint16_t no=arr_get(data,7)|(arr_get(data,8)<<8); - uint16_t h_no=protm_get_slave(p,src)->no; - if(no!=h_no) - { - // 发送一条指令等待其返回,此时流水号应相同 - //DBG_WARN("slave_addr=%d cmd_no error:h_no=%d,no=%d.",src,h_no,no); - //str_set(p->str_err,"cmd no err."); - //return r; - } - if(crc!=arr_get(data,-1)) - { - DBG_WARN("recv data crc check error:%02x,%02x.",crc,arr_get(data,-1)); - str_set(p->str_err,"crc check err."); - } - p->recv_cmd=arr_get(data,6); - list_def *cmds=protm_get_slave(p,src)->cmds; - if(list_contains(cmds,(int []){p->recv_cmd})==0){ - // 命令号校验不对 - DBG_WARN("cmd check err.cmds=%s,recv_cmd=%d",tappend(list_string(cmds),0),p->recv_cmd); - str_set(p->str_err,"cmd check err."); - } - arr_delete(r); - return arr_mid(data,9,len-10); -} - - -// 编码 -array_def *protm_encode(protm_def *p,uint8_t dst,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data) -{ - array_def *t=arr_creat(); - param_check(t); - uint16_t len=arr_length(data)+10; - protm_slave *slave=protm_get_slave(p,dst); - slave->no++; - protm_set_no(p,dst,slave->no,comp_cmd); - arr_append(t,'Y'); - arr_append(t,'e'); - arr_append(t,len&0xff); - arr_append(t,len>>8); - arr_append(t,0);// 源地址 - arr_append(t,dst);// 目标地址 - arr_append(t,cmd);// 命令码 - arr_append(t,slave->no&0xff); - arr_append(t,slave->no>>8); - arr_appends_from(t,data); - arr_append(t,crc_crc8(arr_data(t),arr_length(t))); - return t; -} - -// 发送数据,发送前先开启超时定时器 -int protm_send(protm_def *p,send_data_def *d) -{ - rt_tick_t tick=0; - protm_slave *s=protm_get_slave(p,d->addr); - //DBG_LOG("send:%s",str_temp(arr_string(d->data))); - tick=rt_tick_from_millisecond(s->timeout_ms); - rt_timer_control(p->timer,RT_TIMER_CTRL_SET_TIME,&tick); - rt_timer_start(p->timer); - if(d->data==0) - { - DBG_WARN("addr=%d,d->data=0",d->addr); - return 0; - } - return p->uart->write(p->uart,arr_data(d->data),arr_length(d->data)); -} - - -//// 槽函数,发送数据到指定地址 -//void protm_send_call(protm_def *p,list_def *addrs/*int*/,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data) -//{ -// param_check(p); -// for(int i=0;islaves_addr,(int []){dst})==1) -// { -// array_def *t=0; -// t=protm_encode(p,dst,cmd,comp_cmd,data); -// protm_send(p,t); -// arr_delete(t); -// } -// } -//} - - - -// 槽函数,发送数据到指定地址 -void protm_send_call(protm_def *p,uint8_t addr,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data,int timeout_ms,int retry) -{ - param_check(p); - if(list_contains(p->slaves_addr,(int []){addr})==1) - { - array_def *t=0; - t=protm_encode(p,addr,cmd,comp_cmd,data); - //protm_send(p,t); - //arr_delete(t); - // 添加到发送队列,发送必须等到回应或超时才能发送下一个 - DBG_LOG("send to:%d",addr); - send_data_def sd={0}; - sd.addr=addr;sd.data=t; - protm_slave *s=protm_get_slave(p,addr); - s->retry=retry; - s->timeout_ms=timeout_ms; - list_append(p->send_data,&sd); - if(p->in_send==0){ - irq_disable(); - p->in_send=1; - irq_enable(); - //DBG_LOG("send call"); - rt_event_send(p->event,EVENT_SEND); - } - } -} - - - - -// 返回1表示此地址可以发送到这个端口 -int protm_contains(protm_def *p,uint8_t addr) -{ - param_check(p); - return list_contains(p->slaves_addr,(int []){addr}); -} - - - - - - diff --git a/source/task/tcp.c b/source/task/history/tcp.c similarity index 100% rename from source/task/tcp.c rename to source/task/history/tcp.c diff --git a/source/task/tcp.h b/source/task/history/tcp.h similarity index 100% rename from source/task/tcp.h rename to source/task/history/tcp.h diff --git a/source/task/tran_for_checker.c b/source/task/history/tran_for_checker.c similarity index 100% rename from source/task/tran_for_checker.c rename to source/task/history/tran_for_checker.c diff --git a/source/task/tran_for_checker.h b/source/task/history/tran_for_checker.h similarity index 100% rename from source/task/tran_for_checker.h rename to source/task/history/tran_for_checker.h diff --git a/source/task/tran_for_coder.c b/source/task/history/tran_for_coder.c similarity index 100% rename from source/task/tran_for_coder.c rename to source/task/history/tran_for_coder.c diff --git a/source/task/tran_for_coder.h b/source/task/history/tran_for_coder.h similarity index 100% rename from source/task/tran_for_coder.h rename to source/task/history/tran_for_coder.h diff --git a/source/task/tran_for_coder2.c b/source/task/history/tran_for_coder2.c similarity index 100% rename from source/task/tran_for_coder2.c rename to source/task/history/tran_for_coder2.c diff --git a/source/task/tran_for_coder2.h b/source/task/history/tran_for_coder2.h similarity index 100% rename from source/task/tran_for_coder2.h rename to source/task/history/tran_for_coder2.h diff --git a/source/task/udp.c b/source/task/history/udp.c similarity index 100% rename from source/task/udp.c rename to source/task/history/udp.c diff --git a/source/task/udp.h b/source/task/history/udp.h similarity index 100% rename from source/task/udp.h rename to source/task/history/udp.h diff --git a/source/task/mod_signals.c b/source/task/mod_signals.c index bcbd205..c582cdf 100644 --- a/source/task/mod_signals.c +++ b/source/task/mod_signals.c @@ -1,22 +1,11 @@ #include "stdlib.h" #include "signal.h" #include "commend.h" -#include "handle.h" -#include "handle_for_checker.h" -#include "handle_for_coder.h" -#include "input.h" -#include "log.h" -#include "moter.h" -#include "process.h" #include "prot_mcu.h" #include "prot_uc.h" -#include "tcp.h" #include "transmit.h" -#include "tran_for_checker.h" -#include "tran_for_coder.h" -#include "tran_for_coder2.h" #include "tran_for_coder2ch.h" -#include "udp.h" +#include "tran_for_slave.h" @@ -34,53 +23,6 @@ signal_export(cmd_reply_signal); -void port_send_signal(port_mcu *obj,uint8_t addr,uint8_t cmd,list_def *comp_cmd,array_def *data,int timeout_ms,int retry) -{ - uint32_t param[6]; - param[0]=(uint32_t)addr; - param[1]=(uint32_t)cmd; - param[2]=(uint32_t)comp_cmd; - param[3]=(uint32_t)data; - param[4]=(uint32_t)timeout_ms; - param[5]=(uint32_t)retry; - _signal_emit(obj,port_send_signal,param,6); -} -signal_export(port_send_signal); - - - -void port_end_signal(port_mcu *obj,port_mcu *src,void *data,int ack,char *err_str) -{ - uint32_t param[4]; - param[0]=(uint32_t)src; - param[1]=(uint32_t)data; - param[2]=(uint32_t)ack; - param[3]=(uint32_t)err_str; - _signal_emit(obj,port_end_signal,param,4); -} -signal_export(port_end_signal); - - - -void moter_end_signal(void *m) -{ - _signal_emit(m,moter_end_signal,0,0); -} -signal_export(moter_end_signal); - - - -void process_send_signal(void *obj,uint8_t cmd,array_def *data) -{ - uint32_t param[2]; - param[0]=(uint32_t)cmd; - param[1]=(uint32_t)data; - _signal_emit(obj,process_send_signal,param,2); -} -signal_export(process_send_signal); - - - void protm_recv_signal(void *obj,uint8_t src,uint8_t cmd,array_def *data,char *err_str) { uint32_t param[4]; @@ -107,24 +49,6 @@ signal_export(protu_recv_signal); -void tcp_connect_signal(void *obj) -{ - _signal_emit(obj,tcp_connect_signal,0,0); -} -signal_export(tcp_connect_signal); - - - -void tcp_recv_signal(void *obj,array_def *data) -{ - uint32_t param[1]; - param[0]=(uint32_t)data; - _signal_emit(obj,tcp_recv_signal,param,1); -} -signal_export(tcp_recv_signal); - - - void tran_reply_signal(tran_def *p,array_def *data) { uint32_t param[1]; @@ -146,28 +70,6 @@ signal_export(tran_send_signal); -void coder_live_send_signal(void *obj,uint8_t cmd,array_def *data) -{ - uint32_t param[2]; - param[0]=(uint32_t)cmd; - param[1]=(uint32_t)data; - _signal_emit(obj,coder_live_send_signal,param,2); -} -signal_export(coder_live_send_signal); - - - -void coder2_live_send_signal(void *obj,uint8_t cmd,array_def *data) -{ - uint32_t param[2]; - param[0]=(uint32_t)cmd; - param[1]=(uint32_t)data; - _signal_emit(obj,coder2_live_send_signal,param,2); -} -signal_export(coder2_live_send_signal); - - - void code2_end_signal(void *obj,int ack,array_def *data) { uint32_t param[2]; @@ -187,16 +89,3 @@ signal_export(code2_start_signal); -void udp_recv_signal(void *obj,const char *codec_name,uint8_t cmd,array_def *data,char *err_str) -{ - uint32_t param[4]; - param[0]=(uint32_t)codec_name; - param[1]=(uint32_t)cmd; - param[2]=(uint32_t)data; - param[3]=(uint32_t)err_str; - _signal_emit(obj,udp_recv_signal,param,4); -} -signal_export(udp_recv_signal); - - - diff --git a/source/task/tran_for_coder2ch.c b/source/task/tran_for_coder2ch.c index 8ca45a4..fc23aac 100644 --- a/source/task/tran_for_coder2ch.c +++ b/source/task/tran_for_coder2ch.c @@ -1,20 +1,16 @@ -#include "tran_for_coder2.h" #include "tran_for_coder2ch.h" #include "debug.h" #include "mymisc.h" #include "mystdlib.h" #include "board.h" #include "dev_flash.h" -#include "tcp.h" #include "prot_uc.h" -#include "handle_for_coder.h" -#include "handle_for_checker.h" #include "coder_lib.h" #include "JQ_PSDGenerate.h" #include "mystring.h" #include "coder_judge.h" #include "JQ_UIDGenerate.h" - +#include "transmit.h" @@ -154,10 +150,10 @@ static uint32_t in_range_err(const uint8_t *src_data,const uint8_t *errbit) // 注码完成 -static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str) +static void write_uid_end(ucport_def *u,void *src,void *data,int ack,char *err_str) { write_uid_def *w=(write_uid_def *)u; - uint8_t addr=port_get_addr(src); + uint8_t addr=0; if(addr<=0||addr>w->addrs_num){ DBG_WARN("addr err:%d",addr); return; @@ -263,17 +259,14 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data) u->ack[i*38+0]=i+slave_addr_off(); u->ack[i*38+1]=1; if(1){ - port_mcu *mcu=tran_get_portm(u->u.p,i); - // 这里打开赋码操作 - if(mcu){ - if(check_shell_code(u->item[i].shell_code)){ - port_start(mcu,code2_creat(8,4,u->item[i].uid_pw_hex)); - }else{ - // 管壳码无效,不注码,此时默认已ack - // 管壳码无效不视为失败 - ret=0; - write_uid_fillret(u,i+1,0xff); - } + if(check_shell_code(u->item[i].shell_code)){ + // 开始注码 + //port_start(mcu,code2_creat(8,4,u->item[i].uid_pw_hex)); + }else{ + // 管壳码无效,不注码,此时默认已ack + // 管壳码无效不视为失败 + ret=0; + write_uid_fillret(u,i+1,0xff); } } @@ -316,89 +309,6 @@ transmit_export(ym_checker,0x02,write_uid) -typedef struct{ - rt_timer_t timer; - void *protu; -}live_keeper_def; - - -static void live_start(live_keeper_def *t) -{ - rt_tick_t tick=0; - tick=rt_tick_from_millisecond(1000); - rt_timer_control(t->timer,RT_TIMER_CTRL_SET_TIME,&tick); - rt_timer_start(t->timer); -} -static void live_recv(live_keeper_def *t) -{ - rt_tick_t tick=0; - tick=rt_tick_from_millisecond(5000); - rt_timer_control(t->timer,RT_TIMER_CTRL_SET_TIME,&tick); - rt_timer_start(t->timer); - //rt_timer_stop(t->timer); -} - - -// cmd=0x8a -static void live_send(void *p) -{ - live_keeper_def *live=p; - const sys_param_def *par=sys_param(); - tran_def *t=app_variable("tran",0,0); - uint16_t slave_online=0; - if(t){ - slave_online=tran_get_slave_online(t); - } - //protu_codec_set(live->protu,protu_find_codec("ym_checker")); - - array_def *d=arr_creat(); - arr_append(d,coder_extract_chip(0));// 模块类型 - arr_append(d,0xff); - arr_append(d,0x03); - arr_append(d,par->local_id&0xff); - arr_append(d,slave_online&0xff);// 在线的小板 - arr_append(d,(slave_online>>8)&0xff); - emit coder2_live_send_signal(p,0x8a,arr_temp(d)); - //DBG_LOG("send liver data."); - -} - - -static void init_for_coder2ch(void *t) -{ - void *protu=app_variable("protu",0,0); - if(protu){ - live_keeper_def *live=calloc(1,sizeof(live_keeper_def)); - live->protu=protu; - live->timer=rt_timer_create("live_t",live_send,live, - rt_tick_from_millisecond(1000), - RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER); - protu_codec_set(protu,protu_find_codec("ym_checker")); - connect(protu,protu_recv_signal,0,live,live_recv); - connect(live,coder2_live_send_signal,0,protu,protu_send_call); - DBG_LOG("coder2ch liver created"); - live_start(live); - }else{ - DBG_WARN("can not fond variable \"protu\""); - } -} - - - - -// 如果本机为赋码仪并且连接类型为tcp -// 初始化心跳 -static int init_live_keeper(void) -{ - const sys_param_def *par=sys_param(); - app_valid_call("protu",init_for_coder2ch,0); - return 0; -} -app_init_export(init_live_keeper); - - - - diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c new file mode 100644 index 0000000..86c5f9f --- /dev/null +++ b/source/task/tran_for_slave.c @@ -0,0 +1,34 @@ +#include "tran_for_slave.h" +#include "debug.h" +#include "mymisc.h" +#include "mystdlib.h" +#include "board.h" +#include "dev_flash.h" +#include "prot_uc.h" +#include "coder_lib.h" +#include "JQ_PSDGenerate.h" +#include "mystring.h" +#include "coder_judge.h" +#include "JQ_UIDGenerate.h" +#include "transmit.h" + + + + + + + + + + + + + + + + + + + + + diff --git a/source/task/tran_for_slave.h b/source/task/tran_for_slave.h new file mode 100644 index 0000000..7685ae5 --- /dev/null +++ b/source/task/tran_for_slave.h @@ -0,0 +1,14 @@ +#ifndef tran_for_slave_h__ +#define tran_for_slave_h__ + + + + + + + + + + + +#endif diff --git a/source/task/transmit.c b/source/task/transmit.c index 7f63c19..c71ddd2 100644 --- a/source/task/transmit.c +++ b/source/task/transmit.c @@ -20,49 +20,15 @@ -#define PORT_NUM 2 typedef struct _tran_def{ ucport_def *u; - port_mcu *port[PORT_NUM]; - uint32_t slave_online;// 对应位为1则从机在线 int is_busy; }tran_def; -// 打印从机状态 -static void tran_print_slave_stat(void *t) -{ - list_def *l=list_creat_int(); - uint32_t a=tran_get_slave_online(t); - for(int i=0;islave_online=0xfffff; app_variable("tran",tran,0); - later_execute(tran_scan_slave,tran,500); return 0; } app_init_export(tran_init); -void tran_end_slot(tran_def *obj,port_mcu *src,void *data,int ack,char *err_str); +void tran_end_slot(tran_def *obj,void *src,void *data,int ack,char *err_str); tran_def *tran_creat(sig_thread t) { tran_def *tr=calloc(1,sizeof(tran_def)); param_check(tr); - port_init(); - for(int i=0;iport[i]=port_creat(i+1,t); - // 连接操作结束信号 - connect(tr->port[i],port_end_signal,0,tr,tran_end_slot); - } return tr; } @@ -133,33 +90,16 @@ void tran_recv_slot(tran_def *t,const char *codec_name,uint8_t cmd,array_def *da } } -void tran_set_slave_online(tran_def *t,uint8_t addr,int stat) -{ - param_check(t); - uint32_t a=0; - a=1<<(addr-1); - if(stat) - t->slave_online|=a; - else{ - t->slave_online&=(~a); - //DBG_LOG("a=%08x",a); - } -} -uint32_t tran_get_slave_online(tran_def *t) -{ - param_check(t); - return t->slave_online; -} -void tran_end_slot(tran_def *obj,port_mcu *src,void *data,int ack,char *err_str) + + +void tran_end_slot(tran_def *obj,void *src,void *data,int ack,char *err_str) { //DBG_LOG("tran end slot"); param_check(obj); if(strcmp(err_str,"timeout")==0) { - tran_set_slave_online(obj,port_get_addr(src),0); }else{ - tran_set_slave_online(obj,port_get_addr(src),1); } if((obj->u)&&obj->u->doend) obj->u->doend(obj->u,src,data,ack,err_str); @@ -175,13 +115,7 @@ int tran_get_busy(tran_def *t) } -// 获取指定通道 -port_mcu *tran_get_portm(tran_def *t,int index) -{ - if(index<0||index>=PORT_NUM) - return 0; - return t->port[index]; -} + @@ -374,13 +308,6 @@ static void when_scheme_done(ucport_def *u) DBG_LOG("memused:%d",mem_perused()); rt_thread_mdelay(100); DBG_LOG("memused:%d",mem_perused()); - for(int i=0;islave_data,2048)); - } } static ucport_def *tran_scheme(tran_def *t, uint8_t cmd,array_def *data) { diff --git a/source/task/transmit.h b/source/task/transmit.h index 10c3e1c..20a8349 100644 --- a/source/task/transmit.h +++ b/source/task/transmit.h @@ -2,9 +2,9 @@ #define transmit_h__ #include "rtthread.h" -#include "handle.h" #include "signal.h" - +#include "stdint.h" +#include "bytearray.h" // 错误码定义 @@ -25,7 +25,7 @@ typedef struct _ucport_def{ tran_def *p; int (*dolater)(struct _ucport_def *u,uint8_t cmd,array_def *data,char *err_str); void (*del)(struct _ucport_def *h); - void (*doend)(struct _ucport_def *h,port_mcu *src,void *data,int ack,char *err_str); + void (*doend)(struct _ucport_def *h,void *src,void *data,int ack,char *err_str); }ucport_def; @@ -57,8 +57,6 @@ void tran_recv_slot(tran_def *t,const char *codec_name,uint8_t cmd,array_def *da void tran_set_busy(tran_def *t,int busy); int tran_get_busy(tran_def *t); -port_mcu *tran_get_portm(tran_def *t,int index); -uint32_t tran_get_slave_online(tran_def *t); signal tran_reply_signal(tran_def *p,array_def *data);