Browse Source

Initial Commit

master
mr.zhangsan 2 years ago
commit
22d11f3163
  1. 34
      .gitignore
  2. 8
      backup/all/U4备份程序.bat
  3. 8
      backup/all/U4备份程序全.bat
  4. 10
      backup/all/stc备份程序.bat
  5. BIN
      backup/all/unzip.exe
  6. BIN
      backup/all/zip.exe
  7. BIN
      backup/all/批处理备份程序 使用方法.zip
  8. 532
      keilp/stcTTSS2_W5.uvprojx
  9. 152
      si4/keywords.txt
  10. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_sym
  11. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xab
  12. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xad
  13. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xc
  14. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xf
  15. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xm
  16. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xr
  17. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsb
  18. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsd
  19. BIN
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj
  20. 22
      si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj_settings.xml
  21. 23
      source/New0001.h
  22. 384
      source/app/app_config.c
  23. 264
      source/app/app_config.h
  24. 32
      source/app/app_task_reg.h
  25. 607
      source/app/app_weight.c
  26. 193
      source/app/app_weight.h
  27. 169
      source/app/main.c
  28. 107
      source/app/main.h
  29. 421
      source/app/nouse/app_save.c
  30. 146
      source/app/nouse/app_save.h
  31. 473
      source/app/nouse/app_task_adc - 副本.c
  32. 214
      source/app/nouse/app_task_adc - 副本.h
  33. 30
      source/app/nouse/app_task_adc.c
  34. 29
      source/app/nouse/app_task_adc.h
  35. 124
      source/app/nouse/app_task_debug.c
  36. 32
      source/app/nouse/app_task_debug.h
  37. 64
      source/app/nouse/app_task_reg.c
  38. 64
      source/app/nouse/app_task_reg.c.bak
  39. 24
      source/app/nouse/app_task_uart0.c
  40. 11
      source/app/nouse/app_task_uart0.h
  41. 536
      source/app/nouse/app_weight.c
  42. 151
      source/app/nouse/app_weight.h
  43. 105
      source/app/nouse/app_weightzero.c
  44. 106
      source/app/nouse/app_weightzero.h
  45. 121
      source/app/nouse/common.c
  46. 79
      source/app/nouse/common.h
  47. 107
      source/asp/asp_expara.c
  48. 56
      source/asp/asp_expara.h
  49. 43
      source/asp/asp_gsensor.c
  50. 27
      source/asp/asp_gsensor.h
  51. 312
      source/asp/asp_lowpower.c
  52. 39
      source/asp/asp_lowpower.h
  53. 475
      source/asp/asp_move.c
  54. 118
      source/asp/asp_move.h
  55. 120
      source/asp/asp_mqtt.c
  56. 44
      source/asp/asp_mqtt.h
  57. 726
      source/asp/asp_schain.c
  58. 143
      source/asp/asp_schain.h
  59. 173
      source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.c
  60. 207
      source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.h
  61. 350
      source/asp/新建文件夹/SL_algo1.h
  62. BIN
      source/asp/新建文件夹/SL_algo1.lib
  63. 264
      source/asp/新建文件夹/SL_app.c
  64. 10
      source/asp/新建文件夹/SL_app1.h
  65. 46
      source/asp/新建文件夹/asp_moto.c
  66. 13
      source/asp/新建文件夹/asp_moto.h
  67. 87
      source/asp/新建文件夹/asp_para.c
  68. 67
      source/asp/新建文件夹/asp_para.h
  69. 588
      source/asp/新建文件夹/asp_schain.c
  70. 127
      source/asp/新建文件夹/asp_schain.h
  71. 620
      source/asp/新建文件夹/asp_weight_save.c
  72. 126
      source/asp/新建文件夹/asp_weight_save.h
  73. 21
      source/bsp/TTSSbsp/bsp_config.c
  74. 544
      source/bsp/TTSSbsp/bsp_config.h
  75. 205
      source/bsp/TTSSbsp/bsp_config_const.h
  76. 96
      source/bsp/TTSSbsp/bsp_config_stc.h
  77. 936
      source/bsp/backu/MLX90615.c
  78. 90
      source/bsp/backu/MLX90615.h
  79. 159
      source/bsp/backu/New0001.c
  80. BIN
      source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar
  81. 34
      source/bsp/backu/bsp_433.c
  82. 19
      source/bsp/backu/bsp_433.h
  83. 574
      source/bsp/backu/bsp_cam - 副本.c
  84. 706
      source/bsp/backu/bsp_cam.c
  85. 189
      source/bsp/backu/bsp_cam.h
  86. 218
      source/bsp/backu/bsp_cam_isr.c
  87. 62
      source/bsp/backu/bsp_cam_isr.h
  88. 95
      source/bsp/backu/bsp_config_stc.h.bak
  89. 328
      source/bsp/backu/bsp_cs1232.c
  90. 212
      source/bsp/backu/bsp_cs1232.h
  91. 53
      source/bsp/backu/bsp_func.c
  92. 52
      source/bsp/backu/bsp_func.h
  93. 773
      source/bsp/backu/bsp_gc032a.c
  94. 19
      source/bsp/backu/bsp_gc032a.h
  95. 164
      source/bsp/backu/bsp_iic3.c
  96. 15
      source/bsp/backu/bsp_iic3.h
  97. 110
      source/bsp/backu/bsp_lora.c
  98. 14
      source/bsp/backu/bsp_lora.h
  99. 261
      source/bsp/backu/bsp_msa300.c
  100. 473
      source/bsp/backu/bsp_msa300.h

34
.gitignore

@ -0,0 +1,34 @@
### vim
*.swp
*.swo
*~
### Keil5
/keil/*
/keilp/*
!*.sct
!*.uvprojx
### Source Insight
*.IAB
*.IAD
*.IMB
*.IMD
*.PFI
*.PO
*.PR
*.PRI
*.PS
*.WK3
*.SearchResults
*.bookmarks.xml
*.snippets.xml
*.siwork
si/**/cache/
si/**/Backup/
si4/**/cache/
si4/**/Backup/
### Source file
source/bak/
/out/

8
backup/all/U4备份程序.bat

@ -0,0 +1,8 @@
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a_%%b%%c)
set str=%DATE%
set mydate=%str:/=_%
set mydate=%mydate: =_%
set /p demo=:
echo %demo%
backup\all\zip -q -r -S backup\u4_%demo%_%mydate%%mytime:~0,6%.zip MDK-ARM\*.* core\*.* out\*.hex si\*.* *.ioc .mxproject *.ini *.bat backup\all\*.*
backup\all\zip -q -r -S backup\u4_%demo%_%mydate%%mytime:~0,6%.zip.doc MDK-ARM\*.* core\*.* out\*.hex si\*.* *.ioc .mxproject *.ini *.bat backup\all\*.*

8
backup/all/U4备份程序全.bat

@ -0,0 +1,8 @@
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a_%%b%%c)
set str=%DATE%
set mydate=%str:/=_%
set mydate=%mydate: =_%
set /p demo=:
echo %demo%
backup\all\zip -q -r -S backup\u4_%demo%_%mydate%%mytime:~0,6%.zip MDK-ARM\*.* core\*.* out\*.hex si\*.* *.ioc .mxproject *.ini *.bat backup\all\*.* Drivers\*.*
backup\all\zip -q -r -S backup\u4_%demo%_%mydate%%mytime:~0,6%.zip.doc MDK-ARM\*.* core\*.* out\*.hex si\*.* *.ioc .mxproject *.ini backup\all\*.*

10
backup/all/stc备份程序.bat

@ -0,0 +1,10 @@
For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a_%%b%%c)
set str=%DATE%
set mydate=%str:/=_%
set mydate=%mydate: =_%
set /p demo=:
echo %demo%
backup\zip -q -r -S backup\stcAS03PLCa_%demo%_%mydate%%mytime:~0,6%.zip si4\*.* source\*.* keilp\*.* out\*.hex docs\*.xlsx docs\*.doc* backup\all
backup\zip -q -r -S backup\stcAS03PLCa_%demo%_%mydate%%mytime:~0,6%.zip.doc si4\*.* source\*.* keilp\*.* out\*.hex docs\*.xlsx docs\*.doc* backup\all
pause

BIN
backup/all/unzip.exe

Binary file not shown.

BIN
backup/all/zip.exe

Binary file not shown.

BIN
backup/all/批处理备份程序 使用方法.zip

Binary file not shown.

532
keilp/stcTTSS2_W5.uvprojx

@ -0,0 +1,532 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
<SchemaVersion>2.1</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Targets>
<Target>
<TargetName>STC8H3K48S2</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<TargetOption>
<TargetCommonOption>
<Device>STC8H3K64S4 Series</Device>
<Vendor>STC</Vendor>
<Cpu>IRAM(0-0xFF) XRAM(0-0x0BFF) IROM(0-0xFFF8) CLOCK(35000000) MODP2</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile>"LIB\STARTUP.A51" ("Standard 8051 Startup Code")</StartupFile>
<FlashDriverDll></FlashDriverDll>
<DeviceId>63300</DeviceId>
<RegisterFile>STC8.H</RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
<Linker></Linker>
<OHString></OHString>
<InfinionOptionDll></InfinionOptionDll>
<SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile></SFDFile>
<bCustSvd>0</bCustSvd>
<UseEnv>0</UseEnv>
<BinPath>d:\Keil\C51\BIN\</BinPath>
<IncludePath></IncludePath>
<LibPath></LibPath>
<RegisterFilePath>STC\</RegisterFilePath>
<DBRegisterFilePath>STC\</DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>..\out\</OutputDirectory>
<OutputName>stcTTSS2_w5</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
<DebugInformation>1</DebugInformation>
<BrowseInformation>1</BrowseInformation>
<ListingPath>..\out\</ListingPath>
<HexFormatSelection>0</HexFormatSelection>
<Merge32K>0</Merge32K>
<CreateBatchFile>0</CreateBatchFile>
<BeforeCompile>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopU1X>0</nStopU1X>
<nStopU2X>0</nStopU2X>
</BeforeCompile>
<BeforeMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopB1X>0</nStopB1X>
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopA1X>0</nStopA1X>
<nStopA2X>0</nStopA2X>
</AfterMake>
<SelectedForBatchBuild>0</SelectedForBatchBuild>
<SVCSIdString></SVCSIdString>
</TargetCommonOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<GenerateAssemblyFile>0</GenerateAssemblyFile>
<AssembleAssemblyFile>0</AssembleAssemblyFile>
<PublicsOnly>0</PublicsOnly>
<StopOnExitCode>3</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
<BankNo>65535</BankNo>
</CommonProperty>
<DllOption>
<SimDllName>S8051.DLL</SimDllName>
<SimDllArguments></SimDllArguments>
<SimDlgDll>DP51.DLL</SimDlgDll>
<SimDlgDllArguments>-pDP8051</SimDlgDllArguments>
<TargetDllName>S8051.DLL</TargetDllName>
<TargetDllArguments></TargetDllArguments>
<TargetDlgDll>TP51.DLL</TargetDlgDll>
<TargetDlgDllArguments>-p51</TargetDlgDllArguments>
</DllOption>
<DebugOption>
<OPTHX>
<HexSelection>0</HexSelection>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
<Simulator>
<UseSimulator>1</UseSimulator>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>1</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<LimitSpeedToRealTime>1</LimitSpeedToRealTime>
<RestoreSysVw>1</RestoreSysVw>
</Simulator>
<Target>
<UseTarget>0</UseTarget>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>0</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<RestoreTracepoints>1</RestoreTracepoints>
<RestoreSysVw>1</RestoreSysVw>
</Target>
<RunDebugAfterBuild>0</RunDebugAfterBuild>
<TargetSelection>10</TargetSelection>
<SimDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
</SimDlls>
<TargetDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
<Driver>BIN\STCMON51.DLL</Driver>
</TargetDlls>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>0</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
<Capability>0</Capability>
<DriverSelection>-1</DriverSelection>
</Flash1>
<bUseTDR>0</bUseTDR>
<Flash2></Flash2>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
<pFcArmRoot></pFcArmRoot>
<FcArmLst>0</FcArmLst>
</Utilities>
<Target51>
<Target51Misc>
<MemoryModel>2</MemoryModel>
<RTOS>0</RTOS>
<RomSize>2</RomSize>
<DataHold>0</DataHold>
<XDataHold>0</XDataHold>
<UseOnchipRom>0</UseOnchipRom>
<UseOnchipArithmetic>0</UseOnchipArithmetic>
<UseMultipleDPTR>0</UseMultipleDPTR>
<UseOnchipXram>0</UseOnchipXram>
<HadIRAM>1</HadIRAM>
<HadXRAM>1</HadXRAM>
<HadIROM>1</HadIROM>
<Moda2>0</Moda2>
<Moddp2>0</Moddp2>
<Modp2>1</Modp2>
<Mod517dp>0</Mod517dp>
<Mod517au>0</Mod517au>
<Mode2>0</Mode2>
<useCB>0</useCB>
<useXB>0</useXB>
<useL251>1</useL251>
<useA251>0</useA251>
<Mx51>0</Mx51>
<ModC812>0</ModC812>
<ModCont>0</ModCont>
<Lp51>0</Lp51>
<useXBS>0</useXBS>
<ModDA>0</ModDA>
<ModAB2>0</ModAB2>
<Mx51P>0</Mx51P>
<hadXRAM2>0</hadXRAM2>
<uocXram2>0</uocXram2>
<ModC2>0</ModC2>
<ModH2>0</ModH2>
<Mdu_R515>0</Mdu_R515>
<Mdu_F120>0</Mdu_F120>
<Psoc>0</Psoc>
<hadIROM2>0</hadIROM2>
<ModSmx2>0</ModSmx2>
<cBanks>0</cBanks>
<xBanks>0</xBanks>
<OnChipMemories>
<RCB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0xffff</Size>
</RCB>
<RXB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</RXB>
<Ocm1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm1>
<Ocm2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm2>
<Ocm3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm3>
<Ocr1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr1>
<Ocr2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr2>
<Ocr3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr3>
<IRO>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0xfff9</Size>
</IRO>
<IRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x100</Size>
</IRA>
<XRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0xc00</Size>
</XRA>
<XRA512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA512>
<IROM512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM512>
</OnChipMemories>
</Target51Misc>
<C51>
<RegisterColoring>0</RegisterColoring>
<VariablesInOrder>1</VariablesInOrder>
<IntegerPromotion>0</IntegerPromotion>
<uAregs>0</uAregs>
<UseInterruptVector>1</UseInterruptVector>
<Fuzzy>3</Fuzzy>
<Optimize>0</Optimize>
<WarningLevel>2</WarningLevel>
<SizeSpeed>0</SizeSpeed>
<ObjectExtend>1</ObjectExtend>
<ACallAJmp>0</ACallAJmp>
<InterruptVectorAddress>0</InterruptVectorAddress>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath>..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\source\asp;..\source\debug;..\source\msp\uart;..\source\msp\simiic;..\source\bsp\oled;..\source\bsp\TTSSbsp</IncludePath>
</VariousControls>
</C51>
<Ax51>
<UseMpl>0</UseMpl>
<UseStandard>1</UseStandard>
<UseCase>0</UseCase>
<UseMod51>0</UseMod51>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Ax51>
<Lx51>
<useFile>0</useFile>
<linkonly>0</linkonly>
<UseMemoryFromTarget>1</UseMemoryFromTarget>
<CaseSensitiveSymbols>0</CaseSensitiveSymbols>
<WarningLevel>2</WarningLevel>
<DataOverlaying>1</DataOverlaying>
<OverlayString></OverlayString>
<MiscControls>REMOVEUNUSED</MiscControls>
<DisableWarningNumbers></DisableWarningNumbers>
<LinkerCmdFile></LinkerCmdFile>
<Assign></Assign>
<ReserveString></ReserveString>
<CClasses></CClasses>
<UserClasses></UserClasses>
<CSection></CSection>
<UserSection></UserSection>
<CodeBaseAddress></CodeBaseAddress>
<XDataBaseAddress></XDataBaseAddress>
<PDataBaseAddress></PDataBaseAddress>
<BitBaseAddress></BitBaseAddress>
<DataBaseAddress></DataBaseAddress>
<IDataBaseAddress></IDataBaseAddress>
<Precede></Precede>
<Stack></Stack>
<CodeSegmentName></CodeSegmentName>
<XDataSegmentName></XDataSegmentName>
<BitSegmentName></BitSegmentName>
<DataSegmentName></DataSegmentName>
<IDataSegmentName></IDataSegmentName>
</Lx51>
</Target51>
</TargetOption>
<Groups>
<Group>
<GroupName>app</GroupName>
<Files>
<File>
<FileName>app_weight.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_weight.c</FilePath>
</File>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\main.c</FilePath>
</File>
<File>
<FileName>app_config.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\app\app_config.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>asp</GroupName>
<Files>
<File>
<FileName>asp_schain.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\asp\asp_schain.c</FilePath>
</File>
<File>
<FileName>asp_lowpower.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\asp\asp_lowpower.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>cpu</GroupName>
<Files>
<File>
<FileName>STARTUP.A51</FileName>
<FileType>2</FileType>
<FilePath>..\source\cpu\STARTUP.A51</FilePath>
</File>
<File>
<FileName>stc_8_delay.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\cpu\stc_8_delay.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>msp</GroupName>
<Files>
<File>
<FileName>msp_uartN.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\uart\msp_uartN.c</FilePath>
</File>
<File>
<FileName>msp_time2.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\msp_time2.c</FilePath>
</File>
<File>
<FileName>msp_uart1.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\uart\msp_uart1.c</FilePath>
</File>
<File>
<FileName>msp_iicMx.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\msp_iicMx.c</FilePath>
</File>
<File>
<FileName>msp_eeprom.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\msp_eeprom.c</FilePath>
</File>
<File>
<FileName>msp_adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\msp\msp_adc.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>bsp</GroupName>
<Files>
<File>
<FileName>bsp_config.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\TTSSbsp\bsp_config.c</FilePath>
</File>
<File>
<FileName>bsp_led.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_led.c</FilePath>
</File>
<File>
<FileName>bsp_cs1232.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\bsp\bsp_cs1232.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>ctask</GroupName>
<Files>
<File>
<FileName>TTSS_task.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\ctask\TTSS_task.c</FilePath>
</File>
<File>
<FileName>TTSS_tick.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\ctask\TTSS_tick.c</FilePath>
</File>
<File>
<FileName>TTSS_time_stc.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\ctask\TTSS_time_stc.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>tpc</GroupName>
<Files>
<File>
<FileName>tpc_road.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\tpc\tpc_road.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>clib</GroupName>
<Files>
<File>
<FileName>c_lib.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\clib\c_lib.c</FilePath>
</File>
<File>
<FileName>c_delay.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\clib\c_delay.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>debug</GroupName>
<Files>
<File>
<FileName>cc_as_stc01_main.ini</FileName>
<FileType>5</FileType>
<FilePath>..\source\debug\cc_as_stc01_main.ini</FilePath>
</File>
<File>
<FileName>debug_drv.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\debug\debug_drv.c</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
</Project>

152
si4/keywords.txt

@ -0,0 +1,152 @@
#define, Keyword
#elif, Directive
#else, Directive
#endif, Directive
#if, Directive
#ifdef, Directive
#ifndef, Directive
#include, Keyword
#pragma, Keyword
#undef, Keyword
(, Delimiter
), Delimiter
",", Delimiter
;, Delimiter
abstract, Keyword
__abstract, Keyword
alignas, Keyword
alignof, Keyword
asm, Keyword
__asm, Keyword
assert, Debug
Assert, Debug
async, Keyword
auto, Keyword
bool, Keyword
break, Control
case, Control
catch, Control
cdecl, Keyword
__cdecl, Keyword
char, Keyword
class, Control
coclass, Control
const, Keyword
constexpr, Keyword
const_cast, Keyword
continue, Control
cout, Keyword
decltype, Keyword
default, Control
__delegate, Keyword
delete, Control
do, Control
double, Keyword
DWORD, Keyword
dynamic_cast, Keyword
each, Control
else, Control
enum, Control
__event, Keyword
except, Control
__except, Control
exception, Keyword
explicit, Keyword
export, Keyword
extern, Keyword
FALSE, Boolean
false, Boolean
FAR, Keyword
far, Keyword
final, Keyword
__finally, Control
float, Keyword
for, Control
fortran, Keyword
for_each, Control
friend, Keyword
__gc, Keyword
goto, Control
HUGE, Keyword
huge, Keyword
if, Control
inline, Keyword
INT, Keyword
int, Keyword
int16_t, Keyword
int32_t, Keyword
int64_t, Keyword
int8_t, Keyword
interface, Control
LONG, Keyword
long, Keyword
mutable, Keyword
namespace, Control
near, Keyword
NEAR, Keyword
new, Control
noexcept, Keyword
NULL, Null Value
nullptr, Null Value
__nullptr, Null Value
operator, Keyword
override, Keyword
pascal, Keyword
PASCAL, Keyword
private, Keyword
__property, Keyword
protected, Keyword
public, Keyword
ref, Keyword
REGISTER, Keyword
register, Keyword
reinterpret_cast, Keyword
return, Control
sealed, Keyword
short, Keyword
SHORT, Keyword
signed, Keyword
sizeof, Keyword
static, Keyword
static_cast, Keyword
struct, Control
__super, Keyword
switch, Control
template, Control
this, Keyword
thread_local, Keyword
throw, Control
TRUE, Boolean
true, Boolean
try, Control
__try, Control
TTSS_step01, Highlight
TTSS_Task_end, Highlight
TTSS_Task_init, Highlight
TTSS_Task_step, Highlight
TTSS_step01, Highlight
TTSS_step02,Highlight
TTSS_step03,Highlight
TTSS_step04,Highlight
TTSS_step05,Highlight
TTSS_step06,Highlight
TTSS_step07,Highlight
TTSS_Task_step, Highlight
typedef, Control
typeid, Keyword
typename, Keyword
UINT, Keyword
union, Control
unsigned, Keyword
using, Keyword
virtual, Keyword
VOID, Keyword
void, Keyword
volatile, Keyword
wchar_t, Keyword
while, Control
WORD, Keyword
{, Delimiter
[, Delimiter
], Delimiter
}, Delimiter

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_sym

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xab

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xad

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xc

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xf

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xm

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xr

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsb

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsd

Binary file not shown.

BIN
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj

Binary file not shown.

22
si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj_settings.xml

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectSettings
AppVer="4.00.0128"
AppVerMinReader="4.00.0034"
GlobalConfiguration="1"
GlobalWorkspace="0"
LocalsInDb="0"
IndexMembers="1"
IndexFragments="1"
UseMasterFileList="0"
SourceDir="..\..\source"
BackupDir="%PROJECT_DATA_DIR%\Backup"
MasterFileList="%PROJECT_SOURCE_DIR%\%PROJECT_NAME%_filelist.txt"
IsImportProject="0"
>
<Imports>
<ImportedLibs/>
</Imports>
<ParseConditions>
<Defines/>
</ParseConditions>
</ProjectSettings>

23
source/New0001.h

@ -0,0 +1,23 @@
day1
day2
day3
day4
day5
day6
day7
ECU功能验证

384
source/app/app_config.c

@ -0,0 +1,384 @@
#include "app_config.h"
//#include "../tpc/tpc_uart.h"
///#include "../bsp/bsp_cs1232.h"
#include "msp_eeprom.h"
///#include "../msp/msp_id.h"
#include "debug_drv.h"
#include "msp_uartN.h"
TS_GlobalRegisterSave_ S;
////TS_GlobalParam_ G;
void L3_R_2_S(void)
{
TTSS_run_times(4)////tst_v.i
{ ////ts_adc_samples[tst_v.i].pSPara = &TS_adc_SPara[tst_v.i];
Lc_buf_from_const_uc(D_struct2U8(S.adc_SPara[tst_v.i]),D_struct2U8(TS_adc_SPara[tst_v.i]),D_TS_adc_SPara_LEN);
}
///tst_weight.pSPara = &ts_weight_SPara;
Lc_buf_from_const_uc(D_struct2U8(S.weight_SPara),D_struct2U8(ts_weight_SPara),D_TS_weight_SPara_len);
}
void L3_S_2_R(void)
{
TTSS_run_times(4)////tst_v.i
{
Lc_buf_from_const_uc(D_struct2U8(TS_adc_SPara[tst_v.i]),D_struct2U8(S.adc_SPara[tst_v.i]),D_TS_adc_SPara_LEN);
ts_adc_samples[tst_v.i].pSPara = &TS_adc_SPara[tst_v.i];
}
///
Lc_buf_from_const_uc(D_struct2U8(ts_weight_SPara),D_struct2U8(S.weight_SPara),D_TS_weight_SPara_len);
tst_weight.pSPara = &ts_weight_SPara;
}
#define D_0xaa55 0xaa55
////返回0 并打印 ("\r\nSpara ok ");
/// 返回非零 为错误次数 最后一次ok
/// 返回100 严重错误 一次没有成功
vtype L3_S_init(void)
{
vtype ovt = 0;
////
/*
使
使
step 1 eeprom参数
step 2 spara初始化放到S eepromstep 1
step 3 ok 退
TTSS_run_times(4)////tst_v.i
{ ////ts_adc_samples[tst_v.i].pSPara = &TS_adc_SPara[tst_v.i];
Lc_buf_from_const_uc(D_struct2U8(S.adc_SPara[tst_v.i]),D_struct2U8(&TS_adc_SPara[tst_v.i]),D_TS_adc_SPara_LEN);
}
///tst_weight.pSPara = &ts_weight_SPara;
Lc_buf_from_const_uc(D_struct2U8(S.weight_SPara),D_struct2U8(&ts_weight_SPara),D_TS_weight_SPara_len);
*/
do{
L0_Iap_Read_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
printf1("\r\nread S: %d ",(int)ovt);
L1_uartD_Arrayhex(D_struct2U8(S),D_S_LEN);
if(0xaa55 == S.d0xaa55)
{////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>和应用强相关
L3_S_2_R();
////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<和应用强相关
printfs("\r\nSpara ok ");
return ovt;
}else
{
S.d0xaa55 = D_0xaa55;
printf1("\r\nProg %x",S.d0xaa55);
L3_R_2_S();
L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
}
}while(ovt ++< 2);
return 100;
}
/*
void L3_param_init(void)
{
int i;
for(i=0;i<D_ch_max_num;i++)
{
G.weight[i] = 0;
}
G.allweight = 0;
G._total_weight = 0;
G._total_zweight = 0;
//L3_eeprom_read_param();
}
*/
///出厂参数 向 保存参数
void L3_S(void)
{
/// Lc_buf_copy_uc((u8 *)&R.sd,(u8 *)&iapData,20);
//写入eeprom
/// if(L1_eeprom_write((U8*)&iapData,sizeof(TS_GlobalRegisterSave_)) == 0)
{
// L0_uart0_sendstr("e2p write success");
}
}
////把当前任务中的数据放入到保存参数(一般是eeprom
void L2_para_2_S(TS_para_ *t)
{////void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len)
/// L0_Iap_Program_array(t->add,);
}
//读取iap内容,写入reg
void L3_iap_2_reg(void)
{
/*
U8 len = 0,i = 0;
if(L1_eeprom_read((U8*)&iapData,&len) == 1)
{
L0_uart0_sendstr("e2p read failed\r\n");
return;
}
L0_uart0_sendstr("e2p read success\r\n");
Lc_buf_copy_uc((u8 *)&iapData,(u8 *)&R.sd,20);
*/
}
/*********
int L3_mcu_id_ok(void)
{
U8 i = 0,crc[2];
U32 enc_key;
//1.获取MCU_ID
L0_id_get_rom(G.e.mcu_id);
for(i=0;i<MCU_ID_LEN;i++)
{
L0_uart0_uchex(G.e.mcu_id[i]);
}
//2.读取eeprom中的加密信息
L0_Iap_Read_array(EEP_ENC_ADDR, (U8*)&eep_enc, MCU_ID_KEY_LEN + MCU_ID_LEN + 2);
crc16(crc,(U8*)&eep_enc,MCU_ID_KEY_LEN + MCU_ID_LEN);
if(eep_enc.crc[0] != crc[0] || eep_enc.crc[1] != crc[1])
{
L0_uart0_uc('-');
return 0;
}
//3.根据mcu_id和enc_key计算enc_val
enc_key = ((U32)eep_enc.enc_key[0] << 24) | (eep_enc.enc_key[1] << 16) | (eep_enc.enc_key[2] << 8) |(eep_enc.enc_key[3] << 0);
Lc_encrypt_id((U8*)G.e.mcu_enc_id, (U8*)G.e.mcu_id, enc_key, MCU_ID_LEN);
//4.判断enc_val是否一致
for(i=0;i<MCU_ID_KEY_LEN;i++)
{
if(G.e.mcu_enc_id[i] != eep_enc.enc_val[i])
{
return 0;
}
}
return 1;
}
**********/
#if 0
TS_EEPROM_ENC_ eep_enc;
void L0_reg_reset()
{/******
//R.p.reset = 0;
R.p.adc_ch_status = ADC_status_ch1_Ready | ADC_status_ch2_Ready | ADC_status_ch3_Ready | ADC_status_ch4_Ready; //修改采集通道
R.p.slaver_id = D_UART0_485_SLAVER_ID;
R.zero = 0;
R.status_eep_save = 0;
// R.reset = 0;
R.p.weight_max = 150; //500kg
R.p.lmd = 15; //2mv/v
R.p.adc_blur_mid = 1;
R.p.adc_blur_avg = 6;
R.p.adc_blur_shift[0] = 0;
R.p.adc_blur_shift[1] = 2;
R.p.adc_blur_shift[2] = 4;
R.p.adc_blur_threshold[0] = 1600; //1.6kg
R.p.adc_blur_threshold[1] = 700; //0.7kg
*********/
///L3_reg_2_iap();
}
void L0_reg_init(void)
{
R.sd.rev0x55aa55aa = 0x55aa55aa;
//R.total_weight = R.total_zweight = 0;
///L0_reg_reset();
L4_iap_2_reg();
}
S32 L3_count_std_weight(S32 weight)
{
U8 i = 0;
U16 ratio = 100;
weight = (weight - G._total_zweight)/10;
for(i=0;i<D_weight_std_num;i++)
{
if(R.p.weight_std[i].weight_range == 0 || (R.p.weight_std[i].weight_range * 100) >= weight)
{
break;
}
}
if(i<D_weight_std_num && R.p.weight_std[i].ratio != 0)
{
ratio = R.p.weight_std[i].ratio;
}
return (S32)(weight * 1.0 * ratio / 100) ;
}
#endif
void L0_main_lowp(void)
{//
BITN_1(P_SW2 ,BITN7);USBCON = 0;
D_stdIO_P0_ALL();
D_stdIO_P1_ALL();
D_stdIO_P2_ALL();
D_stdIO_P3_ALL();
D_stdIO_P4_ALL();
D_stdIO_P5_ALL();
WKTCL = 0xff; //设定掉电唤醒时钟约为 1 秒钟 WKTCH = 0x87;
WKTCH = 0x87;
///SetWakeUpTime(10000);
D_P24_REV();
Lc_delay_ms(500);
D_P24_REV();
Lc_delay_ms(500);
D_P24_REV();
Lc_delay_ms(500);
D_P24_ON();
P_SW2|=0x80;
P0PU = 0;
P1PU = 0;
P2PU = 0;
P3PU = 0;
P4PU = 0;
P5PU = 0;
P0SR =0xff;
P1SR =0xff;
P2SR =0xff;
P3SR =0xff;
P4SR =0xff;
P5SR =0xff;
P0DR =0xff;
P1DR =0xff;
P2DR =0xff;
P3DR =0xff;
P4DR =0xff;
P5DR =0xff;
P0IE =0;
P1IE =0;
P2IE =0;
P3IE =0;
P4IE =0;
P5IE =0;
USBCON = 0;
///USBCON = 0x80;
D_HighR_P0_ALL();
D_HighR_P1_ALL();
D_HighR_P2_ALL();
D_HighR_P3_ALL();
D_HighR_P4_ALL();
D_HighR_P5_ALL();
P_SW2 = 0x80;
// XOSCCR =0;
///HIRCCR = 0;
/*****
IRC32KCR = 0x80; //启动内部32K IRC
while (!(IRC32KCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CLKSEL = 0x03; //选择内部32K
P_SW2 = 0x00;
D_stdIO_P0_ALL();
D_stdIO_P1_ALL();
D_stdIO_P2_ALL();
D_stdIO_P3_ALL();
D_stdIO_P4_ALL();
D_stdIO_P5_ALL();
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
P5 = 0xff;
*******/
RSTCFG=0;//没有变化43ua 41ua
while(9)
{
D_HighR_P2_ALL();
_nop_();
_nop_();
PCON = 0x02; ////2222 //MCU进入掉电模式
///D_LPCD_INT_CLOSE(); 对掉电唤醒后有一个中断进来没有效果
_nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_();
/// D_P24_REV();
D_stdIO_P2_ALL();
D_P24_REV();
Lc_delay_ms(300);
D_P24_REV();
}
}

264
source/app/app_config.h

@ -0,0 +1,264 @@
#ifndef APP_CONFIG_H
#define APP_CONFIG_H
#include "c_type51.h"
//#include "asp_para.h"
#include "app_weight.h"
///#include "app_save.h"
#define APP_VERSION 0x10
#define D_MCU_BIGENDIAN 1
// #define D_MCU_LITTLEENDIAN 1
enum tp_handle
{
TP_HANDLED,
TP_UNHANDLE
};
////#define baud_rade L3_baud_rate_change(G.p.baud_rate)
//STEP 3 Register CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
///存放全局需要保存的数据
///cc 2023/04/07--5:12:12 包含系统运行需要的:通讯参数 低功耗配置 采集配置 功能配置(称重)等
/*
S中 TS_GlobalRegisterSave_
code中和程序hex文件一体
S保存参数 eeprom中 eeprom eeprom
F出厂参数 code//hex
R运行参数 ram中
C缓存参数 ram
--> --> -->
= >= >=
R运行参数 eeprom中的保存参数中
S保存参数直接放到eeprom
register
,
512
512
eeprom
eeprom中的0x55aa,F然后放入eeprom中 S R参数中
*/
/*********
///cc 2023/04/08--4:2:23 需要整理
1,
1 512---4-6ms
01
,,
,
--->,
1,,512
30
2, ,.--->,;
flash 28k 8k EEp 28K的最后8K 5000h-6FFFh
*******/
/*******
app_config app_save
app_save ,
,西,,使bsp中
asp ,app通过参数调用asp,使.
,.
app ,
asp app support program wifi的模式设置,adc的读取后的处理
bsp board support program ,wdt,wifi的底层配置函数,sensor
msp mcu support program ,cpu自身的外设,uart led
cpu
*****/
/*******
adc采样值
^
|
| o
| |
| o |
| | |
| ---|---- |------------0=adc=0
0 | |D_ADC_OFFSET
|____|_____|____________> adc + D_ADC_OFFSET
0 40 80
西:
1,< >
2, 0kg的时候的<>
3,<> + <>
3.1 ,250kg,,,.<250kg,>
4, : <(+-10kg)>,<>
,.
5,,<>,,.
4,.
B:4,.
---->C: 4.5 ,
c,,0 (H1sL0.5s)3
西:
< > Byte x n=? .
Byte x n=? .
<> Byte x n=? .
<> ,
,250kg
,id之类的
3,,,使.使.
*****/
////整体放入eeprom的扇区种
typedef struct
{
//RO Register
//RW Register
TS_adc_SPara_ adc_SPara[4];
TS_weight_SPara_ weight_SPara;//// 称重的参数
U16 d0xaa55;
}TS_GlobalRegisterSave_;
extern TS_GlobalRegisterSave_ S;
#define D_S_LEN (D_TS_weight_SPara_len + D_TS_adc_SPara_LEN*D_ADC_CHANNEL_NUM +2 +8)///+8为了容错及扩展
///cc 2023/04/07--15:4:20 独立任务有独立的存储 ,还是比较麻烦,简单至上吧
/*
typedef struct
{
//RO Register
U16 add;
U16 num;
u8* pdat;
U16 0xaa55;////作为本任务保存的
}TS_para_;
*/
#define D_GlobalRegister_size 2
//寄存器内存基地址
#define REG_MEM_BASE ((U16*)(&S)) //寄存器基础地址(本文件外部不应该使用该宏定义)
//变量地址转寄存器
#define MEM_2_REG(mem) (((U16*)(mem) - REG_MEM_BASE) + 1)
//寄存器转变量地址
#define REG_2_MEM(reg) (REG_MEM_BASE + (U16)((reg) - 1))
#define D_EEP_BASE 0x0
extern vtype L3_S_init(void);
extern int L3_mcu_id_ok();
extern S32 L3_count_std_weight(S32 weight);
extern void L3_eeprom_persist_param(void);
extern U8 L1_para_read(U8 *buf,U8 *len);
extern U8 L1_para_write(U8 *buf, U8 len);
extern void L0_main_lowp(void);
extern void L3_S_2_R(void);
extern void L3_R_2_S(void);
#if 0
typedef struct
{
/// U8 enc_key[MCU_ID_KEY_LEN];
/// U8 mcu_id[MCU_ID_LEN];
/// U8 mcu_enc_id[MCU_ID_LEN];
}McuEncryptInfo;
#define D_ch_max_num 4
typedef struct global_param
{
//EncryptInfo
McuEncryptInfo e;
//Global Variables
S32 weight[D_ch_max_num]; //4路重量
S32 allweight; //总重量
S32 _total_weight; //实际重量*1000
S32 _total_zweight; //实际皮重*1000
}TS_GlobalParam_;
extern TS_GlobalParam_ G;
///extern TS_eeprom_param_ eep_param;
///extern TS_EEPROM_ENC_ eep_enc;
#endif
#endif

32
source/app/app_task_reg.h

@ -0,0 +1,32 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_REG_H
#define _APP_TASK_REG_H
#include "TTSS_task.h"
#include "c_lib.h"
typedef struct _s_task_reglisten
{
TS_task task;
}S_TASK_REGVAL_LISTEN;
extern S_TASK_REGVAL_LISTEN s_task_reglisten;
extern void L3_task_reglisten_init(void);
extern void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s);
#endif // #ifndef _APP_TASK_ADC_H

607
source/app/app_weight.c

@ -0,0 +1,607 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_weight.h"
#include "app_config.h"
#include "debug_drv.h"
#include "msp_eeprom.h"
#define D_0kg 0
#define D_20kg 200///0x00c8
#define D_85kg 850////0x0352
/*
#define D_Rsensor_out_D_0kg 0x18D9
#define D_Rsensor_out_D_20kg 0x1B8B
#define D_Rsensor_out_D_85kg 0x244D
*/
#define D_Rsensor_out_D_0kg 0x18D9
#define D_Rsensor_out_D_20kg 0x1c2c
#define D_Rsensor_out_D_85kg 0x26f9
///#define D_20kg 190
///cc 2023/04/06--6:41:48 西安方块 传感器 根据传感器调配 程序应该专门数据结构
///cc 2023/04/06--7:50:26 应该是tst_weight.out6的值
///cc 2023/04/09--8:11:50 adc改为out 因为到了weight这一层 已经不合适用adc,adc的和值 输出out给了weight来做运算
TS_weight_SPara_ ts_weight_SPara =
{
'W',//0 1 u8 rev1;
'E',//1 2 u8 rev2;
D_0kg ,D_Rsensor_out_D_0kg,
D_20kg,D_Rsensor_out_D_20kg,
D_85kg,D_Rsensor_out_D_85kg,
//2 3 TS_weight_point_ zerows[3]; ///4x3=12 手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
'A',//3 4 u8 rev3;
' ',//4 5 u8 rev4;
};
TS_TASK_weight_ tst_weight;
#define D_task_WEIGHT_add 12
#define D_task_WEIGHT_CAL 13
#define D_task_WEIGHT_get 14
#define D_task_WEIGHT_zero 15
///#define D_task_WEIGHT_CAL 124
#define D_task_WEIGHT_out 45
#define D_task_WEIGHT_Sline 11
#define D_task_WEIGHT_getADC 22
///#define D_task_WEIGHT_CAL 33
////#define D_task_WEIGHT_Sline
void L2_task_weight_init(u8 openclose)
{
if(openclose)
{
L0_ADS1213_INIT(D_ADS1213_GAIN_128);
L2_task_adc_init(0);
L2_task_adc_init(1);
L2_task_adc_init(2);
L2_task_adc_init(3);
}else
{
tst_weight.pSPara = &ts_weight_SPara;
}
/*
L2_task_adc_SAinit(0,&S.sd.ADC_shiftaverage_a,&S.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(1,&S.sd.ADC_shiftaverage_a,&S.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(2,&S.sd.ADC_shiftaverage_a,&S.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(3,&S.sd.ADC_shiftaverage_a,&S.sd.ADC_shiftaverage_b);
ts_adc_samples[0].offset = S.sd.offset[0];
ts_adc_samples[1].offset = S.sd.offset[1];
ts_adc_samples[2].offset = S.sd.offset[2];
ts_adc_samples[3].offset = S.sd.offset[3];
*/
}
void L3_task_weight_init(void)
{
//显示任务初始化
L1_task_reg_clear(&tst_weight.task);
L3_task_s_go(tst_weight,D_task_init);
L2_task_weight_init(1);
///Lc_buf_from_const_uc(U8 * d, const U8 * s, U16 num)
///tst_weight.pSPara->ts_WPoint
}
#define D_debug_ch D_Wch2
///L3_task_weight_handler(&tst_weight);
void L3_task_weight_handler(TS_TASK_weight_ *s)
{
L2_task_adc_sample(&ts_adc_samples[D_Wch1]);
L2_task_adc_sample(&ts_adc_samples[D_Wch2]);
L2_task_adc_sample(&ts_adc_samples[D_Wch3]);
L2_task_adc_sample(&ts_adc_samples[D_Wch4]);
TTSS_Task_init():
L0_waitFree_uartN(0);
/*
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[0].offset,ts_adc_samples[0].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[1].offset,ts_adc_samples[1].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[2].offset,ts_adc_samples[2].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[3].offset,ts_adc_samples[3].offset);
printf('4');
*/
s->slow = 0;
s->zero = 0;s->kgx10_zero = 0;
printfs(" L3_task_weight_handler ");
L2_task_go(D_task_WEIGHT_get);
TTSS_Task_step(D_task_WEIGHT_get):
if(1 == ts_adc_samples[D_Wch4].ok)
{//
ts_adc_samples[0].ok = 0;
ts_adc_samples[1].ok = 0;
ts_adc_samples[2].ok = 0;
ts_adc_samples[3].ok = 0;
s->slow ++;
// L0_uart0_uc('%');
L2_task_go(D_task_WEIGHT_Sline);
}
TTSS_Task_step(D_task_WEIGHT_Sline):
if (s->slow >= 1)////采样减速
{s->slow = 0;
///调用asp——adc中的输出 out3
/************/
///cc 2023/04/06--8:9:18 选择使用哪一条滤波线
ts_adc_samples[0].out5 = ts_adc_samples[0].ts_SAa.out4_shift;
ts_adc_samples[1].out5 = ts_adc_samples[1].ts_SAa.out4_shift;
ts_adc_samples[2].out5 = ts_adc_samples[2].ts_SAa.out4_shift;
ts_adc_samples[3].out5 = ts_adc_samples[3].ts_SAa.out4_shift;
L2_task_go(D_task_WEIGHT_getADC);
}else
{
L2_task_go(D_task_WEIGHT_get);
}
//L2_task_go(D_task_WEIGHT_getADC);
TTSS_Task_step(D_task_WEIGHT_getADC):
////四个传感器相加后平均
tst_weight.sum32 = ts_adc_samples[0].out5;
tst_weight.sum32 += ts_adc_samples[1].out5;
tst_weight.sum32 += ts_adc_samples[2].out5;
tst_weight.sum32 += ts_adc_samples[3].out5;
tst_weight.out6 = tst_weight.sum32 >>2;
L2_task_go(D_task_WEIGHT_CAL);
TTSS_Task_step(D_task_WEIGHT_CAL):
tst_weight.adc32 = tst_weight.out6;
L3_task_weight_cal();
L2_task_go(D_task_WEIGHT_out);
TTSS_Task_step(D_task_WEIGHT_out):
if(tst_weight.kgx10 > tst_weight.kgx10_zero)
{
s->kgx10_out = s->kgx10 - s->kgx10_zero;
}else
{
s->kgx10_out = 0 ;
}
//// D_LED1_REV(); L4_weight_out(); D_LED1_REV();
/// L4_weight_print();///需要调试的时候打开!!!!!!!!!!!!!!!
L2_task_Tdelay_go(D_Tdelay_200ms, D_task_WEIGHT_get);
/// L2_task_go(D_task_WEIGHT_get);
TTSS_Task_step(D_task_WEIGHT_zero):
L2_task_go(D_task_WEIGHT_get);
TTSS_Task_end();
}
void L3_task_weight_cal(void)
{
if(tst_weight.adc32 <= (vU32)S.weight_SPara.ts_WPoint[1].adc)
{
if(tst_weight.adc32 <= (vU32)S.weight_SPara.ts_WPoint[0].adc )
{
tst_weight.adc32 = (vU32)S.weight_SPara.ts_WPoint[0].adc;
}
///0-0-40KG
tst_weight.t32a = (tst_weight.adc32-(vU32)S.weight_SPara.ts_WPoint[0].adc);////有可能<0
tst_weight.t32b = (vU32)(S.weight_SPara.ts_WPoint[1].adc-S.weight_SPara.ts_WPoint[0].adc);
tst_weight.t32a *= (vU32)(S.weight_SPara.ts_WPoint[1].kg - S.weight_SPara.ts_WPoint[0].kg);
tst_weight.t32a /= tst_weight.t32b;
}else
{ ///40KG 80KG
tst_weight.t32a = (vU32)(tst_weight.adc32-S.weight_SPara.ts_WPoint[1].adc);////有可能大于b
tst_weight.t32b = (vU32)(S.weight_SPara.ts_WPoint[2].adc-S.weight_SPara.ts_WPoint[1].adc);
tst_weight.t32a *= (vU32)(S.weight_SPara.ts_WPoint[2].kg-S.weight_SPara.ts_WPoint[1].kg) ;
tst_weight.t32a /= tst_weight.t32b;
tst_weight.t32a += (vU32)S.weight_SPara.ts_WPoint[1].kg;
}
tst_weight.kgx10 = (vU16)tst_weight.t32a;
}
/*
#define D_0kg 0
#define D_20kg 200///0x00c8
#define D_85kg 850////0x0352
#define D_Rsensor_out_D_0kg 0x18D9
#define D_Rsensor_out_D_20kg 0x1B8B
#define D_Rsensor_out_D_85kg 0x244D
*/
void L3_weight_ONdebug(u8 filter)//// ON listen function
{
if(filter == pd->filter)
{///filter num d1 d2 d3 ....dn
//// FE 08 11 22 33 44 55 66 77 88
/// printf("\r\nDdebug:FD R1 R2 R3 R4 R5 R6 ocr FD->");
/// printf4("22 ch:(%2X)-%2X S %2X=%2X\r\n",(int)pd->R1,(int)pd->R2,(int)pd->R3,(int)pd->ocr);
L1_uartD_Arrayhex((u8*)pd,9);
switch (pd->ocr)
{
case 0x20:
//// 选择一个砝码,发送0x12指令,然后读取的数据 和砝码的重量使用 20 21 22参数来
///fx R1 R2 R3R4 R5R6 ocr
///Fe ch 00 2233 4455 20 0x2233 kg= 0x4455 adc
///Fe 00 00 0000 18D9 20
///Fe 01 00 00c8 1c2c 20
///Fe 02 00 0352 26f9 20
/// 0352 26f9
///00c8 1c2c
///Fe 22 33 44 55 21
///Fe 22 33 44 55 22
if(pd->R1 < 3)
ts_weight_SPara.ts_WPoint[pd->R1].kg = D_2uc_u16(pd->R3,pd->R4);
ts_weight_SPara.ts_WPoint[pd->R1].adc = D_2uc_u16(pd->R5,pd->R6);
printf5("\r\nset %d: %4x(%6d) %4x(%6d)\r\n",(int)pd->R1,
ts_weight_SPara.ts_WPoint[pd->R1].kg,ts_weight_SPara.ts_WPoint[pd->R1].kg,
ts_weight_SPara.ts_WPoint[pd->R1].adc,ts_weight_SPara.ts_WPoint[pd->R1].adc); {
}
L3_R_2_S();
L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
break;
case 0x35: ///// '5'///
//// 选择一个砝码,发送0x12指令,然后读取的数据 和砝码的重量使用 20 21 22参数来
///fx R1 R2 R3R4 R5R6 ocr
///Fe ch 00 2233 4455 35 kg= 0x2233
////校准20kg 输入 Fe 01 00 00 c8 02 00 35
///Fe 01 00 00 c8 02 00 35 kg= 0x00c8=200d///需要校准的重量的 20kg 200d=0xc8
///校准20kg 输入 Fe 01 00 00 c8 02 00 35
/// Fe 00 00 00 00 01 00 35 校准零点 不需要上电即可
/// Fe 01 00 00 c8 02 00 35 20kg 放置20kg 然后输入
/// Fe 02 00 01 d6 03 00 35 47kg 10个3kg砝码实际是27kg+20kg
////如果需要上位机设置 需要在上位机的串口 加上D4 D代表chuandi
if(pd->R1 < 3)
{
ts_weight_SPara.ts_WPoint[pd->R1].kg = D_2uc_u16(pd->R3,pd->R4);
ts_weight_SPara.ts_WPoint[pd->R1].adc = tst_weight.adc32;////使用当前采样值
printf5("\r\nset %d: %4x(%6d) %4x(%6d)\r\n",(int)pd->R1,
ts_weight_SPara.ts_WPoint[pd->R1].kg,ts_weight_SPara.ts_WPoint[pd->R1].kg,
ts_weight_SPara.ts_WPoint[pd->R1].adc,ts_weight_SPara.ts_WPoint[pd->R1].adc);
}
L3_R_2_S();
L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
break;
case 0x21: /// 清零指令 把当前的重量值作为0点; 可以在pad上配置参数
////Fe 223344556677 21
L4_weight_print();
tst_weight.kgx10_zero = tst_weight.kgx10;
printf2("\r\n kgx10_zero= %4x(%4d)",tst_weight.kgx10_zero,tst_weight.kgx10_zero);
break;
case 0x23:
///Fe 11 22 33 44 55 66 23
TTSS_run_times(3)
{
printf5("\r\n%d: %4x(%4d ) %4x(%6d)\r\n",(int)tst_v.i,
ts_weight_SPara.ts_WPoint[tst_v.i].kg,ts_weight_SPara.ts_WPoint[tst_v.i].kg,
ts_weight_SPara.ts_WPoint[tst_v.i].adc,ts_weight_SPara.ts_WPoint[tst_v.i].adc);
}
break;
case 0x32: ///读取当前的重量和传感器数值
///Fe 223344556677 12
printfs("\r\n ");
L4_weight_print();
break;
case 0x33: ///读取当前的重量和传感器数值 hex
///Fe 223344556677 12
D_LED1_REV();
L4_weight_out();
D_LED1_REV();
break;
default:
printfs(" pp error\r\n ");
break;
};
printfs("333");
}
}
void L4_weight_print(void)
{
L1_uartD_ushex(ts_adc_samples[0].out1_adc);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[1].out1_adc);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[2].out1_adc);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[3].out1_adc);L1_uartD_uc(' ');
/* L1_uartD_uc('|');L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[0].out2_offset);L1_uartD_uc(' ');////调整偏移量后的值
L1_uartD_ushex(ts_adc_samples[1].out2_offset);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[2].out2_offset);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[3].out2_offset);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[0].out5);L1_uartD_uc(' ');////调整偏移量后的值
L1_uartD_ushex(ts_adc_samples[1].out5);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[2].out5);L1_uartD_uc(' ');
L1_uartD_ushex(ts_adc_samples[3].out5);L1_uartD_uc(' ');
*/
L1_uartD_uc('|');L1_uartD_uc(' ');
L1_uartD_ushex((vU16)tst_weight.adc32); L1_uartD_uc(' ');///参与运算的值
printf2(" (%d)%4x ", tst_weight.kgx10,tst_weight.kgx10);
printf2("out (%d)%4x\r\n", tst_weight.kgx10_out,tst_weight.kgx10_out);
}
TS_weight_out_ ts_weight_out;
void L4_weight_out(void)
{
ts_weight_out.fx = 0x55;
ts_weight_out.sensor_adc[0]=ts_adc_samples[0].out1_adc;
ts_weight_out.sensor_adc[1]=ts_adc_samples[1].out1_adc;
ts_weight_out.sensor_adc[2]=ts_adc_samples[2].out1_adc;
ts_weight_out.sensor_adc[3]=ts_adc_samples[3].out1_adc;
ts_weight_out.kgx10_out = tst_weight.kgx10_out;
ts_weight_out.adc32= tst_weight.adc32;////采样值用作校准时使用
ts_weight_out.ocr =0x33;
#if 0
ts_weight_out.num = 17;
#else
ts_weight_out.num = 15;
#endif
ts_weight_out.out6= tst_weight.out6;
L1_uartD_Array((u8 *)&ts_weight_out,ts_weight_out.num);
}
#if 0
void L3_adc_zero(void)
{
L3_out_zero(0);
L3_out_zero(1);
L3_out_zero(2);
L3_out_zero(3);
// printf("\r\niapData.zeroout= %d = 0x%4x\r\n", iapData.zeroout, iapData.zeroout);
// printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[0].offset,ts_adc_samples[0].offset);
/*
S.sd.offset[0] = ts_adc_samples[0].offset;
S.sd.offset[1] = ts_adc_samples[1].offset;
S.sd.offset[2] = ts_adc_samples[2].offset;
S.sd.offset[3] = ts_adc_samples[3].offset;
ts_weight_SPara.offset[0] = S.sd.offset[0];
ts_weight_SPara.offset[1] = S.sd.offset[1];
ts_weight_SPara.offset[2] = S.sd.offset[2];
ts_weight_SPara.offset[3] = S.sd.offset[3];
L0_waitFree_uartN(0);
printf("\r\nR.sd.offset 0x%4x,0x%4x,0x%4x,0x%4x,\r\n",S.sd.offset[0],S.sd.offset[1],S.sd.offset[2],S.sd.offset[3]);
*/
/// L4_reg_2_iap();///写入iap
/// L4_iap_2_reg();///读取出来验证
}
void L3_task_weight_set(Ts_uart_rev_ *ph4)
{
TS_P_debug *td;
if(ph4->debugok)
{ ph4->debugok = 0;
td = (TS_P_debug *)ph4->buf;
/// TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
L0_uartN_uchexArray(0,ph4->buf, 8);
if(0xfd == td->filter)
{
if(0x04 == td->R1)///设置四个传感器的清零
{ //// fd 04 33 44 55
L0_uart0_sendstr("\r\n 4sensor zero \r\n");
L3_adc_zero();
}else if(0x01 == td->R1)///设置重量的清零
{ //// fd 04 33 44 55
L0_uart0_sendstr("\r\n--weight zero-- \r\na b= ");
}else if(0x02 == td->R1)///读取
{
if(0x00 == td->R2)
{//// fd 02 00 44 55
L0_uart0_sendstr("\r\n--read iapData-- \r\n");
L4_print_iap(&iapData);
}else
{//// fd 02 33 44 55
L0_uart0_sendstr("\r\n--read R.sd-- \r\n");
L4_print_iap(&R.sd);
}
}
else
{
L0_uart0_sendstr("\r\n command error \r\n");
}
}
else if(0xf5 == td->filter)
{///设置重量
if(td->R1 < 3)///
{
//// R1 R2 R3
//// f5 00 33 44 55 把当前的adc的值作为第R1个校准点的值
R.sd.zerows[td->R1].adc = (vU16)tst_weight.out6;
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\n set[ %d].adc = 0x%04x\r\n",(int)td->R1, (vU16)tst_weight.out6);
}
else if(0xf6 == td->filter)
{///设置砝码
if(td->R1 < 3)///
{
//// R1 R2 R3
//// f5 00 33 44 55 把当前第R1个校准曲线的点的kg的值 0x3344
R.sd.zerows[td->R1].kg = D_2uc_u16(R2,R3);
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\nset [ %d],Kg = 0x%04x\r\n",(int)td->R1, R.sd.zerows[td->R1].kg );
}
else
{
}
}
}
/////////cc 2023/04/06--7:3:24 协议解析
void L3_weight_setPara(u8 filter)
{
if(filter == Ts_debug.td->filter)
{
L1_uartD_uc('D');
L0_uart0_0d0a();
if(0x01 == Ts_debug.td->ocr)
{
if(0x04 == Ts_debug.td->R1)///设置四个传感器的清零
{ //// fd 04 33 44 01
L0_uart0_sendstr("\r\n 4sensor zero \r\n");
L3_adc_zero();
}else if(0x01 == Ts_debug.td->R1)///设置重量的清零
{ //// fd 01 33 44 01
L0_uart0_sendstr("\r\n--weight zero-- \r\na b= ");
}else if(0x02 == Ts_debug.td->R1)///读取
{
if(0x00 == Ts_debug.td->R2)
{//// fd 02 00 44 01
L0_uart0_sendstr("\r\n--read ts_weight_save-- \r\n");
L4_print_iap(&ts_weight_save);
}else
{//// fd 02 33 44 01
L0_uart0_sendstr("\r\n--read R.sd-- \r\n");
L4_print_iap(&R.sd);
}
}
else
{
L0_uart0_sendstr("\r\n command error \r\n");
}
}
else if(0x02 == Ts_debug.td->ocr)
{///设置重量
if(Ts_debug.td->R1 < 3)///
{
//// R1 R2 R3
//// fd 00 33 44 02 把当前的adc的值作为第R1个校准点的值
R.sd.zerows[Ts_debug.td->R1].adc = (vU16)tst_weight.out6;
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\n set[ %d].adc = 0x%04x\r\n",(int)Ts_debug.td->R1, (vU16)tst_weight.out6);
}
else if(0x03 == Ts_debug.td->ocr)
{///设置砝码
if(Ts_debug.td->R1 < 3)///
{ //200
//// R1 R2 R3
//// fd 00 33 44 03 把当前第R1个校准曲线的点的kg的值 0x3344
R.sd.zerows[Ts_debug.td->R1].kg = D_2uc_u16(Ts_debug.td->R2,Ts_debug.td->R3);
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证 20 14
}else
{
}
L0_waitFree_uartN(0);
printf("\r\nset [ %d],Kg = 0x%04x\r\n",(int)Ts_debug.td->R1, R.sd.zerows[Ts_debug.td->R1].kg );
}
else
{
}
}
}
#endif

193
source/app/app_weight.h

@ -0,0 +1,193 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220109
/// @note cc_AS_stc02
/*******************
xxx.x
Layer4: send/show
write to buffer -->send
-----------------------------
weight = cal(adc32)
Layer3: app weight
tst_weight.adc32 = ts_adc_samples[0].out5;
线 line
-----------------------------
out3
out2
Layer2: asp asp_adc
out1 adc
-------------------------
void L0_ADS1231_readCH2(vtype ch,vU16 *d)
Layer1: bsp: bsp_cs1232 adc的采样
*******************/
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_WEIGHT_H
#define _APP_WEIGHT_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "asp_schain.h"
#include "tpc_debug.h"
/////////#include "asp_weight_save.h"
#include "bsp_config.h"
#include "msp_uart1.h"
#include "../bsp/bsp_cs1232.h"
/////水一般是18-19升,再加上桶,就是大约20公斤
typedef struct
{
///40Bytes
u8 fx;///
u8 num;///从fx开始算起 到结束//12,
vU16 sensor_adc[4];//// 34 56 78 90
vU16 kgx10_out;//// 12
vU16 adc32;//// 12
u8 ocr;//// 3
vU16 out6;//// 12
}TS_weight_out_;
typedef struct
{
vU16 kg;
vU16 adc; ///kg 对应的adc的采样值
}TS_weight_point_;///8Bytes
#define D_rev0x55aa55aa 0x55aa55aa
////需要向eeprom中存储的数据
typedef struct
{
///40Bytes
u8 rev1;
u8 rev2;
TS_weight_point_ ts_WPoint[3]; ///4x3=12 手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
u8 rev3;
u8 rev4;
}TS_weight_SPara_;
////extern TS_weight_SPara_ ts_weight_SPara;
#define D_TS_weight_SPara_len 16///
extern TS_weight_SPara_ ts_weight_SPara;
typedef struct
{
TS_task task;////如果
/////S参数区
TS_weight_SPara_ *pSPara; ///
/////S参数区
vS32 rough_weight;
vU32 adc32;
vU32 sum32;
vU32 sum32b;
vU32 out6;
vU32 t32a,t32b;
/// ts_weight_sheet_
u8 slow;
u8 zero;
u8 pp;
vU16 kgx10;///计算出来的重量
vU16 kgx10_zero;///
vU16 kgx10_out;///
}TS_TASK_weight_;
extern TS_TASK_weight_ tst_weight;
/*******
^
|
| o
| |
| o |
| | |
o | |
| | |
|____|_____|____________>
0 40 80
[0] [1] [2]
20KG 40kg
190 290
19kg 29kg
,adc在一定范围内
:0 40 80
0+-% 40+-% 80+-%
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1235,
D_20kg,0x5678,
D_40kg,0x789a,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1234,
D_20kg,0x5678,
D_40kg,0x789b,
factory_ws
0 kg = 0x1235
190 kg = 0x5678
290 kg = 0x789a
zerows
0 kg = 0x1234
190 kg = 0x5678
290 kg = 0x789b
**/
////
extern void L3_task_weight_cal(void);
extern void L3_task_weight_init(void);
extern void L3_task_weight_handler(TS_TASK_weight_ *s);
///extern void L3_task_weight_set(Ts_uart_rev_ *ph4);
///extern void L3_weight_setPara(u8 filter);
extern void L3_weight_ONdebug(u8 filter);
extern void L4_weight_print(void);
void L4_weight_out(void);
#define D_get_weight() tst_weight.kgx10
#endif // #ifndef _APP_TASK_ADC_H

169
source/app/main.c

@ -0,0 +1,169 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023 CCSENS
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
/// 下面是一个含有两个参数的函数的注释说明(简述)
///
/// 这里写该函数的详述信息
/// @param a 被测试的变量(param描述参数)
/// @param s 指向描述测试信息的字符串
/// @return 测试结果(return描述返回值)
/// @see Test() (本函数参考其它的相关的函数,这里作一个链接)
/// @note (note描述需要注意的问题)
//===============================================
//寄存器头文件
//===============================================
/// 20221023_175541 CCmodify
#include "main.h"
#include "asp_lowpower.h"
void L0_RTC_init(void)
{
P_SW2 = 0x80;
// XOSCCR =0;
///HIRCCR = 0;
IRC32KCR = 0x80; //启动内部32K IRC
while (!(IRC32KCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
/// CLKSEL = 0x03; //选择内部32K
RTCCFG = 3;
///RTCCFG |= 0x02; //选择内部 32K 作为 RTC 时钟源 RTCCFG | = 0x02; / / Select internal 32K as RTC, clock source
RTCCR = 1;
printf3("\r\n %X %X:%X",(int)(DAY), (int)(MIN), (int)(SEC));
D_stdIO_P2(BITN4);D_P24_REV();
Lc_delay_ms(500);
printf3("\r\n %X %X:%X",(int)(DAY), (int)(MIN), (int)(SEC));
Lc_delay_ms(200);D_stdIO_P2(BITN4);D_P24_REV();
Lc_delay_ms(500);
printf3("\r\n %X %X:%X",(int)(DAY), (int)(MIN), (int)(SEC));
Lc_delay_ms(200);D_stdIO_P2(BITN4);D_P24_REV();
Lc_delay_ms(500);
printf3("\r\n %X %X:%X",(int)(DAY), (int)(MIN), (int)(SEC));
Lc_delay_ms(200);
}
void L0_main_initled(void)
{
D_LED1_OFF();
D_LED2_ON();
TTSS_run_times(6)
{
D_LED1_REV();
D_LED2_REV();
Lc_delay_ms(300);
}
}
void L0_main_init(void)
{
int r = 0;
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>算法测试区域
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<算法测试区域
Lc_delay_ms(200);
L0_main_initled();
CLKDIV = 0;////不分频,使用focs
L0_uart1_open();
/// L0_uart2_open();
L3_debug_drv_init();
L1_task_tick_init();
L0_timer0_Init();ET0 = 1;
printf1("\r\nD_sys_MainFre %ld",D_sys_MainFre);
r = L3_S_init();
printf1("\r\nL3_S_init %d",r);
}
//===============================================
//主函数
//===============================================
void main(void)
{
u16 a= 0;
char d[9]={0xab};
//-----------------------------------------------
//系统初始化
//----------------------------------------------
L0_main_init();
L3_task_weight_init();
TTSS_run_every_init(s_nos_tick.stamp,10);
printfs("\r\3 main while13\r\n");
//-----------------------------------------------
//系统主循环
//-----------------------------------------------
while(1)
{///44M 裸奔2us一个循环
//1>>>>>1>>>>>1>>>>>1>>>>>1>>>>>1>>>>> TTSS 1心跳>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
if(1 == s_nos_tick.t1s_heartbeat)///
{
s_nos_tick.t1s_heartbeat = 0;
///L1_uartD_uc('.');
D_LED2_REV();
}
//1<<<<<1<<<<<1<<<<<1<<<<<1<<<<<1<<<<< TTSS 1心跳<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.
//--------------------------------------------------------------------------------------
//>>>>>2>>>>>>2>>>>>2>>>>>2>>>>>2>>>>> TTSS 2 定期任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
TTSS_run_every(s_nos_tick.stamp,40)////500 -7s 70-1s TTSS 2需要主循环定时工作的任务:stamp需要防止被其他程序使用
D_LED1_REV(); L4_weight_out(); //// D_LED1_REV();
///55 0D 0C 90 F5 77 FF 52 80 00 00 00 33
TTSS_run_every_end
//// L1_expara_sample();///
//<<<<<2<<<<<<<2<<<<<<2<<<<<<2<<<<<<<TTSS 2 定期任务 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.
//--------------------------------------------------------------------------------------
//>>>>>3>>>>>>>3>>>>>>3>>>>>>3>>>>>>>TTSS 3 debug>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
if(L2_debug_ONcomand())
{
L3_test_ONdebug(D_cmd_filter_debug);///fd xx xx///
L3_weight_ONdebug(D_cmd_filter_weight);///fd xx xx///
//L3_ADC_debug(D_cmd_filter_adc);///fa xx xx
//L3_moto_debug(D_cmd_filter_moto);///f0 xx xx/
/// L3_lora_debug(D_cmd_filter_lora);//
}
//<<<<<3<<<<<<<3<<<<<<<3<<<<<<3<<<<<<TTSS 3 debug><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.
//--------------------------------------------------------------------------------------
//>>>>>>4>>>>>>>4>>>>>>4>>>>>>4>>>>>>TTSS 4 并行任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
L3_task_weight_handler(&tst_weight);
/// L2_task_move_handle(&ts_task_move);
//<<<<<4<<<<<<<<4<<<<<<4<<<<<<<4<<<<<TTSS 4 并行任务 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.
//--------------------------------------------------------------------------------------
//>>>>>>5>>>>>>>5>>>>>>5>>>>>>5>>>>>>TTSS 5 日常任务 随机任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
//<<<<<5<<<<<<<5<<<<<<<5<<<<<<5<<<<<<TTSS 5 日常任务 随机任务<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.
}
}

107
source/app/main.h

@ -0,0 +1,107 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2017, 传控科技
/// All rights reserved.
///
/// @file main.c
/// @brief main app
///
///(本文件实现的功能的详述)
///
/// @version 1.1 CCsens technology
/// @author CC
/// @date 20150102
///
///
/// 修订说明:最初版本
/// Modified by:
/// Modified date:
/// Version:
/// Descriptions:
///
///
///
///
///
///
///
/// msp: humtemp flow
/// bsp: i2c adc
///
///
///
///
///
//////////////////////////////////////////////////////////////////////////
#ifndef _MAIN_H
#define _MAIN_H
#include "bsp_config.h"
///#include "../bsp/bsp_cs1232.h"
//#include "../bsp/bsp_485.h"
///#include "msp_time2.h"
#include "msp_uart1.h"
///
///
#include "c_delay.h"
///#include "msp_uart2.h"
///#include "msp_uart3.h"
///#include "msp_uart4.h"
///
#include "msp_eeprom.h"
///#include "../msp/msp_id.h"
#include "msp_iicMx.h"
#include "TTSS_task.h"
///#include "../app/app_task_uart0.h"
////#include "../app/app_task_debug.h"
///#include "../app/app_task_reg.h"
///#include "app_config.h"
///#include "app_weightzero.h"
#include "debug_drv.h"
#include "tpc_road.h"
///#include "msp_adc.h"////20220718_135435 CCmodify
///#include "asp_moto.h"////20220718_135435 CCmodify
///
////#include "bsp_AiP650E.h"
////#include "bsp_lora.h"
///#include "bsp_pressure.h"
#include "msp_adc.h"///
#include "stc_8_delay.h"
//////////////////////////////////////////////////////////////////
///#include "max30102.h"
///#include "tpc_wifi.h"
///
///#include "bsp_oled.h"
////#include "bsp_lora.h"
#include "bsp_msa300.h"
#include "bsp_moto.h"
#include "asp_lowpower.h"
#include "asp_move.h"
#include "bsp_pt100x.h"
#include "app_weight.h"
#include "app_config.h"
//////////////////////////////////////////////////////////////////
///#include "max30102.h"
///#include "tpc_lora.h"
///#include "mlx90615.h"
///#include "mlx90615.h"
#endif //#ifndef _MAIN_H

421
source/app/nouse/app_save.c

@ -0,0 +1,421 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2022, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file app_save.c
/// @brief @ app save
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220120
/// @note cc_AS_stc02
#ifdef doc453453
app_save
asp_para L1_para_write eeprom的读写函数和地址配置
U8 L1_para_write(U8 *buf, U8 len)
msp_eeprom mcu的eeprom的底层驱动函数
----------global_register-------------------------------->
iapData数据的映射
TS_GlobalRegisterd R
..........................................
//RO Register
U16 reserved1;
//RW Register
TS_IapData_ sd;//// save data 需要保存的额参数
-----------iapData-------------------------------------->
TS_IapData_ iapData
TS_IapData_ code iapData_factory
..................................................
S16 slaver_id;
ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
////此值上电后更改, 顺便保存(区别于实时保存),
u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
-----------eep_param----------------------------------->
eeprom中的缓存
eeprom ---,,.
TS_eeprom_param_
.........................................
U8 filter;
U8 len;
U8 buf[EEPROM_PARAM_DATA_MAX];
U8 crc[2];
#endif
//////////////////////////////////////////////////////////////////////////////
#include "app_save.h"
#include "app_config.h"
#include "debug_drv.h"
#define D_20kg 200
#define D_85kg 850
///#define D_20kg 190
TS_IapData_ iapData=
{
0xaabcd,
0x18da,0x18d9,0x18d9,0x18d9,///0x18da,0x18d9 0x18d9 0x18d9
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
-123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
8049,///30*0x134
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
TS_IapData_ code iapData_factory=
{
0xaabcd,
0x18da,0x18d9,0x18d9,0x18d9,///
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
-123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
8049,///30*0x134
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
//读取reg内容,写入iap
u8 L4_reg_2_iap(void)
{
Lc_buf_copy_uc((u8 *)&iapData,(u8 *)&R.sd,D_TS_IapData_SIZE);
//写入eeprom
if(L1_para_write((U8*)&iapData,sizeof(TS_IapData_)) == 0)
{
L0_uart0_sendstr("e2p write success");
return 0;
}else
{
return 1;
}
}
//读取factory内容,写入iap
u8 L4_factory_2_iap(void)
{
Lc_buf_copy_uc((u8 *)&iapData,(u8 *)&iapData_factory,D_TS_IapData_SIZE);
L0_uart0_sendstr("\r\nFFFFF return to factory");
//写入eeprom
if(L1_para_write((U8*)&iapData,D_TS_IapData_SIZE) == 0)
{ L0_uart0_sendstr(" ok");
return 0;
}else
{ L0_uart0_sendstr(" error");
return 1;
}
}
///// 多次读取
void L4_iap_2_reg(void)
{
U8 d,len = 0,i = 0;
len = D_TS_IapData_SIZE;///sizeof(TS_IapData_);
/// printf("\r\n len = %d\r\n",len);
L0_uart0_sendstr("\r\nRRRRRRRRRRRRRRRRRRRRRRRRRRRRR\r\n");
/// L0_uart0_uchex(len);
do
{
d = L1_para_read((U8*)&iapData,&len);
if(d == 1)
{////读取错误
L0_uart0_sendstr("e2p read failed\r\n");
L4_factory_2_iap();
}else
{
/// L0_uartD_uchexArray((u8 *)&iapData,len);
L4_print_iap(&iapData);
if(D_rev0x55aa55aa != iapData.rev0x55aa55aa)
{
L0_uart0_sendstr("iapData_factory\r\n");L0_waitFree_uartN(0);
L1_para_write((U8*)&iapData_factory,len);
}else
{
L0_uart0_sendstr("e2p read success\r\n");L0_waitFree_uartN(0);
Lc_buf_copy_uc((u8 *)&R.sd,(u8 *)&iapData,len);
L4_print_iap(&R.sd);
break;
}
}
i ++;
}while(i < 3);
}
void L4_print_iap(TS_IapData_ *s)
{
L0_uart0_sendstr("\r\n--print_reg-- \r\na b= ");
L0_uart0_uchex(s->ADC_shiftaverage_a);
L0_uart0_uc(' ');
L0_uart0_uchex(s->ADC_shiftaverage_b);
L0_waitFree_uartN(0);///混搭使用printf的时候必须加上
printf("\r\nfactory_ws\r\n %d kg = 0x%4x\r\n", s->factory_ws[0].kg,s->factory_ws[0].adc);
printf(" %d kg = 0x%4x\r\n", s->factory_ws[1].kg,s->factory_ws[1].adc);
printf(" %d kg = 0x%4x\r\n", s->factory_ws[2].kg,s->factory_ws[2].adc);
printf("\r\nzerows\r\n %d kg = 0x%4x\r\n", s->zerows[0].kg,s->zerows[0].adc);
printf(" %d kg = 0x%4x\r\n", s->zerows[1].kg,s->zerows[1].adc);
printf(" %d kg = 0x%4x\r\n", s->zerows[2].kg,s->zerows[2].adc);
printf("\r\ns->zeroout= %d = 0x%4x\r\n", s->zeroout, s->zeroout);
printf("\r\ns->sensor 0x%04x 0x%04x 0x%04x 0x%04x\r\n",s->sensor[0],s->sensor[1],s->sensor[2],s->sensor[3]);
printf("\r\ns->ADC_shiftaverage_a 0x%02x s->ADC_shiftaverage_b 0x%02x\r\n",(int)s->ADC_shiftaverage_a ,(int)s->ADC_shiftaverage_b );
printf("\r\n-----print_reg end--------\r\n");
}
/*******
L0_uart0_sendstr("\r\nfactory_ws= ");
L0_uart0_ushex(iapData.factory_ws[0].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[0].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.factory_ws[1].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[1].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.factory_ws[2].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[3].adc);L0_uart0_0d0a();
L0_uart0_sendstr("\r\nzerows= ");
L0_uart0_ushex(iapData.zerows[0].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[0].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.zerows[1].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[1].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.zerows[2].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[3].adc);L0_uart0_0d0a();
63 = 0x 3
R.sd.zeroout= 8049 = 0x1f71 offset 4 = 0x 4
4
v3.4
RRRRRRRRRRRRRRRRRRRRRRRRRRRRR
2800 01 00 02 00 03 00 04 00 00 12 35 00 C8 56 78 01 90 78 9A 00 00 12 34 00 C8 56 78 01 90 78 9B 00 7B FF 85 1F 71 02 05
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x0001 0x0002 0x0003 0x0004
e2p read success
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x0001 0x0002 0x0003 0x0004
8
ADC_SAMPLE
ADC_SAMPLE
ADC_SAMPLE
ADC_SAMPLE
R.sd.zeroout= 8049 = 0x1f71 offset 1 = 0x 1
R.sd.zeroout= 8049 = 0x1f71 offset 2 = 0x 2
R.sd.zeroout= 8049 = 0x1f71 offset 3 = 0x 3
R.sd.zeroout= 8049 = 0x1f71 offset 4 = 0x 4
4Z00 FDAA 21C7 Z02 13EF 0B82 Z03 FD31 2240 Z01 F49D 2AD4 1F3D 1F6D 13F2 1F35 1C74 001E
1EF0 1F64 13F2 1EF7 1C4F 001D
1EA8 1F4A 1EAF 1EB8 1ED6 0025
1E5F 1F44 1E5A 1E55 1E94 0024
1E14 1F3D 1E19 1E74 1E77 0023
1DD3 1F2F 1DD4 1E39 1E43 0023
1D92 1F20 1D8C 1E37 1E1D 0022
1D4C 1F0E 1D4F 1DCF 1DDE 0022
1D0B 1EFF 1D01 1D7F 1DA2 0021
1CEA 1EF4 1CBD 1D49 1D79 0021
FD 04 33 44 55 00 00 00
4sensor zero
R.sd.sensor 0x245d 0x2b5a 0x e46 0x2478
&e2p write success
RRRRRRRRRRRRRRRRRRRRRRRRRRRRR
2824 5D 2B 5A 0E 46 24 78 00 00 12 35 00 C8 56 78 01 90 78 9A 00 00 12 34 00 C8 56 78 01 90 78 9B 00 7B FF 85 1F 71 02 05
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
e2p read success
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1F28 1F65 1CAE 1F2D 1E9A 0024
1EEA 1F58 1EF4 1F37 1F1B 0025
1EA3 1F45 1EB3 1ECE 1EDA 0025
1E72 1F35 1E69 1E92 1EA8 0024
1E2A 1F25 1E2B 1E7B 1E7D 0023
FD 02 33 44 55 00 00 00
--read --
a b=
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1DE4 1F16 1DE6 1E20 1E40 0023
1DA3 1F06 1DA8 1DFB 1E13 0022
1D7C 1EF4 1D67 1DA9 1DE0 0022
1D37 1EE6 1D28 1D53 1DA6 0021
1CE9 1ED4 1CE7 1D37 1D76 0020
1CA7 1EC2 1CA6 1D02 1D44 0020
1C5F 1EAF 1C60 1CA3 1D04 001F
1C2D 1EA1 1C24 1C58 1CD2 001F
1BEB 1E93 1BDC 1C21 1C9E 001E
FD 03 33 44 55 00 00 00
--read R.sd--
a b=
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1BAB 1E83 1B98 1BDB 1C68 001D
1B7D 1E70 1B5A 1BA3 1C3A 001D
1B32 1E5F 1B0B 1AF9 1BE5 001C
1AEA 1E53 1AD3 1AEE 1BBF 001B
*********/

146
source/app/nouse/app_save.h

@ -0,0 +1,146 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2022, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file app_save.h
/// @brief @ app save
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220120
/// @note cc_AS_stc02
/*********
1,
1 512---4-6ms
01
,,
,
--->,
1,,512
30
2, ,.--->,;
flash 28k 8k EEp 28K的最后8K 5000h-6FFFh
*******/
/*******
app_config app_save
app_save ,
,西,,使bsp中
asp ,app通过参数调用asp,使.
,.
app ,
asp app support program wifi的模式设置,adc的读取后的处理
bsp board support program ,wdt,wifi的底层配置函数,sensor
msp mcu support program ,cpu自身的外设,uart led
cpu
*****/
/*******
adc采样值
^
|
| o
| |
| o |
| | |
| ---|---- |------------0=adc=0
0 | |D_ADC_OFFSET
|____|_____|____________> adc + D_ADC_OFFSET
0 40 80
西:
1,< >
2, 0kg的时候的<>
3,<> + <>
3.1 ,250kg,,,.<250kg,>
4, : <(+-10kg)>,<>
,.
5,,<>,,.
4,.
B:4,.
---->C: 4.5 ,
c,,0 (H1sL0.5s)3
西:
< > Byte x n=? .
Byte x n=? .
<> Byte x n=? .
<> ,
,250kg
,id之类的
3,,,使.使.
*****/
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_SAVE_H
#define _APP_SAVE_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "msp_uartN.h"
#include "asp_para.h"
#include "app_weight.h"
////#include "asp_adc.h"
#define D_rev0x55aa55aa 0x55aa55aa
////需要向eeprom中存储的数据
typedef struct _iap_data
{
///40Bytes
S16 slaver_id;
vU16 sensor[4];//// 4x2与第一个传感器的差值,第一个传感器为偏移量
ts_weight_sheet_ factory_ws[3]; ///4x3=12 出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
ts_weight_sheet_ zerows[3]; ///4x3=12 手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
vS16 zerodiff_max; ///2 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
vS16 zerodiff; ///2零点的差值 零公斤位置和手工的差值
////此值上电后更改, 顺便保存(区别于实时保存),
vU16 zeroout; //2
u8 ADC_shiftaverage_a; ///2 a路移位滤波的参数 由上位机命令更改,实时保存
u8 ADC_shiftaverage_b; /// b路移位滤波的参数 由上位机命令更改,实时保存
U32 rev0x55aa55aa;
}TS_IapData_;
extern TS_IapData_ iapData;
#define D_TS_IapData_SIZE 46///
extern void L4_iap_2_reg(void);
void L4_print_iap(TS_IapData_ *s);
u8 L4_reg_2_iap(void);
#endif // #ifndef _APP_TASK_ADC_H

473
source/app/nouse/app_task_adc - 副本.c

@ -0,0 +1,473 @@
#include "app_task_adc.h"
#include "../msp/UART0.h"
//TS_ADC_CH_SWITCH ts_adc_ch_switch;
TS_ADC_CH_SAMPLE ts_adc_ch_sample[D_ch_max_num];
//TS_ADC_CH_BLUR ts_adc_ch_blur[D_ch_max_num];
TS_ADC_ALL_BLUR ts_adc_all_blur;
TS_ADC_ALL_OUT ts_adc_all_out;
TS_ADC_SHOW ts_adc_show;
TS_ADC_CH_MID_BLUR ts_adc_ch_mid_blur[D_ch_max_num];
TS_ADC_CH_AVG_BLUR ts_adc_ch_avg_blur[D_ch_max_num];
TS_ADC_CH_SHIFT_BLUR ts_adc_ch_shift_blur[D_ch_max_num];
static U8 count_n(u8 n,u8 d)
{
if(n < d)
{
return MAX_OUT_NUM + n - d ;
}
else
{
return n-d;
}
}
U32 Abs(S32 a)
{
if(a < 0)
{
a = -a;
}
return a;
}
void L3_task_adc_init(U8 ch)
{
//通道采集任务初始化
L1_task_init(&ts_adc_ch_sample[ch].task);
L3_task_s_go(ts_adc_ch_sample[ch],D_task_init);
ts_adc_ch_sample[ch].status = R.p.adc_ch_status & (ADC_status_chx_Ready_BASE << ch);
ts_adc_ch_sample[ch].pool = 0;
ts_adc_ch_sample[ch].adcval = 0;
ts_adc_ch_sample[ch].n = 0;
ts_adc_ch_sample[ch].ch = D_ADCCH_1 + ch;
//单路中值滤波
L1_task_init(&ts_adc_ch_mid_blur[ch].task);
L3_task_s_go(ts_adc_ch_mid_blur[ch],D_task_init);
ts_adc_ch_mid_blur[ch].n = 0;
ts_adc_ch_mid_blur[ch].max = 1;
ts_adc_ch_mid_blur[ch].ch = D_ADCCH_1 + ch;
//单路均值滤波
L1_task_init(&ts_adc_ch_avg_blur[ch].task);
L3_task_s_go(ts_adc_ch_avg_blur[ch],D_task_init);
ts_adc_ch_avg_blur[ch].max = R.p.cc_blur_ch_avg;
ts_adc_ch_avg_blur[ch].avgval = 0;
ts_adc_ch_avg_blur[ch].n = 0;
ts_adc_ch_avg_blur[ch].ch = D_ADCCH_1 + ch;
//单路移位滤波
L1_task_init(&ts_adc_ch_shift_blur[ch].task);
L3_task_s_go(ts_adc_ch_shift_blur[ch],D_task_init);
ts_adc_ch_shift_blur[ch].n = 0;
ts_adc_ch_shift_blur[ch].max = 1;
ts_adc_ch_shift_blur[ch].sum = 0;
ts_adc_ch_shift_blur[ch].shiftval = 0;
ts_adc_ch_shift_blur[ch].ch = D_ADCCH_1 + ch;
#if 0
L1_task_init(&ts_adc_ch_blur[i].task);
L3_task_s_go(ts_adc_ch_blur[i],D_task_init);
ts_adc_ch_blur[i].SA_sum = 0;
ts_adc_ch_blur[i].SA_avg = 0;
ts_adc_ch_blur[i].SA_n = 0;
ts_adc_ch_blur[i].SHA_sum = 0;
ts_adc_ch_blur[i].SHA_avg = 0;
ts_adc_ch_blur[i].n = 0;
ts_adc_ch_blur[i].ch = D_ADCCH_1 + i;
ts_adc_ch_blur[i].ch_n = TS_ADC_CH_01 + i;
#endif
L1_task_init(&ts_adc_all_blur.task);
L3_task_s_go(ts_adc_all_blur,D_task_init);
ts_adc_all_blur.n = 0;
ts_adc_all_blur.sum = 0;
ts_adc_all_blur.SHA_sum_0 = 0;
ts_adc_all_blur.SHA_avg_0 = 0;
ts_adc_all_blur.SHA_pool_0[0] = ts_adc_all_blur.SHA_pool_0[1] = ts_adc_all_blur.SHA_pool_0[2] = 0;
ts_adc_all_blur.SHA_sum_1 = 0;
ts_adc_all_blur.SHA_avg_1 = 0;
////ts_adc_all_blur.SHA_pool_1[0] = ts_adc_all_blur.SHA_pool_1[1] = ts_adc_all_blur.SHA_pool_1[2] = 0;
L1_task_init(&ts_adc_all_out.task);
L3_task_s_go(ts_adc_all_out,D_task_init);
ts_adc_all_out.n = 0;
for(i=0;i<D_ADC_CH_BLUE_POOL_NUM;i++)
{
ts_adc_all_out.SHA_pool[i] = 0;
}
L1_task_init(&ts_adc_show.task);
L3_task_s_go(ts_adc_show,D_task_init);
ts_adc_show.pool_val = 0;
ts_adc_show.pool_gt = 1;
ts_adc_show.val = 0;
for(i=0;i<D_weight_show_limit_num;i++)
{
ts_adc_show.times[i] = 0;
}
}
//#define D_SA_mid(X); ts_sample[X].midv = Lc_S32_media3(ts_sample[X].mid[0],ts_sample[X].mid[1],ts_sample[X].mid[2]);
#define D_ADC_CHANNEL_READY(X) (R.p.adc_ch_status & (ADC_status_chx_Ready_BASE << X))
#define D_task_ADC_CHx_SAMPLE 0x51
#define D_task_ADC_CHx_WAIT_HIGH_LEVEL 0x52
#define D_task_ADC_CHx_WAIT_LOW_LEVEL 0x53
#define D_task_ADC_CHx_READ 0x54
#define D_task_ADC_CHx_OUT 0x55
void L3_task_adc_ch_sample(TS_ADC_CH_SAMPLE *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SAMPLE);
TTSS_Task_step(D_task_ADC_CHx_SAMPLE)
if(D_ADC_CHANNEL_READY(s->ch))
{
L2_task_go(D_task_ADC_CHx_WAIT_LOW_LEVEL);
}
else
{
s->adcval = s->pool;
L2_task_go(D_task_ADC_CHx_OUT);
}
TTSS_Task_step(D_task_ADC_CHx_WAIT_LOW_LEVEL)
if(0 == L0_2dc_DOUT_AT(s->ch))
{
L2_task_go(D_task_ADC_CHx_READ);
}
TTSS_Task_step(D_task_ADC_CHx_READ)
s->adcval = L0_ADS1231_readCH(s->ch);
L2_task_go(D_task_ADC_CHx_OUT);
TTSS_Task_step(D_task_ADC_CHx_OUT)
s->pool = s->adcval;
s->out[s->n] = s->adcval;
L0_uart0_ulhex(s->out[s->n]);
L0_uart0_uc(' ');
L0_uart0_uc('\n');
s->n++;
if(s->n >= D_ADC_CH_SAMPLE_BUF_MAX)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_SAMPLE);
TTSS_Task_end();
}
//单路中值滤波任务
#define D_task_ADC_CHx_MID_BLUR_GET 0x51
#define D_task_ADC_CHx_MID_BLUR_COUNT 0x52
#define D_task_ADC_CHx_MID_BLUR_OUT 0x53
void L3_task_adc_ch_mid_blur(TS_ADC_CH_MID_BLUR *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_MID_BLUR_GET);
TTSS_Task_step(D_task_ADC_CHx_MID_BLUR_GET)
if(ts_adc_ch_sample[s->ch].n >= 1)
{
U8 i = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_ch_sample[s->ch].out[i];
}
ts_adc_ch_sample[s->ch].n = 0;
L2_task_go(D_task_ADC_CHx_MID_BLUR_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_MID_BLUR_COUNT)
s->midval = Lc_vS32_media(s->in, s->max);
L2_task_go(D_task_ADC_CHx_MID_BLUR_OUT);
TTSS_Task_step(D_task_ADC_CHx_MID_BLUR_OUT)
s->out[s->n] = s->midval;
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_MID_BLUR_GET);
TTSS_Task_end();
}
//单路均值滤波任务
#define D_task_ADC_CHx_AVG_BLUR_GET 0x51
#define D_task_ADC_CHx_AVG_BLUR_COUNT 0x52
#define D_task_ADC_CHx_AVG_BLUR_OUT 0x53
void L3_task_adc_ch_avg_blur(TS_ADC_CH_AVG_BLUR *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_AVG_BLUR_GET);
TTSS_Task_step(D_task_ADC_CHx_AVG_BLUR_GET)
if(ts_adc_ch_mid_blur[s->ch].n >= s->max)
{
U8 i = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_ch_mid_blur[s->ch].out[i];
}
ts_adc_ch_mid_blur[s->ch].n = 0;
L2_task_go(D_task_ADC_CHx_AVG_BLUR_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_AVG_BLUR_COUNT)
s->avgval = Lc_vU32_avg(s->in,s->max);
L2_task_go(D_task_ADC_CHx_AVG_BLUR_OUT);
TTSS_Task_step(D_task_ADC_CHx_AVG_BLUR_OUT)
s->out[s->n] = s->avgval;
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_AVG_BLUR_GET);
TTSS_Task_end();
}
//单路移位滤波任务
#define D_task_ADC_CHx_SHIFT_BLUR_GET 0x51
#define D_task_ADC_CHx_SHIFT_BLUR_COUNT 0x52
#define D_task_ADC_CHx_SHIFT_BLUR_OUT 0x54
void L3_task_adc_ch_shift_blur(TS_ADC_CH_SHIFT_BLUR *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SHIFT_BLUR_GET);
TTSS_Task_step(D_task_ADC_CHx_SHIFT_BLUR_GET)
if(s->h != ts_adc_ch_avg_blur[s->ch].n)
{
s->in = ts_adc_ch_avg_blur[s->ch].out[count_n(ts_adc_ch_avg_blur[s->ch].n,1)];
s->h = ts_adc_ch_avg_blur[s->ch].n;
L2_task_go(D_task_ADC_CHx_SHIFT_BLUR_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_SHIFT_BLUR_COUNT)
s->sum -= s->shiftval;
s->sum += s->in;
s->shiftval = s->sum >> R.p.cc_blur_ch_shift;
L2_task_go(D_task_ADC_CHx_SHIFT_BLUR_OUT);
TTSS_Task_step(D_task_ADC_CHx_SHIFT_BLUR_OUT)
G.weight[s->ch] = D_COUNT_WEIGHT(s->shiftval);
s->n++;
L2_task_go(D_task_ADC_CHx_SHIFT_BLUR_GET);
TTSS_Task_end();
}
#define D_task_ADC_SHOW_GET 0x53
#define D_task_ADC_SHOW_1 0x54
#define D_task_ADC_SHOW_DEBUG 0x55
void L3_task_adc_show(TS_ADC_SHOW *s)
{
U8 i = 0,find = 0,j = 0;
TTSS_Task_init()
L2_task_go(D_task_ADC_SHOW_GET);
TTSS_Task_step(D_task_ADC_SHOW_GET)
if(ts_adc_ch_shift_blur[0].n >= 1)
{
ts_adc_ch_shift_blur[0].n = 0;
ts_adc_ch_shift_blur[1].n = 0;
ts_adc_ch_shift_blur[2].n = 0;
ts_adc_ch_shift_blur[3].n = 0;
s->val = G.weight[0] + G.weight[1] + G.weight[2] + G.weight[3];
L2_task_go(D_task_ADC_SHOW_1);
}
TTSS_Task_step(D_task_ADC_SHOW_1)
if((s->val - s->pool_val) * s->pool_gt < 0)
{
//符号改变,计数清0
//L0_uart0_uc('-');
L3_task_show_times_reset();
}
s->pool_gt = (s->val >= s->pool_val) ? 1 : -1;
s->diff_val = Lc_abs(s->val,s->pool_val);
for(i=0;i<D_weight_show_limit_num;i++)
{
if(R.p.weight_show_limit[i].times == 0)
{
break;
}
if(s->diff_val >= R.p.weight_show_limit[i].weight)
{
find = 1;
break;
}
}
if(find)
{
s->times[i]++;
for(j=0;j<D_weight_show_limit_num;j++)
{
if(j != i)
{
s->times[j] = 0;
}
}
}
else //小于显示分辨率(<0.02kg)
{
L3_task_show_times_reset();
}
for(i=0;i<D_weight_show_limit_num;i++)
{
if(s->times[i] >= R.p.weight_show_limit[i].times)
{
L3_task_show_times_reset();
s->pool_val = s->val;
G._total_weight = s->pool_val;
R.total_weight = L3_count_std_weight(G._total_weight);
break;
}
}
L2_task_go(D_task_ADC_SHOW_GET);
TTSS_Task_end();
}
void L3_task_show_times_reset()
{
U8 i = 0;
for(i=0;i<D_weight_show_limit_num;i++)
{
ts_adc_show.times[i] = 0;
}
}
void L3_task_adc_handler(u8 ch)
{
L3_task_adc_ch_sample(&ts_adc_ch_sample[ch]);
L3_task_adc_ch_mid_blur(&ts_adc_ch_mid_blur[ch]);
L3_task_adc_ch_avg_blur(&ts_adc_ch_avg_blur[ch]);
L3_task_adc_ch_shift_blur(&ts_adc_ch_shift_blur[ch]);
}
#if 0
//单路滤波任务
#define D_task_ADC_CHx_BLUR_GET 0x51
#define D_task_ADC_CHx_BLUR_AVG 0x52
#define D_task_ADC_CHx_BLUR_SHIFT 0x53
#define D_task_ADC_CHx_BLUR_COUNT 0x54
void L3_task_adc_ch_blur(TS_ADC_CH_BLUR *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_BLUR_GET);
TTSS_Task_step(D_task_ADC_CHx_BLUR_GET)
if(ts_adc_ch_sample[s->ch_n].n >= R.p.cc_blur_ch_avg)
{
s->SA_sum = ts_adc_ch_sample[s->ch_n].sum;
s->SA_n = ts_adc_ch_sample[s->ch_n].n;
ts_adc_ch_sample[s->ch_n].sum = 0;
ts_adc_ch_sample[s->ch_n].n = 0;
L2_task_go(D_task_ADC_CHx_BLUR_AVG);
}
TTSS_Task_step(D_task_ADC_CHx_BLUR_AVG)
s->SA_avg = s->SA_sum / s->SA_n;
L2_task_go(D_task_ADC_CHx_BLUR_SHIFT);
TTSS_Task_step(D_task_ADC_CHx_BLUR_SHIFT)
s->SHA_sum -= s->SHA_avg;
s->SHA_sum += s->SA_avg;
s->SHA_avg = (S32)(s->SHA_sum >> R.p.cc_blur_ch_shift);
s->n++;
L2_task_go(D_task_ADC_CHx_BLUR_COUNT);
TTSS_Task_step(D_task_ADC_CHx_BLUR_COUNT)
G.weight[s->ch_n] = D_COUNT_WEIGHT(s->SHA_avg);
L2_task_go(D_task_ADC_CHx_BLUR_GET);
TTSS_Task_end();
}
#define D_task_ADC_ALL_OUT_GET 0x51
#define D_task_ADC_ALL_OUT_DECIDE 0x52
#define D_task_ADC_ALL_OUT_SHOW 0x53
#define D_task_ADC_ALL_OUT_SHOW_1 0x54
#define D_task_ADC_ALL_OUT_DEBUG 0x55
void L3_task_adc_all_out(TS_ADC_ALL_OUT *s)
{
TTSS_Task_init()
//s->diff_threshold = (R.p.cc_blur_all_out_threshold);
//s->diff_threshold1 = (R.p.cc_blur_all_out_threshold1);
//s->diff_threshold2 = (R.p.cc_blur_all_out_threshold2);
//s->should_show_times_threshold = (R.p.cc_blur_all_out_should_show_times_threshold);
L2_task_go(D_task_ADC_ALL_OUT_GET);
TTSS_Task_step(D_task_ADC_ALL_OUT_GET)
if(ts_adc_all_blur.n >= 1)
{
ts_adc_all_blur.n = 0;
Lc_buf_copy_uc((U8*)s->SHA_pool, (U8*)ts_adc_all_blur.SHA_pool_0, D_ADC_CH_BLUE_POOL_NUM * sizeof(S32));
s->SHA_diff[0] = Lc_abs(s->SHA_pool[1] , s->SHA_pool[0]);
s->SHA_diff[1] = Lc_abs(s->SHA_pool[2] , s->SHA_pool[1]);
s->SHA_ddiff[0] = Lc_abs(s->SHA_diff[1] , s->SHA_diff[0]);
L2_task_go(D_task_ADC_ALL_OUT_DECIDE);
}
TTSS_Task_step(D_task_ADC_ALL_OUT_DECIDE)
if((s->SHA_diff[1] >= R.p.cc_blur_all_out_d_threshold) || (s->SHA_diff[0] >= R.p.cc_blur_all_out_d_threshold) || (s->SHA_ddiff[0] >= R.p.cc_blur_all_out_dd_threshold))
{
#if 1
s->sum = s->SHA_pool[2] + s->SHA_pool[1] + s->SHA_pool[0];
ts_adc_all_blur.SHA_sum_1 = s->sum;
ts_adc_all_blur.SHA_sum_1 <<= R.p.cc_blur_all_shift1;
ts_adc_all_blur.SHA_sum_1 /= 3;
ts_adc_all_blur.SHA_avg_1 = (S32)(ts_adc_all_blur.SHA_sum_1 >> R.p.cc_blur_all_shift1);
//s->val = ts_adc_all_blur.SHA_avg_0;
s->val = s->sum / 3;
//s->t = 0;
#else
ts_adc_all_blur.SHA_sum_1 = ts_adc_all_blur.SHA_avg_0 << R.p.cc_blur_all_shift1;
ts_adc_all_blur.SHA_avg_1 = ts_adc_all_blur.SHA_avg_0;
s->val = ts_adc_all_blur.SHA_avg_0;
//s->t = 0;
#endif
}
else
{
s->val = ts_adc_all_blur.SHA_avg_1;
//s->t = 1;
}
s->n++;
L2_task_go(D_task_ADC_ALL_OUT_GET);
TTSS_Task_end();
}
#endif

214
source/app/nouse/app_task_adc - 副本.h

@ -0,0 +1,214 @@
#ifndef APP_TASK_ADC_H
#define APP_TASK_ADC_H
#include "common.h"
#include "../ctask/task.h"
#include "../bsp/bsp_cs1232.h"
#include "../bsp/bsp_config.h"
#define D_ADC_BLUR_MID_MAX 5
enum D_TASK_ADC_CHANNEL
{
TS_ADC_CH_01 = 0x00,
TS_ADC_CH_02 = 0x01,
TS_ADC_CH_03 = 0x02,
TS_ADC_CH_04 = 0x03,
};
//对每一路进行采样
#define D_ADC_CH_SAMPLE_BUF_MAX 50
#define D_ADC_CH_BLUE_POOL_NUM 3
#define MAX_OUT_NUM 10
typedef struct
{
TS_task task;
vU8 pending_ch;
}TS_ADC_CH_SWITCH;
typedef struct
{
TS_task task;
vS32 adcval;
vS32 status;
vS32 pool;
vU8 ch;
vU8 n;
vU32 out[MAX_OUT_NUM];
}TS_ADC_CH_SAMPLE;
//中值滤波
typedef struct ts_adc_ch_mid_blur
{
TS_task task;
vU8 ch;
vU8 max;
vU32 in[MAX_OUT_NUM];
vU32 midval;
vU8 n;
vU32 out[MAX_OUT_NUM];
}TS_ADC_CH_MID_BLUR;
// 均值滤波
typedef struct ts_adc_ch_avg_blur
{
TS_task task;
vU8 ch;
vU8 max;
vU32 in[MAX_OUT_NUM];
vU32 avgval;
vU8 n;
vU32 out[MAX_OUT_NUM];
}TS_ADC_CH_AVG_BLUR;
// 移位滤波
typedef struct ts_adc_ch_shift_blur
{
TS_task task;
vU8 ch;
vU8 h;//均值有数值
vU8 n;//移位有值
vU8 max;
vU32 in;
vU32 sum;
vU32 shiftval;
vU32 out[MAX_OUT_NUM];
}TS_ADC_CH_SHIFT_BLUR;
#if 0
//对每一路进行滤波
typedef struct
{
TS_task task;
vU8 ch;
vU8 ch_n;
//平均滤波
vS32 SA_sum;
vS32 SA_avg;
vS32 SA_n;
//移位滤波
vS32 SHA_sum;
vS32 SHA_avg;
vU8 n;
}TS_ADC_CH_BLUR;
#endif
//和值滤波
typedef struct
{
TS_task task;
vU8 n;
vS32 sum;
vS32 SHA_sum_0;
vS32 SHA_avg_0;
vS32 SHA_pool_0[D_ADC_CH_BLUE_POOL_NUM];
vS32 SHA_sum_1;
vS32 SHA_avg_1;
//vS32 SHA_pool_1[D_ADC_CH_BLUE_POOL_NUM];
}TS_ADC_ALL_BLUR;
//和值阈值判定(滤波方式切换)决定输出
#define D_ADC_ALL_OUT_POOL_NUM 5
typedef struct
{
TS_task task;
vS32 val;
vS32 SHA_pool[D_ADC_CH_BLUE_POOL_NUM];
vU32 SHA_diff[D_ADC_CH_BLUE_POOL_NUM-1];
vU32 SHA_ddiff[D_ADC_CH_BLUE_POOL_NUM-2];
vU8 n;
vS32 sum;
}TS_ADC_ALL_OUT;
typedef struct
{
TS_task task;
vS8 pool_gt;
vS32 pool_val;
vS32 val;
vU16 u16_v;
U32 diff_val;
vU8 times[D_weight_show_limit_num];
U8 stable;
}TS_ADC_SHOW;
typedef struct
{
TS_task task;
U8 cnt1;//不稳定判定次数
U8 cnt2;//稳定判定次数
vS32 r_val;//实际值
vS32 s_val;//显示值
vS32 r_val_pool;//上一个实际值
vU8 n;
}TS_ADC_STABLE;
#if 0
typedef struct _TS_ADC_SampleM_
{
//中值滤波
vS32 mid[D_ADC_BLUR_MID_MAX];
vS32 midv;
//均值滤波
vS32 SA_sum;
vS32 SA_avg;
//移位滤波
vS32 SHA_sum;
vS32 SHA_avg;
}TS_ADC_SampleM;
typedef struct
{
TS_task task;
vU8 error;
vU8 m_n;
vU8 a_n;
vU8 ch;
vU8 ch_n;
vU16 u16_v;
TS_ADC_SampleM ts_sample;
}TS_task_ADC_;
#endif
extern TS_ADC_CH_SWITCH ts_adc_ch_switch;
extern TS_ADC_CH_SAMPLE ts_adc_ch_sample[D_ch_max_num];
extern TS_ADC_CH_MID_BLUR ts_adc_ch_mid_blur[D_ch_max_num];
extern TS_ADC_CH_AVG_BLUR ts_adc_ch_avg_blur[D_ch_max_num];
extern TS_ADC_CH_SHIFT_BLUR ts_adc_ch_shift_blur[D_ch_max_num];
//extern TS_ADC_CH_BLUR ts_adc_ch_blur[D_ch_max_num];
extern TS_ADC_ALL_BLUR ts_adc_all_blur;
extern TS_ADC_ALL_OUT ts_adc_all_out;
extern TS_ADC_SHOW ts_adc_show;
extern TS_ADC_STABLE ts_adc_stable;
extern void L3_task_adc_init(U8 ch);
extern void L3_task_adc_ch_sample(TS_ADC_CH_SAMPLE *s);
//extern void L3_task_adc_all_blur(TS_ADC_ALL_BLUR *s);
//extern void L3_task_adc_all_out(TS_ADC_ALL_OUT *s);
extern void L3_task_adc_show(TS_ADC_SHOW *s);
extern void L3_task_show_times_reset();
//extern void L3_task_weight_stable(TS_ADC_STABLE *s);
extern void L3_task_weight_init(void);
//extern void L3_task_adc_ch_mid_blur(TS_ADC_CH_MID_BLUR *s);
//extern void L3_task_adc_ch_avg_blur(TS_ADC_CH_AVG_BLUR *s);
//extern void L3_task_adc_ch_shift_blur(TS_ADC_CH_SHIFT_BLUR *s);
extern void L3_task_adc_handler(u8 ch);
extern void L3_task_all_adc_handler(void);
#endif

30
source/app/nouse/app_task_adc.c

@ -0,0 +1,30 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_adc.h"
#include "common.h"
void L3_task_adc_handler(u8 ch)
{
L3_task_adc_sample(&ts_adc_samples[ch]);
/***********
//方法论和计算书 https://ccsensp.yuque.com/tegchg/lr84bm/hhexas
L3_task_adc_channel_sample(&ts_adc_channel_samples[ch]);
//L3_task_adc_filter_mid(&ts_adc_blur_mid[ch]);
L3_task_adc_filter_avg(&ts_adc_blur_avg[ch]);
L3_task_adc_filter_shift(&ts_adc_blur_shift[ch]);
L3_task_adc_filter_out(&ts_adc_blur_out[ch]);
***********/
}

29
source/app/nouse/app_task_adc.h

@ -0,0 +1,29 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_ADC_H
#define _APP_TASK_ADC_H
#include "../ctask/task.h"
#include "../clib/clib.h"
#include "asp_adc.h"
#include "../bsp/bsp_config.h"
#include "../msp/uart0.h"
#include "../bsp/bsp_cs1232.h"
void L3_task_adc_handler(u8 ch);
#endif // #ifndef _APP_TASK_ADC_H

124
source/app/nouse/app_task_debug.c

@ -0,0 +1,124 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_debug.h"
///#include "common.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "app_weight.h"
S_TASK_DEBUG _s_task_debug;
//=============================================
void L3_task_debug_init(void)
{
L1_task_init(&_s_task_debug.task);
L3_task_s_go(_s_task_debug,D_task_init);
}
#define D_task_ADC_CHx_DEBUG 0x53
void L3_task_debug(S_TASK_DEBUG *s)
{
TTSS_Task_init():
L2_task_go(D_task_ADC_CHx_DEBUG);
TTSS_Task_step(D_task_ADC_CHx_DEBUG):
if(ts_adc_samples[0].ok)
{ts_adc_samples[0].ok = 0;
L0_uart0_ushex(ts_adc_samples[0].out1);
L0_uart0_uc(0x09);
L0_uart0_ushex(ts_adc_samples[0].out2);
L0_uart0_uc(0x09);
L0_uart0_ushex(ts_adc_samples[0].ts_SAa.out4);
L0_uart0_0d0a();
}
//// L2_task_go_Tdelay(D_task_ADC_CHx_DEBUG,D_Tdelay_Msec(150)); //延时15ms
TTSS_Task_end()
}
/************
...
: STC8H3K48S2
: 7.4.1U
:
. ISP工作频率: 23.866MHz
. IRC振荡器的频率: 11.064MHz
. : 35.250KHz
. 使
. P3.2P3.3
.
. I/O口
.
. : 3.00 V
. ,
. : 256
.
. ,,
. ,EEPROM区一并擦除
. ,485
.
. : 1195 mV (: 1100~1300mV)
. : 202192
: STC8H3K48S2
: 7.4.1U
... [0.812"]
: 11.057MHz (-0.022%)
... [0.125"]
: 115200
... ! [0.656"]
: F74DC52602599C
... ! [3.796"]
... ! [0.016"]
:
. ISP工作频率: 23.866MHz
. IRC振荡器的频率: 11.057MHz
. : 35.250KHz
. 使
. P3.2P3.3
.
. I/O口
.
. : 3.00 V
. ,
. : 256
.
. ,,
. ,EEPROM区
. ,485
.
. : 1195 mV (: 1100~1300mV)
. : 202192
: F74DC52602599C
: STC8H3K48S2
: 7.4.1U
. : 11.059MHz
. : 11.057MHz
. : -0.022%
!(2022-01-08 10:36:46)
*************/

32
source/app/nouse/app_task_debug.h

@ -0,0 +1,32 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_TASK_DEBUG_H
#define _APP_TASK_DEBUG_H
#include "TTSS_task.h"
#include "c_lib.h"
typedef struct _s_task_debug
{
TS_task task;
}S_TASK_DEBUG;
extern S_TASK_DEBUG _s_task_debug;
extern void L3_task_debug_init(void);
extern void L3_task_debug(S_TASK_DEBUG *s);
#endif // #ifndef _APP_TASK_ADC_H

64
source/app/nouse/app_task_reg.c

@ -0,0 +1,64 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_reg.h"
#include "app_weight.h"
///#include "common.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
S_TASK_REGVAL_LISTEN s_task_reglisten;
//=============================================
void L3_task_reglisten_init(void)
{
L1_task_init(&s_task_reglisten.task);
L3_task_s_go(s_task_reglisten,D_task_init);
}
//清零任务
#define D_task_WEIGHT_COUNT 0x50
#define D_task_IAP 0x51
void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s)
{
TTSS_Task_init():
L2_task_go(D_task_WEIGHT_COUNT);
TTSS_Task_step(D_task_WEIGHT_COUNT):
/// if(R.zero != 0)
{
// R.total_zweight = ts_adc_blur_show.rough_weight = R.rough_weight; //皮重 = 毛重
/// R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
/// R.zero = 0;
}
L2_task_go(D_task_IAP); //延时100ms
TTSS_Task_step(D_task_IAP):
/// if(R.status_eep_save != 0)
{
/// R.status_eep_save = 0;
/// L3_reg_2_iap();//写入IAP
}
L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms
TTSS_Task_end();
}

64
source/app/nouse/app_task_reg.c.bak

@ -0,0 +1,64 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_task_reg.h"
#include "app_weight.h"
#include "common.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
S_TASK_REGVAL_LISTEN s_task_reglisten;
//=============================================
void L3_task_reglisten_init(void)
{
L1_task_init(&s_task_reglisten.task);
L3_task_s_go(s_task_reglisten,D_task_init);
}
//清零任务
#define D_task_WEIGHT_COUNT 0x50
#define D_task_IAP 0x51
void L3_task_reglisten_handle(S_TASK_REGVAL_LISTEN *s)
{
TTSS_Task_init():
L2_task_go(D_task_WEIGHT_COUNT);
TTSS_Task_step(D_task_WEIGHT_COUNT):
if(R.zero != 0)
{
R.total_zweight = ts_adc_blur_show.rough_weight = R.rough_weight; //皮重 = 毛重
R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
R.zero = 0;
}
L2_task_go(D_task_IAP); //延时100ms
TTSS_Task_step(D_task_IAP):
if(R.status_eep_save != 0)
{
R.status_eep_save = 0;
L3_reg_2_iap();//写入IAP
}
L2_task_go_Tdelay(D_task_WEIGHT_COUNT,D_Tdelay_Msec(100)); //延时100ms
TTSS_Task_end();
}

24
source/app/nouse/app_task_uart0.c

@ -0,0 +1,24 @@
#include "app_task_uart0.h"
#include "msp_uart0.h"
///#include "../app/common.h"
#include "app_config.h"
void L3_task_uart0_modbus_handler(Ts_uart_rev_ *ph4)
{
if(ph4->ok)
{
#if 1
TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
//L0_uart0_sendArray(ph4->buf, 8);
//L0_uart0_sendArray("abcdefgh", 8);
ph4->ok = 0;
if(ts_modbus->slaver == R.sd.slaver_id ||
ts_modbus->slaver == D_UART0_485_SLAVER_ID_BROADCAST) //从机
{
U16 acklen = L3_modbus_slaver_ack(ts_modbus,&s_uart0_ack);
L0_uart0_sendArray((U8*)&s_uart0_ack, acklen);
}
#endif
}
}

11
source/app/nouse/app_task_uart0.h

@ -0,0 +1,11 @@
#ifndef APP_TASK_UART0_H
#define APP_TASK_UART0_H
///#include "common.h"
#include "../ctask/TTSS_task.h"
#include "../tpc/tpc_modbus.h"
//extern void L3_task_uart0_handler(TS_Handle_PH3 *ph3);
extern void L3_task_uart0_modbus_handler(Ts_uart_rev_ *ph4);
#endif

536
source/app/nouse/app_weight.c

@ -0,0 +1,536 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "app_weight.h"
#include "app_config.h"
#include "debug_drv.h"
TS_TASK_weight_ tst_weight;
#define D_task_WEIGHT_add 12
#define D_task_WEIGHT_CAL 13
#define D_task_WEIGHT_get 14
#define D_task_WEIGHT_zero 15
///#define D_task_WEIGHT_CAL 124
#define D_task_WEIGHT_out 45
#define D_task_WEIGHT_Sline 11
#define D_task_WEIGHT_getADC 22
///#define D_task_WEIGHT_CAL 33
////#define D_task_WEIGHT_Sline
void L2_task_weight_init(u8 openclose)
{
if(openclose)
{
}else
{
}
L2_task_adc_SAinit(0,&R.sd.ADC_shiftaverage_a,&R.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(1,&R.sd.ADC_shiftaverage_a,&R.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(2,&R.sd.ADC_shiftaverage_a,&R.sd.ADC_shiftaverage_b);
L2_task_adc_SAinit(3,&R.sd.ADC_shiftaverage_a,&R.sd.ADC_shiftaverage_b);
ts_adc_samples[0].zeroout = R.sd.zeroout;
ts_adc_samples[1].zeroout = R.sd.zeroout;
ts_adc_samples[2].zeroout = R.sd.zeroout;
ts_adc_samples[3].zeroout = R.sd.zeroout;
ts_adc_samples[0].offset = R.sd.sensor[0];
ts_adc_samples[1].offset = R.sd.sensor[1];
ts_adc_samples[2].offset = R.sd.sensor[2];
ts_adc_samples[3].offset = R.sd.sensor[3];
L0_waitFree_uartN(0);
printf("\r\n\L2_task_weight_initr\n");
printf("\r\n\R.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[0].offset,ts_adc_samples[0].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[1].offset,ts_adc_samples[1].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[2].offset,ts_adc_samples[2].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[3].offset,ts_adc_samples[3].offset);
}
void L3_task_weight_init(void)
{
//显示任务初始化
L1_task_init(&tst_weight.task);
L3_task_s_go(tst_weight,D_task_init);
L2_task_weight_init(0);
}
#define D_debug_ch D_Wch2
void L3_task_weight_handler6666(TS_TASK_weight_ *s)
{
L2_task_adc_sample(&ts_adc_samples[D_Wch1]);
//////// /// L2_task_adc_sample(&ts_adc_samples[D_Wch2]);
L2_task_adc_sample(&ts_adc_samples[D_Wch3]);
L2_task_adc_sample(&ts_adc_samples[D_Wch4]);
L2_task_adc_sample(&ts_adc_samples[D_debug_ch]);
if(1 == ts_adc_samples[D_debug_ch].ok)
{
ts_adc_samples[D_debug_ch].ok = 0;
L0_uart0_ulhex(ts_adc_samples[D_debug_ch].out0);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_debug_ch].out1a );L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_debug_ch].out1);L0_uart0_uc(' ');
L0_uart0_0d0a();
}
}
void L3_task_weight_handler777(TS_TASK_weight_ *s)
{
L2_task_adc_sample(&ts_adc_samples[D_Wch1]);
L2_task_adc_sample(&ts_adc_samples[D_Wch2]);
L2_task_adc_sample(&ts_adc_samples[D_Wch3]);
L2_task_adc_sample(&ts_adc_samples[D_Wch4]);
if(1 == ts_adc_samples[D_debug_ch].ok)
{
ts_adc_samples[D_debug_ch].ok = 0;
/*
L0_uart0_ulhex(ts_adc_samples[D_Wch1].out0);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[D_Wch2].out0);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[D_Wch3].out0);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[D_Wch4].out0);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_Wch1].out1a );L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_Wch2].out1a );L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_Wch3].out1a );L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[D_Wch4].out1a );///L0_uart0_uc(' ');
L0_uart0_0d0a();
****/
}
}
///L3_task_weight_handler(&tst_weight);
void L3_task_weight_handler(TS_TASK_weight_ *s)
{
L2_task_adc_sample(&ts_adc_samples[D_Wch1]);
L2_task_adc_sample(&ts_adc_samples[D_Wch2]);
L2_task_adc_sample(&ts_adc_samples[D_Wch3]);
L2_task_adc_sample(&ts_adc_samples[D_Wch4]);
TTSS_Task_init():
L0_waitFree_uartN(0);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[0].offset,ts_adc_samples[0].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[1].offset,ts_adc_samples[1].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[2].offset,ts_adc_samples[2].offset);
printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[3].offset,ts_adc_samples[3].offset);
L0_uart0_uc('4');
s->slow = 0;
s->zero = 0;
L2_task_go(D_task_WEIGHT_get);
TTSS_Task_step(D_task_WEIGHT_get):
if(1 == ts_adc_samples[D_Wch4].ok)
{//
ts_adc_samples[0].ok = 0;
ts_adc_samples[1].ok = 0;
ts_adc_samples[2].ok = 0;
ts_adc_samples[3].ok = 0;
s->slow ++;
// L0_uart0_uc('%');
L2_task_go(D_task_WEIGHT_Sline);
}
TTSS_Task_step(D_task_WEIGHT_Sline):
if (s->slow >= 1)////采样减速
{s->slow = 0;
///调用asp——adc中的输出 out3
/************/
ts_adc_samples[0].out5 = ts_adc_samples[0].ts_SAb.out4;
ts_adc_samples[1].out5 = ts_adc_samples[1].ts_SAb.out4;
ts_adc_samples[2].out5 = ts_adc_samples[2].ts_SAb.out4;
ts_adc_samples[3].out5 = ts_adc_samples[3].ts_SAb.out4;
L2_task_go(D_task_WEIGHT_getADC);
}else
{
L2_task_go(D_task_WEIGHT_get);
}
//L2_task_go(D_task_WEIGHT_getADC);
TTSS_Task_step(D_task_WEIGHT_getADC):
////四个传感器相加后平均
tst_weight.sum32 = ts_adc_samples[0].out5;
tst_weight.sum32 += ts_adc_samples[1].out5;
tst_weight.sum32 += ts_adc_samples[2].out5;
tst_weight.sum32 += ts_adc_samples[3].out5;
tst_weight.sum32b = ts_adc_samples[0].out1a;
tst_weight.sum32b += ts_adc_samples[1].out1a;
tst_weight.sum32b += ts_adc_samples[2].out1a;
tst_weight.sum32b += ts_adc_samples[3].out1a;
tst_weight.out6 = tst_weight.sum32 >>2;
L0_uart0_ushex((vU16)tst_weight.adc32); L0_uart0_uc(' ');
L2_task_go(D_task_WEIGHT_CAL);
TTSS_Task_step(D_task_WEIGHT_CAL):
tst_weight.adc32 = tst_weight.out6;
L3_task_weight_cal();
/// L0_uart0_ushex(tst_weight.woutx10);
#if 0
L0_uart0_ulhex(ts_adc_samples[0].out1a);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[1].out1a);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[2].out1a);L0_uart0_uc(' ');
L0_uart0_ulhex(ts_adc_samples[3].out1a);L0_uart0_uc(' ');
#else
L0_uart0_ushex(ts_adc_samples[0].out1);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[1].out1);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[2].out1);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[3].out1);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[0].out2);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[1].out2);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[2].out2);L0_uart0_uc(' ');
L0_uart0_ushex(ts_adc_samples[3].out2);L0_uart0_uc(' ');
/// L0_uart0_ushex(tst_weight.woutx10);L0_uart0_uc(' ');
#endif
L0_waitFree_uartN(0);///混搭使用printf的时候必须加上
//// printf("\r\ntst_weight.t32a\r\n %d kg = 0x%4x\r\n", (vU16)tst_weight.t32a,(vU16)tst_weight.t32a);
printf(" (%d)0x%4x\r\n", tst_weight.woutx10,tst_weight.woutx10);
/// L0_uart0_0d0a();
L2_task_go(D_task_WEIGHT_out);
TTSS_Task_step(D_task_WEIGHT_out):
L2_task_go(D_task_WEIGHT_get);
TTSS_Task_step(D_task_WEIGHT_zero):
L2_task_go(D_task_WEIGHT_get);
TTSS_Task_end();
}
void L3_task_weight_cal(void)
{
if(tst_weight.adc32 <= (vU32)R.sd.zerows[1].adc)
{
if(tst_weight.adc32 <= (vU32)R.sd.zerows[0].adc )
{
tst_weight.adc32 = (vU32)R.sd.zerows[0].adc;
}
///0-0-40KG
tst_weight.t32a = (tst_weight.adc32-(vU32)R.sd.zerows[0].adc);////有可能<0
tst_weight.t32b = (vU32)(R.sd.zerows[1].adc-R.sd.zerows[0].adc);
tst_weight.t32a *= (vU32)(R.sd.zerows[1].kg - R.sd.zerows[0].kg);
tst_weight.t32a /= tst_weight.t32b;
}else
{ ///40KG 80KG
tst_weight.t32a = (vU32)(tst_weight.adc32-R.sd.zerows[1].adc);////有可能大于b
tst_weight.t32b = (vU32)(R.sd.zerows[2].adc-R.sd.zerows[1].adc);
tst_weight.t32a *= (vU32)(R.sd.zerows[2].kg-R.sd.zerows[1].kg) ;
tst_weight.t32a /= tst_weight.t32b;
tst_weight.t32a += (vU32)R.sd.zerows[1].kg;
}
tst_weight.woutx10 = (vU16)tst_weight.t32a;
}
void L3_adc_zero(void)
{
L3_out_zero(0);
L3_out_zero(1);
L3_out_zero(2);
L3_out_zero(3);
// printf("\r\niapData.zeroout= %d = 0x%4x\r\n", iapData.zeroout, iapData.zeroout);
// printf("\r\nR.sd.zeroout= %d = 0x%4x offset %d = 0x%4x\r\n", R.sd.zeroout, R.sd.zeroout,ts_adc_samples[0].offset,ts_adc_samples[0].offset);
R.sd.sensor[0] = ts_adc_samples[0].offset;
R.sd.sensor[1] = ts_adc_samples[1].offset;
R.sd.sensor[2] = ts_adc_samples[2].offset;
R.sd.sensor[3] = ts_adc_samples[3].offset;
iapData.sensor[0] = R.sd.sensor[0];
iapData.sensor[1] = R.sd.sensor[1];
iapData.sensor[2] = R.sd.sensor[2];
iapData.sensor[3] = R.sd.sensor[3];
L0_waitFree_uartN(0);
printf("\r\nR.sd.sensor 0x%4x,0x%4x,0x%4x,0x%4x,\r\n",R.sd.sensor[0],R.sd.sensor[1],R.sd.sensor[2],R.sd.sensor[3]);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}
#if 0
void L3_task_weight_set(Ts_uart_rev_ *ph4)
{
TS_P_debug *td;
if(ph4->debugok)
{ ph4->debugok = 0;
td = (TS_P_debug *)ph4->buf;
/// TS_PH4_modbus *ts_modbus = (TS_PH4_modbus *)ph4->buf;
L0_uartN_uchexArray(0,ph4->buf, 8);
if(0xfd == td->filter)
{
if(0x04 == td->R1)///设置四个传感器的清零
{ //// fd 04 33 44 55
L0_uart0_sendstr("\r\n 4sensor zero \r\n");
L3_adc_zero();
}else if(0x01 == td->R1)///设置重量的清零
{ //// fd 04 33 44 55
L0_uart0_sendstr("\r\n--weight zero-- \r\na b= ");
}else if(0x02 == td->R1)///读取
{
if(0x00 == td->R2)
{//// fd 02 00 44 55
L0_uart0_sendstr("\r\n--read iapData-- \r\n");
L4_print_iap(&iapData);
}else
{//// fd 02 33 44 55
L0_uart0_sendstr("\r\n--read R.sd-- \r\n");
L4_print_iap(&R.sd);
}
}
else
{
L0_uart0_sendstr("\r\n command error \r\n");
}
}
else if(0xf5 == td->filter)
{///设置重量
if(td->R1 < 3)///
{
//// R1 R2 R3
//// f5 00 33 44 55 把当前的adc的值作为第R1个校准点的值
R.sd.zerows[td->R1].adc = (vU16)tst_weight.out6;
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\n set[ %d].adc = 0x%04x\r\n",(int)td->R1, (vU16)tst_weight.out6);
}
else if(0xf6 == td->filter)
{///设置砝码
if(td->R1 < 3)///
{
//// R1 R2 R3
//// f5 00 33 44 55 把当前第R1个校准曲线的点的kg的值 0x3344
R.sd.zerows[td->R1].kg = D_2uc_u16(R2,R3);
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\nset [ %d],Kg = 0x%04x\r\n",(int)td->R1, R.sd.zerows[td->R1].kg );
}
else
{
}
}
}
#endif
void L3_weight_setPara(u8 filter)
{
if(filter == Ts_debug.td->filter)
{
L0_uart0_uc("A");
L0_uart0_0d0a();
if(0x01 == Ts_debug.td->ocr)
{
if(0x04 == Ts_debug.td->R1)///设置四个传感器的清零
{ //// fd 04 33 44 01
L0_uart0_sendstr("\r\n 4sensor zero \r\n");
L3_adc_zero();
}else if(0x01 == Ts_debug.td->R1)///设置重量的清零
{ //// fd 01 33 44 01
L0_uart0_sendstr("\r\n--weight zero-- \r\na b= ");
}else if(0x02 == Ts_debug.td->R1)///读取
{
if(0x00 == Ts_debug.td->R2)
{//// fd 02 00 44 01
L0_uart0_sendstr("\r\n--read iapData-- \r\n");
L4_print_iap(&iapData);
}else
{//// fd 02 33 44 01
L0_uart0_sendstr("\r\n--read R.sd-- \r\n");
L4_print_iap(&R.sd);
}
}
else
{
L0_uart0_sendstr("\r\n command error \r\n");
}
}
else if(0x02 == Ts_debug.td->ocr)
{///设置重量
if(Ts_debug.td->R1 < 3)///
{
//// R1 R2 R3
//// fd 00 33 44 02 把当前的adc的值作为第R1个校准点的值
R.sd.zerows[Ts_debug.td->R1].adc = (vU16)tst_weight.out6;
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证
}else
{
}
L0_waitFree_uartN(0);
printf("\r\n set[ %d].adc = 0x%04x\r\n",(int)Ts_debug.td->R1, (vU16)tst_weight.out6);
}
else if(0x03 == Ts_debug.td->ocr)
{///设置砝码
if(Ts_debug.td->R1 < 3)///
{ //200
//// R1 R2 R3
//// fd 00 33 44 03 把当前第R1个校准曲线的点的kg的值 0x3344
R.sd.zerows[Ts_debug.td->R1].kg = D_2uc_u16(Ts_debug.td->R2,Ts_debug.td->R3);
Lc_buf_copy_uc((u8 *)&R.sd.factory_ws,(u8 *)&R.sd.zerows,12);
L4_reg_2_iap();///写入iap
L4_iap_2_reg();///读取出来验证 20 14
}else
{
}
L0_waitFree_uartN(0);
printf("\r\nset [ %d],Kg = 0x%04x\r\n",(int)Ts_debug.td->R1, R.sd.zerows[Ts_debug.td->R1].kg );
}
else
{
}
}
}
#ifdef doc4324
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x2198 0x2b58 0x ad3 0x21e6
--read --
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x2198 0x2b58 0x ad3 0x21e6
--read R.sd--
iapData.sensor 0x263b 0x32ac 0x1465 0x2e99
&e2p write success2800 01 00 02 00 03 00 04 00 00 12 35 00 C8 56 78 01 90 78 9A 00 00 12 34 00 C8 56 78 01 90 78 9B 00 7B FF 85 1F 71 02 05
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
iapData.zeroout= 8049 = 0x1f71
R.sd.zeroout= 8049 = 0x1f71 offset 9787 = 0x263b
iapData.sensor 0x 1 0x 2 0x 3 0x 4
e2p read success
17FC 1F6A 1F4D 1F39 1D7B 0021
1F19 1F51 1F0C 1EEB 1F18 0025
1EEA 1F3A 1ECD 1EB3 1EE9 0025
1EA7 1F25 1E87 1E6F 1EB0 0024
#endif

151
source/app/nouse/app_weight.h

@ -0,0 +1,151 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220109
/// @note cc_AS_stc02
/*******************
xxx.x
Layer4: send/show
write to buffer -->send
-----------------------------
weight = cal(adc32)
Layer3: app weight
tst_weight.adc32 = ts_adc_samples[0].out5;
线 line
-----------------------------
out3
out2
Layer2: asp asp_adc
out1 adc
-------------------------
void L0_ADS1231_readCH2(vtype ch,vU16 *d)
Layer1: bsp: bsp_cs1232 adc的采样
*******************/
//////////////////////////////////////////////////////////////////////////////
#ifndef _APP_WEIGHT_H
#define _APP_WEIGHT_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "asp_schain.h"
#include "tpc_debug.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "../bsp/bsp_cs1232.h"
/////水一般是18-19升,再加上桶,就是大约20公斤
typedef struct
{
vU16 kg;
vU16 adc; ///kg 对应的adc的采样值
}ts_weight_sheet_;///8Bytes
typedef struct
{
TS_task task;
vS32 rough_weight;
vU32 adc32;
vU32 sum32;
vU32 sum32b;
vU32 out6;
vU32 t32a,t32b;
/// ts_weight_sheet_
u8 slow;
u8 zero;
u8 pp;
vU16 woutx10;///计算出来的重量
ts_weight_sheet_ ws[3];
}TS_TASK_weight_;
extern TS_TASK_weight_ tst_weight;
/*******
^
|
| o
| |
| o |
| | |
o | |
| | |
|____|_____|____________>
0 40 80
[0] [1] [2]
20KG 40kg
190 290
19kg 29kg
,adc在一定范围内
:0 40 80
0+-% 40+-% 80+-%
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1235,
D_20kg,0x5678,
D_40kg,0x789a,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1234,
D_20kg,0x5678,
D_40kg,0x789b,
factory_ws
0 kg = 0x1235
190 kg = 0x5678
290 kg = 0x789a
zerows
0 kg = 0x1234
190 kg = 0x5678
290 kg = 0x789b
**/
////
extern void L3_task_weight_cal(void);
extern void L3_task_weight_init(void);
extern void L3_task_weight_handler(TS_TASK_weight_ *s);
///extern void L3_task_weight_set(Ts_uart_rev_ *ph4);
#define D_cmd_filter 0xfd
extern void L3_weight_setPara(u8 filter);
#define D_get_weight() tst_weight.woutx10
#endif // #ifndef _APP_TASK_ADC_H

105
source/app/nouse/app_weightzero.c

@ -0,0 +1,105 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
/*******************
1.--线
2.--使AD值
3.--线
(1)线--AD值构成的曲线
(2)线--线线线线
*******************/
#include "app_weight.h"
#include "app_config.h"
#include "app_weightzero.h"
////#include "common.h"
TS_TASK_weight_zero tst_weight_zero;
void L3_task_weight_zero_init(void)
{
//显示任务初始化
L1_task_init(&tst_weight_zero.task);
L3_task_s_go(tst_weight_zero,D_task_init);
}
#define D_task_weight_zero 16
#define D_task_WEIGHT_ZERO 15
#define D_task_WEIGHT_CAL 10
#define D_task_WEIGHT_get 2
void L3_task_weight_zero_handler(TS_TASK_weight_zero *s)
{
TTSS_Task_init():
printf("\r\n weight_zero\r\n");
L2_task_go_Tdelay(D_task_WEIGHT_get,300);//延时等待重量稳定
TTSS_Task_step(D_task_WEIGHT_get):
s->zero_weight = D_get_weight(); //获取当前重量
/// R.total_zweight = s->zero_weight - tst_weight.ws[0].kg; //当前差值 = 当前重量 - 预设0点重量
L2_task_go(D_task_weight_zero);
TTSS_Task_step(D_task_weight_zero):
///if(R.total_zweight <= R.p.zero_weight) //当前差值在规定范围之内
if(0)
{
L2_task_go(D_task_WEIGHT_CAL);
}
else
{
L2_task_go(D_task_WEIGHT_ZERO);
}
TTSS_Task_step(D_task_WEIGHT_CAL)://计算差值更新曲线
printf("\r\n weight_zero\r\n");
/// s->weight_dval = tst_weight.adc32 - tst_weight.ws[0].adc; //AD差值
tst_weight.ws[0].kg = 0;
tst_weight.ws[0].adc = tst_weight.adc32; //0点AD值=当前AD值
if(s->weight_dval >= 0) //曲线上移
{
tst_weight.ws[1].adc += s->weight_dval; //20KG
tst_weight.ws[2].adc += s->weight_dval; //72KG
}
else //曲线下移
{
tst_weight.ws[1].adc -= s->weight_dval;
tst_weight.ws[2].adc -= s->weight_dval;
}
L2_task_go(D_task_WEIGHT_ZERO);
TTSS_Task_step(D_task_WEIGHT_ZERO): //手动清零
/// if(R.zero != 0) //外部消息
{
// R.zero = 0;
// st_weight.ws[0].kg = s->zero_weight; //预设重量 = 当前重量
}
L2_task_go(D_task_WEIGHT_ZERO);
TTSS_Task_end();
}

106
source/app/nouse/app_weightzero.h

@ -0,0 +1,106 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220109
/// @note cc_AS_stc02
/*******************
app:
weight zero
:
-----------------------------
xxx.x
Layer4: send/show
write to buffer -->send
-----------------------------
weight = cal(adc32)
Layer3: app weight
tst_weight.adc32 = ts_adc_samples[0].out5;
线 line
-----------------------------
out3
out2
Layer2: asp asp_adc
out1 adc
-------------------------
void L0_ADS1231_readCH2(vtype ch,vU16 *d)
Layer1: bsp: bsp_cs1232 adc的采样
*******************/
//////////////////////////////////////////////////////////////////////////////
#ifndef _app_weightzero_H
#define _app_weightzero_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "../bsp/bsp_cs1232.h"
/////水一般是18-19升,再加上桶,就是大约20公斤
/*******
^
|
| o
| |
| o |
- - | |
o | |
| | |
|____|_____|____________>
0 40 80
[0] [1] [2]
,adc在一定范围内
:0 40 80
0+-% 40+-% 80+-%
**/
typedef struct
{
TS_task task;
vS32 rough_weight;
vU32 zero_weight;
vU32 adc32;
vU32 t32a,t32b;
vU32 weight_dval;
/// ts_weight_sheet_ ws[3];
}TS_TASK_weight_zero;
extern TS_TASK_weight_zero tst_weight_zero;
void L3_task_weight_zero_init(void);
void L3_task_weight_zero_handler(TS_TASK_weight_zero *s);
#endif // #ifndef _APP_TASK_ADC_H

121
source/app/nouse/common.c

@ -0,0 +1,121 @@
#include "common.h"
//#include "../tpc/tpc_uart.h"
#include "../bsp/bsp_cs1232.h"
#include "../msp/msp_eeprom.h"
#include "../msp/msp_id.h"
#include "c_crc.h"
struct global_param G;
struct ts_eeprom_param eep_param;
struct ts_eeprom_enc eep_enc;
#define EEP_SECTOR_SIZE 0x200
#define EEP_PARAM_ADDR (EEP_SECTOR_SIZE * 1)
#define EEP_ENC_ADDR (EEP_SECTOR_SIZE * 0)
U8 L1_eeprom_read(U8 *buf,U8 *len)
{
U8 dlen = 0;
L0_Iap_Read_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + EEPROM_PARAM_DATA_MAX + 2);
if(eep_param.filter == EEPROM_PARAM_FILTER)
{
dlen = eep_param.len - 2;
crc16(eep_param.crc,(U8*)&eep_param,2+dlen);
if(eep_param.crc[0] == eep_param.buf[dlen] && eep_param.crc[1] == eep_param.buf[dlen+1])
{
L0_uart0_uc('#');
//Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,dlen);
Lc_buf_copy_uc(buf,(U8*)eep_param.buf,dlen);//防止dlen>sizeof(G.P)引起的内存错误
*len = dlen;
return 0;
}
}
return 1;
}
U8 L1_eeprom_write(U8 *buf, U8 len)
{
U8 dlen = len;
eep_param.filter = EEPROM_PARAM_FILTER;
eep_param.len = dlen + 2;
Lc_buf_copy_uc((U8*)eep_param.buf,buf,dlen);
crc16(eep_param.crc, &eep_param, 2+dlen);
eep_param.buf[dlen] = eep_param.crc[0];
eep_param.buf[dlen+1] = eep_param.crc[1];
L0_Iap_Erase(EEP_PARAM_ADDR);
L0_Iap_Program_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + dlen + 2);
return 0;
}
int L3_mcu_id_ok(void)
{
U8 i = 0,crc[2];
U32 enc_key;
//1.获取MCU_ID
L0_id_get_rom(G.e.mcu_id);
for(i=0;i<MCU_ID_LEN;i++)
{
L0_uart0_uchex(G.e.mcu_id[i]);
}
//2.读取eeprom中的加密信息
L0_Iap_Read_array(EEP_ENC_ADDR, (U8*)&eep_enc, MCU_ID_KEY_LEN + MCU_ID_LEN + 2);
crc16(crc,(U8*)&eep_enc,MCU_ID_KEY_LEN + MCU_ID_LEN);
if(eep_enc.crc[0] != crc[0] || eep_enc.crc[1] != crc[1])
{
L0_uart0_uc('-');
return 0;
}
//3.根据mcu_id和enc_key计算enc_val
enc_key = ((U32)eep_enc.enc_key[0] << 24) | (eep_enc.enc_key[1] << 16) | (eep_enc.enc_key[2] << 8) |(eep_enc.enc_key[3] << 0);
Lc_encrypt_id((U8*)G.e.mcu_enc_id, (U8*)G.e.mcu_id, enc_key, MCU_ID_LEN);
//4.判断enc_val是否一致
for(i=0;i<MCU_ID_KEY_LEN;i++)
{
if(G.e.mcu_enc_id[i] != eep_enc.enc_val[i])
{
return 0;
}
}
return 1;
}
void L3_param_init(void)
{
int i;
for(i=0;i<D_ch_max_num;i++)
{
G.weight[i] = 0;
}
G.allweight = 0;
G._total_weight = 0;
G._total_zweight = 0;
//L3_eeprom_read_param();
}
#if 0
S32 L3_count_std_weight(S32 weight)
{
U8 i = 0;
U16 ratio = 100;
weight = (weight - G._total_zweight)/10;
for(i=0;i<D_weight_std_num;i++)
{
if(R.p.weight_std[i].weight_range == 0 || (R.p.weight_std[i].weight_range * 100) >= weight)
{
break;
}
}
if(i<D_weight_std_num && R.p.weight_std[i].ratio != 0)
{
ratio = R.p.weight_std[i].ratio;
}
return (S32)(weight * 1.0 * ratio / 100) ;
}
#endif

79
source/app/nouse/common.h

@ -0,0 +1,79 @@
#ifndef APP_COMMON_H
#define APP_COMMON_H
#include "../clib/type.h"
#define APP_VERSION 0x10
#define D_MCU_BIGENDIAN 1
// #define D_MCU_LITTLEENDIAN 1
enum tp_handle
{
TP_HANDLED,
TP_UNHANDLE
};
/**
* EEPROM
*/
#define EEPROM_PARAM_DATA_MAX 90
#define EEPROM_PARAM_FILTER 0xAA
typedef struct ts_eeprom_param
{
U8 filter;
U8 len;
U8 buf[EEPROM_PARAM_DATA_MAX];
U8 crc[2];
}EEPROM_PARAM;
#define MCU_ID_LEN 7
#define MCU_ID_KEY_LEN 4
#define EEPROM_ENC_DATA_MAX 64
#define EEPROM_ENC_FILTER 0xAA
typedef struct ts_eeprom_enc
{
U8 enc_key[MCU_ID_KEY_LEN];
U8 enc_val[MCU_ID_LEN];
U8 crc[2];
}EEPROM_ENC;
#define baud_rade L3_baud_rate_change(G.p.baud_rate)
typedef struct mcu_encrypt_info
{
U8 enc_key[MCU_ID_KEY_LEN];
U8 mcu_id[MCU_ID_LEN];
U8 mcu_enc_id[MCU_ID_LEN];
}McuEncryptInfo;
#define D_ch_max_num 4
typedef struct global_param
{
//EncryptInfo
McuEncryptInfo e;
//Global Variables
S32 weight[D_ch_max_num]; //4路重量
S32 allweight; //总重量
S32 _total_weight; //实际重量*1000
S32 _total_zweight; //实际皮重*1000
}GlobalParam;
extern struct global_param G;
extern struct ts_eeprom_param eep_param;
extern struct ts_eeprom_enc eep_enc;
extern void L3_param_init(void);
extern int L3_mcu_id_ok();
extern S32 L3_count_std_weight(S32 weight);
extern void L3_eeprom_persist_param(void);
extern U8 L1_eeprom_read(U8 *buf,U8 *len);
extern U8 L1_eeprom_write(U8 *buf, U8 len);
#endif

107
source/asp/asp_expara.c

@ -0,0 +1,107 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_move.c
/// @brief asp_move
///
///(本文件实现的功能的详述)
/// moved的任务调度,是角度传感器和限位开关、的上层
/// moto工作 限位开关限位 角度传感器指示位置
///move--|--adc
/// |--key
/// |--moto
#include "asp_expara.h"
#include "msp_UART1.h"
#include "asp_move.h"
#include "msp_adc.h"
TS_EXPARA_ ts_expara;
void L1_expara_init(unsigned char onf)
{
if (onf)
{
L0_ADC_init(1);
TTSS_run_every_init(ts_expara.vref.n, D_sample_vref_interval);
TTSS_run_every_init(ts_expara.vbat.n, D_sample_vbat_interval);
TTSS_run_every_init(ts_expara.angle.n, D_sample_angle_interval);
TTSS_run_every_init(ts_expara.pt.n, D_sample_pt_interval);
ts_expara.vbat.en = 1;
ts_expara.angle.en = 1;
ts_expara.pt.en = 1;
ts_expara.vref.en = 1;
D_VCC_BAT_ON();
D_SW_CAL_ON();
SWITCH_INIT();
}else
{
///close adc
}
}
void L1_expara_sample(void)
{
if(ts_expara.vbat.en)
{
TTSS_run_every(ts_expara.vbat.n,D_sample_vbat_interval)
ts_expara.vbat.val = L1_ADC_Readx(D_sample_adc_vbat);
///
TTSS_run_every_end
}
if(ts_expara.angle.en)
{
TTSS_run_every(ts_expara.angle.n,D_sample_angle_interval)
ts_expara.angle.val = L1_ADC_Readx(D_sample_adc_angle);
///printf1(" vbat= %d %x",ts_expara.vbat.val);
ts_task_move.loc_now = ts_expara.angle.val;///
TTSS_run_every_end
}
if(ts_expara.vref.en)
{
TTSS_run_every(ts_expara.vref.n,D_sample_vref_interval)
ts_expara.vref.val = L1_ADC_Readx(D_sample_adc_vref);
///printf1(" pt= %d %x",ts_expara.vbat.val);
TTSS_run_every_end
}
if(ts_expara.pt.en)
{
TTSS_run_every(ts_expara.pt.n,D_sample_pt_interval)
ts_expara.pt.val = L1_ADC_Readx(D_sample_adc_pt);
///printf1(" pt= %d %x",ts_expara.vbat.val);
printf4("%d\t%d\t%d\t%d\r\n",ts_expara.vref.val,ts_expara.vbat.val,ts_expara.angle.val,ts_expara.pt.val);
TTSS_run_every_end
}
}
#if 0
L0_uart1_sendstr("IMEI");
L1_uartD_uchexArray(&R.card,16);
L0_uart1_0d0a();
L3_GET_ANGLE(L1_ADC_Read_ANGLE(6));
printf2("\r\n SET_ANGLE: %x CUR_ANGLE:%x \r\n",(int)R.motor_angle_set,(int)R.motor_angle_cur);
L3_GET_TEMP(L1_ADC_Read_PT(7));
printf2("\r\n IN_TEMP:%x BACK_TEMP: %x \r\n",(int)R.in_temp,(int)R.back_temp);
L3_GET_VBAT(L1_ADC_Read_VBAT(5));
L1_as_readA(0);
printf3("\r\n X_AXIS:%x Y_AXIS: %x Z_AXIS:%x\r\n",(int)R.x_acc,(int)R.y_acc,(int)R.z_acc);
L1_read_time();
printf1("\r\n NET_STREN:%x \r\n",R.signal);
#endif

56
source/asp/asp_expara.h

@ -0,0 +1,56 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#ifndef _ASP_EXPARA_H_
#define _ASP_EXPARA_H_
#include "bsp_config.h"
#include "msp_uart1.h"
#include "TTSS_task.h"
#define D_sample_adc_vbat 5
#define D_sample_adc_angle 6
#define D_sample_adc_pt 7
#define D_sample_adc_vref 15
#define D_sample_vbat_interval D_Tdelay_300ms
#define D_sample_angle_interval D_Tdelay_100ms///D_Tdelay_300ms
#define D_sample_pt_interval D_Tdelay_300ms
#define D_sample_vref_interval D_Tdelay_300ms
typedef struct
{
vU32 n;
u8 en;
vU16 val;
}TS_adcch_;
typedef struct
{
TS_adcch_ vref;////1.19
TS_adcch_ vbat;
TS_adcch_ pt;
TS_adcch_ angle;
}TS_EXPARA_;
extern TS_EXPARA_ ts_expara;
void L1_expara_sample(void);
void L1_expara_init(unsigned char onf);
#endif ///#ifndef _ASP_MOVE_H_

43
source/asp/asp_gsensor.c

@ -0,0 +1,43 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
/// 放置算法 初始化之类的 是bs_xxx型号的gsensor的上层,与型号无关
#include "Asp_gsensor.h"
#include "msp_UART1.h"
#include "msp_iicMx.h"
#include "bsp_msa300.h"
///初始化 调用bsp中的型号
void L2_gsensor_init(u8 d)
{
if (d)
{
L0_IICMx_INIT(D_iicch_MSA,1);
ts_iicm.t0[D_iicch_MSA]= 100;///模拟iic的时候低电平和高电平的时间经常不确定
ts_iicm.t1[D_iicch_MSA]= 100;///使用iic前需要配置iic的速率 根据规格书的要求
L1_msa300_reg_init();
}else
{
LD_gsensor_power(D_PowerMode_suspend|D_gs_LPBW1H9 );///
}
}

27
source/asp/asp_gsensor.h

@ -0,0 +1,27 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#ifndef _ASP_GSENSOR_H_
#define _ASP_GSENSOR_H_
#include "bsp_config.h"
void L2_gsensor_init(u8 d);
#endif ///#ifndef _ASP_GSENSOR_H_

312
source/asp/asp_lowpower.c

@ -0,0 +1,312 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#include "msp_UART1.h"
#include "msp_UART2.h"
#include "debug_drv.h"
#include "bsp_config.h"
#include "asp_gsensor.h"
#include "bsp_moto.h"
#include "asp_move.h"
#include "asp_lowpower.h"
#define D_version_main "7.0"
void L0_uart_close(void)
{
L0_uart1_str("\r\nuart1 close");///
Lc_delay_ms(20);
EA = 0;
D_uart1_ES_INT(0);
//// D_UART2_ES_INT(0);
AUXR = 0; //定时器2开始计时
ET1 = 0; //禁止定时器%d中断
TR1 = 0; //定时器1开始计时
}
void L0_uart1_open(void)
{//
L0_uart1_buf_init();//串口初始化//
EA = 1;
L0_uart1_str("\r\nuart1 open");
}
void L0_uart2_open(void)
{//
//// L0_uart2_buf_init();
EA = 1;
L0_uart1_str("\r\nuart2 open");
}
void L0_SetWakeUpTime(u16 SetTime)
{
SetTime = (U16)((32768UL * (U32)SetTime) / 16000); //重装值 = Fwkt/16 * SetTime/1000 = Fwkt * SetTime / 16000
if(SetTime > 0) SetTime--;
WKTCL = (u8)SetTime;
WKTCH = (u8)(SetTime >> 8) | 0x80;
}
void L0_main_lowp_set(void)
{//
L0_uart_close();
L0_SetWakeUpTime(10000);///
BITN_1(P_SW2 ,BITN7);///P_SW2|=0x80;
////PCON = 0;
///0:禁止端口内部的 4.1K 上拉电阻
///1:使能端口内部的 4.1K 上拉电阻
P0PU = 0;
P1PU = 0;
P2PU = 0;
P3PU = 0;
P4PU = 0;
P5PU = 0;
///0:使能端口的施密特触发功能。(上电复位后默认使能施密特触发)
P0NCS = 0xff;
P1NCS = 0xff;
P2NCS = 0xff;
P3NCS = 0xff;
P4NCS = 0xff;
P5NCS = 0xff;
////1:电平转换速度慢,相应的上下冲比较小
P0SR =0xff;
P1SR =0xff;
P2SR =0xff;
P3SR =0xff;
P4SR =0xff;
P5SR =0xff;
///1:一般驱动能力
P0DR =0xff;
P1DR =0xff;
P2DR =0xff;
P3DR =0xff;
P4DR =0xff;
P5DR =0xff;
///0:禁止数字信号输入。若 I/O 被当作比较器输入口、ADC 输入口、触摸按键输入口或者为外部晶 振接入脚等模拟口时,
///进入时钟停振模式前,必须设置为 0,否则会有额外的耗电。
///1:使能数字信号输入。若 I/O 被当作数字口时,必须设置为 1,否 MCU 无法读取外部端口的电平。
P0IE =0;
P1IE =0;
P2IE =0;
P3IE =0;
P4IE =0;
P5IE =0;
BITN_1(P_SW2 ,BITN7);USBCON = 0;
////USBCON = 0;
///USBCON = 0x80;
ADC_CONTR = 0; ////建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗
RSTCFG = 0;//没有变化43ua 41ua 低压复位控制位
D_HighR_P0_ALL();
D_HighR_P1_ALL();
D_HighR_P2_ALL();
D_HighR_P3_ALL();
D_HighR_P4_ALL();
D_HighR_P5_ALL();/***********
P3 = 0;
P0 = 0;
P1 = 0;
P2 = 0;
P4 = 0;
P5 = 0;
*********/
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P4 = 0xff;
P5 = 0xff;
D_stdIO_P4(BITN1);
///D_OpenD_P4(BITN1);
D_P41_ON();
/*****
// XOSCCR =0;
///HIRCCR = 0;
IRC32KCR = 0x80; //启动内部32K IRC
while (!(IRC32KCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CLKSEL = 0x03; //选择内部32K
P_SW2 = 0x00;
P45
P27
P26
P44
P43
p13
P23 switch2
P40 SWITCH1
P41 SW_CAL =1
*******/
}
/*
void L2_main_version(u8 d)
{
printfs(D_version_main);
L1_uartD_uc(d);
printfs(D_BOARD_NAME);
printfs(__DATE__);
printfs(__TIME__);
}
*/
void L1_main_lowp_test(void)
{//
while(9)
{
/// L2_gsensor_init(0);
L0_main_lowp_set();
_nop_();
_nop_();
//// L0_uart_close();
PCON = 0x02; ////2222 //MCU进入掉电模式
///D_LPCD_INT_CLOSE(); 对掉电唤醒后有一个中断进来没有效果
_nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_();
L0_uart1_open();
L0_uart2_open();
/// L2_main_version(0);
/// L2_gsensor_init(1);
}
}
void L3_test_lp(u8 filter)//// ON listen function
{
if(filter == pd->filter)
{///filter num d1 d2 d3 ....dn
//// FD 08 11 22 33 44 55 66 77 88
///printf("\r\nDdebug:F1 R1 R2 R3 R4 ocr FD->");
switch (pd->ocr)
{
case 0x22: ///'s'
///FX R1 R2 R3 R4 ocr
///F1 m R2 R3 R4 22
// L0_moto_run(pd->R1);
printf1("22: moto=(%X)",(int)pd->R1);
break;
default:
printfs(" pp error\r\n ");
break;
};
printfs("333");
}
}
/***
case 0x23: ///'s'
///FX R1 R2 R3 R4 ocr
///F1 m R2 R3 R4 22
if(pd->R1)
{
D_BUZ_OPEN();
}else
{
D_BUZ_OFF();
}
printf("22: moto=(%X)",(int)pd->R1);
break;
case 0x24: ///'s'
///F1 m 23 56 64 22
ts_task_move.loc_angle[0] = pd->R1;
ts_task_move.loc_angle[1] = pd->R2;
ts_task_move.loc_angle[2] = pd->R3;
ts_task_move.loc_angle[3] = pd->R4;
L3_task_s_go(ts_task_move,D_task_move_init);
printf("move: %d %d %d %d )",(int)pd->R1,(int)pd->R2,(int)pd->R3,(int)pd->R4);
break;
case 0x25: ///'s'
///F1 m 23 56 64 22
ts_task_move.loc_angle[0] = pd->R1;
ts_task_move.loc_angle[1] = pd->R2;
ts_task_move.loc_angle[2] = pd->R3;
ts_task_move.loc_angle[3] = pd->R4;
L3_task_s_go(ts_task_move,D_task_move_init);
ts_task_move.loc_now =D_2uc_u16(pd->R1, pd->R2);
printf("move: loc_now %XH %d )",(int)ts_task_move.loc_now,(int)ts_task_move.loc_now);
break;
case 0x26: ///'s'
///F1 m 23 56 64 22
ts_task_move.loc_angle[0] = pd->R1;
if(pd->R1)
{
ts_task_move.loc_now ++;
}
else
{
ts_task_move.loc_now --;
}
printf("move: loc_now %XH %d ->%d )",(int)ts_task_move.loc_now,(int)ts_task_move.loc_now,(int)ts_task_move.loc_want);
break;
****/

39
source/asp/asp_lowpower.h

@ -0,0 +1,39 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#ifndef _ASP_LOWPOWER_H_
#define _ASP_LOWPOWER_H_
#include "asp_expara.h"
void SetWakeUpTime(u16 SetTime);
void L1_main_lowp_test(void);
void L0_uart_close(void);
void L0_uart1_open(void);
void L0_uart2_open(void);
void L0_main_lowp_set(void);
void L1_main_lowp_test(void);
#define D_cmd_filter_lowpower 0xf1
void L3_test_lp(u8 filter);//// ON listen function
#endif ///#ifndef _ASP_LOWPOWER_H_

475
source/asp/asp_move.c

@ -0,0 +1,475 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_move.c
/// @brief asp_move
///
///(本文件实现的功能的详述)
/// moved的任务调度,是角度传感器和限位开关、的上层
/// moto工作 限位开关限位 角度传感器指示位置
///move--|--adc
/// |--key
/// |--moto
#include "asp_move.h"
#include "bsp_moto.h"
#include "msp_UART1.h"
#include "asp_expara.h"
TS_task_move_ ts_task_move;
TS_task_step_ ts_task_step;
////ts_angle2val[1].val ts_angle2val[2].val很重要 需要出厂前配置,换板子和安装都应该配置下,否则上位机应该配置
////ts_angle2val[0].val 经验值 取决adc比例 和结构
TS_angel2val_ ts_angle2val[5]=
{
-1,100, ///0,1 限位 <= 0度的直接定位到该值 ts_angle2val[0].val
0,268, ///1,2 /u8 loc_min_real;////校准后的最小位置;adc比例 限位<= 0度的 直接定位到 - ts_angle2val[0].val
90,1285, ///2,3 /u8 loc_max_real;////校准后的最大位置;adc比例限位>= 90度的 直接定位到+ts_angle2val[0].val
99,1333, ///3,4
100,1333 ///4,5 限位
};
/// angle 0-90 0,90, 1-89
vU16 L2_angel2adc(u8 angle)
{
if(angle > 0 )
{
if(angle >= 90 )
{
return (ts_angle2val[2].val+ts_angle2val[0].val);///1258+200=1458
}
}else
{
angle = 0;///直接到达限位
return ts_angle2val[1].val - ts_angle2val[0].val;
}
return ts_angle2val[1].val;
}
void L2_task_step_register(void)
{
L1_task_reg_clear(&ts_task_step.task);
///L3_task_s_go(ts_task_step,D_task_init);
}
void L2_task_move_register(void)
{
L1_task_reg_clear(&ts_task_move.task);
L3_task_s_go(ts_task_move,D_task_init);
L2_task_step_register();
}
/*
3
1
2
A-loc_now
M loc_mid
loc_min loc_max
|A-----------------M--------------------|
|>>>>>>>>>>>>>>>>>>M>>>>>>>>>>>>>>>>>>>A|
|A<<<<<<<<<<<<<<<<<M<<<<<<<<<<<<<<<<<<<<|
|------------------M-------------------A|
|A<<<<<<<<<<<<<<<<<M<<<<<<<<<<<<<<<<<<<<|
|>>>>>>>>>>>>>>>>>>M>>>>>>>>>>>>>>>>>>>A|
|-----------A------M--------------------|
|A<<<<<<<<<<<------M--------------------|
|>>>>>>>>>>>>>>>>>>M>>>>>>>>>>>>>>>>>>>A|
|-----------A<<<<<<M<<<<<<<<<<<<<<<<<<<<|
|------------------M-----A--------------|
|------------------M------>>>>>>>>>>>>>A|
|A<<<<<<<<<<<<<<<<<M<<<<<<<<<<<<<<<<<<<<|
|>>>>>>>>>>>A>>>>>>M>>>>>A--------------|
real
0------------------90
240 263 1285 1308/1333
Key 0-------10----------------90-----100 key
0 key
90 key
便
ok
2.1
*/
#define D_ok BITN7/// 1=成功 0 =失败
#define D_angle BITN6///角度逼近1= 发生 0未发生
#define D_locok BITN5///到达指定位置
#define D_modemove BITN4
#define D_locmax BITN3////标志位:到达最大位置;
#define D_locmin BITN2///标志位:到达最小位置;
#define D_locminOV BITN1////标志位:到达最小位置超时
#define D_locmaxOV BITN0////标志位:到达最大位置超时
#define D_moto_diff 1
#define D_angel_over 100
void L2_task_step_handle(TS_task_step_ *s)
{///fixme:需要添加超时保护
unsigned char d = 0;
TTSS_Task_init():
printf("\r\nL2_task_step_handle TTSS_Task_init");
L2_task_go(D_task_step_init);
TTSS_Task_step(D_task_step_init):
printf("\r\nL2_task_step_handle D_task_step_dir");
s->ok_want = 0;
L2_task_go(D_task_step_dir);
TTSS_Task_step(D_task_step_dir):////移动到指定的位置
if(s->loc_want > s->loc_now)//// 1>0 3>2 90>89 34>2 67>45
{
if( (s->loc_want-s->loc_now) >= D_moto_diff)////避免出现一个角度抖动
{
///BITS_1(s->ok_want,D_locok);
L0_moto_run(D_MOTO_FORWARD);
L2_task_go(D_task_step_moto);
}else
{
BITS_1(s->ok_want,D_angle);
L2_task_go(D_task_step_ok);
}
}else
{
if( (s->loc_now-s->loc_want) >= D_moto_diff)////避免出现一个角度抖动
{
L0_moto_run(D_MOTO_BACKWARD);
L2_task_go(D_task_step_moto);
}else
{
BITS_1(s->ok_want,D_angle);
L2_task_go(D_task_step_ok);
}
}
TTSS_Task_step(D_task_step_moto):
if(ABS(s->loc_want, s->loc_now) <= D_moto_diff)
{////到达指定位置
L0_moto_run(D_MOTO_STOP);
BITS_1(s->ok_want,D_locok);
L2_task_go(D_task_step_ok);
}
///printf("\r\nF =%d<-%d ", (int)s->loc_want,s->loc_now);
TTSS_Task_step(D_task_step_ok):
s->ok_want = 1;
/// L2_task_go(0);
printf("\r\nstep_ok =%d<-%d ", (int)s->loc_want,s->loc_now);
L2_task_Tdelay_go(D_Tdelay_30s,D_task_step_init);///测试使用:
TTSS_Task_end();
/// 7 6 5 4 3 2 1 0
/// 7 D_OK BITN7
///6 D_angle BITN6
///5 D_locok BITN5
///4
///3 D_locmax BITN3
///2 D_locmin BITN2
///1 D_locminOV BITN1
///0 D_locmaxOV BITN0
///
///
//>>>>>>>>>>>>>保护代码
if (ts_moto.mode > 0x80 )////运动中
{
BITS_1(s->ok_want,D_modemove);
if((D_MOTO_FORWARD|0x80) == ts_moto.mode)
{
if(L0_Mmax_arrive())
{
L0_moto_run(D_MOTO_STOP);
BITS_1(s->ok_want,D_locmax);
printf("\r\n##Protect:moto max arrive ");
}
else
{
BITS_0(s->ok_want,D_locmaxOV);
TTSS_overtime_get(s->overtimes)
printf("\r\n@Protect:moto overtime ");
BITS_1(s->ok_want,D_locmaxOV);
L0_moto_run(D_MOTO_STOP);
TTSS_overtime_end
}
}else
{
if(L0_Mmin_arrive())
{
L0_moto_run(D_MOTO_STOP);
BITS_1(s->ok_want,D_locmin);
printf("\r\n##Protect:moto min arrive %d ",(int)ts_moto.mode);
}
else
{
BITS_0(s->ok_want,D_locminOV);
TTSS_overtime_get(s->overtimes)
printf("\r\n@Protect:moto overtime ");
BITS_0(s->ok_want,D_locminOV);
L0_moto_run(D_MOTO_STOP);
TTSS_overtime_end
}
}
}else
{
BITS_0(s->ok_want,D_modemove);
TTSS_overtime_init(s->overtimes,D_Tdelay_15s);
/////快速设置(每次设置小于1s或更少时间间隔)如果累计超过15s 电机自动停止,下条指令后重新计时
}
}
////L2_task_move_handle(&ts_task_move);
void L2_task_move_handle(TS_task_move_ *s)
{///fixme:需要添加超时保护
unsigned char d = 0;
TTSS_Task_init():
printf("\r\nL2_task_move_handle TTSS_Task_init");
L2_task_go(D_task_move_init);
TTSS_Task_step(D_task_move_init):
s->loc_angle[0] = 34;
s->loc_angle[1] = 67;
s->loc_angle[2] = 90;
s->loc_angle[3] = 100;
/**/
ts_expara.angle.en = 1;///打开角度采集
s->loc_i = 0;
/// L2_task_Tdelay_go(D_Tdelay_2s,D_task_move_cmd_netid);
L2_task_Tdelay_go(D_Tdelay_100ms,D_task_move_next);///等待adc采样稳定
///L2_task_go(D_task_move_next);
TTSS_Task_step(D_task_move_next):
if(100 != s->loc_angle[s->loc_i])
{
s->loc_want = L2_angel2adc(s->loc_angle[s->loc_i]);
printf("\r\ni =%d %d<-%d",(int)s->loc_i,(int)s->loc_want,s->loc_angle[s->loc_i]);
s->loc_i ++;
L2_task_go(D_task_move_angle);
L3_task_s_go(ts_task_step,D_task_init);
}else
{
}
printf("\r\n over %d %d ",s->loc_i,s->loc_m);
TTSS_Task_step(D_task_move_angle):////移动到指定的位置
if(ts_task_step.ok_want)
{
}else
{
}
TTSS_Task_step(D_task_move_stop):
ts_expara.angle.en = 0;///关闭角度采集
/// L2_task_go(0);
L2_task_Tdelay_go(D_Tdelay_30s,D_task_move_init);///测试使用:
TTSS_Task_end();
L2_task_step_handle(&ts_task_step);
}
#if 0
[]??D"1608 2956 1357 1973
D_UART1 ok 6 F1 01 DC 33 44 22 1->cmd=F num=1 len = 6
cmd = DC 33 44 22 00 00 B 22: moto=(1)3331608 2874 1340 1971
1608 2946 1315 1969
1608 2944 1301 1967
1608 2943 1276 1967
1608 2942 1261 1968
1609 2945 1235 1973
1609 2946 1201 1969
1608 2942 1183 1968
1608 2944 1149 1974
1608 2945 1130 1974
1609 2947 1101 1976
1608 2946 1070 1970
1608 2944 1051 1971
1609 2945 1022 1966
1608 2944 1007 1972
1608 2947 977 1974
1608 2945 958 1969
1608 2944 925 1972
1608 2945 896 1967
1609 2944 877 1969
1609 2945 848 1975
1608 2946 818 1969
1608 2944 799 1971
1608 2946 771 1974
1608 2946 750 1964
1609 2944 721 1971
1608 2946 699 1971
1608 2944 671 1976
1608 2946 637 1971
1608 2944 619 1967
1608 2944 593 1973
1608 2947 566 1970
1608 2945 548 1976
1608 2946 520 1968
1608 2944 507 1966
1608 2944 483 1971
1608 2946 457 1974
1608 2945 441 1971
1608 2946 412 1969
1608 2944 392 1967
1608 2945 367 1968
1608 2947 349 1976
1608 2945 325 1972
1608 2944 298 1970
1608 2945 282 1970
1608 2944 263 1963
[]??D"
D_UART1 ok 6 F1 02 DC 33 44 22 1->cmd=F num=1 len = 6
cmd = DC 33 44 22 00 00 F 22: moto=(2)3331608 2942 258 1963
1608 2906 248 1971
1608 2946 261 1977
1608 2946 268 1972
1608 2945 294 1968
1608 2944 318 1967
1608 2945 335 1975
1608 2944 363 1971
1608 2943 378 1971
1608 2945 402 1973
1607 2946 433 1965
1608 2944 449 1971
1608 2944 475 1972
1608 2944 492 1969
1608 2944 515 1970
1608 2946 541 1968
1608 2946 557 1965
1609 2942 581 1973
1608 2945 600 1969
1608 2944 630 1973
1608 2946 661 1966
1608 2944 680 1971
1608 2946 708 1974
1607 2945 729 1967
1607 2942 763 1972
1608 2944 794 1964
1608 2945 812 1973
1608 2946 838 1975
1608 2946 856 1974
1608 2944 887 1972
1608 2944 916 1965
1608 2945 934 1971
1608 2945 967 1968
1608 2944 986 1968
1608 2944 1015 1974
1607 2944 1044 1973
1608 2945 1062 1964
1608 2942 1084 1970
1608 2944 1102 1973
1608 2945 1140 1967
1608 2940 1172 1973
1608 2944 1195 1971
1607 2945 1220 1963
1608 2941 1244 1972
1608 2944 1269 1974
1608 2944 1295 1970
1608 2945 1309 1967
1608 2945 1333 1968
[]??D"
D_UART1 ok 6 F1 00 DC 33 44 22 1->cmd=F num=1 len = 6
cmd = DC 33 44 22 00 00 S 22: moto=(0)3331608 2945 1349 1971
1608 2955 1371 1974
0
-------------------0
1608 2905 1285 1950
1608 2905 1285 1951
1608 2904 1285 1950
1608 2904 1285 1949
1609 2905 1285 1948
1608 2905 1285 1949
1608 2905 1285 1951
1608 2956 962 1961
1608 2958 962 1960
1608 2956 962 1961
1608 2956 962 1963
1608 2956 962 1962
1607 2956 962 1961
1608 2956 962 1960
1608 2956 962 1962
1608 2956 962 1963
1608 2956 962 1962
1607 2956 962 1961
1608 2956 962 1960
1608 2956 957 1962
1608 2956 957 1963
1608 2956 958 1963
1608 2956 958 1961
1608 2956 958 1960
1608 2956 958 1962
1608 2956 958 1963
1608 2956 958 1962
1608 2956 958 1961
1608 2956 958 1960
1608 2956 958 1962
#endif

118
source/asp/asp_move.h

@ -0,0 +1,118 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#ifndef _ASP_MOVE_H_
#define _ASP_MOVE_H_
#include "bsp_config.h"
#include "msp_uart1.h"
#include "TTSS_task.h"
typedef struct
{
TS_task task;
vU32 overtimes;
u8 ch;
u8 loc_angle[4]; ////达到的角度, 标准角度 需要和adc比例转换
u8 loc_m;
u8 loc_i;
vU16 loc_now;////当前的位置adc比例
vU16 loc_want;////想要达到的位置;adc比例
vU16 loc_max_real;////校准后的最大位置;adc比例
vU16 loc_min_real;////校准后的最小位置;adc比例
vU16 loc_max;////最大位置; adc比例
vU16 loc_min;////最小位置; adc比例
vU16 loc_mid;////中间位置; adc比例
u8 ok_max;////标志位:到达最大位置;
u8 ok_min;////标志位:到达最小位置;
u8 ok_want;////标志位:到达指定的位置;
/// vU16 tmp;
}TS_task_move_;
extern TS_task_move_ ts_task_move;
typedef struct
{
TS_task task;
vU32 overtimes;
u8 ch;
vU16 loc_now;////当前的位置adc比例
vU16 loc_want;////想要达到的位置;adc比例
//// vU16 loc_max_real;////校准后的最大位置;adc比例
//// vU16 loc_min_real;////校准后的最小位置;adc比例
//// vU16 loc_max;////最大位置; adc比例
//// vU16 loc_min;////最小位置; adc比例
//// vU16 loc_mid;////中间位置; adc比例
// u8 ok_max;////标志位:到达最大位置;
// u8 ok_min;////标志位:到达最小位置;
u8 ok_want;////标志位:到达指定的位置;
/// vU16 tmp;
}TS_task_step_;
extern TS_task_step_ ts_task_step;
typedef struct
{
char angle; ////达到的角度,总共数量loc_m
vU16 val;
}TS_angel2val_;
extern TS_angel2val_ ts_angle2val[5];
extern void L2_task_move_register(void);
extern void L2_task_move_handle(TS_task_move_ *s);
#define D_task_move_next 0x33
#define D_task_move_init 0x41
#define D_task_move_stop 0x42
#define D_task_move_2 0x43
#define D_task_move_3 0x53
#define D_Task_mqtt_init 0x44
#define D_task_move_angle 0x45
///#define D_task_move_ok 0x55
#define D_delay_pt D_Tdelay_3s
#define D_task_step_init 0x41
#define D_task_step_dir 0x52
///#define D_task_step_forward 0x46
///#define D_task_step_backward 0x56
#define D_task_step_moto 0x56
#define D_task_step_ok 0x55
#endif ///#ifndef _ASP_MOVE_H_

120
source/asp/asp_mqtt.c

@ -0,0 +1,120 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
/// 放置算法 初始化之类的 是bs_xxx型号的gsensor的上层,与型号无关
#include "asp_mqtt.h"
#include "msp_UART1.h"
#include "msp_iicMx.h"
#include "bsp_msa300.h"
TS_task_mqtt_ ts_task_mqtt;
void L2_mqtt_init(u8 d)
{
if (d)
{
}else
{
}
}
void L2_Task_step_register(void)
{
L1_task_reg_clear(&ts_task_mqtt.task);
///L3_task_s_go(ts_Task_step,D_task_init);
}
void PrintString2(u8 *puts)
{
for (; *puts != 0; puts++)
{
///TX2_write2buff(*puts); //遇到停止符0结束
}
}
xdata char comand_uart1[] = "AT+LMQTTPUB=0,0,0,0,\"$dp\",64,\"{\"ccsens_data\":00}\"\r\n";
void L2_Task_step_handle(TS_task_mqtt_ *s)
{///fixme:需要添加超时保护
unsigned char d = 0;
TTSS_Task_init():
printfs("\r\nL2_Task_step_handle TTSS_Task_init");
L2_task_go(D_Task_mqtt_init);
TTSS_Task_step(D_Task_mqtt_init):
TTSS_Task_step(D_Task_mqtt_init):
P05 = 0;////////////NB_RST
P53 = 1; //////////NB_POWER
delay_ms(100);
P53 = 0; //////////NB_POWER LOW ACTIVE
P05 = 1;////////////NB_RST
S_delay(1);
P53 = 1;///////////////NB_POWER
TTSS_Task_step(D_Task_mqtt_init):
PrintString2("AT+CMEE=1\r\n"); //mqtt config
PrintString2("AT+CSQ\r\n"); //mqtt config
PrintString2("AT+LMQTTCFG=\"cloud\",0,1,3\r\n"); //mqtt config
S_delay(1);
PrintString2("AT+LMQTTOPEN=0,\"183.230.40.39\",6002\r\n"); //BUILDING TCP OK
PrintString2("AT+LMQTTCONN=0,\"1062916368\",\"587005\",\"mm1234\"\r\n"); //BUILDING ON LINE // 设备ID,产品ID,鉴权信息 MQTT CONECT OK
S_delay(1);
PrintString2("AT+LMQTTSUBUNSUB=0,0,1,\"test\",2\r\n"); ////////sub topic
// PrintString2("AT+MQTTOPEN=1,1,0\r\n"); //BUILDING
S_delay(1);
PrintString2("AT+LMQTTPUB=0,0,0,0,\"$dp\",64,\"{\"ccsens_data\":00}\"\r\n"); ////////senddata
S_delay(1);
four_bt = temp_dat_TP/1000+48;
three_bt = (temp_dat_TP%1000)/100+48;
two_bt = ((temp_dat_TP%1000)%100)/10+48;
one_bt = (((temp_dat_TP%1000)%100)%10)+48;
//
// comand_uart1[87] = four_bt;
// comand_uart1[88] = three_bt;
comand_uart1[45] = two_bt;
comand_uart1[46] = one_bt;
PrintString2(comand_uart1);
L2_task_go(D_Task_mqtt_ok);
///printf("\r\nF =%d<-%d ", (int)s->loc_want,s->loc_now);
TTSS_Task_step(D_Task_mqtt_ok):
s->ok_want = 1;
/// L2_task_go(0);
// printf("\r\nstep_ok =%d<-%d ", (int)s->loc_want,s->loc_now);
L2_task_Tdelay_go(D_Tdelay_30s,D_Task_mqtt_init);///测试使用:
TTSS_Task_end();
}

44
source/asp/asp_mqtt.h

@ -0,0 +1,44 @@
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2023, 传控科技
/// All rights reserved.
///
/// @file asp_gsensor.c
/// @brief asp_gsensor
///
///(本文件实现的功能的详述)
///
////20221217_213321 CCmodify new uart struct for road protocol
#ifndef _asp_mqtt_H_
#define _asp_mqtt_H_
#include "bsp_config.h"
void L2_mqtt_init(u8 d);
typedef struct
{
TS_task task;
vU32 overtimes;
u8 ch;
}TS_task_mqtt_;
extern TS_task_mqtt_ ts_task_mqtt;
extern void L2_task_mqtt_register(void);
extern void L2_task_mqtt_handle(TS_task_mqtt_ *s);
#define D_task_mqtt_next 0x33
#define D_task_mqtt_init 0x41
#define D_Task_mqtt_ok 0x42
#endif ///#ifndef _asp_mqtt_H_

726
source/asp/asp_schain.c

@ -0,0 +1,726 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "asp_schain.h"
///#include "common.h"
#include "msp_uart1.h"
#include "bsp_cs1232.h"
#include "debug_drv.h"
#define D_sensor_up_down 1/// 称重传感器上下镜像选择
//=============================================
///打开adc输出监控,0kg的试试每一路的输出就是 0kg_out1_adc FF77 FFB3 00A4 FFEA
#define D_ch1_0kg_out1_adc (vS16)0xFF77
#define D_ch2_0kg_out1_adc (vS16)0xFFB3
#define D_ch3_0kg_out1_adc (vS16)0x00A4
#define D_ch4_0kg_out1_adc (vS16)0xFFEA
/////需要通过测试配置 如果不在意符号位 可以优化 diao
#define D_ch1_out1_offset (vS16)(D_ch1_wantline-D_ch1_0kg_out1_adc)
#define D_ch2_out1_offset (vS16)(D_ch2_wantline-D_ch2_0kg_out1_adc)
#define D_ch3_out1_offset (vS16)(D_ch3_wantline-D_ch3_0kg_out1_adc)
#define D_ch4_out1_offset (vS16)(D_ch4_wantline-D_ch4_0kg_out1_adc)
#define D_ch1_wantline (vS16)0x18da
#define D_ch2_wantline (vS16)0x18da
#define D_ch3_wantline (vS16)0x18da
#define D_ch4_wantline (vS16)0x18da
///cc 2023/04/06--7:39:40 每个传感器放置10kg
///应变片传感器10kg的adc值,选择这个是因为10kg容易获得 并且有一定的重量差
///这个值需要实验获得
#define D_ch1_10kg_out1_adc (vS16)0x0584
#define D_ch2_10kg_out1_adc (vS16)0x05DE
#define D_ch3_10kg_out1_adc (vS16)0x0731
#define D_ch4_10kg_out1_adc (vS16)0x066C
#define D_Rsensor_per_10kg ((vS16)10)
#define D_adc_per_kg ((D_ch1_10kg_out1_adc-D_ch1_0kg_out1_adc)/D_Rsensor_per_10kg)
#define D_adc_zeroout (10*D_adc_per_kg) ///零点都拉到10kg
TS_adc_SPara_ TS_adc_SPara[D_ADC_CHANNEL_NUM]=
{
'A',//0 1 u8 rev1;
0,//2 3 u8 ch;
D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值
D_ch1_out1_offset,//3 4 vU16 offset;
2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16
5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16
'A',//0 1 u8 rev1;
1,//2 3 u8 ch;
D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值
D_ch2_out1_offset,//3 4 vU16 offset;
2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16
5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16
'A',//0 1 u8 rev1;
2,//2 3 u8 ch;
D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值
D_ch3_out1_offset,//3 4 vU16 offset;
2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16
5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16
'A',//0 1 u8 rev1;
3,//2 3 u8 ch;
D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值
D_ch4_out1_offset,//3 4 vU16 offset;
2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16
5//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16
};
TS_task_adc_sample ts_adc_samples[D_ADC_CHANNEL_NUM];
//ch是0123,代表4通道
void L2_task_adc_init(U8 ch)
{
//通道采集任务初始化
L1_task_reg_clear(&ts_adc_samples[ch].task);
L3_task_s_go(ts_adc_samples[ch],D_task_init);
ts_adc_samples[ch].pSPara = &TS_adc_SPara[ch];
ts_adc_samples[ch].firstRun = 1;
}
//ADC Channel 采样任务
#define D_task_ADC_CHx_SAMPLE_JITTER_START_SAMPLE 0x53
#define D_task_ADC_CHx_JITTER 0x63
#define D_task_ADC_CHx_PIANYI 0x93
#define D_task_ADC_CHx_JITTER2 0x83
#define D_task_ADC_CHx_despiking_shift 0x94
#define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x73
#define D_task_ADC_CHx_SAMPLE_READ 0x54
#define D_task_ADC_CHx_SAMPLE_OUT 0x55
#define D_task_ADC_CHx_SHIFTFILTER 0x56
#define D_task_ADC_CHx_SHIFTFILTER2 0x57
#define D_ADC_JITTER_zero 22///还包含建立时间 至少9个
#define D_ADC_JITTER_FINISH 12///还包含建立时间 至少9个
/********
80hZ
1000ms/80= 12.5ms/point
ushex send = 4Bytes+blank = 5Byte;
115200 0.1ms/Byte
5Bytes 0.5ms 2ms
*******/
S16 L3_out_tran(vU32 rdata)
{
S16 t16;
/// 24bits 3Bytes
rdata >>= 8;
t16 = rdata;
#if (D_sensor_up_down)
t16 *= -1;
#else
///t16 *= -1;
#endif
return t16;
}
vU16 L3_adc_out_offset(vU16 offset,vU16 t16)
{
vU16 out;
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
if(t16 & 0x8000) //最高位为1,<0则
{
t16 = 0xffFF - t16;///转变为正数
///*d = D_ADC_OFFSET - t16;
out = offset - t16;
// L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' ');
}else
{
out = t16 + offset;
}
// L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a();
return out;
}
/*
adcval adc采样值
^
|
| --.-------------.-------------.------------.---------wantline
| . . . .
| . . offset3 .
| . . . .
| . . .ch3.adc .
| offset1 offset2 .
| . . offset4
---0---.-------------.--------------------------.------------
| . .ch2.adc .
| . .
| ch1.adc .
| .
| ch3.adc.
.offset
adc有正数和负数
*/
vU16 L3_adc_get_offset(vU16 wantline,vU16 adcv)
{
vU16 out;
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
if(adcv & 0x8000) //最高位为1,<0则
{
out = 0xffFF - adcv;///转变为正数
out += wantline;
}else
{
out = wantline - adcv;
}
return out;
}
/*
///cc 2023/04/06--6:34:10
西
adc
hex dec kg adc/kg
68F 1679 10 168
4196 16790 100
-------------void L2_task_adc_sample(TS_TASK_ADC_SAMPLE *s)----------
s->out1_adc = L3_out_tran(s->out0);
############
s->out2_offset = L3_out_offset(s->ch,s->out1_adc);
############
Lc_despiking_shift3_U16(s->outm);////采样后进行削峰
s->out3_peak = s->outm[1];
############
s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average; from s->out3_peak
s->ts_SAb.out4_shift = (vU16)s->ts_SAb.average;from s->out3_peak
----------void L3_task_weight_handler(TS_TASK_weight_ *s)-----------------
ts_adc_samples[3].out5 = ts_adc_samples[3].ts_SAb.out4_shift;
############
////四个传感器相加后平均
tst_weight.sum32 = ts_adc_samples[0].out5;
tst_weight.sum32 += ts_adc_samples[1].out5;
tst_weight.sum32 += ts_adc_samples[2].out5;
tst_weight.sum32 += ts_adc_samples[3].out5;
tst_weight.out6 = tst_weight.sum32 >>2;
############
tst_weight.adc32 = tst_weight.out6;
L3_task_weight_cal();
1
2
3
1
adc的值都偏移到 10kg/200kg 1/20
线
2
3
---------------------------
*/
void L2_task_adc_sample(TS_task_adc_sample *s)
{
TTSS_Task_init():
////cc 初始化尽量放到这里,不要放到main ——init中,减少系统启动的时间
s->jitter_start = 0; s->ok = 0;
////printf("\r\nADC_SAMPLE\r\n");
/*
printf5("\r\nADC_SAMPLE init ch(%d) wantline:%d(%4X) offset %d(%4X)", (int)s->pSPara->ch,
ts_adc_samples[s->pSPara->ch].pSPara->wantline,ts_adc_samples[s->pSPara->ch].pSPara->wantline,
ts_adc_samples[s->pSPara->ch].pSPara->offset,ts_adc_samples[s->pSPara->ch].pSPara->offset);
*/
printf1("\r\nADC_SAMPLE init ch(%d) ", (int)s->pSPara->ch);
L1_uartD_waitFree() ;
s->firstRun = 1;
/// L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_READ,D_Tdelay_Msec(1500)); //延时15ms
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ):
if(0 == L0_adc_DOUT_AT(s->pSPara->ch))
{////L0_uart0_uc('X');L0_uart0_uc(0x30+s->ch);
//// L0_ADS1231_readCH2(s->ch,&(s->out1)); ////
L0_ADS1231_readCH2(s->pSPara->ch,&(s->out0));
L2_task_go(D_task_ADC_CHx_PIANYI);
}
TTSS_Task_step(D_task_ADC_CHx_PIANYI):
s->out1_adc = L3_out_tran(s->out0);///////cc 2023/04/06--6:33:46 最原始的输出
s->out2_offset = L3_adc_out_offset(s->pSPara->offset,s->out1_adc);
L2_task_go(D_task_ADC_CHx_despiking_shift);
TTSS_Task_step(D_task_ADC_CHx_despiking_shift):
s->outm[0] = s->outm[1];
s->outm[1] = s->outm[2];
s->outm[2] = s->out2_offset;
Lc_despiking_shift3_U16(s->outm);////采样后进行削峰
s->out3_Peak = s->outm[1];
/// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak;
if(s->firstRun)///
{////第一次上电
L2_task_go(D_task_ADC_CHx_JITTER2);
}else
{
L2_task_go(D_task_ADC_CHx_SHIFTFILTER);
}
TTSS_Task_step(D_task_ADC_CHx_JITTER2):
if(s->jitter_start < D_ADC_JITTER_FINISH)
{
///printfs("\r\n D_ADC_JITTER_zero---");
L1_uartD_uc('9');
s->jitter_start ++;
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
}else
{
/// 上电的时候如果没有重量可以这样 ,如果有呢??
///L3_out_zero(s->ch);///算出当前的偏移量 更新offset
s->pSPara->offset = L3_adc_get_offset(s->pSPara->wantline,s->out1_adc);///必须out1_adc 因为偏移是针对 out1_adc的
/// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak;
printfs("\r\n D_ADC_JITTER_zero---");
///printf3("\r\n ch(%d) out3_Peak %5d %5X ",(int)s->pSPara->ch,s->out3_Peak,s->out3_Peak );
printf4("\r\n ch(%d) adc=%5d ->offset %5d wantline %5d ",(int)s->pSPara->ch,s->out1_adc,s->pSPara->offset,s->pSPara->wantline);
printf4("\r\n ch(%d) adc=%5X ->offset %5X wantline %5X ",(int)s->pSPara->ch,s->out1_adc,s->pSPara->offset,s->pSPara->wantline);
s->ts_SAa.average = (vU32)s->out3_Peak;/// shiftaverage_a路初始化
s->ts_SAa.sum = s->ts_SAa.average << s->pSPara->ashift;
/**
s->ts_SAb.average = (vU32)s->out3_Peak;/// shiftaverage_b路初始化
s->ts_SAb.sum = s->ts_SAb.average << s->pSPara->bshift;
*/
s->firstRun = 0;
///刚开始的抖动,先去掉几个最开始的数据
L2_task_go(D_task_ADC_CHx_SHIFTFILTER);
}
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER):
//L0_uart0_uc('B');
s->ts_SAa.sum -= s->ts_SAa.average;
s->ts_SAa.sum += (vU32)s->out3_Peak;
s->ts_SAa.average = s->ts_SAa.sum >> s->pSPara->ashift;
// s->ts_SAa.new = s->ts_SAa.average;
s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average;
/// L0_uart0_uc('s');
L2_task_go(D_task_ADC_CHx_SHIFTFILTER2);
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER2):
s->ok = 1;
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
/// L2_task_go(D_task_ADC_CHx_SAMPLE_OUT);
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT):
/***
L0_uart0_ulhex(s->out0); L0_uart0_uc(0x09);
L0_uart0_ushex(s->out1); L0_uart0_uc(0x09);
L0_uart0_ushex(s->out2); L0_uart0_uc(0x09);
L0_uart0_ushex(s->ts_SAa.out4); L0_uart0_uc(0x09);
L0_uart0_ushex(s->ts_SAb.out4);
L0_uart0_0d0a();
**/
////
//// L0_uart0_uc('0' + s->ch);L0_uart0_uc('A');//
TTSS_Task_end();
}
#if 0
void L3_out_zero(u8 ch)
{
vS16 t,m;
t = ts_adc_samples[ch].out1_adc;
m = ts_adc_samples[ch].SPara.wantline;
m -= t;
ts_adc_samples[ch].SPara.offset = (vU16)m;
/// L0_waitFree_uartN(0);///混搭使用printf的时候必须加上
/// printf("\r\nzeroout = %4x offset= 0x%4x\r\n", ts_adc_samples[ch].zeroout,ts_adc_samples[ch].offset);
/// D_ADC_OFFSET(ch) = ts_adc_samples[ch].zeroout - ts_adc_samples[ch].out1;
}
vU16 L3_out_offset222(u8 ch,vU16 t16)
{
vU16 out;
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
if(t16 & 0x8000) //最高位为1,<0则
{
t16 = 0xffFF - t16;///转变为正数
///*d = D_ADC_OFFSET - t16;
out = ts_adc_samples[ch].SPara.offset - t16;
// L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' ');
}else
{
out = t16 + ts_adc_samples[ch].SPara.offset;
}
// L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a();
return out;
}
vU16 L3_out_tran2(vU32 rdata)
{
vU16 t16;
//// L0_ADS1231_readCH2(0,&rdata);
// L0_uart0_uc('0'+ch); L0_uart0_uc(0x09);
// L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
if (rdata > 0x007fFFff)
{
rdata >>= D_sensor_zoom; ///fixme:此处正负差和移位不一致需要谨慎
rdata |= D_sensor_zoom_FF; /// 1111 1100
}else
{
rdata >>= D_sensor_zoom;
}
// L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
t16 = rdata;
// L0_uart0_ushex(t16); L0_uart0_uc(0x09);
///L0_uart0_0d0a();
return t16;
}
void L3_task_show_init(void)
{
//显示任务初始化
L1_task_init(&ts_adc_blur_show.task);
L3_task_s_go(ts_adc_blur_show,D_task_init);
ts_adc_blur_show.rough_weight = 0;
}
//中值滤波任务
#define D_task_ADC_CHx_FILTER_MID_GET 0x50
#define D_task_ADC_CHx_FILTER_MID_COUNT 0x51
#define D_task_ADC_CHx_FILTER_MID_OUT 0x52
void L3_task_adc_filter_mid(S_TASK_ADC_BLUR_MID *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out1[i];
}
ts_adc_channel_samples[s->ch].n = 0;
L2_task_go(D_task_ADC_CHx_FILTER_MID_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_COUNT)
s->midval = Lc_S32_media(s->in, s->max);
L2_task_go(D_task_ADC_CHx_FILTER_MID_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_OUT)
s->out[s->n] = s->midval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_end();
}
//均值滤波任务
#define D_task_ADC_CHx_FILTER_AVG_GET 0x50
#define D_task_ADC_CHx_FILTER_AVG_COUNT 0x51
#define D_task_ADC_CHx_FILTER_AVG_OUT 0x52
void L3_task_adc_filter_avg(S_TASK_ADC_BLUR_AVG *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
ts_adc_channel_samples[s->ch].n = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out1[i];
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_COUNT)
s->avgval = Lc_vS32_avg(s->in,s->max);
L2_task_go(D_task_ADC_CHx_FILTER_AVG_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_OUT)
s->out[s->n] = s->avgval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_end();
}
//移位滤波任务
#define D_task_ADC_CHx_FILTER_SHIFT_GET 0x50
#define D_task_ADC_CHx_FILTER_SHIFT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_SHIFT_OUT 0x52
void L3_task_adc_ShiftFilter(TS_TASK_ADC_SHIFTFILTER *s)
{
TTSS_Task_init()
s->average = ts_adc_samples[s->ch].out2;///
s->sum = s->average << s->shift;
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_GET)
s->sum +=
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_COUNT)
s->sum[0] -= s->shiftval[0];
s->sum[0] += s->in;
s->shiftval[0] = s->sum[0] >> s->shiftreg[0];
s->sum[1] -= s->shiftval[1];
s->sum[1] += s->in;
s->shiftval[1] = s->sum[1] >> s->shiftreg[1];
s->sum[2] -= s->shiftval[2];
s->sum[2] += s->in;
s->shiftval[2] = s->sum[2] >> s->shiftreg[2];
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_OUT)
s->out[0][s->n] = s->shiftval[0];
s->out[1][s->n] = s->shiftval[1];
s->out[2][s->n] = s->shiftval[2];
//R.adval[s->ch] = s->out[0][s->n] = s->shiftval[0];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_end();
}
//输出判定任务
#define D_task_ADC_CHx_FILTER_OUT_GET 0x50
#define D_task_ADC_CHx_FILTER_OUT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_OUT_CHANGE 0x52
#define D_task_ADC_CHx_FILTER_OUT_OUT 0x53
void L3_task_adc_filter_out(S_TASK_ADC_BLUR_OUT *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_GET)
if(s->h != ts_adc_blur_shift[s->ch].n)
{
s->h = ts_adc_blur_shift[s->ch].n;
s->in[0] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 1)];
s->in[1] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 2)];
//获取输出曲线val
s->newout = ts_adc_blur_shift[s->ch].out[s->oldnum][count_n(ts_adc_blur_shift[s->ch].n, 1)];
L2_task_go(D_task_ADC_CHx_FILTER_OUT_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_COUNT) //根据阀值选择输出的曲线
//判断选择新曲线
if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[0])//2KG
{
s->newnum = 0;
}
else if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[1]) //0.5KG
{
s->newnum = 1;
}
else
{
s->newnum = 2;
}
//L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
L2_task_go(D_task_ADC_CHx_FILTER_OUT_CHANGE);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_CHANGE)
if(s->newnum != s->oldnum)//切换移位滤波时调整其他滤波的SUM
{
s->oldnum = s->newnum; //不能只调整新值,所有曲线都要一起调整
//ts_adc_blur_shift[s->ch].sum[1] = (ts_adc_blur_avg[s->ch].out[ts_adc_blur_avg[s->ch].n] * R.adc_blur_avg);
ts_adc_blur_shift[s->ch].sum[0] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[0];
ts_adc_blur_shift[s->ch].shiftval[0] = s->newout;
ts_adc_blur_shift[s->ch].sum[1] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[1];
ts_adc_blur_shift[s->ch].shiftval[1] = s->newout;
ts_adc_blur_shift[s->ch].sum[2] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[2];
ts_adc_blur_shift[s->ch].shiftval[2] = s->newout;
}
L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_OUT)
R.adval[s->ch] = s->newout;
//R.adval[s->ch] = ts_adc_channel_samples[s->ch].adcval;
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_end();
}
//显示任务
#define D_task_ADC_CHx_SHOW 0x50
void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SHOW);
TTSS_Task_step(D_task_ADC_CHx_SHOW)
R.ch_weight[0] = D_COUNT_WEIGHT(R.adval[0]);
R.ch_weight[1] = D_COUNT_WEIGHT(R.adval[1]);
R.ch_weight[2] = D_COUNT_WEIGHT(R.adval[2]);
R.ch_weight[3] = D_COUNT_WEIGHT(R.adval[3]);
s->rough_weight = R.ch_weight[0] + R.ch_weight[1] + R.ch_weight[2] + R.ch_weight[3]; //毛重
#if 0
L0_uart0_ulhex(s->rough_weight);
L0_uart0_uc(' ');
#endif
if( ABS(R.rough_weight,s->rough_weight) >= 50) //变化超过0.05KG
{
R.rough_weight = s->rough_weight;
R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
}
L2_task_go_Tdelay(D_task_ADC_CHx_SHOW,D_Tdelay_Msec(15)); //延时15ms
TTSS_Task_end();
}
/*******
ts_adc_channel_samples[ch].status = (R.p.adc_ch_status >> ch) & 0x1;
ts_adc_channel_samples[ch].pool = 0;
ts_adc_channel_samples[ch].adcval = 0;
ts_adc_channel_samples[ch].n = 0;
ts_adc_channel_samples[ch].ch = D_ADCCH_1 + ch;
//通道中值滤波任务初始化
L1_task_init(&ts_adc_blur_mid[ch].task);
L3_task_s_go(ts_adc_blur_mid[ch],D_task_init);
ts_adc_blur_mid[ch].n = 0;
ts_adc_blur_mid[ch].max = R.p.adc_blur_mid;
ts_adc_blur_mid[ch].ch = D_ADCCH_1 + ch;
//通道均值滤波任务初始化
L1_task_init(&ts_adc_blur_avg[ch].task);
L3_task_s_go(ts_adc_blur_avg[ch],D_task_init);
ts_adc_blur_avg[ch].max = R.p.adc_blur_avg;
ts_adc_blur_avg[ch].avgval = 0;
ts_adc_blur_avg[ch].n = 0;
ts_adc_blur_avg[ch].ch = D_ADCCH_1 + ch;
//通道移位滤波任务初始化
L1_task_init(&ts_adc_blur_shift[ch].task);
L3_task_s_go(ts_adc_blur_shift[ch],D_task_init);
ts_adc_blur_shift[ch].n = 0;
ts_adc_blur_shift[ch].h = 0;
ts_adc_blur_shift[ch].shiftreg[0] = R.p.adc_blur_shift[0];
ts_adc_blur_shift[ch].shiftreg[1] = R.p.adc_blur_shift[1];
ts_adc_blur_shift[ch].shiftreg[2] = R.p.adc_blur_shift[2];
ts_adc_blur_shift[ch].sum[0] = 0;
ts_adc_blur_shift[ch].sum[1] = 0;
ts_adc_blur_shift[ch].sum[2] = 0;
ts_adc_blur_shift[ch].shiftval[0] = 0;
ts_adc_blur_shift[ch].shiftval[1] = 0;
ts_adc_blur_shift[ch].shiftval[2] = 0;
ts_adc_blur_shift[ch].ch = D_ADCCH_1 + ch;
//输出判定任务初始化
L1_task_init(&ts_adc_blur_out[ch].task);
L3_task_s_go(ts_adc_blur_out[ch],D_task_init);
ts_adc_blur_out[ch].h= 0;
ts_adc_blur_out[ch].threshold[0] = D_blur_threshold_2_1(R.p.adc_blur_threshold[0]); //2KG
ts_adc_blur_out[ch].threshold[1] = D_blur_threshold_2_1(R.p.adc_blur_threshold[1]); //0.5KG
ts_adc_blur_out[ch].newnum = 0;
ts_adc_blur_out[ch].oldnum = 0;
ts_adc_blur_out[ch].oldout = 0;
ts_adc_blur_out[ch].newout = 0;
ts_adc_blur_out[ch].n = 0;
ts_adc_blur_out[ch].ch = D_ADCCH_1 + ch;
*****/
#if 0
//通道切换任务初始化
//L1_task_init(&ts_adc_channel_switch.task);
L3_task_s_go(ts_adc_channel_switch,D_task_init);
#endif
#endif

143
source/asp/asp_schain.h

@ -0,0 +1,143 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _asp_schain_H
#define _asp_schain_H
#include "bsp_config.h"
#include "TTSS_task.h"
#include "c_lib.h"
///#include "app_config.h"
#define D_Wch1 0
#define D_Wch2 1
#define D_Wch3 2
#define D_Wch4 3
#define ADC_CHANNEL_STATUS_UNREADY 0 //UnReady状态,不能读取
#define ADC_CHANNEL_STATUS_READY 1 //ready状态,可以读取
#define D_ADC_CHANNEL_NUM 4
#define D_ADC_CH_SAMPLE_BUF_MAX 50
#define D_ADC_CH_BLUE_POOL_NUM 3
typedef struct
{
vU32 average; ///
//// vU8 shift; ///移动的位数 1-2 2-4 3-8 4-16
vU32 sum;
vU32 new; ///新的输出值
vU16 out4_shift; ///
}TS_shift_averge_;
typedef struct
{///!!!!!和 D_TS_adc_SPara_LEN 需要一一对应
u8 rev1; ////= 0x30 第一次运行
u8 ch;
vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值
vU16 offset; ///当前adc被偏移到wantline的时候 和原始值out_adc的差值 一般=(wantline-原始adc)
vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16
vU8 bshift444; ///移动的位数 1-2 2-4 3-8 4-16 fixme:需要开放时调整
// u8 rev1;
// u8 rev2;
// u8 rev2;
}TS_adc_SPara_;
extern TS_adc_SPara_ TS_adc_SPara[D_ADC_CHANNEL_NUM];
#define D_TS_adc_SPara_LEN (8)
//AD_CHANNEL_SAMPLE 采样
#define MAX_OUT_NUM 10
typedef struct
{ TS_task task;
/////S参数区
TS_adc_SPara_ *pSPara;
/////S参数区
vU8 firstRun;
vU8 ok;
vU8 jitter_start; ///刚开始的抖动,先去掉几个最开始的数据
vU32 out0;
vU16 out1_adc;
vU16 out2_offset;
vU16 out3_Peak;
TS_shift_averge_ ts_SAa;
/// TS_shift_averge_ ts_SAb; fixme:需要开放时调整
vU16 outm[3];///中值移位滤波的缓存
vU16 out4_shift;//滤波输出
vU16 out5;////选择后的
}TS_task_adc_sample;
extern TS_task_adc_sample ts_adc_samples[D_ADC_CHANNEL_NUM];
extern void L2_task_adc_init(U8 ch);
extern void L2_task_adc_sample(TS_task_adc_sample *s);
extern void L2_task_adc_SAinit(U8 ch,U8 *a,U8 *b);
void L3_out_zero(u8 ch);
#endif // #ifndef _asp_adc_H
#if 0
///cc 2023/04/08--4:7:12 准备删除
////cc 比较重要的滤波调整参数,根据实际需要进行调整
#define D_ADC_shiftaverage_a 2
#define D_ADC_shiftaverage_b 4
///vtype i; vU32 rdata = 0;
//任务读
/// 单个传感器 D_sensor_zoom=8 2kg 289 80kg 8374
/// D_sensor_zoom=6 1274 31787
///#define D_sensor_zoom 6
///#define D_sensor_zoom_FF 0xFFfc0000
#define D_sensor_zoom 7
#define D_sensor_zoom_FF 0xFFfe0000
///#define D_sensor_zoom 8///实际上8位不需要,因为强制转换成16位后自动符合要求
///#define D_sensor_zoom_FF 0xfF000000
//// 31688 80kg 31688/80= =400
//#define D_ADC_PER_KG 400 ///每公斤adc
//#define D_ADC_OFFSET (20*D_ADC_PER_KG)
///134
///extern TS_GlobalRegister R;
#define D_ADC_PER_KG 0x134///每公斤adc
#define D_ADC_OFFSET(ch) ts_adc_samples[ch].offset////(30*D_ADC_PER_KG)
///#define D_ADC_OFFSET(ch) 0////(30*D_ADC_PER_KG)
/*****
000028FE 1kg 81.984375
00015D85 3kg 699.0390625 617.0546875
2^7 128 0x134
******/
#endif

173
source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.c

@ -0,0 +1,173 @@
#include "SL_Sc7a20_FreeFall_Driver.h"
#include "msp_iicM1.h"
unsigned char SL_MEMS_i2c_spi_Write(unsigned char reg, unsigned char dat)
{
///void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd)
L2_IICM1_WriteCmd(SC7A20_IIC_ADDRESS, reg, dat); //由客户的II函数接口决定
return 1;
}
unsigned char SL_MEMS_i2c_spi_Read(unsigned char reg, unsigned char len, unsigned char *buf)
{
///void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg,
/// unsigned char *r,unsigned char n)
L2_IICM1_ReadReg( SC7A20_IIC_ADDRESS, reg, buf, len);//由客户的II函数接口决定
return 1;
}
/***************在线测试**********************/
signed char SL_SC7A20_Online_Test(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x0F,1, &SL_Read_Reg);
if(SL_Read_Reg==SC7A20_CHIP_ID_VALUE) return 1;
else return -1;
}
/***************BOOT 重载内部寄存器值*********************/
signed char SL_SC7A20_BOOT(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=SL_SC7A20_BOOT_ENABLE|SL_Read_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
return 1;
}
/***************传感器量程设置**********************/
signed char SL_SC7A20_FS_Config(unsigned char Sc7a20_FS_Reg)
{
unsigned char SL_Read_Reg=0xff,SL_Write_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
// SL_Write_Reg=0x80|Sc7a20_FS_Reg|SL_SC7A20_HR_ENABLE;
SL_Write_Reg=0x80|Sc7a20_FS_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x23, SL_Write_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
if(SL_Read_Reg==SL_Write_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_Power_Config(unsigned char Power_Config_Reg)
{
unsigned char SL_Read_Reg;
#if SL_SC7A20_MTP_ENABLE == 0X01
SL_Read_Reg = 0x00;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x1E, SL_SC7A20_MTP_VALUE);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x57,1, &SL_Read_Reg);
SL_Read_Reg=SL_Read_Reg|SL_SC7A20_SDO_PU_MSK|SL_SC7A20_I2C_PU_MSK;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x57, SL_Read_Reg);
#endif
SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x20, Power_Config_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==Power_Config_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_FreeFall_Config(void)
{
unsigned char SL_Read_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=0x80|SL_Read_Reg;//AOI1 LATCH
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x22, 0x40);//AOI1 映射到INT1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x25, 0x02);//INT1 默认高电平,有中断输出低电平
//FreeFall AOI1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x30, 0x95);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x32, 0x19);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x33, 0x04);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x30,1, &SL_Read_Reg);
if(SL_Read_Reg==0x95) return 1;
else return -1;
}
#if SL_SC7A20_16BIT_8BIT==0
/***************加速度计数据读取*8bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed char *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed char)SL_Read_Buf[2];
SL_SC7A20_Data_XYZ_Buf[1]=(signed char)SL_Read_Buf[4];
SL_SC7A20_Data_XYZ_Buf[2]=(signed char)SL_Read_Buf[6];
return 1;
}
else
{
return 0;
}
}
#elif SL_SC7A20_16BIT_8BIT==1
/***************加速度计数据读取*16bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed short *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed short)((SL_Read_Buf[2]<<8) + SL_Read_Buf[1]);
SL_SC7A20_Data_XYZ_Buf[1]=(signed short)((SL_Read_Buf[4]<<8) + SL_Read_Buf[3]);
SL_SC7A20_Data_XYZ_Buf[2]=(signed short)((SL_Read_Buf[6]<<8) + SL_Read_Buf[5]);
return 1;
}
else
{
return 0;
}
}
#endif
//自由落体检测
signed char SL_SC7A20_Freefall_Status(void)
{
unsigned char sl_freefall_reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x31,1, &sl_freefall_reg);
//USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg);
if((sl_freefall_reg&0x40)==0x40)
{
return 1;//自由落体成立
}
return 0;//自由落体不成立
}
signed char SL_SC7A20_Power_Down(void)//power down
{
unsigned char SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE, 0x20, 0x00);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==0x00) return 1;
else return -1;
}

207
source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.h

@ -0,0 +1,207 @@
#ifndef __SL_SC7A20_FREEFALL_DRIVER_H__
#define __SL_SC7A20_FREEFALL_DRIVER_H__
/***使用驱动前请根据实际接线情况配置******/
/**SC7A20的SDO 脚接地: 0****************/
/**SC7A20的SDO 脚接电源:1****************/
#define SC7A20_SDO_VDD_GND 1
/*****************************************/
/***使用驱动前请根据实际IIC情况进行配置***/
/**SC7A20的IIC 接口地址类型 7bits: 0****/
/**SC7A20的IIC 接口地址类型 8bits: 1****/
#define SC7A20_IIC_7BITS_8BITS 0
/*****************************************/
#define SL_SC7A20_16BIT_8BIT 1
/**SC7A20的数据位数选择 16bits: 1****/
/**SC7A20的数据位数选择 8bits: 0****/
/*****************************************/
#define SL_SC7A20_SPI_IIC_MODE 1
/**SC7A20 SPI IIC 选择 SPI: 0****/
/**SC7A20 SPI IIC 选择 IIC: 1****/
/*****************************************/
#if SC7A20_SDO_VDD_GND==0
#define SC7A20_IIC_7BITS_ADDR 0x18
#define SC7A20_IIC_8BITS_ADDR 0x30
#else
#define SC7A20_IIC_7BITS_ADDR 0x19
#define SC7A20_IIC_8BITS_ADDR 0x32
#endif
#if SC7A20_IIC_7BITS_8BITS==0
#define SC7A20_IIC_ADDRESS SC7A20_IIC_7BITS_ADDR
#else
#define SC7A20_IIC_ADDRESS SC7A20_IIC_8BITS_ADDR
#endif
#define SC7A20_CHIP_ID_ADDRESS (unsigned char)0x0F
#define SC7A20_CHIP_ID_VALUE (unsigned char)0x11
#define SL_SC7A20_CTRL_REG1 (unsigned char)0x20
#define SL_SC7A20_CTRL_REG2 (unsigned char)0x21
#define SL_SC7A20_CTRL_REG3 (unsigned char)0x22
#define SL_SC7A20_CTRL_REG4 (unsigned char)0x23
#define SL_SC7A20_CTRL_REG5 (unsigned char)0x24
#define SL_SC7A20_CTRL_REG6 (unsigned char)0x25
#define SL_SC7A20_STATUS_REG (unsigned char)0x27
#define SL_SC7A20_OUT_X_L (unsigned char)0x28
#define SL_SC7A20_OUT_X_H (unsigned char)0x29
#define SL_SC7A20_OUT_Y_L (unsigned char)0x2A
#define SL_SC7A20_OUT_Y_H (unsigned char)0x2B
#define SL_SC7A20_OUT_Z_L (unsigned char)0x2C
#define SL_SC7A20_OUT_Z_H (unsigned char)0x2D
#define SL_SC7A20_FIFO_CTRL_REG (unsigned char)0x2E
#define SL_SC7A20_FIFO_SRC_REG (unsigned char)0x2F
#define SL_SC7A20_INT1_CFG (unsigned char)0x30
#define SL_SC7A20_INT1_SRC (unsigned char)0x31
#define SL_SC7A20_INT1_THS (unsigned char)0x32
#define SL_SC7A20_INT1_DURATION (unsigned char)0x33
#define SL_SC7A20_INT2_CFG (unsigned char)0x34
#define SL_SC7A20_INT2_SRC (unsigned char)0x35
#define SL_SC7A20_INT2_THS (unsigned char)0x36
#define SL_SC7A20_INT2_DURATION (unsigned char)0x37
#define SL_SC7A20_CLICK_CFG (unsigned char)0x38
#define SL_SC7A20_CLICK_SRC (unsigned char)0x39
#define SL_SC7A20_CLICK_THS (unsigned char)0x3A
#define SL_SC7A20_TIME_LIMIT (unsigned char)0x3B
#define SL_SC7A20_TIME_LATENCY (unsigned char)0x3C
#define SL_SC7A20_TIME_WINDOW (unsigned char)0x3D
#define SL_SC7A20_ACT_THS (unsigned char)0x3E
#define SL_SC7A20_ACT_DURATION (unsigned char)0x3F
/*连续读取数据时的数据寄存器地址*/
#define SL_SC7A20_DATA_OUT (unsigned char)(SL_SC7A20_OUT_X_L|0x80)
/**********特殊功能寄存器**********/
/*非原厂技术人员请勿修改*/
#define SL_SC7A20_MTP_ENABLE 0x00
#define SL_SC7A20_MTP_CFG (unsigned char)0x1E
#define SL_SC7A20_MTP_VALUE (unsigned char)0x05
#define SL_SC7A20_SDOI2C_PU_CFG (unsigned char)0x57
#define SL_SC7A20_SDO_PU_MSK (unsigned char)0x08
#define SL_SC7A20_I2C_PU_MSK (unsigned char)0x04
#define SL_SC7A20_HR_ENABLE (unsigned char)0X08
#define SL_SC7A20_BOOT_ENABLE (unsigned char)0X80
/*非原厂技术人员请勿修改*/
/***************数据更新速率**加速度计使能**********/
#define SL_SC7A20_ODR_POWER_DOWN (unsigned char)0x00
#define SL_SC7A20_ODR_1HZ (unsigned char)0x17
#define SL_SC7A20_ODR_10HZ (unsigned char)0x27
#define SL_SC7A20_ODR_25HZ (unsigned char)0x37
#define SL_SC7A20_ODR_50HZ (unsigned char)0x47
#define SL_SC7A20_ODR_100HZ (unsigned char)0x57
#define SL_SC7A20_ODR_200HZ (unsigned char)0x67
#define SL_SC7A20_ODR_400HZ (unsigned char)0x77
#define SL_SC7A20_ODR_1600HZ (unsigned char)0x87
#define SL_SC7A20_ODR_1250HZ (unsigned char)0x97
#define SL_SC7A20_ODR_5000HZ (unsigned char)0x9F
#define SL_SC7A20_LOWER_POWER_ODR_1HZ (unsigned char)0x1F
#define SL_SC7A20_LOWER_POWER_ODR_10HZ (unsigned char)0x2F
#define SL_SC7A20_LOWER_POWER_ODR_25HZ (unsigned char)0x3F
#define SL_SC7A20_LOWER_POWER_ODR_50HZ (unsigned char)0x4F
#define SL_SC7A20_LOWER_POWER_ODR_100HZ (unsigned char)0x5F
#define SL_SC7A20_LOWER_POWER_ODR_200HZ (unsigned char)0x6F
#define SL_SC7A20_LOWER_POWER_ODR_400HZ (unsigned char)0x7F
/***************数据更新速率**加速度计使能**********/
/***************传感器量程设置**********************/
#define SL_SC7A20_FS_2G (unsigned char)0x00
#define SL_SC7A20_FS_4G (unsigned char)0x10
#define SL_SC7A20_FS_8G (unsigned char)0x20
#define SL_SC7A20_FS_16G (unsigned char)0x30
/***************传感器量程设置**********************/
/***取值在0-127之间,此处仅举例****/
#define SL_SC7A20_INT1_THS_5PERCENT (unsigned char)0x06
#define SL_SC7A20_INT1_THS_10PERCENT (unsigned char)0x0C
#define SL_SC7A20_INT1_THS_20PERCENT (unsigned char)0x18
#define SL_SC7A20_INT1_THS_40PERCENT (unsigned char)0x30
#define SL_SC7A20_INT1_THS_80PERCENT (unsigned char)0x60
/***取值在0-127之间,此处仅举例 乘以ODR单位时间****/
#define SL_SC7A20_INT1_DURATION_2CLK (unsigned char)0x02
#define SL_SC7A20_INT1_DURATION_5CLK (unsigned char)0x05
#define SL_SC7A20_INT1_DURATION_10CLK (unsigned char)0x0A
/***中断有效时的电平设置,高电平相当于上升沿,低电平相当于下降沿****/
#define SL_SC7A20_INT_ACTIVE_LOWER_LEVEL 0x02 //0x02:中断时INT1脚输出 低电平
#define SL_SC7A20_INT_ACTIVE_HIGH_LEVEL 0x00 //0x00:中断时INT1脚输出 高电平
/***中断有效时的电平设置,高电平相当于上升沿,低电平相当于下降沿****/
#define SL_SC7A20_INT_AOI1_INT1 0x40 //AOI1 TO INT1
#define SL_SC7A20_INT_AOI2_INT1 0x20 //AOI2 TO INT1
/********客户需要进行的IIC接口封包函数****************/
extern unsigned char SL_SC7A20_I2c_Spi_Write(unsigned char sl_spi_iic,unsigned char reg, unsigned char dat);
extern unsigned char SL_SC7A20_I2c_Spi_Read(unsigned char sl_spi_iic,unsigned char reg, unsigned char len, unsigned char *buf);
/**SL_SC7A20_I2c_Spi_Write 函数中, sl_spi_iic:0=spi 1=i2c Reg:寄存器地址 data:寄存器的配置值******************/
/**SL_SC7A20_I2c_Spi_Write 函数 是一个单次写的函数*******************************************************************/
/***SL_SC7A20_I2c_Spi_Read 函数中, sl_spi_iic:0=spi 1=i2c Reg 同上,len:读取数据长度,buf:存储数据首地址(指针)***/
/***SL_SC7A20_I2c_Spi_Read 函数 是可以进行单次读或多次连续读取的函数*************************************************/
/*** 客户IIC函数封装举例
unsigned char SL_MEMS_i2c_spi_Write(unsigned char reg, unsigned char data)
{
i2cWrite(SC7A20_IIC_ADDRESS, reg, data); //由客户的II函数接口决定
return 1;
}
unsigned char SL_MEMS_i2c_spi_Read(unsigned char reg, unsigned char len, unsigned char *buf)
{
i2cRead( SC7A20_IIC_ADDRESS, reg, len, buf);//由客户的II函数接口决定
return 1;
}
***/
signed char SL_SC7A20_Online_Test(void);
signed char SL_SC7A20_BOOT(void);
signed char SL_SC7A20_FS_Config(unsigned char Sc7a20_FS_Reg);
signed char SL_SC7A20_Power_Config(unsigned char Power_Config_Reg);
signed char SL_SC7A20_FreeFall_Config(void);
#if SL_SC7A20_16BIT_8BIT==0
signed char SL_SC7A20_Read_XYZ_Data(signed char *SL_SC7A20_Data_XYZ_Buf);
#elif SL_SC7A20_16BIT_8BIT==1
signed char SL_SC7A20_Read_XYZ_Data(signed short *SL_SC7A20_Data_XYZ_Buf);
#endif
signed char SL_SC7A20_Freefall_Status(void);
//步骤如下:
//0.signed char SL_SC7A20_BOOT(void);
//1.signed char SL_SC7A20_Online_Test(void);
//2.signed char SL_SC7A20_FS_Config(unsigned char Sc7a20_FS_Reg);
//3.signed char SL_SC7A20_Power_Config(unsigned char Power_Config_Reg);
//4.signed char SL_SC7A20_FreeFall_Config(void);
//6.signed char SL_SC7A20_Read_XYZ_Data(signed char *SL_SC7A20_Data_XYZ_Buf);
//6.signed char SL_SC7A20_Read_XYZ_Data(signed short *SL_SC7A20_Data_XYZ_Buf);
//7.signed char SL_SC7A20_Freefall_Status(void);
#endif /* __SL_SC7A20_DRIVER_H */

350
source/asp/新建文件夹/SL_algo1.h

@ -0,0 +1,350 @@
/*
Copyright (c) 2017 Silan MEMS. All Rights Reserved.
*/
#ifndef SL_Watch_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO_DRV__H__
#define SL_Watch_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO_DRV__H__
#define SL_Sensor_Algo_Release_Enable 0x01
//0x00: for debug
//0x01: release version
/***使用驱动前请根据实际接线情况配置******/
/**SC7A20的SDO 脚接地: 0****************/
/**SC7A20的SDO 脚接电源:1****************/
#define SL_SC7A20_SDO_VDD_GND 1
/*****************************************/
/***使用驱动前请根据实际IIC情况进行配置***/
/**SC7A20的IIC 接口地址类型 7bits: 0****/
/**SC7A20的IIC 接口地址类型 8bits: 1****/
#define SL_SC7A20_IIC_7BITS_8BITS 1
/*****************************************/
#if SL_SC7A20_SDO_VDD_GND==0
#define SL_SC7A20_IIC_7BITS_ADDR 0x18
#define SL_SC7A20_IIC_8BITS_WRITE_ADDR 0x30
#define SL_SC7A20_IIC_8BITS_READ_ADDR 0x31
#else
#define SL_SC7A20_IIC_7BITS_ADDR 0x19
#define SL_SC7A20_IIC_8BITS_WRITE_ADDR 0x32
#define SL_SC7A20_IIC_8BITS_READ_ADDR 0x33
#endif
#if SL_SC7A20_IIC_7BITS_8BITS==0
#define SL_SC7A20_IIC_ADDRESS SL_SC7A20_IIC_7BITS_ADDR
#else
#define SL_SC7A20_IIC_WRITE_ADDRESS SL_SC7A20_IIC_8BITS_WRITE_ADDR
#define SL_SC7A20_IIC_READ_ADDRESS SL_SC7A20_IIC_8BITS_READ_ADDR
#endif
#define SL_SC7A20_CHIP_ID_ADDR (unsigned char)0x0F
#define SL_SC7A20_CHIP_ID_VALUE (unsigned char)0x11
#define SL_SC7A20_VERSION_ADDR (unsigned char)0x70
#define SL_SC7A20_VERSION_VALUE (unsigned char)0x11
#define SL_SC7A20E_VERSION_VALUE (unsigned char)0x26
typedef enum {FALSE = 0,TRUE = !FALSE} bool;
/********客户需要进行的IIC接口封包函数****************/
extern unsigned char SL_SC7A20_I2c_Spi_Write(bool sl_spi_iic,unsigned char reg, unsigned char dat);
extern unsigned char SL_SC7A20_I2c_Spi_Read(bool sl_spi_iic,unsigned char reg, unsigned char len, unsigned char *buf);
/**SL_SC7A20_I2c_Spi_Write 函数中, sl_spi_iic:0=spi 1=i2c Reg:寄存器地址 dat:寄存器的配置值*******************/
/**SL_SC7A20_I2c_Spi_Write 函数 是一个单次写的函数*******************************************************************/
/***SL_SC7A20_I2c_Spi_Read 函数中, sl_spi_iic:0=spi 1=i2c Reg 同上,len:读取数据长度,buf:存储数据首地址(指针)***/
/***SL_SC7A20_I2c_Spi_Read 函数 是可以进行单次读或多次连续读取的函数*************************************************/
/*************驱动初始化函数**************/
signed char SL_SC7A20_Driver_Init(bool Sl_spi_iic_init,unsigned char Sl_pull_up_mode);
/***输入参数:1,Sl_spi_iic_init:0-1***2,PULL_UP_MODE:0x00 0x08 0x04 0x0c********/
/****Sl_spi_iic_init=0:SPI MODE, Sl_pull_up_mode config failed****************/
/****Sl_spi_iic_init=1:IIC MODE***********************************************/
/****Sl_pull_up_mode=0x00: SDO I2C pull up***********************************/
/****Sl_pull_up_mode=0x08: I2C pull up and SDO open drain*******************/
/****Sl_pull_up_mode=0x04: SDO pull up and I2C open drain*******************/
/****Sl_pull_up_mode=0x0C: SDO I2C open drain********************************/
/****SDO脚接地,推荐关闭SDO内部上拉电阻****************************************/
/****SPI通讯,推荐关闭SDA,SCL内部上拉电阻,SDO内部上拉电阻会自动关闭**********/
/*************返回数据情况如下*****************/
/**return : 0x11/0x26 表示CHIP ID 正常*********/
/**return : 0 表示读取异常*************/
/**return :-1; SPI 通信问题*************/
/**return :-2; IIC 通信问题*************/
/**return :-3; 连续读取 通信问题********/
/***************执行算法前需要读取FIFO数据*****/
/***************FIFO数据读取后,FIFO会清空*****/
/***************所以FIFO只能定时读取一次*******/
unsigned char SL_SC7A20_Read_FIFO(void);
/**return : FIFO_LEN 表示数组长度***********/
/****说明:该函数需要定时执行,从而保证算法执行到位**/
/***************执行算法获取计步结果***************/
unsigned int SL_Watch_Kcal_Pedo_Algo(bool sl_music_motor_en);
/***sl_music_motor_en=0: 马达电机和音乐功能未打开**/
/***sl_music_motor_en=1: 马达电机和音乐功能已打开**/
/**************获取当天的当前计步值****************/
/*************输出数据为:计步值(步)***************/
/***************获取三轴原始数据***************/
unsigned char SL_SC7A20_GET_FIFO_Buf(signed short *sl_x_buf,signed short *sl_y_buf,signed short *sl_z_buf,bool filter_en);
/****************执行算法后执行该命令**********/
/**x_buf y_buf z_buf : 长度32的数组首地址****/
/**filter_en:0 低通滤波禁止 1:低通滤波使能***/
/****************返回数据情况如下**************/
/**return : FIFO_LEN 表示数组长度***********/
/******************复位计步值************************/
void SL_Pedo_Kcal_ResetStepCount(void);
/**********输入数据为:无******输出数据为:无********/
/*使用方法: 系统时间到第二天时,调用该函数清除计步值*/
/*******************计步状态复位**********************/
void SL_Pedo_WorkMode_Reset(void);
/******************输入参数:无***********************/
/******************输出值参数:无*********************/
/******************升级后,设置计步值,距离,热量************************/
/******************升级后,请在初始化函数后,增加该函数****************/
void SL_Pedo_StepCount_Set(unsigned int sl_pedo_value,unsigned int sl_dis_value,unsigned int sl_kcal_value);
/**********输入数据为:sl_pedo_value 计步值*****/
/**********输入数据为:sl_dis_value 距离值*****/
/**********输入数据为:sl_kcal_value 热量值*****/
/******************计步灵敏度设置********************/
void SL_PEDO_TH_SET(unsigned char sl_pedo_amp,unsigned char sl_pedo_th,unsigned char sl_pedo_weak,unsigned char sl_zcr_lel,unsigned char sl_scope_lel);
/******sl_pedo_amp>4&&sl_pedo_amp<201**************************/
/******sl_pedo_amp:越小灵敏度越高,越容易计步******************/
/******sl_pedo_amp:越大灵敏度越高,越难计步********************/
/******sl_pedo_amp:默认值26,不设置就是26**********************/
/******sl_pedo_th>5&&sl_pedo_th<50*****************************/
/******sl_pedo_th:越小灵敏度越高,越容易计步*******************/
/******sl_pedo_th:越大灵敏度越高,越难计步*********************/
/******sl_pedo_th:默认值10,不设置就是10***********************/
/******sl_pedo_weak>=0&&sl_pedo_weak<6*************************/
/******sl_pedo_th:0,不打开轻微走路计步功能*********************/
/******sl_pedo_th:1,打开轻微走路计步功能***********************/
/******sl_pedo_th:2,打开轻微走路计步功能***********************/
/******sl_pedo_th:3,打开轻微走路计步功能***********************/
/******sl_pedo_th:4,打开轻微走路计步功能***********************/
/******sl_pedo_th:5,打开轻微走路计步功能***********************/
/******sl_pedo_th:默认值0,设置的值越大,检测计步的越灵敏*******/
/*****sl_zcr_lel>=0&&sl_zcr_lel<=255***************************/
/*****sl_zcr_lel:默认值=20,设置的值越小,越容易屏蔽喇叭震动****/
/*****一定时间内的过零率计算***********************************/
/*****sl_scope_lel>=0&&sl_scope_lel<=255***********************/
/*****整体数据幅度阈值*****************************************/
/*******计步主轴设置****************/
void SL_PEDO_SET_AXIS(unsigned char sl_xyz);
/***sl_xyz:0 x轴*******************/
/***sl_xyz:1 y轴*******************/
/***sl_xyz:2 z轴*******************/
/***sl_xyz:3 算法决定**************/
/*设置运动检测幅度阈值和时间阈值****/
void SL_PEDO_INT_SET(unsigned char V_TH,unsigned char T_TH,bool INT_EN);
/***V_TH:0 0-127************************************/
/***T_TH:1 0-127************************************/
/***INT_EN:0 关闭中断功能,1,打开中断状态监测功能***/
/***USE AOI2 INT*************************************/
/*设置运动状态读取******************/
bool SL_INT_STATUS_READ(void);
/*0: 没有运动*********************/
/*1: 有运动***********************/
/*关闭中断功能情况下,一直输出1*****/
/***********关闭IIC设备**************/
/***********Power down 函数**********/
/********不使用该设备情况下**********/
/****如需重启,使用驱动初始化函数****/
bool SL_SC7A20_Power_Down(void);
/*************输入参数:无************/
/**********返回参数情况说明**********/
/**return 1: Power Down Success*****/
/**return 0: Power Down Fail********/
/*************初始化个人参数*************/
/**参数初始化,用于热量,距离计算********/
void SL_Pedo_Person_Inf_Init(unsigned char *Person_Inf_Init);
/*********输入指针参数分别是:身高 体重 年龄 性别***举例:178,60,26 1*********/
/**身高范围: 30cm ~ 250cm ***********/
/**体重范围: 10Kg ~ 200Kg ***********/
/**年龄范围: 3岁 ~ 150岁 ***********/
/**性别范围: 0 ~ 1 0:女 1:男 ****/
/*********************获取运动状态值**********************/
unsigned char SL_Pedo_GetMotion_Status(void);
/**********输入数据为:无*********************************/
/**********输出数据为:0 ~ 3 *****************************/
/**输出数据为:0 *静止或静坐**********/
/**输出数据为:1 *慢走或散步**********/
/**输出数据为:2 *正常走路************/
/**输出数据为:3 *跑步或剧烈运动******/
/**************获取截止当前当天的行走距离*****************/
unsigned int SL_Pedo_Step_Get_Distance(void);
/*******************输入数据为:无************************/
/*******************输出数据为:当天行走距离 *************/
/*******************单位: 分米(dm)******************/
/**************获取截止当前当天的热量消耗*****************/
unsigned int SL_Pedo_Step_Get_KCal(void);
/*******************输入数据为:无************************/
/*******************输出数据为:当天热量消耗值 ***********/
/*********单位: 大卡 1个单位=0.1大卡******************/
/**************获取最近一段时间的走路平均幅度*************/
unsigned short SL_Pedo_Step_Get_Avg_Amp(void);
/********************输入数据为:无***********************/
/***********************1LSB≈XXXmg************************/
/***********************获取当前走路平均步频**************/
unsigned char SL_Pedo_Step_Get_Step_Per_Min(void);
/********************输入数据为:无***********************/
/********************输出数据为:XXX步/分钟 **************/
/***********************获取当前的运动等级****************/
unsigned char SL_Pedo_Step_Get_Motion_Degree(void);
/********************输入数据为:无***********************/
/********************输出数据为:0-25 ********************/
/**********抬手亮屏算法**********/
/*****************抬手亮屏算法初始化函数****************/
void SL_Turn_Wrist_Init(unsigned char *SL_Turn_Wrist_Para);
/************输入参数:*************/
/******SL_Turn_Wrist_Para[0]:加速度计贴片位置设置 0--7********/
/******SL_Turn_Wrist_Para[1]:抬手亮屏灵敏度设置 1--5********/
/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1********/
/*************三轴加速度计贴片位置设置*************************/
/***SL_Turn_Wrist_Para[0]:设定值的范围为: 0 ~ 7 **************/
/***请参考文档:Silan_MEMS_手环算法说明书_V1.1.pdf**************/
/***SL_Turn_Wrist_Para[1]:设定值的范围为: 1 ~ 5 **/
/*********默认值为:3 中等灵敏度****************/
/*********设定值为:1 最低灵敏度****************/
/*********默认值为:5 最高灵敏度****************/
/*********设定值为:1(最迟钝)~5(最灵敏)***********/
/******SL_Turn_Wrist_Para[2]:水平抬手亮屏使能控制位0--1*******/
/******0:禁止水平抬手功能********/
/******1:使能水平抬手功能********/
/*****************抬手亮屏状态获取函数****************/
signed char SL_Watch_Wrist_Algo(void);
/***********输入参数:无***********/
/***********返回参数情况说明*******/
/**Return: 2 备注说明:屏幕点亮后需要关闭*********/
/**Return: 1 备注说明:屏幕需要点亮***************/
/**Return: 0 备注说明:屏幕不需要点亮*************/
/**Return: -1 备注说明:未初始化或初始化失败*******/
/*****************抬手亮屏状态复位********************/
//void SL_Turn_Wrist_WorkMode_Reset(void);
/******************输入参数:无***********************/
/******************输出值参数:无*********************/
//3-12
//1-10
//0-10
/******************睡眠参数设置********************/
void SL_Sleep_Para(unsigned char adom_time_th,unsigned char sleep_vpp_th,unsigned char sleep_time_th);
/**************************佩戴检测的时长***********************/
/******adom_time_th:0-255 min***********************************/
/******adom_time_th:未活动的时间,大于设置阈值才能认为未佩戴****/
/******adom_time_th:设置值越小,越容易出现未佩戴情况************/
/**************************睡眠中间点阈值***********************/
/******sleep_vpp_th:越小灵敏度越高,越容易睡眠状态切换**********/
/******sleep_vpp_th:越大灵敏度越低,越难睡眠状态切换************/
/******sleep_vpp_th:默认值10,不设置就是10**********************/
/**************************状态切换最小时间*********************/
/******sleep_time_th:该值越小,睡眠状态切换的所需时间就越短*****/
/******sleep_time_th:该值越大,睡眠状态切换的所需时间就越长*****/
/******sleep_time_th:默认值1,不设置就是1***********************/
/***************获取当前的睡眠状态*****************/
unsigned char SL_Sleep_GetStatus(unsigned char SL_Sys_Time);
/*******SL_Sys_Time:当前的时间,以小时为单位******/
/*******全天的输入时间范围为:0-23 ****************/
/***************输出数据范围:0-7******************/
/***************0:清醒状态************************/
/***************7:深度睡眠************************/
/***************获取当前的活动等级*****************/
unsigned char SL_Sleep_Active_Degree(unsigned char mode);
/***************mode:0 定时器0.5s中调用***********/
/***************mode:1 定时器1min中调用***********/
/***************输出数据范围:0-255****************/
/***************0:静止****************************/
/*************255:运动****************************/
unsigned char SL_Sleep_Get_Active_Degree(void);
/***************mode:0 定时器0.5s中调用***********/
/***************mode:1 定时器1min中调用***********/
/***************输出数据范围:0-255****************/
/***************0:静止****************************/
/*************255:运动****************************/
/***************获取当前的佩戴的情况***************/
unsigned char SL_Adom_GetStatus(void);
/***************0:未佩戴**************************/
/***************1:已佩戴**************************/
/***************获取当前的佩戴的情况***************/
unsigned char SL_In_Sleep_Status(void);
/***************0:out sleep**********************/
/***************1:in sleep***********************/
/**************************翻转功能************************/
bool SL_Get_Clock_Status(bool open_close);
/***********输入参数:sensor_pos***********/
/****sensor_pos:1 open 检测是否要关闭时输入 1*************/
/****sensor_pos:0 close 关闭闹铃时时 输入 0*************/
/*********************返回参数情况说明*********************/
/***********************翻转功能检测***********************/
/**Return: 1 备注说明:屏幕已翻转,关闭闹钟************/
/**Return: 0 备注说明:屏幕未翻转,不关闭闹钟**********/
/**************************摇晃功能************************/
bool SL_Get_Phone_Answer_Status(unsigned char Sway_Degree,unsigned char Sway_Num);
/***********输入参数:摇晃等级0--10 摇晃数量0--10***********************/
/***摇晃等级:设置值越小,需要摇晃的幅度越小,越容易触发接听动作*********/
/***摇晃数量:设置值越小,需要摇晃的次数越少,越容易触发接听动作*********/
/***********返回参数情况说明*******************************/
/**Return: 1 备注说明:摇晃动作成立,接听电话**********/
/**Return: 0 备注说明:摇晃动作不成立,不接听电话******/
/************加测项目客户端测试***********/
/***初始化的时候调用用于判断FIFO是否正常**/
bool SL_SC7A20_FIFO_TEST(void);
/*************输入参数:无*****************/
/*************返回数据情况如下************/
/**return :1 FIFO 异常*******************/
/**return :0 FIFO 正常*******************/
#endif/****SL_Watch_ALGO_DRV__H__*********/

BIN
source/asp/新建文件夹/SL_algo1.lib

Binary file not shown.

264
source/asp/新建文件夹/SL_app.c

@ -0,0 +1,264 @@
#include "SL_algo1.h"
#if SL_Sensor_Algo_Release_Enable==0x00
#include "usart.h"
extern signed short SL_DEBUG_DATA[10][128];
extern unsigned char SL_DEBUG_DATA_LEN;
extern unsigned char sl_sleep_sys_cnt;
#endif
#if SL_Sensor_Algo_Release_Enable==0x00
extern signed short SL_ACCEL_DATA_Buf[3][16];
extern unsigned char SL_FIFO_ACCEL_PEDO_NUM;
signed short hp_buf[16];
#endif
#define SL_SC7A20_SPI_IIC_MODE 1
/***SL_SC7A20_SPI_IIC_MODE==0 :SPI*******/
/***SL_SC7A20_SPI_IIC_MODE==1 :IIC*******/
static signed char sl_init_status=0x00;
/**Please modify the following parameters according to the actual situation**/
signed char SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_INIT(void)
{
#if SL_Sensor_Algo_Release_Enable==0x00
unsigned char sl_version_value=0x00;
#endif
// bool fifo_status =0;
unsigned char sl_person_para[4] ={178,60,26,1};
unsigned char Turn_Wrist_Para[3]={1,3,0};//refer pdf
#if SL_Sensor_Algo_Release_Enable==0x00
//sl_version_value==0x11 SC7A20
//sl_version_value==0x26 SC7A20E
SL_SC7A20_I2c_Spi_Read(1, SL_SC7A20_VERSION_ADDR,1, &sl_version_value);
USART_printf( USART1, "Version ID=0x%x!\r\n",sl_version_value);
if(sl_version_value==SL_SC7A20_VERSION_VALUE)
USART_printf( USART1, "SC7A20!\r\n");
else if(sl_version_value==SL_SC7A20E_VERSION_VALUE)
USART_printf( USART1, "SC7A20E!\r\n");
#endif
/*****if use spi mode please config first******/
#if SL_SC7A20_SPI_IIC_MODE == 0//spi
sl_init_status=SL_SC7A20_Driver_Init(1,0x04);//iic mode pull up config
//init sensor
sl_init_status=SL_SC7A20_Driver_Init(0,0x04);//spi or iic select
#else//i2c
sl_init_status=SL_SC7A20_Driver_Init(1,0x00);//spi or iic select
//0x08-->close sdo pull up
#endif
/**********sc7a20 fifo test***************/
//fifo_status=SL_SC7A20_FIFO_TEST();
/**********set pedo sensitivity***********/
SL_PEDO_TH_SET(32,10,1,30,50);//36 12 0 30 50for motor
/*which axis used to pedo depend on algo**/
SL_PEDO_SET_AXIS(3);
/**********set int para*******************/
SL_PEDO_INT_SET(2,1,1);//0 or 1 sleep is different
/**********set motion para****************/
SL_Pedo_Person_Inf_Init(&sl_person_para[0]);//personal para init
/**********set turn wrist para************/
SL_Turn_Wrist_Init(&Turn_Wrist_Para[0]);
/**********set sleep sensitivity**********/
SL_Sleep_Para(120,10,1);
return sl_init_status;
}
static unsigned int SL_STEP = 0;
static unsigned int SL_STEP_TEMP = 0;
static unsigned char SL_STEP_MOTION = 0;
static unsigned int SL_DISTANCE = 0;
static unsigned int SL_KCAL = 0;
static unsigned char SL_CADENCE_STEP = 0;//step per minutes
static unsigned short SL_CADENCE_AMP = 0;//Equal scale scaling
static unsigned char SL_CADENCE_DEGREE = 0;//degree
static signed char SL_WRIST = 0;
static unsigned char SL_SLEEP_ACTIVE = 0;
static unsigned char SL_SLEEP_STATUS = 0;
static unsigned char SL_SLEEP_ADOM = 0;
static unsigned char SL_SLEEP_CNT = 0;
static bool SL_CLOCK_STATUS = 0;
static bool SL_SWAY_STATUS = 0;
static bool SL_SWAY_ENABLE = 0;
static unsigned char SL_INT_TIME_CNT = 0;
#define SL_INT_TIME_TH 12 //per lsb is 0.5s
extern unsigned char sl_sleep_sys_hour;
unsigned char SL_MCU_SLEEP_ALGO_FUNCTION(void);
unsigned int SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO(void)
{
#if SL_Sensor_Algo_Release_Enable==0x00
unsigned char sl_i;
#endif
signed short SC7A20_XYZ_Buf[3][14];
unsigned char SC7A20_FIFO_NUM;
bool SC7A20_INT_STATUS;
if((sl_init_status!=SL_SC7A20_VERSION_VALUE)&&(sl_init_status!=SL_SC7A20E_VERSION_VALUE)) return 0;//initial fail
/*******read int status******/
SC7A20_INT_STATUS=SL_INT_STATUS_READ();
if((SC7A20_INT_STATUS==1)||(SL_STEP_TEMP!= SL_STEP))
{
SL_INT_TIME_CNT =0;
SL_STEP_TEMP =SL_STEP;
}
else
{
if(SL_INT_TIME_CNT<200)
{
SL_INT_TIME_CNT++;
}
}
if(SL_INT_TIME_CNT<SL_INT_TIME_TH)//6s
{
/*******get sc7a20 FIFO data******/
SC7A20_FIFO_NUM= SL_SC7A20_Read_FIFO();
/*******get pedo value************/
SL_STEP= SL_Watch_Kcal_Pedo_Algo(0);//涓嶆墦寮€椹揪鎴栭煶涔愭椂璋冪敤璇ュ嚱鏁?
//SL_STEP= SL_Watch_Kcal_Pedo_Algo(1);//鎵撳紑椹揪鎴栭煶涔愭椂璋冪敤璇ュ嚱鏁?
/*********get sleep active degree value*********/
SL_SLEEP_ACTIVE = SL_Sleep_Active_Degree(0);
/*******get accel orginal data and length*******/
SC7A20_FIFO_NUM = SL_SC7A20_GET_FIFO_Buf(&SC7A20_XYZ_Buf[0][0],&SC7A20_XYZ_Buf[1][0],&SC7A20_XYZ_Buf[2][0],0);
/* SL_Pedo_GetMotion_Status */
SL_STEP_MOTION = SL_Pedo_GetMotion_Status();
/* SL_Pedo_Step_Get_Distance */
SL_DISTANCE = SL_Pedo_Step_Get_Distance();
/* SL_Pedo_Step_Get_KCal */
SL_KCAL = SL_Pedo_Step_Get_KCal();
/*****average step per minutes****/
SL_CADENCE_STEP = SL_Pedo_Step_Get_Step_Per_Min();
/*****average amp per step****/
SL_CADENCE_AMP = SL_Pedo_Step_Get_Avg_Amp();
/*****motion degree****/
SL_CADENCE_DEGREE = SL_Pedo_Step_Get_Motion_Degree();
// if(SL_STEP>200)
// {
/**reset pedo value**/
// SL_Pedo_Kcal_ResetStepCount();
// }
/*******get wrist value******/
SL_WRIST= SL_Watch_Wrist_Algo();
/*******get overturn value******/
SL_CLOCK_STATUS=SL_Get_Clock_Status(1);//open overturn monitor
if(SL_CLOCK_STATUS==1)//overturn success
{
SL_Get_Clock_Status(0);//close overturn monitor
}
/*******get sway value******/
if(SL_SWAY_ENABLE==1)
{
/**this function will disable pedo function**/
SL_SWAY_STATUS=SL_Get_Phone_Answer_Status(4,5);//get sway value
}
}
else
{
//sc7a20 's data for heart rate algo
//SC7A20_FIFO_NUM= SL_SC7A20_Read_FIFO();
//SC7A20_FIFO_NUM= SL_SC7A20_GET_FIFO_Buf(&SC7A20_XYZ_Buf[0][0],&SC7A20_XYZ_Buf[1][0],&SC7A20_XYZ_Buf[2][0],0);
SL_Pedo_WorkMode_Reset();
//SL_Turn_Wrist_WorkMode_Reset();please not use this function
SC7A20_FIFO_NUM=0;
}
/*******get sleep status value******/
SL_SLEEP_CNT++;
#if SL_Sensor_Algo_Release_Enable==0x00
if(SL_SLEEP_CNT>39)//1min
#else
if(SL_SLEEP_CNT>119)//1min
#endif
{
#if SL_Sensor_Algo_Release_Enable==0
sl_sleep_sys_cnt++;
if(sl_sleep_sys_cnt>59)//min
{
sl_sleep_sys_cnt=0;
sl_sleep_sys_hour++;//hour
if(sl_sleep_sys_hour==24)
sl_sleep_sys_hour=0;
}
#endif
SL_SLEEP_CNT=0;
SL_MCU_SLEEP_ALGO_FUNCTION();
}
#if SL_Sensor_Algo_Release_Enable==0x00
SL_DEBUG_DATA_LEN=SC7A20_FIFO_NUM;
for(sl_i=0;sl_i<SL_DEBUG_DATA_LEN;sl_i++)
{
SL_DEBUG_DATA[0][sl_i]=SC7A20_XYZ_Buf[0][sl_i];
SL_DEBUG_DATA[1][sl_i]=SC7A20_XYZ_Buf[1][sl_i];
SL_DEBUG_DATA[2][sl_i]=SC7A20_XYZ_Buf[2][sl_i];
SL_DEBUG_DATA[3][sl_i]=SL_STEP;
SL_DEBUG_DATA[4][sl_i]=SL_WRIST;
// SL_DEBUG_DATA[4][sl_i]=SL_CLOCK_STATUS;
// SL_DEBUG_DATA[5][sl_i]=SL_SLEEP_STATUS;
SL_DEBUG_DATA[5][sl_i]=SL_SWAY_STATUS;
SL_DEBUG_DATA[6][sl_i]=SL_STEP_MOTION;
SL_DEBUG_DATA[7][sl_i]=SL_DISTANCE;
// SL_DEBUG_DATA[7][sl_i]=hp_buf[sl_i];
SL_DEBUG_DATA[8][sl_i]=SL_KCAL;
SL_DEBUG_DATA[9][sl_i]=SL_CADENCE_STEP;
// SL_DEBUG_DATA[8][sl_i]=SL_CADENCE_AMP;
// SL_DEBUG_DATA[9][sl_i]=SL_CADENCE_DEGREE;
}
#endif
return SL_STEP;
}
#if SL_Sensor_Algo_Release_Enable==0x00
unsigned short sl_sleep_counter=0;
#endif
#define SL_SLEEP_DEEP_TH 6
#define SL_SLEEP_LIGHT_TH 3
/***Call this function regularly for 1 minute***/
unsigned char SL_MCU_SLEEP_ALGO_FUNCTION(void)
{
/*******get sleep status value******/
SL_SLEEP_STATUS= SL_Sleep_GetStatus(sl_sleep_sys_hour);
SL_SLEEP_ACTIVE= SL_Sleep_Get_Active_Degree();
SL_SLEEP_ADOM = SL_Adom_GetStatus();
#if SL_Sensor_Algo_Release_Enable==0x00
sl_sleep_counter++;
USART_printf( USART1, "step=%d! sys_time=%d!\r\n",SL_STEP,sl_sleep_sys_hour);
USART_printf( USART1, "T=%d,sleep_status:%d,sleep_adom:%d!\r\n",sl_sleep_counter,SL_SLEEP_STATUS,SL_SLEEP_ADOM);
USART_printf( USART1, "SL_SLEEP_ACTIVE:%d!\r\n",SL_SLEEP_ACTIVE);
#endif
if(SL_SLEEP_STATUS<SL_SLEEP_LIGHT_TH)
{
return 0;//0 1 2 3
}
else if(SL_SLEEP_STATUS<SL_SLEEP_DEEP_TH)
{
return 1;//4 5 6
}
else
{
return 2;//7
}
}

10
source/asp/新建文件夹/SL_app1.h

@ -0,0 +1,10 @@
#ifndef SL_Watch_Pedo_Kcal_Wrist_Sleep_Sway_Application__H__
#define SL_Watch_Pedo_Kcal_Wrist_Sleep_Sway_Application__H__
extern signed char SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_INIT(void);
extern unsigned int SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_ALGO(void);
#endif

46
source/asp/新建文件夹/asp_moto.c

@ -0,0 +1,46 @@
#include "asp_moto.h"
#include "debug_drv.h"
void L2_moto_init(void)
{
;
}
/// L3_moto_debug(D_cmd_filter_moto)
void L3_moto_debug(u8 filter)
{
if(filter == Ts_debug.td->filter)
{///filter num d1 d2 d3 ....dn
//// FD 08 11 22 33 44 55 66 77 88
L1_uartD_uchexArray(Ts_debug.td,Ts_debug.td->R1);
if(0x10 == Ts_debug.td->ocr)///read 读
{
//NUM: 0 1 2 3 4
// Fx R1 R2 R3 ocr
// sla reg1 num
/// f1 32 15 06 10
printf("\r\n ch(%d)=",(int)Ts_debug.td->R1);
/// Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1);
printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16);
}
else if(0x11 == Ts_debug.td->ocr)
{
}
else if(0x12 == Ts_debug.td->ocr)
{
}
else
{
}
}
}

13
source/asp/新建文件夹/asp_moto.h

@ -0,0 +1,13 @@
#ifndef _ASP_MOTO_H_
#define _ASP_MOTO_H_
#include "bsp_config.h"
//485_RE P33
//485_DE P32
///#define D_485_TX() P55 = 1;// >750us
///#define D_485_RX() P55 = 0;
extern void L2_moto_init(void);
#define D_cmd_filter_moto 0xf0
extern void L3_moto_debug(u8 filter);
#endif

87
source/asp/新建文件夹/asp_para.c

@ -0,0 +1,87 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "asp_para.h"
///#include "common.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "msp_eeprom.h"
/*********
v3.3
AA 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
#e2p read success
00 00 00 00 00 00 00 00 00 00
AA 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
#e2p read success
00 00 00 00 00 00 00 00 00 00
AA 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
#e2p read success
00 00 00 00 00 00 00 00 00 00
AA 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
#e2p read success
00 00 00 00 00 00 00 00 00 00
8ADC_SAMPLEADC_SAMPLEADC_SAMPLEADC_SAMPLE4E320 F408 2088 FA90 0000BC90 1502
**********/
TS_eeprom_param_ eep_param;
U8 L1_para_read(U8 *buf,U8 *len)
{
U8 dlen = 0;
L0_Iap_Read_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + EEPROM_PARAM_DATA_MAX + 2);
/// L0_uartN_uchexArray(0,(u8 *)&eep_param,20);
if(eep_param.filter == EEPROM_PARAM_FILTER)
{
dlen = eep_param.len - 2;
crc16(eep_param.crc,(U8*)&eep_param,2+dlen);
if(eep_param.crc[0] == eep_param.buf[dlen] && eep_param.crc[1] == eep_param.buf[dlen+1])
{
/// if()
//L0_uart0_uc('#');
//Lc_buf_copy_uc((U8*)&G.p,(U8*)eep_param.buf,dlen);
Lc_buf_copy_uc(buf,(U8*)eep_param.buf,dlen);//防止dlen>sizeof(G.P)引起的内存错误
*len = dlen;
return 0;
}
}
return 1;
}
U8 L1_para_write(U8 *buf, U8 len)
{
U8 dlen = len;
eep_param.filter = EEPROM_PARAM_FILTER;////fxime
eep_param.len = dlen + 2;
Lc_buf_copy_uc((U8*)eep_param.buf,buf,dlen);
crc16(eep_param.crc, &eep_param, 2+dlen);
eep_param.buf[dlen] = eep_param.crc[0];
eep_param.buf[dlen+1] = eep_param.crc[1];
L0_Iap_Erase(EEP_PARAM_ADDR);
L0_Iap_Program_array(EEP_PARAM_ADDR, (U8*)&eep_param, 2 + dlen + 2);
L0_uart0_uc('&');
return 0;
}

67
source/asp/新建文件夹/asp_para.h

@ -0,0 +1,67 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2022, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file app_save.h
/// @brief @ app save
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220120
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _ASP_EEPROM_H
#define _ASP_EEPROM_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
/////cc 20220127 和cup息息相关 应该和标识牌_config进行匹配
/// 16k =16 1024 = 32 512 =
//// 16 1024 =16384 =0x4000
#define EEP_SECTOR_SIZE 0x200 ///512
#define EEP_PARAM_ADDR (EEP_SECTOR_SIZE * 1)
#define EEP_ENC_ADDR (EEP_SECTOR_SIZE * 0)//// 加密信息
/**
* EEPROM
*/
#define EEPROM_PARAM_DATA_MAX 90
#define EEPROM_PARAM_FILTER 0xAA
typedef struct
{
U8 filter;
U8 len;
U8 buf[EEPROM_PARAM_DATA_MAX];
U8 crc[2];
}TS_eeprom_param_;
#define MCU_ID_LEN 7
#define MCU_ID_KEY_LEN 4
#define EEPROM_ENC_DATA_MAX 64
#define EEPROM_ENC_FILTER 0xAA
typedef struct ts_eeprom_enc
{
U8 enc_key[MCU_ID_KEY_LEN];
U8 enc_val[MCU_ID_LEN];
U8 crc[2];
}TS_EEPROM_ENC_;
U8 L1_para_read(U8 *buf,U8 *len);
U8 L1_para_write(U8 *buf, U8 len);
#endif // #ifndef _APP_TASK_ADC_H

588
source/asp/新建文件夹/asp_schain.c

@ -0,0 +1,588 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "asp_schain.h"
///#include "common.h"
#include "msp_uart0.h"
#include "bsp_cs1232.h"
//=============================================
//S_TASK_ADC_CHANNEL_BLUR ts_adc_channel_blurs[D_ADC_CHANNEL_NUM];
//S_TASK_ADC_CHANNEL_SHOW ts_adc_channel_show;
TS_TASK_ADC_SAMPLE ts_adc_samples[D_ADC_CHANNEL_NUM];
/***********
TS_TASK_ADC_SHIFTFILTER ts_adc_ShiftFilter[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_MID ts_adc_blur_mid[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_AVG ts_adc_blur_avg[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_SHIFT ts_adc_blur_shift[D_ADC_CHANNEL_NUM];
S_TASK_ADC_BLUR_OUT ts_adc_blur_out[D_ADC_CHANNEL_NUM];
*********/
void L2_task_adc_SAinit(U8 ch,U8 *a,U8 *b)
{
ts_adc_samples[ch].ts_SAa.shift = *a;
ts_adc_samples[ch].ts_SAb.shift = *b;
}
//ch是0123,代表4通道
void L2_task_adc_init(U8 ch)
{
//通道采集任务初始化
L1_task_init(&ts_adc_samples[ch].task);
L3_task_s_go(ts_adc_samples[ch],D_task_init);
ts_adc_samples[D_Wch1].ch = D_Wch1;
ts_adc_samples[D_Wch2].ch = D_Wch2;
ts_adc_samples[D_Wch3].ch = D_Wch3;
ts_adc_samples[D_Wch4].ch = D_Wch4;
}
//ADC Channel 采样任务
#define D_task_ADC_CHx_SAMPLE_JITTER_START_SAMPLE 0x53
#define D_task_ADC_CHx_JITTER 0x63
#define D_task_ADC_CHx_PIANYI 0x93
#define D_task_ADC_CHx_JITTER2 0x83
#define D_task_ADC_CHx_despiking_shift 0x94
#define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x73
#define D_task_ADC_CHx_SAMPLE_READ 0x54
#define D_task_ADC_CHx_SAMPLE_OUT 0x55
#define D_task_ADC_CHx_SHIFTFILTER 0x56
#define D_task_ADC_CHx_SHIFTFILTER2 0x57
#define D_ADC_JITTER_zero 11///还包含建立时间 至少9个
#define D_ADC_JITTER_FINISH 12///还包含建立时间 至少9个
/********
80hZ
1000ms/80= 12.5ms/point
ushex send = 4Bytes+blank = 5Byte;
115200 0.1ms/Byte
5Bytes 0.5ms 2ms
*******/
/****************
^
|
|--------------------------zeroout
| | | | | offset
| | | | .
| . | |
0------.----|-------------> 0
| .
ts_adc_samples[3].offset = R.sd.zeroout;
ts_adc_samples[0].zeroout = R.sd.zeroout;
R.sd.zeroout= 2418 = 0x 972 offset 2418 = 0x 972
R.sd.zeroout= 2418 = 0x 972 offset 2418 = 0x 972
R.sd.zeroout= 2418 = 0x 972 offset 2418 = 0x 972
R.sd.zeroout= 2418 = 0x 972 offset 2418 = 0x 972
4
out1 offset
Z00 0116 085C
Z01 F671 1301
Z02 1642 F330
Z03 FF66 0A0C
092B 0967 0928 0954 0943 0000
08DF 0956 08E0 0929 090F 0000
0895 0945 089C 0900 08DD 0000
R.sd.zeroout= 8049 = 0x1f71 offset 8049 = 0x1f71
4
Z00 0415 1B5C
Z01 F482 2AEF
Z02 1902 066F
Z03 02C7 1CAA
0000 1F4D 1F16 1F35 1766 000F
0000 1F34 1EB7 1F08 173C 000E
0000 1F19 1E6C 1E73
*********************/
void L3_out_zero(u8 ch)
{
vS16 t,m;
t = ts_adc_samples[ch].out1;
m = ts_adc_samples[ch].zeroout;
m -= t;
ts_adc_samples[ch].offset = (vU16)m;
/// L0_waitFree_uartN(0);///混搭使用printf的时候必须加上
/// printf("\r\nzeroout = %4x offset= 0x%4x\r\n", ts_adc_samples[ch].zeroout,ts_adc_samples[ch].offset);
/// D_ADC_OFFSET(ch) = ts_adc_samples[ch].zeroout - ts_adc_samples[ch].out1;
}
vU16 L3_out_tran2(vU32 rdata)
{
vU16 t16;
//// L0_ADS1231_readCH2(0,&rdata);
// L0_uart0_uc('0'+ch); L0_uart0_uc(0x09);
// L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
if (rdata > 0x007fFFff)
{
rdata >>= D_sensor_zoom; ///fixme:此处正负差和移位不一致需要谨慎
rdata |= D_sensor_zoom_FF; /// 1111 1100
}else
{
rdata >>= D_sensor_zoom;
}
// L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
t16 = rdata;
// L0_uart0_ushex(t16); L0_uart0_uc(0x09);
///L0_uart0_0d0a();
return t16;
}
S16 L3_out_tran(vU32 rdata)
{
S16 t16;
/// 24bits 3Bytes
rdata >>= 8;
t16 = rdata;
return t16;
}
vU16 L3_out_offset(u8 ch,vU16 t16)
{
vU16 out;
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
if(t16 & 0x8000) //最高位为1,<0则
{
t16 = 0xffFF - t16;///转变为正数
///*d = D_ADC_OFFSET - t16;
out = ts_adc_samples[ch].offset - t16;
// L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' ');
}else
{
out = t16 + ts_adc_samples[ch].offset;
}
// L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a();
return out;
}
void L2_task_adc_sample(TS_TASK_ADC_SAMPLE *s)
{
TTSS_Task_init():
////cc 初始化尽量放到这里,不要放到main ——init中,减少系统启动的时间
s->jitter_start = 0; s->ok = 0;
/// L0_uart0_sendstr("\r\nADC_SAMPLE\r\n");
/// L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_READ,D_Tdelay_Msec(1500)); //延时15ms
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ):
if(0 == L0_adc_DOUT_AT(s->ch))
{////L0_uart0_uc('X');L0_uart0_uc(0x30+s->ch);
//// L0_ADS1231_readCH2(s->ch,&(s->out1)); ////
L0_ADS1231_readCH2(s->ch,&(s->out0));
L2_task_go(D_task_ADC_CHx_PIANYI);
}
TTSS_Task_step(D_task_ADC_CHx_PIANYI):
s->out1 = L3_out_tran(s->out0);
////s->out1a = L3_out_tran2(s->out0);
/// L0_uart0_uc('0' + s->ch);
s->out2 = L3_out_offset(s->ch,s->out1);
L2_task_go(D_task_ADC_CHx_despiking_shift);
TTSS_Task_step(D_task_ADC_CHx_despiking_shift):
s->outm[0] = s->outm[1];
s->outm[1] = s->outm[2];
s->outm[2] = s->out2;
Lc_despiking_shift3_U16(s->outm);////采样后进行削峰
s->out3 = s->outm[1];
L2_task_go(D_task_ADC_CHx_JITTER2);
TTSS_Task_step(D_task_ADC_CHx_JITTER2):
///刚开始的抖动,先去掉几个最开始的数据
if(D_ADC_JITTER_FINISH == s->jitter_start)
{
s->ts_SAa.average = (vU32)s->out3;///shiftaverage_a路初始化
s->ts_SAa.sum = s->ts_SAa.average << s->ts_SAa.shift;
s->ts_SAb.average = (vU32)s->out3;///shiftaverage_b路初始化
s->ts_SAb.sum = s->ts_SAb.average << s->ts_SAb.shift;
L2_task_go(D_task_ADC_CHx_SHIFTFILTER);
}else if(D_ADC_JITTER_zero == s->jitter_start)
{///
L3_out_zero(s->ch);///算出当前的偏移量 更新offset
L0_uart0_uc('Z');L0_uart0_uchex(s->ch);
L0_uart0_uc(' ');L0_uart0_ushex(s->out1);L0_uart0_uc(' ');
L0_uart0_uc(' ');L0_uart0_ushex(s->offset);L0_uart0_uc(' ');
s->jitter_start ++;
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
}else
{
s->jitter_start ++;
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
}
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER):
//L0_uart0_uc('B');
s->ts_SAa.sum -= s->ts_SAa.average;
s->ts_SAa.sum += (vU32)s->out3;
s->ts_SAa.average = s->ts_SAa.sum >> s->ts_SAa.shift;
// s->ts_SAa.new = s->ts_SAa.average;
s->ts_SAa.out4 = (vU16)s->ts_SAa.average;
/// L0_uart0_uc('s');
L2_task_go(D_task_ADC_CHx_SHIFTFILTER2);
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER2):
s->ts_SAb.sum -= s->ts_SAb.average;
s->ts_SAb.sum += (vU32)s->out3;
s->ts_SAb.average = s->ts_SAb.sum >> s->ts_SAb.shift;
s->ts_SAb.out4 = (vU16)s->ts_SAb.average;
///out4 = out3
s->ok = 1;
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
/// L2_task_go(D_task_ADC_CHx_SAMPLE_OUT);
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT):
/***
L0_uart0_ulhex(s->out0); L0_uart0_uc(0x09);
L0_uart0_ushex(s->out1); L0_uart0_uc(0x09);
L0_uart0_ushex(s->out2); L0_uart0_uc(0x09);
L0_uart0_ushex(s->ts_SAa.out4); L0_uart0_uc(0x09);
L0_uart0_ushex(s->ts_SAb.out4);
L0_uart0_0d0a();
**/
////
//// L0_uart0_uc('0' + s->ch);L0_uart0_uc('A');//
TTSS_Task_end();
}
#if 0
void L3_task_show_init(void)
{
//显示任务初始化
L1_task_init(&ts_adc_blur_show.task);
L3_task_s_go(ts_adc_blur_show,D_task_init);
ts_adc_blur_show.rough_weight = 0;
}
//中值滤波任务
#define D_task_ADC_CHx_FILTER_MID_GET 0x50
#define D_task_ADC_CHx_FILTER_MID_COUNT 0x51
#define D_task_ADC_CHx_FILTER_MID_OUT 0x52
void L3_task_adc_filter_mid(S_TASK_ADC_BLUR_MID *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out1[i];
}
ts_adc_channel_samples[s->ch].n = 0;
L2_task_go(D_task_ADC_CHx_FILTER_MID_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_COUNT)
s->midval = Lc_S32_media(s->in, s->max);
L2_task_go(D_task_ADC_CHx_FILTER_MID_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_OUT)
s->out[s->n] = s->midval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_MID_GET);
TTSS_Task_end();
}
//均值滤波任务
#define D_task_ADC_CHx_FILTER_AVG_GET 0x50
#define D_task_ADC_CHx_FILTER_AVG_COUNT 0x51
#define D_task_ADC_CHx_FILTER_AVG_OUT 0x52
void L3_task_adc_filter_avg(S_TASK_ADC_BLUR_AVG *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_GET)
if(ts_adc_channel_samples[s->ch].n >= s->max)
{
U8 i = 0;
ts_adc_channel_samples[s->ch].n = 0;
for(i=0;i<s->max;i++)
{
s->in[i] = ts_adc_channel_samples[s->ch].out1[i];
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_COUNT)
s->avgval = Lc_vS32_avg(s->in,s->max);
L2_task_go(D_task_ADC_CHx_FILTER_AVG_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_OUT)
s->out[s->n] = s->avgval;
//R.adval[s->ch] = s->out[s->n];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET);
TTSS_Task_end();
}
//移位滤波任务
#define D_task_ADC_CHx_FILTER_SHIFT_GET 0x50
#define D_task_ADC_CHx_FILTER_SHIFT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_SHIFT_OUT 0x52
void L3_task_adc_ShiftFilter(TS_TASK_ADC_SHIFTFILTER *s)
{
TTSS_Task_init()
s->average = ts_adc_samples[s->ch].out2;///
s->sum = s->average << s->shift;
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_GET)
s->sum +=
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_COUNT)
s->sum[0] -= s->shiftval[0];
s->sum[0] += s->in;
s->shiftval[0] = s->sum[0] >> s->shiftreg[0];
s->sum[1] -= s->shiftval[1];
s->sum[1] += s->in;
s->shiftval[1] = s->sum[1] >> s->shiftreg[1];
s->sum[2] -= s->shiftval[2];
s->sum[2] += s->in;
s->shiftval[2] = s->sum[2] >> s->shiftreg[2];
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_OUT)
s->out[0][s->n] = s->shiftval[0];
s->out[1][s->n] = s->shiftval[1];
s->out[2][s->n] = s->shiftval[2];
//R.adval[s->ch] = s->out[0][s->n] = s->shiftval[0];
s->n++;
if(s->n >= MAX_OUT_NUM)
{
s->n = 0;
}
L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET);
TTSS_Task_end();
}
//输出判定任务
#define D_task_ADC_CHx_FILTER_OUT_GET 0x50
#define D_task_ADC_CHx_FILTER_OUT_COUNT 0x51
#define D_task_ADC_CHx_FILTER_OUT_CHANGE 0x52
#define D_task_ADC_CHx_FILTER_OUT_OUT 0x53
void L3_task_adc_filter_out(S_TASK_ADC_BLUR_OUT *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_GET)
if(s->h != ts_adc_blur_shift[s->ch].n)
{
s->h = ts_adc_blur_shift[s->ch].n;
s->in[0] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 1)];
s->in[1] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 2)];
//获取输出曲线val
s->newout = ts_adc_blur_shift[s->ch].out[s->oldnum][count_n(ts_adc_blur_shift[s->ch].n, 1)];
L2_task_go(D_task_ADC_CHx_FILTER_OUT_COUNT);
}
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_COUNT) //根据阀值选择输出的曲线
//判断选择新曲线
if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[0])//2KG
{
s->newnum = 0;
}
else if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[1]) //0.5KG
{
s->newnum = 1;
}
else
{
s->newnum = 2;
}
//L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
L2_task_go(D_task_ADC_CHx_FILTER_OUT_CHANGE);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_CHANGE)
if(s->newnum != s->oldnum)//切换移位滤波时调整其他滤波的SUM
{
s->oldnum = s->newnum; //不能只调整新值,所有曲线都要一起调整
//ts_adc_blur_shift[s->ch].sum[1] = (ts_adc_blur_avg[s->ch].out[ts_adc_blur_avg[s->ch].n] * R.adc_blur_avg);
ts_adc_blur_shift[s->ch].sum[0] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[0];
ts_adc_blur_shift[s->ch].shiftval[0] = s->newout;
ts_adc_blur_shift[s->ch].sum[1] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[1];
ts_adc_blur_shift[s->ch].shiftval[1] = s->newout;
ts_adc_blur_shift[s->ch].sum[2] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[2];
ts_adc_blur_shift[s->ch].shiftval[2] = s->newout;
}
L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT);
TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_OUT)
R.adval[s->ch] = s->newout;
//R.adval[s->ch] = ts_adc_channel_samples[s->ch].adcval;
L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET);
TTSS_Task_end();
}
//显示任务
#define D_task_ADC_CHx_SHOW 0x50
void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s)
{
TTSS_Task_init()
L2_task_go(D_task_ADC_CHx_SHOW);
TTSS_Task_step(D_task_ADC_CHx_SHOW)
R.ch_weight[0] = D_COUNT_WEIGHT(R.adval[0]);
R.ch_weight[1] = D_COUNT_WEIGHT(R.adval[1]);
R.ch_weight[2] = D_COUNT_WEIGHT(R.adval[2]);
R.ch_weight[3] = D_COUNT_WEIGHT(R.adval[3]);
s->rough_weight = R.ch_weight[0] + R.ch_weight[1] + R.ch_weight[2] + R.ch_weight[3]; //毛重
#if 0
L0_uart0_ulhex(s->rough_weight);
L0_uart0_uc(' ');
#endif
if( ABS(R.rough_weight,s->rough_weight) >= 50) //变化超过0.05KG
{
R.rough_weight = s->rough_weight;
R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重
}
L2_task_go_Tdelay(D_task_ADC_CHx_SHOW,D_Tdelay_Msec(15)); //延时15ms
TTSS_Task_end();
}
/*******
ts_adc_channel_samples[ch].status = (R.p.adc_ch_status >> ch) & 0x1;
ts_adc_channel_samples[ch].pool = 0;
ts_adc_channel_samples[ch].adcval = 0;
ts_adc_channel_samples[ch].n = 0;
ts_adc_channel_samples[ch].ch = D_ADCCH_1 + ch;
//通道中值滤波任务初始化
L1_task_init(&ts_adc_blur_mid[ch].task);
L3_task_s_go(ts_adc_blur_mid[ch],D_task_init);
ts_adc_blur_mid[ch].n = 0;
ts_adc_blur_mid[ch].max = R.p.adc_blur_mid;
ts_adc_blur_mid[ch].ch = D_ADCCH_1 + ch;
//通道均值滤波任务初始化
L1_task_init(&ts_adc_blur_avg[ch].task);
L3_task_s_go(ts_adc_blur_avg[ch],D_task_init);
ts_adc_blur_avg[ch].max = R.p.adc_blur_avg;
ts_adc_blur_avg[ch].avgval = 0;
ts_adc_blur_avg[ch].n = 0;
ts_adc_blur_avg[ch].ch = D_ADCCH_1 + ch;
//通道移位滤波任务初始化
L1_task_init(&ts_adc_blur_shift[ch].task);
L3_task_s_go(ts_adc_blur_shift[ch],D_task_init);
ts_adc_blur_shift[ch].n = 0;
ts_adc_blur_shift[ch].h = 0;
ts_adc_blur_shift[ch].shiftreg[0] = R.p.adc_blur_shift[0];
ts_adc_blur_shift[ch].shiftreg[1] = R.p.adc_blur_shift[1];
ts_adc_blur_shift[ch].shiftreg[2] = R.p.adc_blur_shift[2];
ts_adc_blur_shift[ch].sum[0] = 0;
ts_adc_blur_shift[ch].sum[1] = 0;
ts_adc_blur_shift[ch].sum[2] = 0;
ts_adc_blur_shift[ch].shiftval[0] = 0;
ts_adc_blur_shift[ch].shiftval[1] = 0;
ts_adc_blur_shift[ch].shiftval[2] = 0;
ts_adc_blur_shift[ch].ch = D_ADCCH_1 + ch;
//输出判定任务初始化
L1_task_init(&ts_adc_blur_out[ch].task);
L3_task_s_go(ts_adc_blur_out[ch],D_task_init);
ts_adc_blur_out[ch].h= 0;
ts_adc_blur_out[ch].threshold[0] = D_blur_threshold_2_1(R.p.adc_blur_threshold[0]); //2KG
ts_adc_blur_out[ch].threshold[1] = D_blur_threshold_2_1(R.p.adc_blur_threshold[1]); //0.5KG
ts_adc_blur_out[ch].newnum = 0;
ts_adc_blur_out[ch].oldnum = 0;
ts_adc_blur_out[ch].oldout = 0;
ts_adc_blur_out[ch].newout = 0;
ts_adc_blur_out[ch].n = 0;
ts_adc_blur_out[ch].ch = D_ADCCH_1 + ch;
*****/
#if 0
//通道切换任务初始化
//L1_task_init(&ts_adc_channel_switch.task);
L3_task_s_go(ts_adc_channel_switch,D_task_init);
#endif
#endif

127
source/asp/新建文件夹/asp_schain.h

@ -0,0 +1,127 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_drv.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _asp_schain_H
#define _asp_schainH
#include "../bsp/bsp_config.h"
#include "TTSS_task.h"
#include "c_lib.h"
///#include "app_config.h"
#define D_Wch1 0
#define D_Wch2 1
#define D_Wch3 2
#define D_Wch4 3
#define ADC_CHANNEL_STATUS_UNREADY 0 //UnReady状态,不能读取
#define ADC_CHANNEL_STATUS_READY 1 //ready状态,可以读取
#define D_ADC_CHANNEL_NUM 4
#define D_ADC_CH_SAMPLE_BUF_MAX 50
#define D_ADC_CH_BLUE_POOL_NUM 3
typedef struct
{
vU32 average; ///
vU8 shift; ///移动的位数 1-2 2-4 3-8 4-16
vU32 sum;
vU32 new; ///新的输出值
vU16 out4; ///
}TS_shift_averge_;
////cc 比较重要的滤波调整参数,根据实际需要进行调整
#define D_ADC_shiftaverage_a 2
#define D_ADC_shiftaverage_b 4
///vtype i; vU32 rdata = 0;
//任务读
/// 单个传感器 D_sensor_zoom=8 2kg 289 80kg 8374
/// D_sensor_zoom=6 1274 31787
///#define D_sensor_zoom 6
///#define D_sensor_zoom_FF 0xFFfc0000
#define D_sensor_zoom 7
#define D_sensor_zoom_FF 0xFFfe0000
///#define D_sensor_zoom 8///实际上8位不需要,因为强制转换成16位后自动符合要求
///#define D_sensor_zoom_FF 0xfF000000
//// 31688 80kg 31688/80= =400
//#define D_ADC_PER_KG 400 ///每公斤adc
//#define D_ADC_OFFSET (20*D_ADC_PER_KG)
///134
///extern TS_GlobalRegister R;
#define D_ADC_PER_KG 0x134///每公斤adc
#define D_ADC_OFFSET(ch) ts_adc_samples[ch].offset////(30*D_ADC_PER_KG)
///#define D_ADC_OFFSET(ch) 0////(30*D_ADC_PER_KG)
/*****
000028FE 1kg 81.984375
00015D85 3kg 699.0390625 617.0546875
2^7 128 0x134
******/
//AD_CHANNEL_SAMPLE 采样
#define MAX_OUT_NUM 10
typedef struct _s_task_adc_sample
{
TS_task task;
vU8 ok;
vU8 ch;
/// vS32 adcval;
// vS32 pool;
vU8 jitter_start; ///刚开始的抖动,先去掉几个最开始的数据
vU32 out0;
vU16 out1;
S16 out1a;
vU16 outm[3];///中值移位滤波的缓存
vU16 out2;
vU16 out3;
/****************
^
|
|--------------------------zeroout
| | | | | offset
| | | | .
| . | |
0------.----|-------------> 0
| .
*********************/
vU16 offset;
vU16 zeroout;
TS_shift_averge_ ts_SAa;
TS_shift_averge_ ts_SAb;
vU16 out4;//滤波输出
vU16 out5;////选择后的
}TS_TASK_ADC_SAMPLE;
extern TS_TASK_ADC_SAMPLE ts_adc_samples[D_ADC_CHANNEL_NUM];
extern void L2_task_adc_init(U8 ch);
extern void L2_task_adc_sample(TS_TASK_ADC_SAMPLE *s);
extern void L2_task_adc_SAinit(U8 ch,U8 *a,U8 *b);
void L3_out_zero(u8 ch);
#endif // #ifndef _asp_adc_H

620
source/asp/新建文件夹/asp_weight_save.c

@ -0,0 +1,620 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2022, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file app_save.c
/// @brief @ app save
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220120
/// @note cc_AS_stc02
#ifdef doc453453
app_save
asp_para L1_para_write eeprom的读写函数和地址配置
U8 L1_para_write(U8 *buf, U8 len)
msp_eeprom mcu的eeprom的底层驱动函数
----------global_register-------------------------------->
iapData数据的映射
TS_GlobalRegisterd S
..........................................
//RO Register
U16 reserved1;
//RW Register
TS_IapData_ sd;//// save data 需要保存的额参数
-----------iapData-------------------------------------->
TS_IapData_ iapData
TS_IapData_ code iapData_factory
..................................................
S16 slaver_id;
TS_weight_point_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
TS_weight_point_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
////此值上电后更改, 顺便保存(区别于实时保存),
u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
-----------eep_param----------------------------------->
eeprom中的缓存
eeprom ---,,.
TS_eeprom_param_
.........................................
U8 filter;
U8 len;
U8 buf[EEPROM_PARAM_DATA_MAX];
U8 crc[2];
#endif
//////////////////////////////////////////////////////////////////////////////
#include "asp_weight_save.h"
#include "app_config.h"
#include "debug_drv.h"
#include "msp_eeprom.h"
#define D_0kg 0
#define D_20kg 200
#define D_85kg 850
///#define D_20kg 190
///cc 2023/04/06--6:41:48 西安方块 传感器 根据传感器调配 程序应该专门数据结构
/*
///cc 2023/04/06--6:43:39
\--------adc---------
hex dec kg adc/kg
68F 1679 10 168
4196 16790 100
37BF 14272 85
D1E 3358 20
1out_adc
210kg D_Rsensor_per_10kg
step 1 adc
step 2 offset
step 3
step 4 zeroout
step 5
^
|
|
| | | | | offset
| | | | .
| . | |
0------.----|-------------> 0
| .
vU16 offset;
vU16 zeroout; ///默认的零点输出吧所有通道都调整成同一个起点 ,应该远大于原始采样值out_adc的最大值
*/
///打开adc输出监控,0kg的试试每一路的输出就是 0kg_out1_adc
#define D_ch1_0kg_out1_adc (vS16)0xFF3D
#define D_ch2_0kg_out1_adc (vS16)0xFF8D
#define D_ch3_0kg_out1_adc (vS16)0x00D9
#define D_ch4_0kg_out1_adc (vS16)0xFFE0
/////需要通过测试配置 如果不在意符号位 可以优化 diao
#define D_ch1_out1_offset (D_ch1_wantline-D_ch1_0kg_out1_adc)
#define D_ch2_out1_offset (D_ch2_wantline-D_ch2_0kg_out1_adc)
#define D_ch3_out1_offset (D_ch3_wantline-D_ch3_0kg_out1_adc)
#define D_ch4_out1_offset (D_ch4_wantline-D_ch4_0kg_out1_adc)
#define D_ch1_wantline 0x18da
#define D_ch2_wantline 0x18da
#define D_ch3_wantline 0x18da
#define D_ch4_wantline 0x18da
///cc 2023/04/06--7:39:40 每个传感器放置10kg
///应变片传感器10kg的adc值,选择这个是因为10kg容易获得 并且有一定的重量差
///这个值需要实验获得
#define D_ch1_10kg_out1_adc (vS16)0x0584
#define D_ch2_10kg_out1_adc (vS16)0x05DE
#define D_ch3_10kg_out1_adc (vS16)0x0731
#define D_ch4_10kg_out1_adc (vS16)0x066C
#define D_Rsensor_per_10kg ((vS16)10)
#define D_adc_per_kg ((D_ch1_10kg_out1_adc-D_ch1_out1_adc)/D_Rsensor_per_10kg)
#define D_adc_zeroout (10*D_adc_per_kg) ///零点都拉到10kg
///cc 2023/04/06--7:50:26 应该是tst_weight.out6的值
#define D_Rsensor_adc_D_0kg 0x5e2
#define D_Rsensor_adc_D_20kg 0x11a6
#define D_Rsensor_adc_D_85kg 0x37E3
///TS_weight_save_ ts_weight_save;
TS_weight_SPara_ ts_weight_SPara=
{
0xaabcd,
D_ch1_out1_offset,D_ch2_out1_offset,D_ch3_out1_offset,D_ch4_out1_offset,///0x18da,0x18d9 0x18d9 0x18d9 4x2与第一个传感器的差值,第一个传感器为偏移量
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
D_0kg,D_Rsensor_adc_D_0kg,
D_20kg,D_Rsensor_adc_D_20kg,
D_85kg,D_Rsensor_adc_D_85kg,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
/// 123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
/// -123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
/// D_adc_zeroout,
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
TS_weight_SPara_ code ts_weight__factory=
{
0xaabcd,
D_ch1_out1_offset,D_ch2_out1_offset,D_ch3_out1_offset,D_ch4_out1_offset,///
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
// 123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
////// -123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
/// D_adc_zeroout,
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
#if 0
///cc 2023/04/06--6:41:28 长条的传感器数据150kg?
///cc 2023/04/06--6:41:48 西安方块 传感器
TS_IapData_ iapData=
{
0xaabcd,
0x18da,0x18d9,0x18d9,0x18d9,///0x18da,0x18d9 0x18d9 0x18d9
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
-123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
8049,///30*0x134
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
TS_IapData_ code iapData_factory=
{
0xaabcd,
0x18da,0x18d9,0x18d9,0x18d9,///
/// ts_weight_sheet_ factory_ws[3]; ///出厂的设置,发布出厂指令后更新 由上位机命令更改,实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// ts_weight_sheet_ zerows[3]; ///手工清零后的参数, 没有清零或者出错恢复到和出厂设置一样,需要实时保存
0,0x1f7f,
D_20kg,0x25ed,
D_85kg,0x3236,
/// vS16 zerodiff_max; /// 上电时,如果和zerows的零点ADC的差值小于 zerodiff_max 说明没有人,启动上电校准;
123,
/// vS16 zerodiff; ///零点的差值 零公斤位置和手工的差值
-123, ////此值上电后更改, 顺便保存(区别于实时保存),
///vU16 zeroout; //2
8049,///30*0x134
/// u8 ADC_shiftaverage_a; ///a路移位滤波的参数 由上位机命令更改,实时保存
/// u8 ADC_shiftaverage_b; ///b路移位滤波的参数 由上位机命令更改,实时保存
2,5,
D_rev0x55aa55aa
};
#endif
//读取reg内容,写入iap
u8 L4_reg_2_iap(void)
{
}
//读取factory内容,写入iap
u8 L4_factory_2_iap(void)
{
}
#define D_EEP_SAVE_ADDR 0
///// 多次读取
void L4_iap_2_reg(void)
{
L0_Iap_Read_array(D_EEP_SAVE_ADDR, (U8*)&S, 128);
}
void L4_print_iap(TS_weight_SPara_ *s)
{
L0_waitFree_uartN(0);///混搭使用printf的时候必须加上
printf("\r\nzerows\r\n %d kg = 0x%4x\r\n", s->zerows[0].kg,s->zerows[0].adc);
printf(" %d kg = 0x%4x\r\n", s->zerows[1].kg,s->zerows[1].adc);
printf(" %d kg = 0x%4x\r\n", s->zerows[2].kg,s->zerows[2].adc);
/// printf("\r\ns->zeroout= %d = 0x%4x\r\n", s->zeroout, s->zeroout);
//// printf("\r\ns->offset 0x%04x 0x%04x 0x%04x 0x%04x\r\n",s->offset[0],s->offset[1],s->offset[2],s->offset[3]);
printf("\r\n-----print_reg end--------\r\n");
}
/*******
///cc 2023/04/06--6:51:31
1.out1 1.out2
1F7F FF3D FF8E 00D9 FFE0 1F6C 1F6F 1F75 1F6E (0)0x 0 -194 -113 217 -31
1F7F FF3D FF8D 00D9 FFE0 1F6C 1F6E 1F75 1F6E (0)0x 0 -194 -114 217 -31
1F7F FF3D FF8E 00D9 FFE0 1F6C 1F6F 1F75 1F6E (0)0x 0 -194 -113 217 -31
1F7F FF3D FF8D 00D9 FFE0 1F6C 1F6E 1F75 1F6E (0)0x 0 -194 -114 217 -31
1F7F FF3D FF8E 00DA FFE0 1F6C 1F6F 1F76 1F6E (0)0x 0 -194 -113 218 -31
1F7F FF3D FF8E 00D9 FFE0 1F6C 1F6F 1F75 1F6E (0)0x 0 -194 -113 217 -31
1F7F FF3D FF8E 00D9 FFE0 1F6C 1F6F 1F75 1F6E (0)0x 0 -194 -113 217 -31
1F7F FF3D FF8E 00D9 FFE1 1F6C 1F6F 1F75 1F6F (0)0x 0 -194 -113 217 -30
1F7F FF3B FF8E 00D8 FFDF 1F6A 1F6F 1F74 1F6D (0)0x 0 -196 -113 216 -32
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3D FF8C 00D9 FFE0 1F6C 1F6D 1F75 1F6E (0)0x 0 -194 -115 217 -31
1F7F FF3E FF8D 00D9 FFE0 1F6D 1F6E 1F75 1F6E (0)0x 0 -193 -114 217 -31
1F7F FF3D FF8C 00D9 FFE0 1F6C 1F6D 1F75 1F6E (0)0x 0 -194 -115 217 -31
1F7F FF3E FF8C 00D9 FFE0 1F6D 1F6D 1F75 1F6E (0)0x 0 -193 -115 217 -31
1F7F FFB7 FF88 00D9 FFE1 1FE6 1F69 1F75 1F6F (1)0x 1 -72 -119 217 -30
1F8C 033F FF8A 00D9 FFE1 236D 1F6B 1F75 1F6F (28)0x 1c 831 -117 217 -30
2069 0478 FF8A 00D9 FFE0 24A6 1F6B 1F75 1F6E (38)0x 26 1144 -117 217 -31
20BA 04D3 FF8B 00D9 FFE1 2501 1F6C 1F75 1F6F (41)0x 29 1235 -116 217 -30
20D3 0520 FF8D 00D9 FFE1 254E 1F6E 1F75 1F6F (43)0x 2b 1312 -114 217 -30
20E5 053C FF8B 00D9 FFE1 256A 1F6C 1F75 1F6F (44)0x 2c 1340 -116 217 -30
20EE 0542 FF8B 00D9 FFE1 2570 1F6C 1F75 1F6F (45)0x 2d 1346 -116 217 -30
20F3 0575 FF8C 00D9 FFE1 25A3 1F6D 1F75 1F6F (46)0x 2e 1397 -115 217 -30
20FB 0562 FF8C 00D9 FFE0 2590 1F6D 1F75 1F6E (45)0x 2d 1378 -115 217 -31
20F8 056E FF8D 00D9 FFE1 259C 1F6E 1F75 1F6F (46)0x 2e 1390 -114 217 -30
20FC 0581 FF8D 00D9 FFE1 25AF 1F6E 1F75 1F6F (46)0x 2e 1409 -114 217 -30
2100 057C FF8C 00D9 FFE1 25AA 1F6D 1F75 1F6F (46)0x 2e 1404 -115 217 -30
20FE 0584 FF8C 00DA FFE1 25B2 1F6D 1F76 1F6F (46)0x 2e 1412 -115 218 -30
2101 0585 FF8D 00DA FFE1 25B3 1F6E 1F76 1F6F (46)0x 2e 1413 -114 218 -30
2101 05A4 FF8D 00D9 FFE0 25D2 1F6E 1F75 1F6E (47)0x 2f 1444 -114 217 -31
2109 05AD FF8C 00D9 FFE1 25DB 1F6D 1F75 1F6F (48)0x 30 1453 -115 217 -30
210B 05C0 FF8D 00D9 FFE1 25EE 1F6E 1F75 1F6F (48)0x 30 1472 -114 217 -30
210F 05BD FF8C 00D9 FFE0 25EB 1F6D 1F75 1F6E (48)0x 30 1469 -115 217 -31
210E 0584 FF8D 00D9 FFE1 25B2 1F6E 1F75 1F6F (47)0x 2f 1412 -114 217 -30
2105 FF3E FF8D 00D9 FFE0 1F6D 1F6E 1F75 1F6E (0)0x 0 -193 -114 217 -31
1F7F FF3D FF8D 00D9 FFE0 1F6C 1F6E 1F75 1F6E (0)0x 0 -194 -114 217 -31
1F7F FF3E FF8D 00DA FFE1 1F6D 1F6E 1F76 1F6F (0)0x 0 -193 -114 218 -30
1F7F FF3D FF8D 00D9 FFE0 1F6C 1F6E 1F75 1F6E (0)0x 0 -194 -114 217 -31
1F7F FF3E 005C 00DA FFE0 1F6D 203C 1F76 1F6E (2)0x 2 -193 92 218 -31
1F97 FF3D 04BA 00D9 FFE0 1F6C 249A 1F75 1F6E (37)0x 25 -194 1210 217 -31
20B5 FF3E 05D0 00D9 FFE0 1F6D 25B0 1F75 1F6E (47)0x 2f -193 1488 217 -31
2103 FF3E 0608 00D9 FFE0 1F6D 25E8 1F75 1F6E (48)0x 30 -193 1544 217 -31
210E FF3E 05EE 00D9 FFE1 1F6D 25CE 1F75 1F6F (48)0x 30 -193 1518 217 -30
210B FF3E 05DE 00D9 FFE0 1F6D 25BE 1F75 1F6E (47)0x 2f -193 1502 217 -31
2103 FF3D 05E5 00D9 FFE0 1F6C 25C5 1F75 1F6E (47)0x 2f -194 1509 217 -31
2105 FF3E 05E1 00D9 FFE0 1F6D 25C1 1F75 1F6E (47)0x 2f -193 1505 217 -31
2105 FF3D 05E1 00D9 FFE0 1F6C 25C1 1F75 1F6E (47)0x 2f -194 1505 217 -31
2104 FF3E 05C3 00DA FFE0 1F6D 25A3 1F76 1F6E (46)0x 2e -193 1475 218 -31
20FE FF3E 054D 00D9 FFE0 1F6D 252D 1F75 1F6E (43)0x 2b -193 1357 217 -31
20E5 FF3D FF8F 00D9 FFE0 1F6C 1F70 1F75 1F6E (0)0x 0 -194 -112 217 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3E FF8F 00D9 FFE0 1F6D 1F70 1F75 1F6E (0)0x 0 -193 -112 217 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3D FF8E 00D9 FFE0 1F6C 1F6F 1F75 1F6E (0)0x 0 -194 -113 217 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3D FF8E 01FE FFE0 1F6C 1F6F 209A 1F6E (5)0x 5 -194 -113 510 -31
1FAB FF3D FF8E 066F FFE0 1F6C 1F6F 250B 1F6E (41)0x 29 -194 -113 1647 -31
20D2 FF3E FF8E 06EA FFE0 1F6D 1F6F 2586 1F6E (45)0x 2d -193 -113 1770 -31
20F4 FF3E FF8E 0736 FFE0 1F6D 1F6F 25D2 1F6E (47)0x 2f -193 -113 1846 -31
2105 FF3E FF8E 072A FFE0 1F6D 1F6F 25C6 1F6E (47)0x 2f -193 -113 1834 -31
2104 FF3E FF8E 072A FFE0 1F6D 1F6F 25C6 1F6E (47)0x 2f -193 -113 1834 -31
2104 FF3E FF8E 0715 FFE0 1F6D 1F6F 25B1 1F6E (46)0x 2e -193 -113 1813 -31
20FF FF3E FF8E 0731 FFE0 1F6D 1F6F 25CD 1F6E (47)0x 2f -193 -113 1841 -31
2105 FF3E FF8E 0744 FFE0 1F6D 1F6F 25E0 1F6E (47)0x 2f -193 -113 1860 -31
210A FF3E FF8E 076A FFE0 1F6D 1F6F 2606 1F6E (49)0x 31 -193 -113 1898 -31
2114 FF3D FF8E 0762 FFE0 1F6C 1F6F 25FE 1F6E (48)0x 30 -194 -113 1890 -31
2112 FF3E FF8E 0767 FFE0 1F6D 1F6F 2603 1F6E (48)0x 30 -193 -113 1895 -31
2112 FF3E FF8E 076A FFE0 1F6D 1F6F 2606 1F6E (49)0x 31 -193 -113 1898 -31
2114 FF3E FF8E 06F2 FFE0 1F6D 1F6F 258E 1F6E (46)0x 2e -193 -113 1778 -31
20FC FF3E FF8E 00D9 FFE1 1F6D 1F6F 1F75 1F6F (0)0x 0 -193 -113 217 -30
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3F FF8E 00D9 FFE0 1F6E 1F6F 1F75 1F6E (0)0x 0 -192 -113 217 -31
1F7F FF3E FF8E 00D9 0230 1F6D 1F6F 1F75 21BD (13)0x d -193 -113 217 560
1FEE FF3F FF8E 00D9 0629 1F6E 1F6F 1F75 25B6 (46)0x 2e -192 -113 217 1577
20FA FF3E FF8E 00D9 066A 1F6D 1F6F 1F75 25F7 (48)0x 30 -193 -113 217 1642
2112 FF3E FF8E 00D9 0670 1F6D 1F6F 1F75 25FD (49)0x 31 -193 -113 217 1648
2113 FF3E FF8F 00D9 0664 1F6D 1F70 1F75 25F1 (48)0x 30 -193 -112 217 1636
2111 FF3D FF8E 00D9 0669 1F6C 1F6F 1F75 25F6 (48)0x 30 -194 -113 217 1641
2111 FF3F FF8F 00D9 066C 1F6E 1F70 1F75 25F9 (48)0x 30 -192 -112 217 1644
2112 FF3E FF8E 00D9 066B 1F6D 1F6F 1F75 25F8 (48)0x 30 -193 -113 217 1643
2112 FF3E FF8F 00D9 066D 1F6D 1F70 1F75 25FA (48)0x 30 -193 -112 217 1645
2112 FF3E FF8F 00D9 066C 1F6D 1F70 1F75 25F9 (48)0x 30 -193 -112 217 1644
2112 FF3E FF8E 00D9 067D 1F6D 1F6F 1F75 260A (49)0x 31 -193 -113 217 1661
2116 FF3E FF8E 00D9 065E 1F6D 1F6F 1F75 25EB (48)0x 30 -193 -113 217 1630
210F FF3E FF8E 00D9 0673 1F6D 1F6F 1F75 2600 (49)0x 31 -193 -113 217 1651
2113 FF3E FF8F 00D9 066B 1F6D 1F70 1F75 25F8 (48)0x 30 -193 -112 217 1643
2112 FF3E FF8E 00D9 0674 1F6D 1F6F 1F75 2601 (49)0x 31 -193 -113 217 1652
2114 FF3F FF8E 00D9 067E 1F6E 1F6F 1F75 260B (49)0x 31 -192 -113 217 1662
2117 FF3E FF8F 00D9 0665 1F6D 1F70 1F75 25F2 (48)0x 30 -193 -112 217 1637
2110 FF3E FF8E 00D9 0610 1F6D 1F6F 1F75 259D (46)0x 2e -193 -113 217 1552
20FE FF3E FF8D 00D9 FFE1 1F6D 1F6E 1F75 1F6F (0)0x 0 -193 -114 217 -30
1F7F FF3E FF8E 00DA FFE0 1F6D 1F6F 1F76 1F6E (0)0x 0 -193 -113 218 -31
1F7F FF3E FF8E 00D9 FFE0 1F6D 1F6F 1F75 1F6E (0)0x 0 -193 -113 217 -31
1F7F FF3E FF8E 00D9 FFE1 1F6D 1F6F 1F75 1F6F (0)0x 0 -193 -113 217 -30
1F7F FF3F FF8E 00DA FFE0 1F6E 1F6F 1F76 1F6E (0)0x 0 -192 -113 218 -31
1F7F FF3E FF8E 00D9 FFE1 1F6D 1F6F 1F75 1F6F (0)0x 0 -193 -113 217 -30
1F7F FF3F FF8D 00D9 FFE0 1F6E 1F6E 1F75 1F6E (0)0x 0 -192 -114 217 -31
1F7F FF3F FF8D 00D9 FFE0 1F6E 1F6E 1F75 1F6E (0)0x 0 -192 -114 217 -31
1F7F FF3F FF96 00D9 FFE0 1F6E 1F77 1F75 1F6E (0)0x 0 -192 -105 217 -31
1F7F FF3F FF96 00D9 FFE0 1F6E 1F77 1F75 1F6E (0)0x 0 -192 -105 217 -31
1F7F FF3F FF96 00D9 FFE0 1F6E 1F77 1F75 1F6E (0)0x 0 -192 -105 217 -31
1F7F FF3F FF95 00D9 FFE0 1F6E 1F76 1F75 1F6E (0)0x 0 -192 -106 217 -31
1F7F FF3F FF94 00D9 FFE0 1F6E 1F75 1F75 1F6E (0)0x 0 -192 -107 217 -31
1F7F FF3F FF93 00D9 FFE0 1F6E 1F74 1F75 1F6E (0)0x 0 -192 -108 217 -31
L0_uart0_sendstr("\r\nfactory_ws= ");
L0_uart0_ushex(iapData.factory_ws[0].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[0].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.factory_ws[1].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[1].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.factory_ws[2].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.factory_ws[3].adc);L0_uart0_0d0a();
L0_uart0_sendstr("\r\nzerows= ");
L0_uart0_ushex(iapData.zerows[0].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[0].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.zerows[1].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[1].adc);L0_uart0_0d0a();
L0_uart0_ushex(iapData.zerows[2].kg);L0_uart0_uc(' ');
L0_uart0_ushex(iapData.zerows[3].adc);L0_uart0_0d0a();
63 = 0x 3
R.sd.zeroout= 8049 = 0x1f71 offset 4 = 0x 4
4
v3.4
RRRRRRRRRRRRRRRRRRRRRRRRRRRRR
2800 01 00 02 00 03 00 04 00 00 12 35 00 C8 56 78 01 90 78 9A 00 00 12 34 00 C8 56 78 01 90 78 9B 00 7B FF 85 1F 71 02 05
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x0001 0x0002 0x0003 0x0004
e2p read success
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x0001 0x0002 0x0003 0x0004
8
ADC_SAMPLE
ADC_SAMPLE
ADC_SAMPLE
ADC_SAMPLE
R.sd.zeroout= 8049 = 0x1f71 offset 1 = 0x 1
R.sd.zeroout= 8049 = 0x1f71 offset 2 = 0x 2
R.sd.zeroout= 8049 = 0x1f71 offset 3 = 0x 3
R.sd.zeroout= 8049 = 0x1f71 offset 4 = 0x 4
4Z00 FDAA 21C7 Z02 13EF 0B82 Z03 FD31 2240 Z01 F49D 2AD4 1F3D 1F6D 13F2 1F35 1C74 001E
1EF0 1F64 13F2 1EF7 1C4F 001D
1EA8 1F4A 1EAF 1EB8 1ED6 0025
1E5F 1F44 1E5A 1E55 1E94 0024
1E14 1F3D 1E19 1E74 1E77 0023
1DD3 1F2F 1DD4 1E39 1E43 0023
1D92 1F20 1D8C 1E37 1E1D 0022
1D4C 1F0E 1D4F 1DCF 1DDE 0022
1D0B 1EFF 1D01 1D7F 1DA2 0021
1CEA 1EF4 1CBD 1D49 1D79 0021
FD 04 33 44 55 00 00 00
4sensor zero
R.sd.sensor 0x245d 0x2b5a 0x e46 0x2478
&e2p write success
RRRRRRRRRRRRRRRRRRRRRRRRRRRRR
2824 5D 2B 5A 0E 46 24 78 00 00 12 35 00 C8 56 78 01 90 78 9A 00 00 12 34 00 C8 56 78 01 90 78 9B 00 7B FF 85 1F 71 02 05
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
e2p read success
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1F28 1F65 1CAE 1F2D 1E9A 0024
1EEA 1F58 1EF4 1F37 1F1B 0025
1EA3 1F45 1EB3 1ECE 1EDA 0025
1E72 1F35 1E69 1E92 1EA8 0024
1E2A 1F25 1E2B 1E7B 1E7D 0023
FD 02 33 44 55 00 00 00
--read --
a b=
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1DE4 1F16 1DE6 1E20 1E40 0023
1DA3 1F06 1DA8 1DFB 1E13 0022
1D7C 1EF4 1D67 1DA9 1DE0 0022
1D37 1EE6 1D28 1D53 1DA6 0021
1CE9 1ED4 1CE7 1D37 1D76 0020
1CA7 1EC2 1CA6 1D02 1D44 0020
1C5F 1EAF 1C60 1CA3 1D04 001F
1C2D 1EA1 1C24 1C58 1CD2 001F
1BEB 1E93 1BDC 1C21 1C9E 001E
FD 03 33 44 55 00 00 00
--read R.sd--
a b=
--print_reg--
a b= 02 05
factory_ws
0 kg = 0x1235
200 kg = 0x5678
400 kg = 0x789a
zerows
0 kg = 0x1234
200 kg = 0x5678
400 kg = 0x789b
s->zeroout= 8049 = 0x1f71
s->sensor 0x245d 0x2b5a 0x0e46 0x2478
1BAB 1E83 1B98 1BDB 1C68 001D
1B7D 1E70 1B5A 1BA3 1C3A 001D
1B32 1E5F 1B0B 1AF9 1BE5 001C
1AEA 1E53 1AD3 1AEE 1BBF 001B
*********/

126
source/asp/新建文件夹/asp_weight_save.h

@ -0,0 +1,126 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2022, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file app_save.h
/// @brief @ app save
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220120
/// @note cc_AS_stc02
/*********
1,
1 512---4-6ms
01
,,
,
--->,
1,,512
30
2, ,.--->,;
flash 28k 8k EEp 28K的最后8K 5000h-6FFFh
*******/
/*******
app_config app_save
app_save ,
,西,,使bsp中
asp ,app通过参数调用asp,使.
,.
app ,
asp app support program wifi的模式设置,adc的读取后的处理
bsp board support program ,wdt,wifi的底层配置函数,sensor
msp mcu support program ,cpu自身的外设,uart led
cpu
*****/
/*******
adc采样值
^
|
| o
| |
| o |
| | |
| ---|---- |------------0=adc=0
0 | |D_ADC_OFFSET
|____|_____|____________> adc + D_ADC_OFFSET
0 40 80
西:
1,< >
2, 0kg的时候的<>
3,<> + <>
3.1 ,250kg,,,.<250kg,>
4, : <(+-10kg)>,<>
,.
5,,<>,,.
4,.
B:4,.
---->C: 4.5 ,
c,,0 (H1sL0.5s)3
西:
< > Byte x n=? .
Byte x n=? .
<> Byte x n=? .
<> ,
,250kg
,id之类的
3,,,使.使.
*****/
//////////////////////////////////////////////////////////////////////////////
#ifndef _asp_weight_save_H
#define _asp_weight_save_H
#include "TTSS_task.h"
#include "c_lib.h"
#include "../bsp/bsp_config.h"
#include "msp_uart1.h"
#include "msp_uartN.h"
///#include "asp_para.h"
///#include "app_weight.h"
////#include "asp_adc.h"
extern void L4_iap_2_reg(void);
void L4_print_iap(TS_weight_SPara_ *s);
u8 L4_reg_2_iap(void);
#endif // #ifndef _APP_TASK_ADC_H

21
source/bsp/TTSSbsp/bsp_config.c

@ -0,0 +1,21 @@
#include "bsp_config.h"
///#include "../tpc/tpc_modbus.h"
///#include "app_config.h"
#include "msp_uart1.h"
///#include "bsp_AiP650E.h"
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2023 CCSENS All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_func.c
/// @brief bsp @ fuctiong ; io复用选择等,和cpu型号息息相关
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180308
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////

544
source/bsp/TTSSbsp/bsp_config.h

@ -0,0 +1,544 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file hard_config.h
/// @brief hard config include
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx
///-------------------------------------------------------------------------
/// @version 1.1
/// @author CC
/// @date 20180308
/// @note
//////////////////////////////////////////////////////////////////////////////
/// @version 5.1
/// @author CC
/// @date 20200301
/// @note
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#ifndef _BSP_CONFIG_H
#define _BSP_CONFIG_H
#include <INTRINS.H>
#include "c_bit.h"
#include "bsp_config_const.h"//
//STEP 1 TYPE_UASER_BOARD SELECT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define TYPE_UASER_BOARD TYPE_BOARD_TTSS2_w5
//STEP 2 TYPE_UASER_BOARD CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#if(TYPE_UASER_BOARD == TYPE_BOARD_TTSS2_w5)
#include <stdio.h>
#include <string.h>
#include <intrins.h>
//基本配置(工作频率、时钟、看门狗、字节序)
#define TYPE_MCU TYPE_MCU_STC_8H
#define TYPE_IDE TYPE_IDE_KEIL
/// #define D_sys_MainFre MainFre_11M////STC8A8K64D4 z最大45M
#define D_sys_MainFre MainFre_22M////STC8A8K64D4 z最大45M
/// #define D_sys_MainFre MainFre_44M////STC8A8K64D4 z最大45M
#define D_sys_Jiffies TYPE_JIFFIES_12MS
#warning "MainFre_22M"
#define D_MCU_NAME "STC8A8K64U4"
#define D_str_version "\r\n stcTTSS2NB2_"
#define D_BOARD_NAME " NB2"
#include "c_type51.h"
/**************
...
: STC8H3K48S2
: 7.4.1U
:
. ISP工作频率: 23.844MHz
. IRC振荡器的频率: 11.057MHz
. : 35.250KHz
. 使
. P3.2P3.3
.
. I/O口
.
. : 2.00 V
. ,
. : 256
.
. ,EEPROM区一并擦除
. ,485
.
. : 1195 mV (: 1100~1300mV)
. : 202192
: STC8H3K48S2
: 7.4.1U
... [0.906"]
: 22.094MHz (-0.109%)
... [0.125"]
: 460800
... ! [0.656"]
... ! [2.860"]
... ! [0.016"]
:
. ISP工作频率: 23.844MHz
. IRC振荡器的频率: 22.094MHz
. : 35.250KHz
. 使
. P3.2P3.3
.
. I/O口
.
. : 2.00 V
. ,
. : 256
.
. ,EEPROM区一并擦除
. ,485
.
. : 1195 mV (: 1100~1300mV)
. : 202192
: F74DC52602599C
: STC8H3K48S2
: 7.4.1U
. : 22.118MHz
. : 22.094MHz ( = 1)
. : -0.109%
!(2023-04-06 21:16:42)
--------------------------------------------------------------
EN_DEC3V3 P14 PIN8
EN_DC5V P37 PIN28
LED5VEN1 P20 PIN33 4 LED5VEN4
RFID5VEN P41 PIN29 RFID
--------------------------------------------------------------
BEE P22
--------------------------------------------------------------
20230317_ CCmodify
U1 DEBUG
U2 5311
U3 485
U4 xx
--------------------------------------------------------------
TTSS 使0
1 123
uart1 使2 uart1.c
uart2 使 uart2.c
modbus使用定时器2 uart空闲状态的判定 使0,
*******************************************************/
#include "bsp_config_stc.h"
#define D_WDT_STATUS TYPE_WDT_DISABLE //如果配置为enable,请在bsp_config.c中设置wdt溢出时间
#define D_MCU_ENDIAN TYPE_MCU_BIGENDIAN
#define D_CODE_ENCRYPTION_TYPE TYPE_ENCRYPTION_ENABLE //是否代码加密
//串口配置
/// #define D_UART1_BRT BRT_460800
/// #define D_UART1_BRT BRT_921600
#define D_UART1_BRT BRT_115200
#define D_UART1_SBIT SBIT_1
#define D_PIN_UART1 PIN_UART1_Rxd_30_Txd_31
#define D_UART2_BRT BRT_115200///BRT_921600///BRT_115200///
#define D_UART3_BRT BRT_115200///BRT_921600///BRT_115200
#define D_UART4_BRT BRT_115200///BRT_921600///BRT_115200
//485配置
#define D_UART1_485_TYPE TYPE_485_SLAVER //UART1启用485
#define D_UART1_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息
#define D_UART1_485_SLAVER_ID 0x11 //板卡作为485从机 slaverId
#define D_UART1_485_TX() D_P55_stdIO();D_P55_ON();
#define D_UART1_485_RX() D_P55_stdIO();D_P55_OFF();
#define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485
#define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485
#define D_UART4_485_TYPE TYPE_485_NONE //UART2不启用485
//MODBUS协议配置
#define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行
#define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改
#define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应
//外设定义
#define D_LED1_INIT() D_LED1_OFF()
#define D_LED1_ON() D_P17_stdIO();D_P17_OFF()
#define D_LED1_OFF() D_P17_stdIO();D_P17_ON()
#define D_LED1_REV() D_P17_stdIO();D_P17_REV()
#define D_LED2_INIT() D_LED2_OFF()
#define D_LED2_ON() D_P54_stdIO();D_P54_OFF()
#define D_LED2_OFF() D_P54_stdIO();D_P54_ON()
#define D_LED2_REV() D_P54_stdIO();D_P54_REV()
//EEP存储地址定义
#define D_EEP_SECTOR_SIZE 0x200
#define D_EEP_PARAM_ADDR (D_EEP_SECTOR_SIZE * 0) //eeprom参数区扇区地址
//存储器特殊参数地址配置
#define D_MCU_SPEC_PARAM_CHIPID 0xFDF9
//...其他参数
#define D_iicch_0 0
#define D_iicch_1 1
#define D_iicch_2 2
#define D_iicch_3 3
#define D_iicch_4 4
#define D_iicch_5 5
#define D_iicch_6 6
#define D_iicch_7 7
#define D_iicch_8 8
#define D_iicch_9 9
#define D_iic_chnum 2
#define D_SIIC_USE_0
#define D_SIIC_USE_1
///#define D_SIIC_USE_2
///#define D_SIIC_USE_3
///#define D_SIIC_USE_4
///#define D_SIIC_USE_5
///#define D_SIIC_USE_6
///#define D_SIIC_USE_7
///#define D_SIIC_USE_8
#define D_iicch_MSA D_iicch_1///第3路iic配置程mas301加速度传感器
#define D_iicch_CLK D_iicch_0
///////////////////////////3//////////////////////////////////////////////
//////////////////////////ch=1 /0///////////////////////////////////////////////
#ifdef D_SIIC_USE_0
//IICM0 SDA
//IICM0 SDA
#define L0_IICM0_SDA_init() D_PUON_P2(BITN2) ;D_OpenD_P4(BITN2)
#define L0_IICM0_SDA_OUT() D_P22_OUT()
#define L0_IICM0_SDA_IN() D_P22_IN()
#define L0_IICM0_SDA_ON() D_P22_ON()
#define L0_IICM0_SDA_OFF() D_P22_OFF()
#define L0_IICM0_SDA_AT() D_P22_AT()
//IICM0 SCL
#define L0_IICM0_SCL_init() D_PUON_P2(BITN3) ;D_stdIO_P2(BITN3)
#define L0_IICM0_SCL_OUT() D_P23_OUT()
#define L0_IICM0_SCL_IN() D_P23_IN()
#define L0_IICM0_SCL_ON() D_P23_ON()
#define L0_IICM0_SCL_OFF() D_P23_OFF()
#endif
//--------------------------------------------
#ifdef D_SIIC_USE_1
#define L0_IICM1_SDA_init() D_PUON_P4(BITN1);D_OpenD_P4(BITN1)
#define L0_IICM1_SDA_OUT() D_P41_OUT()
#define L0_IICM1_SDA_IN() D_P41_IN()
#define L0_IICM1_SDA_ON() D_P41_ON()
#define L0_IICM1_SDA_OFF() D_P41_OFF()
#define L0_IICM1_SDA_AT() D_P41_AT()
#define L0_IICM1_SCL_init() D_PUON_P4(BITN2);D_stdIO_P4(BITN2)
#define L0_IICM1_SCL_OUT() D_P42_OUT()
#define L0_IICM1_SCL_IN() D_P42_IN()
#define L0_IICM1_SCL_ON() D_P42_ON()
#define L0_IICM1_SCL_OFF() D_P42_OFF()
#endif
#ifdef D_SIIC_USE_2
///DOUT2 P04 sch;MAS_SDA MAS_SCL P50
#define L0_IICM2_SDA_init() D_PUON_P3(BITN4) ;D_OpenD_P3(BITN4)
#define L0_IICM2_SDA_OUT() D_P34_OUT()
#define L0_IICM2_SDA_IN() D_P34_IN()
#define L0_IICM2_SDA_ON() D_P34_ON()
#define L0_IICM2_SDA_OFF() D_P34_OFF()
#define L0_IICM2_SDA_AT() D_P34_AT()
#define L0_IICM2_SCL_init() D_PUON_P5(BITN0) ;D_stdIO_P5(BITN0)
#define L0_IICM2_SCL_OUT() D_P50_OUT()
#define L0_IICM2_SCL_IN() D_P50_IN()
#define L0_IICM2_SCL_ON() D_P50_ON()
#define L0_IICM2_SCL_OFF() D_P50_OFF()
/////////////////////////ch=3 //2//////////////////////////////////////////////
#endif
#ifdef D_SIIC_USE_3
#define L0_IICM3_SDA_init() D_PUON_P3(BITN7) ;D_OpenD_P3(BITN7)
#define L0_IICM3_SDA_OUT() D_P37_OUT()
#define L0_IICM3_SDA_IN() D_P37_IN()
#define L0_IICM3_SDA_ON() D_P37_ON()
#define L0_IICM3_SDA_OFF() D_P37_OFF()
#define L0_IICM3_SDA_AT() D_P37_AT()
#define L0_IICM3_SCL_init() D_PUON_P4(BITN1) ;D_stdIO_P4(BITN1)
#define L0_IICM3_SCL_OUT() D_P41_OUT()
#define L0_IICM3_SCL_IN() D_P41_IN()
#define L0_IICM3_SCL_ON() D_P41_ON()
#define L0_IICM3_SCL_OFF() D_P41_OFF()
#endif
#ifdef D_SIIC_USE_4
/////////////////////////ch=4 //2//////////////////////////////////////////////
#define L0_IICM4_SDA_init() D_PUON_P3(BITN7) ;D_OpenD_P3(BITN7)
#define L0_IICM4_SDA_OUT() D_P37_OUT()
#define L0_IICM4_SDA_IN() D_P37_IN()
#define L0_IICM4_SDA_ON() D_P37_ON()
#define L0_IICM4_SDA_OFF() D_P37_OFF()
#define L0_IICM4_SDA_AT() D_P37_AT()
#define L0_IICM4_SCL_init() D_PUON_P4(BITN1) ;D_stdIO_P4(BITN1)
#define L0_IICM4_SCL_OUT() D_P41_OUT()
#define L0_IICM4_SCL_IN() D_P41_IN()
#define L0_IICM4_SCL_ON() D_P41_ON()
#define L0_IICM4_SCL_OFF() D_P41_OFF()
#endif
#ifdef D_SIIC_USE_5
//IICM5 SDA
#define L0_IICM5_SDA_init() D_stdIO_P1(BITN5)
#define L0_IICM5_SDA_OUT() D_P15_OUT()
#define L0_IICM5_SDA_IN() D_P15_IN()
#define L0_IICM5_SDA_ON() D_P15_ON()
#define L0_IICM5_SDA_OFF() D_P15_OFF()
#define L0_IICM5_SDA_AT() D_P15_AT()
//IICM5 SCL
#define L0_IICM5_SCL_init() D_stdIO_P1(BITN4)
#define L0_IICM5_SCL_OUT() D_P14_OUT()
#define L0_IICM5_SCL_IN() D_P14_IN()
#define L0_IICM5_SCL_ON() D_P14_ON()
#define L0_IICM5_SCL_OFF() D_P14_OFF()
#endif
#ifdef D_SIIC_USE_6
//IICM6 SDA
#define L0_IICM6_SDA_init() D_stdIO_P1(BITN5)
#define L0_IICM6_SDA_OUT() D_P15_OUT()
#define L0_IICM6_SDA_IN() D_P15_IN()
#define L0_IICM6_SDA_ON() D_P15_ON()
#define L0_IICM6_SDA_OFF() D_P15_OFF()
#define L0_IICM6_SDA_AT() D_P15_AT()
//IICM6 SCL
#define L0_IICM6_SCL_init() D_stdIO_P1(BITN4)
#define L0_IICM6_SCL_OUT() D_P14_OUT()
#define L0_IICM6_SCL_IN() D_P14_IN()
#define L0_IICM6_SCL_ON() D_P14_ON()
#define L0_IICM6_SCL_OFF() D_P14_OFF()
#endif
#ifdef D_SIIC_USE_7
//IICM7 SDA
#define L0_IICM7_SDA_init() D_stdIO_P1(BITN5)
#define L0_IICM7_SDA_OUT() D_P15_OUT()
#define L0_IICM7_SDA_IN() D_P15_IN()
#define L0_IICM7_SDA_ON() D_P15_ON()
#define L0_IICM7_SDA_OFF() D_P15_OFF()
#define L0_IICM7_SDA_AT() D_P15_AT()
//IICM7 SCL
#define L0_IICM7_SCL_init() D_stdIO_P1(BITN4)
#define L0_IICM7_SCL_OUT() D_P14_OUT()
#define L0_IICM7_SCL_IN() D_P14_IN()
#define L0_IICM7_SCL_ON() D_P14_ON()
#define L0_IICM7_SCL_OFF() D_P14_OFF()
#endif
#ifdef D_SIIC_USE_8
//IICM8 SDA
#define L0_IICM8_SDA_init() D_stdIO_P1(BITN5)
#define L0_IICM8_SDA_OUT() D_P15_OUT()
#define L0_IICM8_SDA_IN() D_P15_IN()
#define L0_IICM8_SDA_ON() D_P15_ON()
#define L0_IICM8_SDA_OFF() D_P15_OFF()
#define L0_IICM8_SDA_AT() D_P15_AT()
//IICM8 SCL
#define L0_IICM8_SCL_init() D_stdIO_P1(BITN4)
#define L0_IICM8_SCL_OUT() D_P14_OUT()
#define L0_IICM8_SCL_IN() D_P14_IN()
#define L0_IICM8_SCL_ON() D_P14_ON()
#define L0_IICM8_SCL_OFF() D_P14_OFF()
#endif
#define D_LPCD_INT_INIT(); P_SW2|=0x80;IT0 = 1;//下降沿中断
#define D_LPCD_INT_OPEN(); EX0 = 1;
#define D_LPCD_INT_CLOSE(); EX0 = 0;
#define D_RTC_INT_INIT(); INTCLKO = EX2;
#define D_RTC_INT_OPEN(); INTCLKO = EX2;
#define D_RTC_INT_CLOSE(); INTCLKO = 0;
#define D_MSA_INT_INIT(); IT1 = 1;//下降沿中断
#define D_MSA_INT_OPEN(); EX1 = 1;
#define D_MSA_INT_CLOSE(); EX1 = 0;
typedef struct
{
U8 time_f;
U8 clear_dog;
U8 weak_up;
U8 dog_ok;
U8 who_wake; /// 谁让我醒来 =D_int_RTC 20221002_18542 CCmodify
vU16 sleeptime; ///系统休眠的时间间隔
vU16 sleeptime_left; ///系统休眠的时间间隔
U8 start_sleep; ///上电后多久进入睡眠状态 时间颗粒1秒
U8 nb_status;
}TS_low_time;
extern TS_low_time ts_low_time;
/***********
#define L0_IICM1_SDA_init() D_stdIO_P4(BITN2)
#define L0_IICM1_SDA_OUT() D_P42_OUT()
#define L0_IICM1_SDA_IN() D_P42_IN()
#define L0_IICM1_SDA_ON() D_P42_ON()
#define L0_IICM1_SDA_OFF() D_P42_OFF()
#define L0_IICM1_SDA_AT() D_P42_AT()
#define L0_IICM1_SCL_init() D_stdIO_P4(BITN1)
#define L0_IICM1_SCL_OUT() D_P41_OUT()
#define L0_IICM1_SCL_IN() D_P41_IN()
#define L0_IICM1_SCL_ON() D_P41_ON()
#define L0_IICM1_SCL_OFF() D_P41_OFF()
***********/
#else
#error "未指定当前板卡"
#endif///#if(TYPE_UASER_BOARD
//STEP 3 Register CONFIG >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG
#define SERIAL_MAX_NUM 1
////fixme:和cpu的程序容量息息相关
/// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
/// 128Bytes = 128*0.5ms = 64ms
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG End
//======================================================== 以下为协议配置 ====================================================
#define D_CMD_Filter1_ff 0xFF
#define D_CMD_Filter2_fe 0xFE
#define D_HETU_FX_fi 0xF0
#define D_HETU_FX_MASK 0x0F
#define D_tp_handle_x_len 32
//STEP 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Transmission Protocol Config
#define D_TPC_CCMODBUS_Filter0 0xFF
#define D_TPC_CCMODBUS_Filter1 0xFE
#define D_TPC_DEBUG_FX_fi 0xF0
#define D_TPC_DEBUG_FX_MASK 0x0F
#define D_TPC_HANDLER_X_LEN 128
extern void L0_board_config(void);
extern void L0_reg_init(void);
extern void L3_reg_2_iap(void);
extern void L3_iap_2_reg(void);
extern void L0_uartboard_config(void);
void L0_moto_init(unsigned char onf);
void L0_moto_run(unsigned char mode);
////#pragma message("#pragma message验证测试")
/// pack(4)
typedef struct
{
u8 req;
u8 mac[6];/// 1、帧头: 帧起始标志,固定值为 0x68。
u8 netid;
u8 band;
u8 buf[12];
}TS_para_;
extern TS_para_ ts_para;
///#pragma pack()
void L0_board_key(void);
#endif//_BSP_CONFIG_H
/*********************************end file*********************************************/

205
source/bsp/TTSSbsp/bsp_config_const.h

@ -0,0 +1,205 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_config.h
/// @brief hard config include
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx
///-------------------------------------------------------------------------
/// @version 1.1
/// @author CC
/// @date 20180308
/// @note
//////////////////////////////////////////////////////////////////////////////
/// @version 5.1
/// @author CC
/// @date 20200301
/// @note
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
///存储器中的特殊参数
///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节
///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前)
///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前)
///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H -
///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H -
///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H
///固件版本为7.3.12U
///以及后续版本有效
///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H
///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H
///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH
///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH
///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH
///保留 7FECH BFECH EFECH FDECH
///保留 7FEBH BFEBH EFEBH FDEBH
///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH
///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H
//////////////////////////////////////////////////////////////////////////
#ifndef _BSP_CONFIG_CONST_H
#define _BSP_CONFIG_CONST_H
#include <INTRINS.H>
///#include "type.h"
#include "c_bit.h"
//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE
#define TYPE_BOARD_hhnew 1
#define TYPE_BOARD_st_sleep04_01 4
#define TYPE_BOARD_st_sleep03 5
#define TYPE_BOARD_SMMM_MB_VH032_0E 6
#define TYPE_BOARD_LPC17xx_ 8
#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036
#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551
#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7
#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178
#define TYPE_BOARD_stc5as32_WIFIBV01 532
#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32
#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感
#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板
#define TYPE_BOARD_ADDA_MAIN_V02 0xa8 //ADDA
#define TYPE_BOARD_433_0A 0xa9 //433
#define TYPE_BOARD_WEIGH_0B 0xaa //称重
#define TYPE_BOARD_TOUCH_PEN_0B 0xab //点读笔
#define TYPE_BOARD_TOUCH_PEN_0C 0xabc //点读笔2 20210103 cc 最新版本
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end
#define TYPE_BOARD_paper6133_m0a6 0xa6 //纸张传感器
#define TYPE_BOARD_paper_main_m10 0x10 //纸张传感器2 CC_SE_paper_main_m10_smt01.sch
#define ccSensor_CG_V02_m08_debug 0x0208 //CG传感器2
#define TYPE_BOARD_cc_Light_Speed0B 0x11b //LR光电感器2
#define TYPE_BOARD_cc_G0A03 0x123 //倾角感器2
#define ccSensor_WS_ps5ws 0x0258 ///称重传感
#define ccSensor_WS_ps6wifi 0x0268 ///带2.4g的动作采集类 20200102 芯片价格变化 stc建议使用tssop20 LQFP32 取代 SOP28, TSSOP20 取代 SOP20 是趋势,有 LQFP48
#define TYPE_BOARD_SD_SAVE 0xd //SD 读取新式的加速度芯片
#define TYPE_BOARD_point_read 0xddd //点读笔的测试程序
#define TYPE_BOARD_sensor_sca720 0x720 //
#define TYPE_BOARD_TTSS2PLC 0x2 //
#define TYPE_BOARD_TTSS2lora 0x110 //
#define TYPE_BOARD_TTSS2elc 0x111 // 大医院
#define TYPE_BOARD_TTSS2f8 0xf8 // 足底stc版本
#define TYPE_BOARD_TTSS2cam8 0xc8 //cam8 ocr版 64U
#define TYPE_BOARD_TTSS2car2m 0x28 //平车2主板_主机
#define TYPE_BOARD_TTSS2car2s 0x285 //平车2主板_从机
#define TYPE_BOARD_TTSS2_NB2 0x2112 //智能闭户锁_0DM03
#define TYPE_BOARD_TTSS2_w5 0x1115 //智能闭户锁_0DM03
//>>>>>>>>>>>>>>>>>>>>>>MCU TYPE
#define TYPE_MCU_VENDOR_MSK 0xF0
#define TYPE_MCU_VENDOR_STC 0x10
#define TYPE_MCU_STC_8A 0x11
#define TYPE_MCU_STC_8F 0x12
#define TYPE_MCU_STC_8G 0x13
#define TYPE_MCU_STC_8H 0x14
#define TYPE_MCU_VENDOR_TI 0x60
#define TYPE_MCU_SHC6601 0x66
#define TYPE_MCU_LPC17xx 0x67
#define TYPE_MCU_STM32 0x68
#define D_CPUfamily_8bits 8
#define D_CPUfamily_16bits 16
#define D_CPUfamily_32bits 32
//<<<<<<<<<<<<<<<<<<<<<<MCU TYPE end
//>>>>>>>>>>>>>>>>>>>>>>IDE TYPE
#define TYPE_IDE_KEIL 1
#define TYPE_IDE_MDK 2
#define TYPE_IDE_IAR 3
//<<<<<<<<<<<<<<<<<<<<<<IDE TYPE end
//>>>>>>>>>>>>>>>>>>>>>>SysTimer TYPE
#define TYPE_JIFFIES_600US 600
#define TYPE_JIFFIES_5MS 5000
#define TYPE_JIFFIES_10MS 10000
#define TYPE_JIFFIES_25MS 250000
#define TYPE_JIFFIES_12MS 125000
////#define TYPE_JIFFIES_25MS 44.2368
//<<<<<<<<<<<<<<<<<<<<<<<<<<<SysTimer TYPE end
//>>>>>>>>>>>>>>>>>>>>>>.WDT TYPE
#define TYPE_WDT_DISABLE 1
#define TYPE_WDT_ENABLE 2
#define WDT_FEED() WDT_CONTR |= 0x10
//#define WDT_FEED() WDT_CONTR |= 0x10
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end
//>>>>>>>>>>>>>>>>>>>>>>.ByteOrder TYPE
#define TYPE_MCU_BIGENDIAN 1 //大端字节序
#define TYPE_MCU_LITENDIAN 2 //小端字节序
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end
//>>>>>>>>>>>>>>>>>>>>>>.代码加密 TYPE
#define TYPE_ENCRYPTION_ENABLE 1 //代码加密
#define TYPE_ENCRYPTION_DISABLE 2 //代码不加密
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end
//>>>>>>>>>>>>>>>>>>>>>>BUADRATE & StopBit
#define SBIT_1 1 //1 stop bit
#define SBIT_2 2 //2 stop bit
#define BRT_921600 921600
#define BRT_460800 460800
#define BRT_230400 230400
#define BRT_115200 115200
#define BRT_19200 19200
#define BRT_9600 9600
#define BRT_4800 4800
//<<<<<<<<<<<<<<<<<<<<<<BUADRATE & StopBit end
//>>>>>>>>>>>>>>>>>>>>>>MainFre
#define MainFre_5M 5529600L
#define MainFre_11M 11059200L
#define MainFre_22M 22118400L
#define MainFre_24M 24000000L
#define MainFre_27M 27000000L
#define MainFre_33M 33177600L
#define MainFre_44M 44236800L
//<<<<<<<<<<<<<<<<<<<<<<MainFre end
//>>>>>>>>>>>>>>>>>>>>>>UART0 PIN
#define PIN_UART1_Rxd_30_Txd_31 1
#define PIN_UART1_Rxd_36_Txd_37 2
#define PIN_UART1_Rxd_16_Txd_17 3
#define PIN_UART1_Rxd_43_Txd_44 4
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART0 PIN
//>>>>>>>>>>>>>>>>>>>>>>UART2 PIN
#define PIN_UART2_Rxd_10_Txd_11 5
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART2 PIN
//>>>>>>>>>>>>>>>>>>>>>>485 Type
#define TYPE_485_NONE 0
#define TYPE_485_MASTER 1
#define TYPE_485_SLAVER 2
//<<<<<<<<<<<<<<<<<<<<<<485 Type end
//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE
#define TYPE_ASENSOR_ADXL362 362
#define TYPE_ASENSOR_MSA300 300
#define TYPE_ASENSOR TYPE_ASENSOR_MSA300
//<<<<<<<<<<<<<<<<<<<<<<G-SENSOR TYPE end
#endif//_BSP_CONFIG_CONST_H
/*********************************end file*********************************************/

96
source/bsp/TTSSbsp/bsp_config_stc.h

@ -0,0 +1,96 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file _bsp_config_stc_H.h
/// @brief hard _bsp_config_stc_H include
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
/// @info 确认cpu类型后调用对应的cpu的配置参数,主要为了兼容c51 arm avr等
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220313
/// @note
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_config_stc_H
#define _bsp_config_stc_H
#if(TYPE_MCU == TYPE_MCU_STC_8H)
#define D_CPUfamily_type D_CPUfamily_8bits
/// #include "../cpu/STC_stc8h3k.h"
/// #include "../cpu/STC_stc8f.h"
#include "STC8H.h"
#include "stc_8A8K64D4_ext.h"////扩展 依据规格书
#include "stc_8_delay.h"
#include "../cpu/STC_only.h"
#include "../cpu/c51_macro.h"
#include "TTSS_time_stc.h"
#include "c_lib.h"
#if(MainFre_5M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
/// #define Lc_delay_ms L0_Delay_1ms
#elif(MainFre_22M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
//// #define Lc_delay_ms L0_Delay_1ms
#define L0_Delay_1ms Delay1ms
#define D_delay_para1ms 90
#elif(MainFre_27M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
/// #define Lc_delay_ms L0_Delay_1ms
#define L0_Delay_1ms Delay1ms
#elif(MainFre_44M == D_sys_MainFre)
#define D_Cdelay_200us 5
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
/// #define Lc_delay_ms L0_Delay_1ms
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
//// #define Lc_delay_ms L0_Delay_1ms
#define L0_Delay_1ms Delay1ms
#define D_delay_para1ms 90
#define L0_Delay_1ms Delay1ms
#else ///MainFre_11M
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define D_delay_para1ms 90
/// #define Lc_delay_ms L0_Delay_1ms
#define L0_Delay_1ms Delay1ms
/// #define L0_Delay_1ms() Lc_for_int16()
#endif//D_sys_MainFre)
#endif///TYPE_MCU
#endif//_bsp_config_after_H
/*********************************end file*********************************************/

936
source/bsp/backu/MLX90615.c

@ -0,0 +1,936 @@
#include "MLX90615.h"
#include "stc_8_delay.h"/////
/*******************************************************************************
* Filename: bsp_mlx90615.c
* Revised: All copyrights reserved to Roger.
* Date: 2022-05-04
* Revision: v1.0
* Writer: Roger-WY.
*
* Description: ()
*
*
* Notes:
* All copyrights reserved to Roger-WY
*******************************************************************************/
////#include "bsp_mlx90615.h"
TS_mx95_ ts_mx95;
void delay_ms2(unsigned int ms)
{
unsigned int a;
while(ms)
{
///a=1800;
a=290;
while(a--);
ms--;
}
return;
}
void L1_mlx95_cal_tmp(void)
{///27315
///x*2 - 27315
ts_mx95.u16b = D_2uc_u16(ts_mx95.Object[1],ts_mx95.Object[0]);
ts_mx95.u16b *=2;
ts_mx95.u16out_o = ts_mx95.u16b - 27315;
ts_mx95.u16b = D_2uc_u16(ts_mx95.Ambient[1],ts_mx95.Ambient[0]);
ts_mx95.u16b *=2;
ts_mx95.u16out_a = ts_mx95.u16b - 27315;
printf("obj*100 %d A: %d ",(int)ts_mx95.u16out_o,(int)ts_mx95.u16out_a);
}
void L1_mlx95_get_tmp(void)
{
////100us 10k 1ms/10=100us 100k--10us
L0_mlx95_wakeup();
L2_IICMx_ReadReg(D_iicch_mlx96015,MLX90615_ADDR_WR,
MLX90615_AMBIENT_TEMPERATURE,&ts_mx95.Ambient,3);
/// printf("\r\nmlx95 %X %X %X ",(int)0x123,(int)ts_mx95.Ambient[0],(int)ts_mx95.Ambient[1]);
L2_IICMx_ReadReg(D_iicch_mlx96015,MLX90615_ADDR_WR,
MLX90615_OBJECT_TEMPERATURE,&ts_mx95.Object,3);
/// printf("obj %X %X ",(int)ts_mx95.Object[0],(int)ts_mx95.Object[1]);
L1_mlx95_cal_tmp();
}
#if 0
//----------------------------------------------------------------------------//
#define MLX90615_I2C_SCL_RCC RCC_APB2Periph_GPIOC
#define MLX90615_I2C_SCL_PIN GPIO_Pin_4 /* 连接到SCL时钟线的GPIO */
#define MLX90615_I2C_SCL_PORT GPIOC
#define MLX90615_I2C_SDA_RCC RCC_APB2Periph_GPIOC
#define MLX90615_I2C_SDA_PIN GPIO_Pin_5 /* 连接到SDA数据线的GPIO */
#define MLX90615_I2C_SDA_PORT GPIOC
/* 定义读写SCL和SDA的宏 */
#define MLX90615_I2C_SCL_1() MLX90615_I2C_SCL_PORT->BSRR = MLX90615_I2C_SCL_PIN /* SCL = 1 */
#define MLX90615_I2C_SCL_0() MLX90615_I2C_SCL_PORT->BRR = MLX90615_I2C_SCL_PIN /* SCL = 0 */
#define MLX90615_I2C_SDA_1() MLX90615_I2C_SDA_PORT->BSRR = MLX90615_I2C_SDA_PIN /* SDA = 1 */
#define MLX90615_I2C_SDA_0() MLX90615_I2C_SDA_PORT->BRR = MLX90615_I2C_SDA_PIN /* SDA = 0 */
#define MLX90615_I2C_SDA_READ() ((MLX90615_I2C_SDA_PORT->IDR & MLX90615_I2C_SDA_PIN) != 0) /* 读SDA口线状态 */
#define MLX90615_I2C_SCL_READ() ((MLX90615_I2C_SCL_PORT->IDR & MLX90615_I2C_SCL_PIN) != 0) /* 读SCL口线状态 */
//----------------------------------------------------------------------------//
//============================================================================//
/*
********************************************************************************
* : Mlx90615_i2c_Delay
* : I2C总线位延迟400KHz
* :
* :
********************************************************************************
*/
static void Mlx90615_i2c_Delay(void)
{
volatile uint8_t i;
for (i = 0; i < 50; i++);
}
static void Mlx90615_i2c_Start(void)
{
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
MLX90615_I2C_SDA_1();
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1();
Mlx90615_i2c_Delay();
MLX90615_I2C_SDA_0();
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_0();
// Mlx90615_i2c_Delay();
}
/*******************************************************************************
* i2c_Stop
* CPU发起I2C总线停止信号
*
*
*    Roger-WY
* 2018-05-20
*
*
*
* SCL _____/ˉˉˉˉˉˉˉ
* SDA _________/ˉˉˉˉˉ
* | |
* STOP
*******************************************************************************/
static void Mlx90615_i2c_Stop(void)
{
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
MLX90615_I2C_SDA_0();
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1();
Mlx90615_i2c_Delay();
MLX90615_I2C_SDA_1();
// Mlx90615_i2c_Delay();
}
/*******************************************************************************
* i2c_WaitAck
* CPU产生一个时钟ACK应答信号
*
* 01
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
static uint8_t Mlx90615_i2c_WaitAck(void)
{
uint8_t re;
uint8_t TimeOutCnt = 20; /* 超时计数器 */
MLX90615_I2C_SDA_1(); /* CPU释放SDA总线 */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
Mlx90615_i2c_Delay();
while(TimeOutCnt -- ) {
if (MLX90615_I2C_SDA_READ()) {/* CPU读取SDA口线状态 */
re = 1;
} else {
re = 0;
}
}
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
return re;
}
/*******************************************************************************
* i2c_Ack
* CPU产生一个ACK信号
*
*
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
static void Mlx90615_i2c_Ack(void)
{
MLX90615_I2C_SDA_0(); /* CPU驱动SDA = 0 */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1(); /* CPU产生1个时钟 */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
MLX90615_I2C_SDA_1(); /* CPU释放SDA总线 */
}
/*******************************************************************************
* i2c_NAck
* CPU产生1个NACK信号
*
*
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
static void Mlx90615_i2c_NAck(void)
{
MLX90615_I2C_SDA_1(); /* CPU驱动SDA = 1 */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1(); /* CPU产生1个时钟 */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
}
/*******************************************************************************
* bsp_InitI2C
* I2C总线的GPIOIO的方式实现
*
*
*    Roger-WY
* 2018-06-29
*
*
*
*******************************************************************************/
static void Mlx90615_InitI2C(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(MLX90615_I2C_SCL_RCC | MLX90615_I2C_SDA_RCC, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 开漏输出模式 */
GPIO_InitStructure.GPIO_Pin = MLX90615_I2C_SCL_PIN;
GPIO_Init(MLX90615_I2C_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = MLX90615_I2C_SDA_PIN;
GPIO_Init(MLX90615_I2C_SDA_PORT, &GPIO_InitStructure);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
Mlx90615_i2c_Stop();
}
/*******************************************************************************
* i2c_SendByte
* CPU向I2C总线设备发送8bit数据
* _ucByte
*
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
static void Mlx90615_i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++) {
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
if (_ucByte & 0x80) {
MLX90615_I2C_SDA_1();
} else {
MLX90615_I2C_SDA_0();
}
_ucByte <<= 1; /* 左移一个bit */
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1();
Mlx90615_i2c_Delay();
}
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
}
/*******************************************************************************
* Mlx90615_i2c_ReadByte
* CPU从I2C总线设备读取8bit数据
*
*
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
static uint8_t Mlx90615_i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
/* 读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++) {
value <<= 1;
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
MLX90615_I2C_SCL_1();
Mlx90615_i2c_Delay();
if (MLX90615_I2C_SDA_READ()) {
value++;
}
}
MLX90615_I2C_SCL_0();
Mlx90615_i2c_Delay();
return value;
}
/*******************************************************************************
* bsp_Mlx90615ScanDevice
* I2C总线设备CPU向发送设备地址
* _AddressI2C总线地址
* 0 1
*    Roger-WY
* 2018-05-20
*
*
*
*******************************************************************************/
int8_t bsp_Mlx90615ScanDevice(uint8_t *pSlaveAddr)
{
uint8_t ucAck;
Mlx90615_InitI2C();
if (MLX90615_I2C_SDA_READ() && MLX90615_I2C_SCL_READ()) {
for(uint8_t i = 0; i < 128; i++)
{
Mlx90615_i2c_Start(); /* 发送启动信号 */
Mlx90615_i2c_SendByte(i << 1);
ucAck = Mlx90615_i2c_WaitAck(); /* 检测设备的ACK应答 */
Mlx90615_i2c_Stop(); /* 发送停止信号 */
if(ucAck == 0)
{
*pSlaveAddr = i; //找到设备并获取从机地址
return 0;
}
}
return -1; //没有找到设备
}
return -2; /* I2C总线异常 */
}
//============================================================================//
static const uint8_t crc_table[] = {
0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31,
0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9,
0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1,
0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe,
0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16,
0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80,
0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8,
0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10,
0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f,
0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7,
0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef,
0xfa, 0xfd, 0xf4, 0xf3
};
uint8_t CRC8_Calc (uint8_t *p, uint8_t len)
{
uint16_t i;
uint16_t crc = 0x0;
while (len--) {
i = (crc ^ *p++) & 0xFF;
crc = (crc_table[i] ^ (crc << 8)) & 0xFF;
}
return (crc & 0xFF);
}
/*******************************************************************************
* bsp_Mlx90615Init
* Mlx90615传感器的初始化
*
*
*    Roger-WY.
* 2018-08-08
*
*
*
*******************************************************************************/
int8_t bsp_Mlx90615Init(void)
{
int8_t ucError = 0;
Mlx90615_InitI2C();
return (ucError);
}
int8_t bsp_Mlx90615WriteReg(uint8_t devAddr, uint8_t regAddr, uint16_t data)
{
uint8_t ucAck = 0;
uint8_t i = 0;
uint8_t crcSendBuffer[5] = {0x00,0x00,0x00,0x00,0x00}; //used to save the data to send
crcSendBuffer[0] = devAddr << 1;
crcSendBuffer[1] = regAddr;
crcSendBuffer[2] = (uint8_t)data;
crcSendBuffer[3] = (uint8_t)(data >> 8);
crcSendBuffer[4] = CRC8_Calc(crcSendBuffer,4);
Mlx90615_i2c_Start();
for(i = 0; i < 5; i++)
{
Mlx90615_i2c_SendByte(crcSendBuffer[i]);
ucAck = Mlx90615_i2c_WaitAck();
if(ucAck) { /* 如果Mlx90615,没有应答 */
goto cmd_fail; /* 器件无应答 */
}
}
/* 发送I2C总线停止信号 */
Mlx90615_i2c_Stop();
return 0; /* 执行成功 */
cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
/* 发送I2C总线停止信号 */
Mlx90615_i2c_Stop();
return -1;
}
int8_t bsp_Mlx90615ReadReg(uint8_t devAddr, uint8_t regAddr,uint16_t *pReadData)
{
uint8_t ucAck = 0;
uint8_t ValBuf[6] = {0};
uint8_t prcRegVal = 0;
ValBuf[0] = devAddr << 1;
ValBuf[1] = regAddr;
ValBuf[2] = (devAddr << 1) | 0x01;
Mlx90615_i2c_Start();
Mlx90615_i2c_SendByte(ValBuf[0]);
ucAck = Mlx90615_i2c_WaitAck();
if(ucAck) { /* 如果LM75X,没有应答 */
goto cmd_fail; /* 器件无应答 */
}
Mlx90615_i2c_SendByte(ValBuf[1]);
ucAck = Mlx90615_i2c_WaitAck();
if(ucAck) { /* 如果LM75X,没有应答 */
goto cmd_fail; /* 器件无应答 */
}
//------------------------------------------------------------------------//
Mlx90615_i2c_Start();
Mlx90615_i2c_SendByte(ValBuf[2]);
ucAck = Mlx90615_i2c_WaitAck();
if(ucAck) { /* 如果LM75X,没有应答 */
goto cmd_fail; /* 器件无应答 */
}
ValBuf[3] = Mlx90615_i2c_ReadByte();
Mlx90615_i2c_Ack();
ValBuf[4] = Mlx90615_i2c_ReadByte();
Mlx90615_i2c_Ack();
ValBuf[5] = Mlx90615_i2c_ReadByte();
Mlx90615_i2c_Ack();
/* 发送I2C总线停止信号 */
Mlx90615_i2c_Stop();
prcRegVal = CRC8_Calc(ValBuf,5);
if(prcRegVal == ValBuf[5])
{
*pReadData = (ValBuf[4] << 8) + ValBuf[3];
return 0; /* 执行成功 */
}
else
{
return -2; //校验不正确
}
cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
/* 发送I2C总线停止信号 */
Mlx90615_i2c_Stop();
return -1;
}
/* 读取环境温度 */
int8_t bsp_Mlx90615ReadTempAmbient(uint8_t slaveAddr, float *ao)
{
int8_t ret = 0;
uint16_t data = 0;
ret = bsp_Mlx90615ReadReg(slaveAddr,MLX90615_AMBIENT_TEMPERATURE,&data);
if( 0 == ret)
{
*ao = (data * 0.02) - 273.15;
}
else
{
*ao = MLX90615_TEMP_READ_ERR_CODE;
}
return ret;
}
/* 读取目标温度 */
int8_t bsp_Mlx90615ReadTempObject(uint8_t slaveAddr, float *to)
{
int8_t ret = 0;
uint16_t data = 0;
ret = bsp_Mlx90615ReadReg(slaveAddr,MLX90615_OBJECT_TEMPERATURE,&data);
if( 0 == ret)
{
*to = (data * 0.02) - 273.15;
}
else
{
*to = MLX90615_TEMP_READ_ERR_CODE;
}
return ret;
}
int8_t bsp_Mlx90615ReadIrData(uint8_t slaveAddr, uint16_t *ir)
{
int8_t ret = 0;
uint16_t data = 0;
ret = bsp_Mlx90615ReadReg(slaveAddr,MLX90615_RAW_IR_DATA,&data);
if(ret == 0)
{
*ir = data;
}
else
{
*ir = (uint16_t)MLX90615_TEMP_READ_ERR_CODE;
}
return (ret);
}
int8_t bsp_Mlx90615ReadEmissivity(uint8_t slaveAddr, float *emissivity)
{
int8_t ret = 0;
uint16_t data = 0;
ret = bsp_Mlx90615ReadReg(slaveAddr,MLX90615_EEPROM_EMISSIVITY,&data);
if(data < 32768)
{
*emissivity = (float)data / 0x4000;
}
else
{
*emissivity = (32768 - (float)data) / 0x4000;
}
return (ret);
}
int8_t bsp_Mlx90615SetEmissivity(uint8_t slaveAddr, float emissivity)
{
int8_t ret = 0;
uint16_t newE = 0;
float temp = 0;
if(emissivity > 1.0 || emissivity < 0.05)
{
return -6;
}
temp = emissivity * 0x4000 + 0.5;
newE = (uint16_t)temp;
ret = bsp_Mlx90615WriteReg(slaveAddr, MLX90615_EEPROM_EMISSIVITY, 0x0000);
if(ret == 0)
{
ret = bsp_Mlx90615WriteReg(slaveAddr, MLX90615_EEPROM_EMISSIVITY, newE);
}
return (ret);
}
/***************************** (END OF FILE) **********************************/
1MLX90615只有3V供电MLX90614则有5V和3V选项
2MLX90615只集成了IIR数字滤波MLX90614同时集成FIR和IIR滤波
3SMBus地址不兼容MLX90615出厂设置为0x5BMLX90614为0x5B
4PWM频率MLX90615可选为10Hz或者1kHzMLX90614是在1Hz和1kHz之间支持编程调节
5RAM和EEPROM进行操作时
6MLX90615在SCL脚MLX90614在SDA脚
#endif
#if 0
#include "intrins.h"
##define SA 0x00 // Slave address
#define DEFAULT_SA 0x5B // Default Slave address
#define RAM_Access 0x20 // RAM access command
#define EEPROM_Access 0x10 // EEPROM access command
#define RAM_Ta 0x06 // Ta address in the ram
#define RAM_To 0x07 // To address in the ram
#define _NOP() _nop_()
// 5us
void delay_Tbuf()
{
unsigned char a, b;
for ( b = 1; b > 0; b-- )
for ( a = 1; a > 0; a-- );
}
void delay_Thd()
{
_nop_();
}
void MLX90615_init ( void )
{
mSDA_OUT; // Set SDA as Output
mSCL_OUT; // Set SCL as Output
mSDA_HIGH(); // bus free
mSCL_HIGH();
}
void START_bit ( void )
{
mSDA_OUT;
mSDA_HIGH(); // Set SDA line
delay_Tbuf(); // Wait a few microseconds
mSCL_HIGH(); // Set SCL line
delay_Tbuf(); // Generate bus free time between Stop
// and Start condition (Tbuf=4.7us min)
mSDA_LOW(); // Clear SDA line
delay_Tbuf(); // Hold time after (Repeated) Start
// Condition. After this period, the first clock is generated.
//(Thd:sta=4.0us min)
mSCL_LOW(); // Clear SCL line
delay_Tbuf(); // Wait a few microseconds
}
void STOP_bit ( void )
{
mSDA_OUT;
mSCL_LOW(); // Clear SCL line
delay_Tbuf(); // Wait a few microseconds
mSDA_LOW(); // Clear SDA line
delay_Tbuf(); // Wait a few microseconds
mSCL_HIGH(); // Set SCL line
delay_Tbuf(); // Stop condition setup time(Tsu:sto=4.0us min)
mSDA_HIGH(); // Set SDA line
}
unsigned char TX_byte ( unsigned char Tx_buffer )
{
unsigned char Bit_counter;
unsigned char Ack_bit;
unsigned char bit_out;
for ( Bit_counter = 8; Bit_counter; Bit_counter-- )
{
if ( Tx_buffer & 0x80 )
bit_out = 1; // If the current bit of Tx_buffer is 1 set bit_out
else
bit_out = 0; // else clear bit_out
send_bit ( bit_out ); // Send the current bit on SDA
Tx_buffer <<= 1; // Get next bit for checking
}
Ack_bit = Receive_bit(); // Get acknowledgment bit
return Ack_bit;
}// End of TX_bite()
unsigned char RX_byte ( unsigned char ack_nack )
{
unsigned char RX_buffer;
unsigned char Bit_Counter;
for ( Bit_Counter = 8; Bit_Counter; Bit_Counter-- )
{
if ( Receive_bit() ) // Get a bit from the SDA line
{
RX_buffer <<= 1; // If the bit is HIGH save 1 in RX_buffer
RX_buffer |= 0x01;
}
else
{
RX_buffer <<= 1; // If the bit is LOW save 0 in RX_buffer
RX_buffer &= 0xfe;
}
}
send_bit ( ack_nack ); // Sends acknowledgment bit
return RX_buffer;
}
//---------------------------------------------------------------------------------------------
void send_bit ( unsigned char bit_out )
{
mSDA_OUT;
if ( bit_out )
mSDA_HIGH();
else
mSDA_LOW();
delay_Thd(); // Tsu:dat = 250ns minimum
mSCL_HIGH(); // Set SCL line
delay_Tbuf(); // High Level of Clock Pulse------------------
mSCL_LOW(); // Clear SCL line
delay_Tbuf(); // Low Level of Clock Pulse----------------------
// mSDA_HIGH(); // Master release SDA line ,
return;
}//End of send_bit()
//---------------------------------------------------------------------------------------------
unsigned char Receive_bit ( void )
{
unsigned char Ack_bit;
mSDA_IN; // SDA-input
_NOP();
_NOP();
_NOP();
mSCL_HIGH(); // Set SCL line
delay_Tbuf(); // High Level of Clock Pulse
// if(P2Input(BIT2))
SDA = 1;
if ( SDA )
Ack_bit = 1; // \ Read acknowledgment bit, save it in Ack_bit
else
Ack_bit = 0; // /
mSCL_LOW(); // Clear SCL line
delay_Tbuf(); // Low Level of Clock Pulse
return Ack_bit;
}//End of Receive_bit
unsigned int MemRead ( unsigned char SlaveAddress, unsigned char command )
{
unsigned int tdata; // Data storage (DataH:DataL)
unsigned char Pec; // PEC byte storage
unsigned char DataL; // Low data byte storage
unsigned char DataH; // High data byte storage
unsigned char arr[6]; // Buffer for the sent bytes
unsigned char PecReg; // Calculated PEC byte storage
unsigned char ErrorCounter; // Defines the number of the attempts for communication with MLX90614
ErrorCounter = 0x00; // Initialising of ErrorCounter
do
{
repeat:
STOP_bit(); //If slave send NACK stop comunication
--ErrorCounter; //Pre-decrement ErrorCounter
if ( !ErrorCounter ) //ErrorCounter=0?
{
break; //Yes,go out from do-while{}
}
START_bit(); //Start condition
if ( TX_byte ( SlaveAddress ) ) //Send SlaveAddress
{
goto repeat; //Repeat comunication again
}
if ( TX_byte ( command ) ) //Send command
{
goto repeat; //Repeat comunication again
}
START_bit(); //Repeated Start condition
if ( TX_byte ( SlaveAddress ) ) //Send SlaveAddress-------------------???
{
goto repeat; //Repeat comunication again
}
DataL = RX_byte ( ACK ); //Read low data,master must send ACK
DataH = RX_byte ( ACK ); //Read high data,master must send ACK
Pec = RX_byte ( NACK ); //Read PEC byte, master must send NACK
STOP_bit(); //Stop condition
arr[5] = SlaveAddress; //
arr[4] = command; //
arr[3] = SlaveAddress; //Load array arr
arr[2] = DataL; //
arr[1] = DataH; //
arr[0] = 0; //
PecReg = PEC_calculation ( arr ); //Calculate CRC
// UART1_SendOneChar ( PecReg );
// UART1_SendOneChar ( Pec );
}
while ( PecReg != Pec ); //If received and calculated CRC are equal go out from do-while{}
* ( ( unsigned char * ) ( &tdata ) ) = DataH; //
* ( ( unsigned char * ) ( &tdata ) + 1 ) = DataL; //data=DataH:DataL
return tdata;
}
unsigned char PEC_calculation ( unsigned char pec[] )
{
unsigned char crc[6];
unsigned char BitPosition = 47;
unsigned char shift;
unsigned char i;
unsigned char j;
unsigned char temp;
do
{
crc[5] = 0; /* Load CRC value 0x000000000107 */
crc[4] = 0;
crc[3] = 0;
crc[2] = 0;
crc[1] = 0x01;
crc[0] = 0x07;
BitPosition = 47; /* Set maximum bit position at 47 */
shift = 0;
//Find first 1 in the transmited message
i = 5; /* Set highest index */
j = 0;
while ( ( pec[i]& ( 0x80 >> j ) ) == 0 && i > 0 )
{
BitPosition--;
if ( j < 7 )
{
j++;
}
else
{
j = 0x00;
i--;
}
}/*End of while */
shift = BitPosition - 8; /*Get shift value for crc value*/
//Shift crc value
while ( shift )
{
for ( i = 5; i < 0xFF; i-- )
{
if ( ( crc[i-1] & 0x80 ) && ( i > 0 ) )
{
temp = 1;
}
else
{
temp = 0;
}
crc[i] <<= 1;
crc[i] += temp;
}/*End of for*/
shift--;
}/*End of while*/
//Exclusive OR between pec and crc
for ( i = 0; i <= 5; i++ )
{
pec[i] ^= crc[i];
}/*End of for*/
}
while ( BitPosition > 8 ); /*End of do-while*/
return pec[0];
}/*End of PEC_calculation*/
#endif

90
source/bsp/backu/MLX90615.h

@ -0,0 +1,90 @@
/*******************************************************************************
* Filename: bsp_mlx90615.h
* Revised: All copyrights reserved to Roger.
* Date: 2022-05-04
* Revision: v1.0
* Writer: Roger-WY.
*
* Description: ()
*******************************************************************************/
#ifndef __BSP_MLX90615_H__
#define __BSP_MLX90615_H__
#include "msp_iicMx.h"/////使用iic1 作为
#include "c_type51.h"/////
#include "stc_8_delay.h"/////
#define MLX90615_TEMP_READ_ERR_CODE -99
/* MLX90615 内部寄存器地址定义 */
/* Private defines -----------------------------------------------------------*/
/* DEFAULT SLAVE ADDRESS */
#define MLX90615_ADDR 0x5B
#define MLX90615_ADDR_WR (MLX90615_ADDR << 1)
#define MLX90615_EEPROM_SA 0x10
#define MLX90615_EEPROM_PWMT_MIN MLX90615_EEPROM_SA
#define MLX90615_EEPROM_PWMT_RNG 0x11
#define MLX90615_EEPROM_CONFIG 0x12
#define MLX90615_EEPROM_EMISSIVITY 0x13
#define MLX90615_RAW_IR_DATA 0x25
#define MLX90615_AMBIENT_TEMPERATURE 0x26
#define MLX90615_OBJECT_TEMPERATURE 0x27
#define MLX90615_SLEEP 0xC6
// DEPRECATED! (just emissivity, not the whole EEPROM)
#define AccessEEPROM MLX90615_EEPROM_EMISSIVITY
#define Default_Emissivity 0x4000
/* MLX90615 供外部调用函数 */
u8 bsp_Mlx90615Init(void);
int8_t bsp_Mlx90615ScanDevice(uint8_t *pSlaveAddr);
int8_t bsp_Mlx90615ReadTempAmbient(uint8_t slaveAddr, float *ao);
int8_t bsp_Mlx90615ReadTempObject(uint8_t slaveAddr, float *to);
int8_t bsp_Mlx90615ReadIrData(uint8_t slaveAddr, uint16_t *ir);
int8_t bsp_Mlx90615ReadEmissivity(uint8_t slaveAddr, float *emissivity);
int8_t bsp_Mlx90615SetEmissivity(uint8_t slaveAddr, float emissivity);
#define L0_mlx95_wakeup() L0_IICMx_SCL(D_iicch_mlx96015,1);\
delay_ms2(1);\
L0_IICMx_SCL(D_iicch_mlx96015,0);\
delay_ms2(40);\
L0_IICMx_SCL(D_iicch_mlx96015,1);
typedef struct
{
u8 d[12];
u8 Object[3];
u8 Ambient[3];
u16 tmp;
/// u32 u32a;
u16 u16b;
u16 u16t;
u16 u16out_o;///目标温度 放大100倍
u16 u16out_a;///环境温度 放大100倍
}TS_mx95_;
extern TS_mx95_ ts_mx95;
void L1_mlx95_get_tmp(void);
#endif
/***************************** (END OF FILE) **********************************/

159
source/bsp/backu/New0001.c

@ -0,0 +1,159 @@
#include "SL_Sc7a20_FreeFall_Driver.h"
/***************在线测试**********************/
signed char SL_SC7A20_Online_Test(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x0F,1, &SL_Read_Reg);
if(SL_Read_Reg==SC7A20_CHIP_ID_VALUE) return 1;
else return -1;
}
/***************BOOT 重载内部寄存器值*********************/
signed char SL_SC7A20_BOOT(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=SL_SC7A20_BOOT_ENABLE|SL_Read_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
return 1;
}
/***************传感器量程设置**********************/
signed char SL_SC7A20_FS_Config(unsigned char Sc7a20_FS_Reg)
{
unsigned char SL_Read_Reg=0xff,SL_Write_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
// SL_Write_Reg=0x80|Sc7a20_FS_Reg|SL_SC7A20_HR_ENABLE;
SL_Write_Reg=0x80|Sc7a20_FS_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x23, SL_Write_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
if(SL_Read_Reg==SL_Write_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_Power_Config(unsigned char Power_Config_Reg)
{
unsigned char SL_Read_Reg;
#if SL_SC7A20_MTP_ENABLE == 0X01
SL_Read_Reg = 0x00;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x1E, SL_SC7A20_MTP_VALUE);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x57,1, &SL_Read_Reg);
SL_Read_Reg=SL_Read_Reg|SL_SC7A20_SDO_PU_MSK|SL_SC7A20_I2C_PU_MSK;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x57, SL_Read_Reg);
#endif
SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x20, Power_Config_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==Power_Config_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_FreeFall_Config(void)
{
unsigned char SL_Read_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=0x80|SL_Read_Reg;//AOI1 LATCH
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x22, 0x40);//AOI1 映射到INT1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x25, 0x02);//INT1 默认高电平,有中断输出低电平
//FreeFall AOI1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x30, 0x95);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x32, 0x19);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x33, 0x04);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x30,1, &SL_Read_Reg);
if(SL_Read_Reg==0x95) return 1;
else return -1;
}
#if SL_SC7A20_16BIT_8BIT==0
/***************加速度计数据读取*8bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed char *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed char)SL_Read_Buf[2];
SL_SC7A20_Data_XYZ_Buf[1]=(signed char)SL_Read_Buf[4];
SL_SC7A20_Data_XYZ_Buf[2]=(signed char)SL_Read_Buf[6];
return 1;
}
else
{
return 0;
}
}
#elif SL_SC7A20_16BIT_8BIT==1
/***************加速度计数据读取*16bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed short *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed short)((SL_Read_Buf[2]<<8) + SL_Read_Buf[1]);
SL_SC7A20_Data_XYZ_Buf[1]=(signed short)((SL_Read_Buf[4]<<8) + SL_Read_Buf[3]);
SL_SC7A20_Data_XYZ_Buf[2]=(signed short)((SL_Read_Buf[6]<<8) + SL_Read_Buf[5]);
return 1;
}
else
{
return 0;
}
}
#endif
//自由落体检测
signed char SL_SC7A20_Freefall_Status(void)
{
unsigned char sl_freefall_reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x31,1, &sl_freefall_reg);
//USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg);
if((sl_freefall_reg&0x40)==0x40)
{
return 1;//自由落体成立
}
return 0;//自由落体不成立
}
signed char SL_SC7A20_Power_Down(void)//power down
{
unsigned char SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE, 0x20, 0x00);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==0x00) return 1;
else return -1;
}

BIN
source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar

Binary file not shown.

34
source/bsp/backu/bsp_433.c

@ -0,0 +1,34 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, ´«¿Ø¿Æ¼¼ All rights reserved.
///-------------------------------------------------------------------------
/// @file APP_433.c
/// @brief APP_POWER driver app µçÔ´¹ÜÀí
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20181010
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/
//#include "app_Gsensor.h"
#include "bsp_433.h"
////L0_uart0_sendArray( (unsigned char *)&TS_paer_value,5);

19
source/bsp/backu/bsp_433.h

@ -0,0 +1,19 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, ´«¿Ø¿Æ¼¼ All rights reserved.
///-------------------------------------------------------------------------
/// @file APP_433.c
/// @brief APP_POWER driver app µçÔ´¹ÜÀí
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20181010
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
#ifndef _BSP_433_H
#define _BSP_433_H
#include "../msp/uart0.h"
#endif // #ifndef _BSP_433_H

574
source/bsp/backu/bsp_cam - 副本.c

@ -0,0 +1,574 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "Bsp_debug.h"
#include "bsp_func.h"
#include "bsp_power.h"
#include "bsp_cam_isr.h"
#include "bsp_cam.h"
#include "../msp/uart0.h"
#include "cw63xx.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
#include "../msp/time.h"
TS_P_rf433 TS_paer_value=
{
0xaa,///vU8 ha;
// 0xaa,///vU8 hb;
0xad,
0x0123,
// 0x00,///U16 paperNum:12; //12bit纸张数据
///U8 cameraIndex:2; //摄像头编号
///U8 cameraWorking:1; //是否正常工作
///U8 reserved: 1; //保留
0x56,///U8 cameraBoardPower; //电量
0xcc//, 0xaa///vU8 hc;
};
void GC032A_port_init(void)
{
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
//p3.6 --HSYNC
// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6);
///P3.7 -- VSYNC
// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7);
L0_GC032A_standby();
D_cam_AVDD_on();
}
////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>>
struct _s_task_GC032A_ s_task_GC032A;
void L2_task_GC032A_init(void)
{
L0_cam_isr_init();
L1_task_init(&s_task_GC032A.task);
///L3_task_s_go(s_task_GC032A,D_task_init);
s_task_GC032A.next_line = D_clear;
s_task_GC032A.run = D_run;
s_task_GC032A.line_get = D_clear;
s_task_GC032A.cal_ok = D_clear;
s_task_GC032A.frames = 0;
s_task_GC032A.vs_ok = D_clear;
s_task_GC032A.line_en = D_ON;
s_task_GC032A.cal_en = D_OFF;
/// D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//使能INT2中断
}
#if 10
///// get
void L2_task_GC032A_handle(struct _s_task_GC032A_ *s)
{
TTSS_Task_init();
//PWDN引脚拉低(0 -- 正常工作,1 -- 休眠)
L0_GC032A_standby();
L0_uart0_uc('2');
L2_task_go(D_task_GC032A_init_DVDD);
TTSS_Task_step(D_task_GC032A_init_DVDD);
L0_GC032A_work();
//IOVDD上电,并延时50us以上;
D_cam_DVDD_on();
// L0_uart0_uc('3');
L2_task_go(D_task_GC032A_init_AVDD);
//L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_AVDD);
//AVDD28上电,并延时0us以上
D_cam_AVDD_on();
L0_uart0_uc('4');
L2_task_go(D_task_GC032A_init_pwdn);
TTSS_Task_step(D_task_GC032A_init_pwdn);
//提供032A系统频率
/// L0_MCLKO_init(D_ON);
//L0_uart0_uc('n');
//PWDN引脚拉高,延时,拉低
L0_GC032A_standby();DL0_WDT();//
L2_task_go(D_task_GC032A_init_pwdn_wait);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_pwdn_wait);
L0_GC032A_work();
GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20);
gRccUs03 = 0;
// L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
L2_task_go(D_task_GC032A_write_reg);
//L2_task_go(0);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_write_reg);
//设置摄像头参数 大约2s时间
if(0 != GC6133_init_reg_tbl[gRccUs03][0])
{
//GC032a_L0_uart0_uc('k');
L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
gRccUs03 ++;
}else
{
L2_task_go(D_task_GC032A_div);
///L1_task_Tdelay(D_Tdelay_500ms);
L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa
}
TTSS_Task_step(D_task_GC032A_div);
//L0_GC032A_write(0xfc,0x02); //复位??
L0_GC032A_write(0xf8,0x03);/// 恢复分频
L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();//
GC032a_L0_uart0_uc('6');
L2_task_go(D_task_GC032A_start_time);
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
////等待 其他任务的启动后才工作
TTSS_Task_step(D_task_GC032A_start_time);
D_cam_led_on();D_VSYNCS_open();
L1_GC032A_sleep(D_wakeup);
GC032a_L0_uart0_uc('7');
/// s->one_line_ok = D_clear;D_ledb_OFF();
L2_task_go(D_task_GC032A_led);
TTSS_Task_step(D_task_GC032A_led);
///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________
///cam_led ```````````\_________________________________________________________/`````````````````\____
if(D_ready == s->vs_ok)///为了关灯
{
s_task_GC032A.vs_ok = D_clear;
D_cam_led_off(); GC032a_L0_uart0_uc('D');
L2_task_go(D_task_GC032A_wait);
}
TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>---
///捕获到需要的行
if(D_ready == s->line_get)
{DL0_WDT();//
s->line_get = D_clear;
/// 1.standby
/// D_cam_led_off();
if(D_ON == s->line_en)
{
GC032a_L0_uart0_uc(0xfe);
GC032a_L0_uart0_uc(0xfd);
D_send_us(DR_pclk_n);
//D_send_us(s->lines);
L2_task_go(D_task_GC032A_send_line);
}else
{
L2_task_go(D_task_GC032A_cal);
}
L1_task_Tdelay(D_Tdelay_10ms);
}
TTSS_Task_step(D_task_GC032A_send_line);
if(D_uart0_free())
{
L0_uart0_sendArraylong(s->buf,0,199);
L2_task_go(D_task_GC032A_send2);
}
TTSS_Task_step(D_task_GC032A_send2);
if(D_uart0_free())
{
L0_uart0_sendArraylong(s->buf,200,399);
L2_task_go(D_task_GC032A_send3);
}
TTSS_Task_step(D_task_GC032A_send3);
if(D_uart0_free())
{
L0_uart0_sendArraylong(s->buf,400,509);
L2_task_go(D_task_GC032A_send5);
}
TTSS_Task_step(D_task_GC032A_send4);
if(D_uart0_free())
{
L0_uart0_sendArraylong(s->buf,600,639);
L2_task_go(D_task_GC032A_send5);
}
TTSS_Task_step(D_task_GC032A_send5);
if(D_uart0_free())
{
// 'fe','fd','fd','fc'
// GC032a_L0_uart0_uc(0xfd);
// GC032a_L0_uart0_uc(0xfc);
L2_task_go(D_task_GC032A_line1);
//L2_task_go(D_task_GC032A_sleep);
}
TTSS_Task_step(D_task_GC032A_line1)
for(gRccUs03 = 1;gRccUs03 < 568;gRccUs03 ++)
{
if((s->buf[gRccUs03 - 1] == 0)&&
(s->buf[gRccUs03] == 1))//// _/``上升沿
{
if(s->buf[gRccUs03 + 1] == 0)
{//_/`\_ 尖峰需要过滤
}else
{// ___/````上升沿开始高电平
s->up_point = gRccUs03;
}
}else if((s->buf[gRccUs03 - 1] == 1)&&
(s->buf[gRccUs03] == 0))//// ``\_ 下降沿
{
s->down_point = gRccUs03;
}else
{
}
}
L2_task_go(D_task_GC032A_line2);
TTSS_Task_step(D_task_GC032A_line2)
D_send_us(s->up_point);
D_send_us(s->down_point);
D_send_us(s->down_point - s->up_point);
// DR_pdata_n =0;
// 'fe','fd','fd','fc'
GC032a_L0_uart0_uc(0xfd);
GC032a_L0_uart0_uc(0xfc);
if(D_ON == s->cal_en)
{
L2_task_go(D_task_GC032A_cal);
}else
{
L2_task_go(D_task_GC032A_sleep);
}
TTSS_Task_step(D_task_GC032A_cal)
GC032a_L0_uart0_uc('8');//2.1ms
L2_task_go(D_task_GC032A_sleep);
TTSS_Task_step(D_task_GC032A_sample);
///20181007本想调试成 分段的led 不通过vs 关断 但是发现不好调整
///采样的时候led打开照亮
D_cam_led_on();GC032a_L0_uart0_uc('`');
L2_task_go(D_task_GC032A_sleep);
// L1_task_Tdelay(D_Tdelay_500ms+6);
TTSS_Task_step(D_task_GC032A_sleep);
/// 收到外部命令run后 决定进入睡眠状态 ,低功耗处理
////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms
/////1160-10 - 20 = 1130ms
/// GC032a_L0_uart0_uc(0x88);
if(D_run == s->run)
{
GC032a_L0_uart0_uc('9');//2.1ms
L2_task_go(D_task_GC032A_led);
L1_task_Tdelay(D_Tdelay_10ms);
}else
{
D_cam_led_off();
L1_GC032A_sleep(D_sleep);
L2_task_go(0);
}
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
TTSS_Task_end();
}
#else
///// get
void L2_task_GC032A_handle(struct _s_task_GC032A_ *s)
{
TTSS_Task_init();
//PWDN引脚拉低(0 -- 正常工作,1 -- 休眠)
L0_GC032A_standby();
L0_uart0_uc('2');
L2_task_go(D_task_GC032A_init_DVDD);
TTSS_Task_step(D_task_GC032A_init_DVDD);
L0_GC032A_work();
//IOVDD上电,并延时50us以上;
D_cam_DVDD_on();
// L0_uart0_uc('3');
L2_task_go(D_task_GC032A_init_AVDD);
//L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_AVDD);
//AVDD28上电,并延时0us以上
D_cam_AVDD_on();
L0_uart0_uc('4');
L2_task_go(D_task_GC032A_init_pwdn);
TTSS_Task_step(D_task_GC032A_init_pwdn);
//提供032A系统频率
/// L0_MCLKO_init(D_ON);
//L0_uart0_uc('n');
//PWDN引脚拉高,延时,拉低
L0_GC032A_standby();DL0_WDT();//
L2_task_go(D_task_GC032A_init_pwdn_wait);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_pwdn_wait);
L0_GC032A_work();
GC032a_L0_uart0_uc('5');/// Lc_delay_ms(20);
gRccUs03 = 0;
// L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
L2_task_go(D_task_GC032A_write_reg);
//L2_task_go(0);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_write_reg);
//设置摄像头参数 大约2s时间
if(0 != GC6133_init_reg_tbl[gRccUs03][0])
{
//GC032a_L0_uart0_uc('k');
L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
gRccUs03 ++;
}else
{
L2_task_go(D_task_GC032A_div);
///L1_task_Tdelay(D_Tdelay_500ms);
L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa
}
TTSS_Task_step(D_task_GC032A_div);
//L0_GC032A_write(0xfc,0x02); //复位??
L0_GC032A_write(0xf8,0x03);/// 恢复分频
L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();//
GC032a_L0_uart0_uc('6');
L2_task_go(D_task_GC032A_start_time);
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
////等待 其他任务的启动后才工作
TTSS_Task_step(D_task_GC032A_start_time);
D_cam_led_on();D_VSYNCS_open();
L1_GC032A_sleep(D_wakeup);
GC032a_L0_uart0_uc('7');
/// s->one_line_ok = D_clear;D_ledb_OFF();
L2_task_go(D_task_GC032A_led);
TTSS_Task_step(D_task_GC032A_led);
///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________
///cam_led ```````````\_________________________________________________________/`````````````````\____
if(D_ready == s->vs_ok)///为了关灯
{
s_task_GC032A.vs_ok = D_clear;
D_cam_led_off(); GC032a_L0_uart0_uc('_');
L2_task_go(D_task_GC032A_wait);
}
TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>---
///捕获到需要的行
if(1 == s->line_get)
{DL0_WDT();//
s->line_get = 0;
L2_task_go(D_task_GC032A_cal);//// 单行计算
}
TTSS_Task_step(D_task_GC032A_cal);
///计算一个 line的数据
///D_txd4_wakeup();
///GC032a_L0_uart0_uc(0xd); GC032a_L0_uart0_uc(0xa);//
s->buf[D_pclk_per_hs + 1] =s->buf[30];
///GC032a_L0_uart0_uchex(s->buf[D_pclk_per_hs + 1]);
gRccUs04 = 0;
for(gRccUs03 = 0;gRccUs03 < D_pclk_per_hs_2;gRccUs03 ++)
{ //s->buf[gRccUs03] = 0x10;
//debug 开关 显示当前收到的数据
//L0_uart0_uc(s->buf[gRccUs03]);
if(s->buf[gRccUs03] >= 0x10)
{
s->buf[gRccUs03] -= 0x10;
}
s->buf[gRccUs03] >>= 1;
gRccUs04 += s->buf[gRccUs03];
}
gRccUs04 >>= 2;//gRccUs04 >>= 4;
TS_paer_value.r123.paperNum = gRccUs04;
///GC032a_L0_uart0_uchex((unsigned char)(gRccUs04>>8));
s_task_GC032A.cal_ok = D_ready;
L2_task_go(D_task_GC032A_sample);/// 发送完成延时后开始采样,
L1_task_Tdelay(D_Tdelay_300ms); //700=1a 600=1e 500 21 400 25 300 26
TTSS_Task_step(D_task_GC032A_sample);
///20181007本想调试成 分段的led 不通过vs 关断 但是发现不好调整
///采样的时候led打开照亮
D_cam_led_on();GC032a_L0_uart0_uc('`');
L2_task_go(D_task_GC032A_sleep);
// L1_task_Tdelay(D_Tdelay_500ms+6);
TTSS_Task_step(D_task_GC032A_sleep);
/// 收到外部命令run后 决定进入睡眠状态 ,低功耗处理
////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms
/////1160-10 - 20 = 1130ms
/// GC032a_L0_uart0_uc(0x88);
if(D_run == s->run)
{
GC032a_L0_uart0_uc('r');//2.1ms
L2_task_go(D_task_GC032A_led);
}else
{
D_cam_led_off();
L1_GC032A_sleep(D_sleep);
L2_task_go(0);
}
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
TTSS_Task_end();
}
#endif
void L1_GC032A_sleep(unsigned char onf)
{///FE 15 Fd 33 44//standby
///FE 05 Fd 33 44//wakeup
if(D_sleep == onf)
{
GC032a_L0_uart0_uc('L');
/// 进入standby:
L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00);
Lc_delay_nop(30);
Lc_delay_nop(30);
/// D_cam_AVDD_off();
// D_cam_led_off();
}else
{
GC032a_L0_uart0_uc('X');
/// 退出standby:
L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff);
/// D_cam_led_on();
}
}
#if 10
void L3_GC032A_fun(U8 *pPara)
{
}
#else
//// fe 01 reg data 0cx
/// Ac 01 02 03 ocr ---bsp_debug.c
/// p.cmd p.R2 p.R3 p.ocr
///Ac 00 03 01 00/// ACC_X[13:6]
void L3_GC032A_fun(U8 *pPara)
{
U8 i,val[2];
// unsigned short j;
TS_P_debug *p = pPara;
switch(p->cmd)
{
case 0x01:
///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); 读取当前页面
///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); 读取id i= 0x23
L0_GC032A_read(p->R2,&i,1);
L0_uart0_uc(i);
break;
//修改摄像头配置参数
case 0x02:
/// fe 02 r2 r3 xx 设置寄存器(r2) = r3
/// sysreg FE 02 FE 01 44 //设置当前页面01
L0_GC032A_write(p->R2,p->R3);
L0_uart0_uc(p->R2);
L0_uart0_uc(p->R3);
break;
//启动摄像头进行拍照;
case 0x03:/// sysreg FE 03 03 04 05 //设置是否发送一line数据(数据分为一帧=640Line = 640line*480pclk )
///AE 03 01 33 44 //s_task_GC032A.line_onf = 01
///AE 03 00 33 44 //s_task_GC032A.line_onf = 00
s_task_GC032A.line_onf = p->R2;
L0_uart0_uc(0x30|s_task_GC032A.line_onf);
break;
case 0x05:
///AE 05 01 33 44 //进入 standby
///AE 05 00 33 44 //退出 standby
L1_GC032A_sleep(p->R2);
L0_uart0_uc(0x30|s_task_GC032A.line_onf);
break;
case 6:///AE 06 22 33 44
D_cam_led_off();
break;
case 7:///AE 07 22 33 44
D_cam_led_on();
break;
/*******************
case 0x00:
L0_GC032A_read(p->R2,val,p->R3);
L0_uart0_uc(p->cmd);
L0_uart0_uc(p->R2);
L0_uart0_uc(p->R3);
L0_uart0_uc('G');
for(i = 0;i < p->R3;i++)
{
L0_uart0_uc(val[i]);
}
break;
//读取摄像头配置参数
case 0x35:
L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma
L0_uart0_uc(0x31);
break;
case 0x36:
/// 退出standby:
L0_GC032A_work();
L0_uart0_uc(0x30);
break;
****************************/
default:
break;
};
}
#endif
#if 0
FE 02 88 15 10 13 11 15 11 16 12 14 11 15 12 16 12 16 14 17 13 17 13 16 13 16 12 16 13 16 12 18
14 15 12 15 13 15 12 16 14 15 13 15 12 15 13 16 14 18 14 17 13 16 10 16 15 1A 15 22 2D 3A 3F 47
41 53 5E 63 65 69 6C 6F 71 7A 72 73 75 7A 7B 7E 7D 82 85 8B 8F 90 8F 93 96 9A 9D 9A 97 98 96 99
9A 9B 9A 9C 9E 9F 9F 9D 9A 9A 99 9C 9B 9B 9A 9A 9B 9C 9D 9F 9F A0 A1 A2 A3 A2 A2 A3 A1 A3 A4 A4
A4 A4 A3 A3 A2 A2 A3 A5 A6 A7 A8 A7 A6 A6 A5 A6 A6 A8 AA AA AA AA AA AB AB AB AC AC AB AC AC AD
AF AE AD AD AC AC AB AC AC AD AD AE AE AE AF AD AE AE AD AE AE AE AE AE AF AF AF AF AF AF B0 B1
B1 B1 B2 B1 B1 B1 B1 B1 B1 B2 B2 B2 B3 B2 B2 B2 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B5
B4 B5 B6 B5 B5 B4 B4 B4 B3 B4 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B5 B6 B6 B6 B6 B6 B6 B6
B6 B6 B6 B6 B6 B6 B6 B6 B7 B6 B6 B7 B6 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7
B8 B7 B7 B8 B8 B7 B8 B8 B7 B8 B9 B8 B8 B8 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B8 B7 B7 B8 B8
B8 B8 B8 B8 B8 B8 B7 B7 B7 B7 B8 B8 B9 B8 B9 B8 B8 B8 B8 B7 B7 B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8
B9 B8 B8 B8 B8 B9 BA B8 B8 B8 B7 B8 B8 B8 B8 B8 B8 B8 B9 B8 B7 B7 B7 B7 B7 B7 B6 B6 B7 B7 B7 B7
B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B9 B8 B9 B8 B8 B9 BA B9 B8 B8 B8 B8 B9 B8 B9 B8 B8 B8
B8 B8 B9 B9 B8 B9 B9 B9 B9 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B8 B9 B9 B9 B9 B9 B9 BA B9
B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B9 B9 BB B9 B9 B9 B9 B9 B9 B9 BA BA
BB B9 B8 B8 B8 B8 B8 B9 B9 BA BA B9 BA B9 B9 B9 B9 B9 B8 B8 B8 B8 B9 B9 B9 B9 BA BA BB B9 B9 B9
B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 BA B9 B9 B9 B9 BA BA BB BB BA BB BA B9 B9 B9 B9 B9 B9 B9 BA
BB BA BA BA BA B9 B8 B8 B8 B8 B8 B9 B9 BA BB BB BB BA BA B9 B9 B9 B9 B9 BA fd fc
#endif

706
source/bsp/backu/bsp_cam.c

@ -0,0 +1,706 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "Bsp_debug.h"
#include "bsp_func.h"
#include "bsp_power.h"
#include "bsp_cam_isr.h"
#include "bsp_cam.h"
#include "../msp/uart0.h"
#include "cw63xx.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
#include "../msp/time.h"
/// 第一个比第二个延迟20ms 发送 这样同样触发后,第一个10.5ms发送完成 第二个还没有发送,不构成干扰
#define D_p_send_delay(); L1_task_Cdelay(D_Cdelay_15ms*(1+D_cameralIndex));
////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>>
void L0_p_send(void);
extern TS_P_rf433 TS_paer_value;
struct _s_task_GC032A_ s_task_GC032A;
void L2_task_GC032A_init(void)
{
L0_cam_isr_init();
L1_task_init(&s_task_GC032A.task);
s_task_GC032A.next_line = D_clear;
s_task_GC032A.line_ok = D_run;
s_task_GC032A.line_get = D_clear;
s_task_GC032A.cal_ok = D_clear;
s_task_GC032A.vs_ok = D_clear;
}
//// 采集单行的程序 20190217
//// step01 上电时序初始化
///step02 输入配置寄存器
///step03 打开中断进入采集模式
///step04 捕捉第一帧数据 开始采样每一行 同时可以关闭led节约电
/// step05 捕获到需要的行数 采集到需要的一行数据
/// step06------>进入休眠状态
/// |----->持续采集下一行
#if(MODE_CAM_LINE == MODE_CAM)
#if 0
/// 采集完后延时一定时间 打开led灯 为下次的cam工作提供光源
/// 等待run信号 如果关闭工作,休眠 fixme:冷启动还是热启动
void L2_task_GC032A_handle(struct _s_task_GC032A_ *s)
{
TTSS_Task_init()
//#define D_pclk_per_hs 6
// PrintCam_L0_uart0_uc('$');
L2_task_go(D_task_GC032A_init_standby);
TTSS_Task_step(D_task_GC032A_init_standby)
L0_GC032A_standby();
D_cam_led_on();
//PWDN引脚拉低(0 -- 正常工作,1 -- 休眠)
// PrintCam_L0_uart0_uc('2');
L2_task_go(D_task_GC032A_init_DVDD);
TTSS_step01(D_task_GC032A_init_DVDD);
L0_GC032A_work();
//IOVDD上电,并延时50us以上;
L2_task_go(D_task_GC032A_init_AVDD);
TTSS_Task_step(D_task_GC032A_init_AVDD);
//AVDD28上电,并延时0us以上
D_cam_AVDD_on();
L2_task_go(D_task_GC032A_init_pwdn);
TTSS_Task_step(D_task_GC032A_init_pwdn);
//提供032A系统频率
L0_MCLKO_init(D_ON);
L2_task_GC032A_init();
//PWDN引脚拉高,延时,拉低
L0_GC032A_standby();
DL0_WDT();//
L2_task_go(D_task_GC032A_init_pwdn_wait);
L1_task_Cdelay(D_Cdelay_15ms);
TTSS_Task_step(D_task_GC032A_init_pwdn_wait);
L0_GC032A_work();
gRccUs03 = 0;
L2_task_go(D_task_GC032A_write_reg);
L1_task_Cdelay(D_Cdelay_15ms);
TTSS_Task_step(D_task_GC032A_write_reg);
//设置摄像头参数 大约2s时间
if(0 != GC6133_init_reg_tbl[gRccUs03][0])
{
//GC032a_L0_uart0_uc('k');
L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
gRccUs03 ++;
}else
{
L2_task_go(D_task_GC032A_div);
L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa
}
TTSS_Task_step(D_task_GC032A_div);
//L0_GC032A_write(0xfc,0x02); //复位??
L0_GC032A_write(0xf8,0x03);/// 恢复分频
L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();
L2_task_go(D_task_GC032A_wakup_sample);
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
////等待 其他任务的启动后才工作
TTSS_step03(D_task_GC032A_wakup_sample)
L1_GC032A_sleep(D_wakeup);
GC032a_L0_uart0_uc('w');
///D_ledb_OFF();
L2_task_go((D_task_GC032A_wakup_sample2));
L1_task_Tdelay(D_Tdelay_1s5);
TTSS_step04(D_task_GC032A_wakup_sample2);
D_VSYNCS_open();////后台的中断开始工作
L2_task_go(D_task_GC032A_one_frame);
//////////////////////////////////////////////////////////////////////////////
TTSS_step04(D_task_GC032A_one_frame);
////捕获到一帧数据的开始((来自于后台的中断))
///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________
///cam_led ```````````\_________________________________________________________/`````````````````\____
if(D_ready == s->vs_ok)///为了关灯
{
/// PrintCam_L0_uart0_uc('V');
s_task_GC032A.vs_ok = D_clear;
D_cam_led_off();
L2_task_go(D_task_GC032A_wait);
//L1_task_Tdelay(D_Tdelay_50ms); ////取决于getline的行数 和cam需要亮灯的时间
}
TTSS_step05(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>---
///捕获到需要的Line(来自于后台的中断)
if(D_clear != s->line_get)
{DL0_WDT(); ////memo20190217 : 间隔1.15s
//PrintCam_L0_uart0_uc(s->line_get);// L2_line_send();
s->buf2_ok = D_ready;///buf2_ok数据准备好可供算法查询
L2_task_go(D_task_GC032A_sleep);
/// L1_task_Tdelay(D_Tdelay_10ms);
}
TTSS_Task_step(D_task_GC032A_sleep)
///采样结束
L1_GC032A_sleep(D_sleep);
L0_GC032A_standby();
L0_MCLKO_init(D_OFF);
D_cam_led_off();
L2_task_go(D_task_FLOW_PreSend);
////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TTSS_Task_step(D_task_FLOW_PreSend);
D_txd4_wakeup();///上升沿 1ms后433 从sleep到可以发送
/// TS_paer_value.r123.cameraBoardPower = s->t_stamp+0x30;
L0_p_send();
//D_txd4_low();
L2_task_go(D_task_FLOW_send);
// L1_task_Tdelay(D_Tdelay_10ms);
///L1_task_Cdelay(60);//2ms---mcu+433无法接收
TTSS_Task_step(D_task_FLOW_send);
//D_txd4_wakeup();
L0_uart0_sendArray((unsigned char *)&TS_paer_value,6);
L2_task_go(D_task_FLOW_send2);
TTSS_Task_step(D_task_FLOW_send2);
if(D_uart0_free())
{
L2_task_go(D_task_FLOW_send3);///
D_p_send_delay();
}
TTSS_Task_step(D_task_FLOW_send3);
L0_uart0_sendArray((unsigned char *)&TS_paer_value,6);
L2_task_go(D_task_FLOW_send4);
TTSS_Task_step(D_task_FLOW_send4);
if(D_uart0_free())
{
L2_task_go(D_task_FLOW_send5);
}
TTSS_Task_step(D_task_FLOW_send5);
D_txd4_low();///共计耗时15ms
D_cam_AVDD_off();///注意影响发送
L2_task_go(0);
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
TTSS_Task_end();
}
#endif
#elif(MODE_CAM_FRAME == MODE_CAM)
#elif(MODE_CAM_TEST == MODE_CAM)
#define PrintCam_L0_uart0_uc(x) L0_uart0_uc(x)
#define PrintCam_D_send_us(x) L0_uart0_us(x)
///#define L0_uart0_sendArraylong(a,start,end) L0_uart0_sendArray(a(start))
/// 采集完后延时一定时间 打开led灯 为下次的cam工作提供光源
/// 等待run信号 如果关闭工作,休眠 fixme:冷启动还是热启动
void L2_task_GC032A_handleTest(struct _s_task_GC032A_ *s)
{
TTSS_Task_init()
//#define D_pclk_per_hs 6
// PrintCam_L0_uart0_uc('$');
L2_task_go(D_task_GC032A_init_standby);
TTSS_Task_step(D_task_GC032A_init_standby)
L0_GC032A_standby();
D_cam_led_on();
//PWDN引脚拉低(0 -- 正常工作,1 -- 休眠)
// PrintCam_L0_uart0_uc('2');
L2_task_go(D_task_GC032A_init_DVDD);
TTSS_step01(D_task_GC032A_init_DVDD);
L0_GC032A_work();
//IOVDD上电,并延时50us以上;
L2_task_go(D_task_GC032A_init_AVDD);
TTSS_Task_step(D_task_GC032A_init_AVDD);
//AVDD28上电,并延时0us以上
D_cam_AVDD_on();
L2_task_go(D_task_GC032A_init_pwdn);
TTSS_Task_step(D_task_GC032A_init_pwdn);
//提供032A系统频率
L0_MCLKO_init(D_ON);
L2_task_GC032A_init();
//PWDN引脚拉高,延时,拉低
L0_GC032A_standby();
DL0_WDT();//
L2_task_go(D_task_GC032A_init_pwdn_wait);
L1_task_Cdelay(D_Cdelay_15ms);
TTSS_Task_step(D_task_GC032A_init_pwdn_wait);
L0_GC032A_work();
gRccUs03 = 0;
L2_task_go(D_task_GC032A_write_reg);
L1_task_Cdelay(D_Cdelay_15ms);
TTSS_Task_step(D_task_GC032A_write_reg);
//设置摄像头参数 大约2s时间
if(0 != GC6133_init_reg_tbl[gRccUs03][0])
{
L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);///
gRccUs03 ++;
}else
{
L2_task_go(D_task_GC032A_div);
L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa
}
TTSS_Task_step(D_task_GC032A_div);
//L0_GC032A_write(0xfc,0x02); //复位??
L0_GC032A_write(0xf8,0x03);/// 恢复分频
L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();
L2_task_go(D_task_GC032A_wakup_sample);
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
///------------------------------------------------------cam init over
////等待 其他任务的启动后才工作
TTSS_step03(D_task_GC032A_wakup_sample)
L1_GC032A_sleep(D_wakeup);
///D_ledb_OFF();
L2_task_go((D_task_GC032A_wakup_sample2));
L1_task_Tdelay(D_Tdelay_1s5);
TTSS_step04(D_task_GC032A_wakup_sample2);
D_VSYNCS_open();////后台的中断开始工作
PrintCam_L0_uart0_uc('w');
L2_task_go(D_task_GC032A_one_frame);
//////////////////////////////////////////////////////////////////////////////
TTSS_step04(D_task_GC032A_one_frame);
PrintCam_L0_uart0_uc('.');
////捕获到一帧数据的开始((来自于后台的中断))
///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________
///cam_led ```````````\_________________________________________________________/`````````````````\____
if(D_ready == s->vs_ok)///为了关灯
{
s->vs_ok = D_clear;
PrintCam_L0_uart0_uc('V');
/// D_cam_led_off();
D_HSYNCS_open();
L2_task_go(D_task_GC032A_send2);
//L1_task_Tdelay(D_Tdelay_50ms); ////取决于getline的行数 和cam需要亮灯的时间
}
TTSS_Task_step(D_task_GC032A_send2)///----------------------开始一行一行的发送
if(1 == s_task_GC032A.line_ok)
{
s_task_GC032A.line_ok = 0;
///采样结束
PrintCam_L0_uart0_uc(0xfe);
PrintCam_L0_uart0_uc(0xfd);
///PrintCam_D_send_us(DR_pclk_n);
PrintCam_D_send_us(DR_line_n);
L0_uart0_sendArray(&s_task_GC032A.buf[0],200);
L2_task_go(D_task_GC032A_06);
/// L1_task_Tdelay(D_Tdelay_50ms);
}else { }
TTSS_step06(D_task_GC032A_06);
/*********************************************************
TTS_for_add(s_task_GC032A.lines,0,627)///[0]--[199]199
/// s_task_GC032A.buf[s_task_GC032A.lines] = s_task_GC032A.lines;
s_task_GC032A.buf[s_task_GC032A.lines] = 0;
TTS_for_add_end()
**************************************************/
if(D_uart0_send_over())
{
L0_uart0_sendArray(&s_task_GC032A.buf[200],200);
L2_task_go(D_task_GC032A_07);
}
TTSS_step06(D_task_GC032A_07);
if(D_uart0_send_over())
{
L0_uart0_sendArray(&s_task_GC032A.buf[400],200);
L2_task_go(D_task_GC032A_08);
}
TTSS_step06(D_task_GC032A_08);
if(D_uart0_send_over())
{
L0_uart0_sendArray(&s_task_GC032A.buf[600],D_pclk_per_hs-600);/// 628point
// 'fe','fd','fd','fc' 46 44 20 46 43 0d 0a
PrintCam_L0_uart0_uc(0xfd);
PrintCam_L0_uart0_uc(0xfc);
s_task_GC032A.next_line = 1;
L2_task_go(D_task_GC032A_send2);
L1_task_Tdelay(D_Tdelay_10ms);
}
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
TTSS_Task_end();
}
#endif
void L1_GC032A_sleep(unsigned char onf)
{///FE 15 Fd 33 44//standby
///FE 05 Fd 33 44//wakeup
if(D_sleep == onf)
{
// GC032a_L0_uart0_uc('L');
/// 进入standby:
L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00);
Lc_delay_nop(30);
Lc_delay_nop(30);
}else
{
// GC032a_L0_uart0_uc('X');
/// 退出standby:
L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff);
}
}
void L2_line_send(void)
{
#if 0
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
// PrintCam_L0_uart0_uc(0xfe);
// PrintCam_L0_uart0_uc(0xfd);
PrintCam_D_send_us(DR_pclk_n);
/// PrintCam_D_send_us(s_task_GC032A.usSum);
PrintCam_L0_uart0_uc(0x09);
// PrintCam_D_send_us(0x1234); PrintCam_D_send_us(0x5678); PrintCam_D_send_us(0xabcd);
// PrintCam_L0_uart0_uc(0x0d);
// PrintCam_L0_uart0_uc(0x0a);
PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[50]),40);
PrintCam_L0_uart0_uc(0x09);
PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[50]),40);
PrintCam_L0_uart0_uc(0x09);
PrintCam_L0_uart0_sendArray(&s_task_GC032A.buf[D_pclk_per_hs_570-21],20);
///Lc_hex2ascii(&(s_task_GC032A.buf[0]),10,ts_uart_send_shop.buf);
// Lc_hex2ascii(&s_task_GC032A.buf[D_pclk_per_hs_570-10],2,ts_uart_send_shop.buf2);
// L0_uart0_sendArray(ts_uart_send_shop.buf2,2*3);
///#ifdef D_debug_add_send
// PrintCam_L0_uart0_uc('P');
///L0_uart0_sendArraylong(s_task_GC032A.buf,D_pclk_per_hs_570-10,D_pclk_per_hs_570);
// 'fe','fd','fd','fc'
// PrintCam_L0_uart0_uc(0xfd);
// PrintCam_L0_uart0_uc(0xfc);
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
///#else
/*****
??
10 10 10 10 10 10 10 10 10 10
10 10 10 10 11 11 11 11 11 11
11 11 11 11 11 11 11 11 11 11
11 11
10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10
CRpaper =04F8-g-offdiff :.
******/
///vU16 i; for(i = 0;i <= D_pclk_per_hs_570; i ++) {s_task_GC032A.buf[i]=i; }
PrintCam_L0_uart0_uc(0xfe);
PrintCam_L0_uart0_uc(0xfd);
PrintCam_D_send_us(DR_pclk_n);
L0_uart0_sendArray(s_task_GC032A.buf,200);
L0_uart0_sendArray(&s_task_GC032A.buf[200],200);
L0_uart0_sendArray(&s_task_GC032A.buf[400],(D_pclk_per_hs_570-400));
// PrintCam_D_send_us(ts_task_ALGO.usSum_temp);
//// PrintCam_D_send_us(s_task_GC032A.down_point);
// PrintCam_D_send_us(s_task_GC032A.down_point - s_task_GC032A.up_point);
// DR_pdata_n =0;
// PrintCam_D_send_us(0x1234);
// 'fe','fd','fd','fc'
// PrintCam_L0_uart0_uc(0xfd);
// PrintCam_L0_uart0_uc(0xfc);
#endif
/* */
}
#if 0
void GC032A_port_init(void)
{
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
//p3.6 --HSYNC
// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6);
///P3.7 -- VSYNC
// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7);
L0_GC032A_standby();
D_cam_AVDD_on();
}
//// AX CMD R2 R3 R4
/// Ae 01 01 03 04
void L3_GC032A_fun(U8 *pPara)
{
*pPara = 0;
}
/********
void L3_GC032A_fun(U8 *pPara)
{
U8 i,val[2];
// unsigned short j;
TS_P_debug *p = pPara;
switch(p->cmd)
{
case 3: //Ae 03 03 04 00
//xx 03 R2 R3 xx
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
PrintCam_L0_uart0_uc('l');
Lc_delay_ms(12);
s_task_GC032A.vline_get = p->R2 << 8;
s_task_GC032A.vline_get |= p->R3;
L0_uart0_uchex(p->R2);
Lc_delay_ms(12);
L0_uart0_uchex(p->R3);
Lc_delay_ms(1200);
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
break;
default:
break;
};
}
********/
///#else
//// fe 01 reg data 0cx
/// Ac 01 02 03 ocr ---bsp_debug.c
/// U8 i,val[2];
// unsigned short j;
TS_P_debug *p = pPara;
switch(p->cmd)
{
case 0x01: p.cmd p.R2 p.R3 p.ocr
///Ac 00 03 01 00/// ACC_X[13:6]
void L3_GC032A_fun(U8 *pPara)
{
U8 i,val[2];
// unsigned short j;
TS_P_debug *p = pPara;
switch(p->cmd)
{
case 0x01:
///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); 读取当前页面
///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); 读取id i= 0x23
L0_GC032A_read(p->R2,&i,1);
PrintCam_L0_uart0_uc(i);
break;
//修改摄像头配置参数
case 0x02:
/// fe 02 r2 r3 xx 设置寄存器(r2) = r3
/// sysreg FE 02 FE 01 44 //设置当前页面01
L0_GC032A_write(p->R2,p->R3);
PrintCam_L0_uart0_uc(p->R2);
PrintCam_L0_uart0_uc(p->R3);
break;
//启动摄像头进行拍照;
case 0x03:/// sysreg FE 03 03 04 05 //设置是否发送一line数据(数据分为一帧=640Line = 640line*480pclk )
///AE 03 01 33 44 //s_task_GC032A.line_onf = 01
///AE 03 00 33 44 //s_task_GC032A.line_onf = 00
s_task_GC032A.line_onf = p->R2;
PrintCam_L0_uart0_uc(0x30|s_task_GC032A.line_onf);
break;
case 0x05:
///AE 05 01 33 44 //进入 standby
///AE 05 00 33 44 //退出 standby
L1_GC032A_sleep(p->R2);
PrintCam_L0_uart0_uc(0x30|s_task_GC032A.line_onf);
break;
case 6:///AE 06 22 33 44
D_cam_led_off();
break;
case 7:///AE 07 22 33 44
D_cam_led_on();
break;
/*******************
case 0x00:
L0_GC032A_read(p->R2,val,p->R3);
PrintCam_L0_uart0_uc(p->cmd);
PrintCam_L0_uart0_uc(p->R2);
PrintCam_L0_uart0_uc(p->R3);
PrintCam_L0_uart0_uc('G');
for(i = 0;i < p->R3;i++)
{
PrintCam_L0_uart0_uc(val[i]);
}
break;
//读取摄像头配置参数
case 0x35:
L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma
PrintCam_L0_uart0_uc(0x31);
break;
case 0x36:
/// 退出standby:
L0_GC032A_work();
PrintCam_L0_uart0_uc(0x30);
break;
****************************/
default:
break;
};
}
#endif
#if 0
254 253
FE FD 02 7F ///639
1A 1B 1B 1B 1B 1B 1A 1C 1B 1B 1B 1A 1A 19 19 1A 19 1A 19 1A 19 1A 19 19 18 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 17 16 17 16 18 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17 18 18 17 17 17 17 17 16 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 19 19 19 19 19 19 18 18 19 19 19 18 18 18 1A 19 19 19 19 19 1A 1A 1A 1A 1A 1A 19 19 18 19 19 19 1A 1A 1A 1B 1B 1B 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1C 1C 1C 1C 1D 1E 1C 1C 1C 1D 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1D 1C 1B 1A 1B 1A 1B 1D 1D 1D 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1B 1B 1B 1B 1B 1C 1C 1C 1C 1B 1B 1C 1C 1C 1E 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1C 1B 1C 1C 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1C 1C 1C 1C 1C 1D 1D 1E 1D 1E 1F 1F 1E 1E 1E 1E 1E 1E 1E 1E 1D 1D 1C 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1D 1D 1C 1D 1D 1D 1D 1D 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1D 1C 1C 1C 1C 1C 1C 1C 1B 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1B 1C 1C 1C 1C 1C 1C 1D 1C 1C 1C 1C 1D 1F 1F 1D 1C 1C 1B 1C 1C 1C 1C 1C 1C 1B 1B 1B 1B 1B 1B 1B 1C 1C 1C 1C 1C 1D 1C 1C 1C 1D 1D 1D 1D 1E 1D 1C 1C 1C 1C 1C 1C 1C 1C 1D 1D 1E 1E 1E 1D 1D 1D 1D 1C 1D 1C 1C 1C 1C 1D 1D 1D 1D 1C 1C 1C 1C 1C 1C 1B 1B 1C 1C 1C 1C 1B 1B 1B 1B 1D 1B 1C 1B 1B 1B 1C 1D 1C 1B 19 1A 19 1B 1C 1A 1A 1A 1A 1A 1A 1B 1B 1B 1A 1B 19 1B 1A 1A 1A 1A 1A 19 18 19 19 1A 1A 1A 1A 1A 19 19 18 18 18 18 18 1A 18 18 18 18 18 18 18 18 19 1A 19 19 19 19 19 19 19 1A 1A 1A 1A 19 19 18 18 18 18 18 18 19 18 18 18 19 18 18 18 18 18 1A 18 18 18 18 18 18 18 18 17 17 17 18 18 18 18 17 17 17 17 17 16 17 17 18 18 19 19 19 19 19 19 18 18 18 18 18 18 17 17 18 18 17 17 17 17 17 17 19 17 17 17 17 17 17 17 17 17 17 17 17 18 17 17 17 17 17 17 17 17 16 16 17 17 17 17 17 16 16 17 17 17 17 16 16 16 16 16 16 16 17 16 16 16 16 16 16 16 16 16 16 18 19 16 16 16 16 15 16 17 17 16 15 15 16 16 16 15 14 14 15 17 15 15 15 15 16 16 16 16 16 15 16 16 16 15 15 15 15 15
FD FC
253 252
254 253 /639./ 253 252
#endif
#if 0/// memo
//memo20190217 : 间隔1.15s
/*********
[15:37:04.337]v 4.337
[15:37:05.487]v 5.487 1.15
[15:37:06.637]v 6.637 1.15
[15:37:07.787]k 7.787 1.15
[15:37:08.947]v 8.947 1.16
[15:37:10.097]v 10.097 1.15
[15:37:11.247]v 11.247 1.15
[15:37:12.397]v 12.397 1.15
[15:37:13.547]k 13.547 1.15
48 31 61 77 77 77 77 2E 56 77 77 77 33 76 01 D3 56 2E 77 77 77 00
***/
void GC032A_port_init(void)
{
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
//p3.6 --HSYNC
// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6);
///P3.7 -- VSYNC
// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7);
// L0_GC032A_standby();
// D_cam_AVDD_on();
}
void L2_line_send(void)
{
// /// vU16 usi;
PrintCam_D_send_us(0x1234);
PrintCam_D_send_us(0x5678);
PrintCam_D_send_us(0xabcd);
#if 0
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
// PrintCam_L0_uart0_uc(0xfe);
// PrintCam_L0_uart0_uc(0xfd);
PrintCam_D_send_us(DR_pclk_n);
PrintCam_D_send_us(0x1234);
PrintCam_D_send_us(0x5678);
PrintCam_D_send_us(0xabcd);
PrintCam_L0_uart0_uc(0x0d);
PrintCam_L0_uart0_uc(0x0a);
PrintCam_L0_uart0_sendArray(&(s_task_GC032A.buf[0]),2);
PrintCam_L0_uart0_uc(0x09);
/// PrintCam_L0_uart0_sendArray(&s_task_GC032A.buf[D_pclk_per_hs_570-10],9);
///Lc_hex2ascii(&(s_task_GC032A.buf[0]),10,ts_uart_send_shop.buf);
Lc_hex2ascii(&s_task_GC032A.buf[D_pclk_per_hs_570-10],2,ts_uart_send_shop.buf2);
L0_uart0_sendArray(ts_uart_send_shop.buf2,2*3);
///#ifdef D_debug_add_send
PrintCam_L0_uart0_uc('P');
///L0_uart0_sendArraylong(s_task_GC032A.buf,D_pclk_per_hs_570-10,D_pclk_per_hs_570);
// 'fe','fd','fd','fc'
// PrintCam_L0_uart0_uc(0xfd);
// PrintCam_L0_uart0_uc(0xfc);
// PrintCam_L0_uart0_uc(0x0d);
// PrintCam_L0_uart0_uc(0x0a);
///#else
[18:41:16.591]ê?????02 FE FD 02 42 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 12 12 12 13 13 14 15 16 16 17 18 18 17 17 16 16 17 19 1C 1F 25 28 2A 2C 2D 2E 2F 30 31 31 32 32 32 32 31 31 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 34 33 34 34 34 34 34 34 34 34 34 34 34 35 35 34 35 35 35 35 35 35 36 35 35 36 36 11 11 11 FD FC
PrintCam_L0_uart0_uc(0xfe);
PrintCam_L0_uart0_uc(0xfd);
PrintCam_D_send_us(DR_pclk_n);
L0_uart0_sendArraylong(s_task_GC032A.buf,0,199);
L0_uart0_sendArraylong(s_task_GC032A.buf,200,399);
if(D_pclk_per_hs < 600)
{
L0_uart0_sendArraylong(s_task_GC032A.buf,400,599);
}else
{
L0_uart0_sendArraylong(s_task_GC032A.buf,400,599);
L0_uart0_sendArraylong(s_task_GC032A.buf,600,(D_pclk_per_hs-1));
}
// PrintCam_D_send_us(ts_task_ALGO.usSum_temp);
//// PrintCam_D_send_us(s_task_GC032A.down_point);
// PrintCam_D_send_us(s_task_GC032A.down_point - s_task_GC032A.up_point);
// DR_pdata_n =0;
// PrintCam_D_send_us(0x1234);
// 'fe','fd','fd','fc'
PrintCam_L0_uart0_uc(0xfd);
PrintCam_L0_uart0_uc(0xfc);
#endif
/* */
}
#endif

189
source/bsp/backu/bsp_cam.h

@ -0,0 +1,189 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_cam_H
#define _bsp_cam_H
#include "../bsp/bsp_config.h"
#include "../tpc/tpc_uart.h"
#include "../msp/uart0.h"
#include "bsp_gc032a.h"
//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask
//#define D_i2c_addr_gc61xx 0x80 //page8/30 @pdf
#define D_i2c_addr_gc032A 0x42 //page15/31 @pdf
///// 400KHz Tlow > 1.3us
#define L0_GC032A_write(R,D) L2_I2C_WriteCmd(D_i2c_addr_gc032A,(R),(D))
#define L0_GC032A_read(R,D,N) L2_I2C_ReadReg(D_i2c_addr_gc032A,(R),(D),(N))
#define L0_GC032A_reg(R,D) L2_tws_ReadReg(D_i2c_addr_gc032A,(R),(D))
/// p55 pwdn
/// p54 inclk
/// p3.7 vsync
/// p3.6 hsync
#if 0
#define L0_GC032A_work() D_P55_OFF();
#define L0_GC032A_standby()
#else
#define L0_GC032A_work() D_P55_OFF();D_stdIO_P1_ALL();\
D_stdIO_P5(BITN4);\
D_stdIO_P5(BITN5);\
D_stdIO_P3(BITN7);\
D_stdIO_P3(BITN6);
#define L0_GC032A_standby() D_HighR_P1_ALL();\
D_HighI_P5(BITN4);\
D_HighI_P5(BITN5);\
D_HighI_P3(BITN7);\
D_HighI_P3(BITN6);D_P55_ON();
///pwdn 100uAD_P55_OFF();//
#endif
#define GC6123_SERIAL_write_cmos_sensor L0_GC032A_write
///#define D_pclk_per_hs 628
///#define D_pclk_per_hs 688
#define D_pclk_per_hs 639 ///027F
#define D_pclk_per_hs_570 570
//#define D_pclk_per_hs 580
#define D_pclk_per_hs_2 D_pclk_per_hs
///#define D_pclk_per_hs_2 (110)
//#define D_pclk_per_hs 6
struct _s_task_GC032A_
{
TS_task task;
/// vU32 t_stamp;
unsigned short lines; ///当前行采样结束
unsigned short frames; ///当前行采样结束
unsigned char next_line:1; ///下一行采样开始
unsigned char cal_ok:1; ///当前行采样结束//
unsigned char lamp:1; ///当前灯的标志
unsigned char line_get:1; ///当前需要的行采样结束 可以计算了
unsigned char line_ok:1; /// 采样的开关
unsigned char vs_ok:1; /// 开始一帧的采样 代表收到了vs信号
unsigned char line_onf:2; /// D_line_onf_get=0发送需要发送的一个line\\ D_line_onf_all=1 发送连续line
// volatile unsigned short usHs_count;
// volatile unsigned short usPclk;
unsigned char buf2_ok;
/// volatile unsigned short usN;
////// unsigned short usMax;
unsigned char buf[D_pclk_per_hs +2];
};
#define D_line_onf_all 1
#define D_line_onf_get 0
extern struct _s_task_GC032A_ s_task_GC032A;
void L2_task_GC032A_init(void);
#define D_task_GC032A_init_standby 0x36
#define D_task_GC032A_init_DVDD 0x30
#define D_task_GC032A_init_AVDD 0x31
#define D_task_GC032A_init_pwdn 0x32
#define D_task_GC032A_init_pwdn_wait 0x33
#define D_task_FLOW_PreSend 0xa3
#define D_task_FLOW_PreSend2 0xa4
#define D_task_FLOW_send 0x90
#define D_task_FLOW_send2 0x91
#define D_task_FLOW_send3 0x92
#define D_task_FLOW_send4 0x93
#define D_task_FLOW_send5 0x94
#define D_task_GC032A_write_reg 0x40
#define D_task_GC032A_wakup_sample 0x41
#define D_task_GC032A_start_time2 0x43
#define D_task_GC032A_wakup_sample2 0x44
#define D_task_GC032A_wait 0x51
#define D_task_GC032A_one_frame 0x52
#define D_task_GC032A_write_reg2 0x53
#define D_task_GC032A_div 0x54
#define D_task_GC032A_dat 0x55
#define D_task_GC032A_led 0x56
#define D_task_GC032A_send_line 0x61
#define D_task_GC032A_send2 0x62
#define D_task_GC032A_send3 0x63
#define D_task_GC032A_send4 0x64
////#define D_task_GC032A_over 0x63
#define D_task_GC032A_cal 0x65
///#define D_task_GC032A_send_over 0x64
#define D_task_GC032A_sleep 0x67
#define D_task_GC032A_06 0x68
#define D_task_GC032A_07 0x69
#define D_task_GC032A_08 0x6a
#define D_task_GC032A_09 0x6b
#define D_task_GC032A_sample 0x68
#define D_task_GC032A_end 0x69
#define D_task_GC032A_next_line 0x70
extern void L2_task_GC032A_handle(struct _s_task_GC032A_ *s);
extern void L2_task_GC032A_handleTest(struct _s_task_GC032A_ *s);
////////////////////////////////////////////////////////////////////
extern void GC032A_port_init(void);
extern void L3_GC032A_fun(U8 *pPara);
extern void L1_GC032A_sleep(unsigned char onf);
#define D_cam_led_on(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_ON|D_CW63XX_3V2);//P34 = 1;/////s_task_GC032A.lamp = D_ON;
#define D_cam_led_off(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_OFF|D_CW63XX_3V2);///P34 = 0;/////s_task_GC032A.lamp = D_OFF;
#endif // #ifndef _bsp_gc6133_H

218
source/bsp/backu/bsp_cam_isr.c

@ -0,0 +1,218 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.c
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
///-------------------------------------------------------------------------
/// @version 1.2
/// @author CC
/// @date 20180703
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
//#include "Bsp_debug.h"
#include "bsp_func.h"
#include "bsp_cam_isr.h"
#include "bsp_cam.h"
#include "../msp/uart0.h"
#include "cw63xx.h"
#include "../clib/Clib.h"
#include "../clib/bit.h"
#include "../msp/time.h"
#define D_pclk_div_hs 1 ///D_pclk_per_hs*D_pclk_div_hs < 680
///vs p3.7 int3
///hs p3.6 int2
///pclk p3.2 int0
/// row line确可以表示一条线 一行的意思.而column则形象的表示一个纵向的“列
#define D_line_get 10
#define D_row_get2 4
#ifdef doc_98989
vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________
hs /\/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480个__/\____/\____/\____/\/\
hs /``\________________________hs______________________/``\
pclk |||||||||||||||||||||||||||||||||||||||||||||||640
Line0 L1 L2 L1 L1 L1 L1 L1 L1 L480
----------------------------------------------------------------------
1 1 1 1 1 1 1 1 1 --- --- 1
2 2 2 2 2 2 2 2 2 --- --- 2
3 3 3 3 3 3 3 3 3 --- --- 3
4 4 4 4 4 4 4 4 4 --- --- 4
5 5 5 5 5 5 5 5 5 --- --- 5
6 6 6 6 6 6 6 6 6 --- --- 6
7 7 7 7 7 7 7 7 7 --- --- 7
8 8 8 8 8 8 8 8 8 --- --- 8
9 9 9 9 9 9 9 9 9 --- --- 9
10 10 10 10 10 10 10 10 10 --- --- 10
11 11 11 11 11 11 11 11 11 --- --- 11
12 12 12 12 12 12 12 12 12 --- --- 12
13 13 13 13 13 13 13 13 13 --- --- 13
14 14 14 14 14 14 14 14 14 --- --- 14
. . . . . . . . . --- --- .
. . . . . . . . . --- --- .
. . . . . . . . . --- --- .
. . . . . . . . . --- --- .
640 640 640 640 640 640 640 640 640 --- --- 640
#endif ///doc_98989
void L0_cam_isr_init(void)
{
IT0 = 1;///int0 下降沿触发 = 0 上下沿均可触发
/// IT0 = 0;////int0 下降沿触发 = 0 上下沿均可触发
/// L0_INT0_OPEN();
D_HSYNCS_close();
D_VSYNCS_open();
D_PCLK_close();
}
#if(MODE_CAM_LINE == MODE_CAM)
#if 0
//////////
/////一帧数据的开始
void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿
{////找到一帧数据的开头:第一行
L0_INT3_CLEAR();
///s_task_GC032A.usHs_count = 0;
DR_line_n = 0;
/// s_task_GC032A.next_line = D_ready;///启动第一行 这样确保帧头是第一行,对齐的///
/// s_task_GC032A.one_line_ok = D_clear;
s_task_GC032A.line_get = D_clear;
s_task_GC032A.vs_ok = D_ready;
//s_task_GC032A.frames ++;
//if(s_task_GC032A.frames > 10)
{/// 时间溢出
///s_task_GC032A.frames = 0;
}
D_ledb_OFF();
/// D_leda_ON();
D_HSYNCS_open();
}
/////一行line row数据的开始
void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿
{///hs 下沿有效
L0_INT2_CLEAR();
//// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表
//// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据
///if(D_ready == s_task_GC032A.next_line)
{///D_P33_REV();
//D_leda_OFF();
/// s_task_GC032A.next_line = D_clear;///因为接收一行数据的时间远远小于发送的时间
///因此添加这个为了提高可靠性
///发送完了后由“gc032a任务”启动
s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过
////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了
///0 24 58 94 129 165 200 236 271 307 342 378
D_PCLK_open();
//D_P35_REV() ;
DR_pclk_n = 0;
if(DR_line_n >= D_line_get)
{
s_task_GC032A.line_get = D_ready;
D_HSYNCS_close();D_PCLK_close();
}
}
DR_line_n ++;///当前行数增加
}
////s_task_GC032A.buf 存放的是一行的数据
//// pclk int0 每个点的采样
void L0_PCLK_Isr(void) interrupt D_ISR_int0 /// using 10///
{///PCLK
// D_P34_REV();
DR_Dat = P1;
s_task_GC032A.buf[DR_pclk_n] = DR_Dat; // s_task_GC032A.buf[DR_pclk_n] = 0xaa;//P1&0xf0; //s_task_GC032A.buf[s_task_GC032A.usN] = s_task_GC032A.usN;
DR_pclk_n++;// D_P34_REV();
if(DR_pclk_n > D_pclk_per_hs)////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据
{
D_PCLK_close();
//D_ledb_REV() ;
DR_pclk_n = D_pclk_per_hs; ///fixme
DR_pclk_n = 0;
/// s_task_GC032A.one_line_ok = D_ready;////给“gc032a任务”传递消息 可以开始计算或者发送了
D_ledb_ON();
}
}
#endif
#elif(MODE_CAM_FRAME == MODE_CAM)
#elif(MODE_CAM_TEST == MODE_CAM)
/////连续发送
void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿
{////找到一帧数据的开头:第一行
///s_task_GC032A.usHs_count = 0;
DR_line_n = 0;
s_task_GC032A.next_line = 1;///启动第一行 这样确保帧头是第一行,对齐的///
s_task_GC032A.vs_ok = D_ready;
}
/////一行line row数据的开始
void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿
{///hs 下沿有效
//// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表
//// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据
if(s_task_GC032A.next_line)
{///D_P33_REV();
s_task_GC032A.next_line = 0;///因为接收一行数据的时间远远小于发送的时间
///因此添加这个为了提高可靠性
///发送完了后由“gc032a任务”启动
s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过
////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了
///0 24 58 94 129 165 200 236 271 307 342 378
/*****
if(D_line_get == DR_line_n)
{
s_task_GC032A.line_get = 1;
}
******/
D_PCLK_open();///启动记录下一行数据
DR_pclk_n = 0;
}
DR_line_n ++;///当前行数增加
}
////s_task_GC032A.buf 存放的是一行的数据
//// pclk int0 每个点的采样
void L0_PCLK_Isr(void) interrupt D_ISR_int0 //// using 10///
{///PCLK
// D_P34_REV();
//// DR_Dat = P1; s_task_GC032A.buf[DR_pclk_n] = DR_Dat;
s_task_GC032A.buf[DR_pclk_n] = P1;
////s_task_GC032A.buf[DR_pclk_n] = 0xcc;
///s_task_GC032A.buf[DR_pclk_n] = DR_pclk_n;
DR_pclk_n++;// D_P34_REV();
if(DR_pclk_n > D_pclk_per_hs) ////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据
{
D_PCLK_close();
DR_pclk_n = D_pclk_per_hs; ///fixme
s_task_GC032A.line_ok = 1; ////给“gc032a任务”传递消息 可以开始计算或者发送了
}
}
////收到 next_line 记录当前第几行lines,启动 pclk,采集数据到buf中,然后line_ok
///// send buf, set next_line after send buf over
#endif

62
source/bsp/backu/bsp_cam_isr.h

@ -0,0 +1,62 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, ´«¿Ø¿Æ¼¼ All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_gc6133.c.h
/// @brief bsp @ driver config
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180331
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_cam_isr_H
#define _bsp_cam_isr_H
#include "../bsp/bsp_config.h"
#include "../tpc/tpc_uart.h"
#include "../msp/uart0.h"
#include "bsp_gc032a.h"
#define D_VSYNCS_open(); L0_INT3_OPEN();
#define D_VSYNCS_close(); L0_INT3_CLOSE();
#define D_HSYNCS_open(); L0_INT2_OPEN();
#define D_HSYNCS_close(); L0_INT2_CLOSE();
#define D_PCLK_open(); L0_INT0_OPEN();
#define D_PCLK_close(); L0_INT0_CLOSE();
#define DR_pclk_n gRccUs05
#define DR_line_n gRccUs01
#define DR_line_n_H gRccUs01_H
#define DR_line_n_L gRccUs01_L
///// #define DR_Hs_count gRccUs02//s_task_GC032A.usPclk
///#define DR_Dat CCAP1L
#define DR_Dat SPDAT
//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask
//#define D_row_max 640
////////////////////////////////////////////////////////////////////
extern void L0_cam_isr_init(void) ;
#endif // #ifndef _bsp_cam_isr_H

95
source/bsp/backu/bsp_config_stc.h.bak

@ -0,0 +1,95 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file _bsp_config_stc_H.h
/// @brief hard _bsp_config_stc_H include
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
/// @info 确认cpu类型后调用对应的cpu的配置参数,主要为了兼容c51 arm avr等
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20220313
/// @note
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_config_stc_H
#define _bsp_config_stc_H
#if(TYPE_MCU == TYPE_MCU_STC_8H)
#define D_CPUfamily_type D_CPUfamily_8bits
/// #include "../cpu/STC_stc8h3k.h"
/// #include "../cpu/STC_stc8f.h"
#include "../cpu/stc_8A8K64D4.h"
#include "../cpu/stc_8A8K64D4_ext.h"////扩展 依据规格书
#include "../cpu/STC_only.h"
#include "../cpu/c51_macro.h"
#include "TTSS_time_stc.h"
#if(MainFre_5M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#elif(MainFre_22M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define D_delay_para1ms 90
#elif(MainFre_27M == D_sys_MainFre)
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#else ///MainFre_11M
#define D_Cdelay_200us 20
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
#define D_delay_para1ms 90
#endif//D_sys_MainFre)
#endif///TYPE_MCU
//Step4: IRQ Config
///这种不允许换行,即使后面没有其他字符也不可以.
#if 0
#define D_SERVE_INT0 interrupt 0
#define D_SERVE_TIMER0 interrupt 1
#define D_SERVE_INT1 interrupt 2
#define D_SERVE_TIMER1 interrupt 3
#define D_SERVE_UART interrupt UART1_VECTOR
#define D_SERVE_ADC interrupt 5
#define D_SERVE_LVD interrupt 6
#define D_SERVE_PCA interrupt 7
#define D_SERVE_UART2 interrupt 8
#define D_SERVE_SPI interrupt 9
#define D_SERVE_INT2 interrupt 10
#define D_SERVE_INT3 interrupt 11
#define D_SERVE_TIMER2 interrupt 12
#define D_SERVE_INT4 interrupt 16
#define D_SERVE_UART3 interrupt 17
#define D_SERVE_UART4 interrupt 18
#define D_SERVE_TIMER3 interrupt 19
#define D_SERVE_TIMER4 interrupt 20
#define D_SERVE_CMP interrupt 21
#define D_SERVE_PWM interrupt 22
#define D_SERVE_PWMFD interrupt 23
#define D_SERVE_I2C interrupt 24
#endif
#endif//_bsp_config_after_H
/*********************************end file*********************************************/

328
source/bsp/backu/bsp_cs1232.c

@ -0,0 +1,328 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2020, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file cs1232.h
/// @brief hard cs1232 include
/// @info FILE FOR HARDWARE cs1232
///-------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
/// @version 1.0
/// @author CC
/// @date 20200530
/// @note
//////////////////////////////////////////////////////////////////////////////
#include "bsp_cs1232.h"
///TS_cs1232_ ts_adc;///TSS_FLOW_ tss_ads;
void L0_ADS1213_mode(vtype mode)
{
switch(mode)
{
case D_ADS1213_POWERDOWN:
D_ADC_SCLK1_CLOSE();
D_ADC_DOUT1_CLOSE();
D_ADC_SCLK2_CLOSE();
D_ADC_DOUT2_CLOSE();
D_ADC_SCLK3_CLOSE();
D_ADC_DOUT3_CLOSE();
D_ADC_SCLK4_CLOSE();
D_ADC_DOUT4_CLOSE();
D_ADC_POWERDOWN();
L0_uart0_uc('d');
break;
case D_ADS1213_GAIN_128:
D_ADC_GAIN0_128();
L0_uart0_uc('8');
break;
case D_ADS1213_GAIN_64:
D_ADC_GAIN0_64();
L0_uart0_uc('6');
break;
default:
D_ADC_GAIN0_64();
L0_uart0_uc('q');
break;
};
}
void L0_ADS1213_INIT(vtype mode)
{
D_ADC_GAIN0_INIT();
D_ADC_SCLK1_INIT();
D_ADC_DOUT1_INIT();
D_ADC_SCLK2_INIT();
D_ADC_DOUT2_INIT();
D_ADC_SCLK3_INIT();
D_ADC_DOUT3_INIT();
D_ADC_SCLK4_INIT();
D_ADC_DOUT4_INIT();
D_ADC_PDWN_INIT();
D_ADC_PD_WACKUP();
L0_ADS1213_mode(mode);
}
void L0_adc_SCLK(vtype ch,vtype onf)
{
switch (ch)
{
case D_ADCCH_1:
if(onf){D_ADC_SCLK1_ON();}else{D_ADC_SCLK1_OFF();}
break;
case D_ADCCH_2:
if(onf){D_ADC_SCLK2_ON();}else{D_ADC_SCLK2_OFF();}
break;
case D_ADCCH_3:
if(onf){D_ADC_SCLK3_ON();}else{D_ADC_SCLK3_OFF();}
break;
case D_ADCCH_4:
if(onf){D_ADC_SCLK4_ON();}else{D_ADC_SCLK4_OFF();}
break;
default:
break;
}
}
vtype L0_adc_DOUT_AT(vtype ch)
{
vtype r = 9;
switch (ch)
{
case D_ADCCH_1:
r = D_ADC_DOUT1_AT();
break;
case D_ADCCH_2:
r = D_ADC_DOUT2_AT();
break;
case D_ADCCH_3:
r = D_ADC_DOUT3_AT();
break;
case D_ADCCH_4:
r = D_ADC_DOUT4_AT();
break;
default:
break;
}
return r;
}
void L0_ADS1231_readCH2(vtype ch,vU32 *d)
{
u8 i = 0;
vU32 rdata;
/// vU16 t16;
rdata = 0;
for(i = 0; i < 24; i++)
{
L0_adc_SCLK(ch,1);/// D_ADC_SCLK1_ON();
rdata <<= 1;
L0_adc_SCLK(ch,0);///D_ADC_SCLK1_OFF();
if(L0_adc_DOUT_AT(ch))
{
rdata += 1;
}
}
///25 puls make DOUT high
L0_adc_SCLK(ch,1);
///FF84 CC09 FF84 CC09
L0_adc_SCLK(ch,0);
*d = rdata;
}
#if 0
void L0_ADS1231_readCH2555(vtype ch,vU16 *d)
{
u8 i = 0;
vU32 rdata;
vU16 t16;
rdata = 0;
for(i = 0; i < 24; i++)
{
L0_adc_SCLK(ch,1);/// D_ADC_SCLK1_ON();
rdata <<= 1;
L0_adc_SCLK(ch,0);///D_ADC_SCLK1_OFF();
if(L0_adc_DOUT_AT(ch))
{
rdata += 1;
}
}
///25 puls make DOUT high
L0_adc_SCLK(ch,1);
///FF84 CC09 FF84 CC09
L0_uart0_uc('0'+ch); L0_uart0_uc(0x09);
L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
if (rdata > 0x007fFFff)
{
rdata >>= D_sensor_zoom; ///fixme:此处正负差和移位不一致需要谨慎
rdata |= D_sensor_zoom_FF; /// 1111 1100
}else
{
rdata >>= D_sensor_zoom;
}
// L0_uart0_ulhex(rdata); L0_uart0_uc(0x09);
t16 = rdata;
// L0_uart0_ushex(t16); L0_uart0_uc(0x09);
///L0_uart0_0d0a();
if(t16 & 0x8000) //最高位为1,<0则
{
t16 = 0xffFF - t16;///转变为正数
///*d = D_ADC_OFFSET - t16;
*d = D_ADC_OFFSET - t16;
}else
{
*d = t16 + D_ADC_OFFSET;
}
// L0_uart0_ushex(*d); L0_uart0_0d0a();
L0_adc_SCLK(ch,0);
}
#endif
/*********************************end file*********************************************/
//#define D_ADC_GATHER_Way1 1
#if 0
//调试阻塞读
vS32 L0_ADS1231_read(U8 ch)
{
vU32 e = 0;u8 i;vS32 rdata = 0;
while(1 == L0_2dc_DOUT_AT(ch))
{
if(e ++ > 100000)
{
//return 0;
}
}
for(i = 0; i < 24; i++)
{
L0_2dc_SCLK(ch,1);
rdata <<= 1;
L0_2dc_SCLK(ch,0);
if(L0_2dc_DOUT_AT(ch))
{
rdata += 1;
}
}
L0_2dc_SCLK(ch,1);
if(rdata & 0x800000) //???λ?1??<0??
{
rdata |= 0xFF000000;
}
return rdata;
}
void L1_ADS1213_main(void)
{
U8 ch = D_ADCCH_2;
while(1)
{
while(1 == L0_2dc_DOUT_AT(ch))
;
tss_ads.u32_i = L0_ADS1231_readCH(ch);
tss_ads.u16_v = (vU16)( tss_ads.u32_i >> 16);
L0_uart0_ushex(tss_ads.u16_v);
tss_ads.u16_v = (vU16)(tss_ads.u32_i & 0x0000ffff);
L0_uart0_ushex(tss_ads.u16_v);//Lc_delay_us(500);
L0_uart0_uc(0x0d); L0_uart0_uc(0x0a);
}
}
u8 Read_byte_adcIC(void)
{
u8 i;
u8 rdata = 0; //初始化返回值为 0
for(i = 0; i < 8; i++)
{
D_ADC_SCLK1_ON();
rdata <<= 1; //返回值左移 1 位
/// CS1231_Clk(); //上升沿接收数据,下降沿更新数据
D_ADC_SCLK1_OFF();
if(D_ADC_DOUT1_AT())
{
rdata += 1; //若数据线上数据为 1,则返回值加 1
}
}
return(rdata);
}
void L0_ADS1213_CH(u8 ch)
{
/// /// SPEED = 1 57--57 ms 硬件配置成高电平
D_ADC_PDWN_OFF();
switch(ch)
{
case D_ADCCH_T:
L0_ADS1213_T(1);
break;
case D_ADCCH_1:
D_ADC_CS_A0_OFF();
break;
case D_ADCCH_2:
D_ADC_CS_A0_ON();
break;
case D_ADCCH_3:
//D_ADC_CS2_A0_OFF();
break;
case D_ADCCH_4:
//D_ADC_CS2_A0_ON();
break;
default:///
L0_ADS1213_T(0);
break;
};
Lc_delay_us(50);
D_ADC_PDWN_ON();
}
//channel-温度
void L0_ADS1213_T(u8 onff)
{
if(onff)
{
D_ADC_PDWN_OFF();
D_ADC_TEMP_ON();
Lc_delay_us(50);
D_ADC_PDWN_ON();
}
else
{
D_ADC_PDWN_OFF();
D_ADC_TEMP_OFF();
Lc_delay_us(50);
D_ADC_PDWN_ON();
}
}
#endif
/*********************************************/

212
source/bsp/backu/bsp_cs1232.h

@ -0,0 +1,212 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2020, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file cs1232.h
/// @brief hard cs1232 include
/// @info FILE FOR HARDWARE cs1232
///-------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
/// @version 1.0
/// @author CC
/// @date 20200530
/// @note
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#ifndef _BSP_cs1232_H
#define _BSP_cs1232_H
#include "../bsp/bsp_config.h"
#include "msp_uart0.h"
#include "TTSS_task.h"
#define D_ADCCH_1 0
#define D_ADCCH_2 1
#define D_ADCCH_3 2
#define D_ADCCH_4 3
#define D_ADCCH_T 8
#define D_ADCCH_Toff 9
///数字部分需要有四个数据转换周期满足模拟输入信号的建立和滤波器的建立时间要求。芯
///片从外部差分输入信号切换到温度传感器、从温度传感器切换到外部差分输入信号,或通
///道间切换,到新的正确的数据到来都需要四个数据转换周期。整个建立过程如下图所示:
///A0/TEMP _______________/````````
///'DRDY/DOUT----------------/``\'
///改变 A0 或 TEMP 后的建立时间 40--50 us
//// 建立时间 ( 保持高电 平)
/// SPEED = 1 57--57 ms
/// SPEED = 0 407--407 ms
////值是在 fclk=4.9152MHz 时对应的值,不同的 fclk 频率,数值等比例变化
/// CS1232 在连续转换过程中,若外部差分输入信号发生突然变化,同样需要建立时间。突变
///的信号需要 4 个转换周期进行建立,第 5 个转换周期得到最终的 AD 值。图 7 描述突变信
///号建立的过程。若在建立的过程中,信号再发生突变,则忽略之前的建立,需要新的 4 个
///转换周期进行建立,之后紧接着的第 5 个转换周期得到最终的 AD 值。
/// 内部振荡器频率 4.6 5 5.4 MHz
/// 内置时钟温漂 250 ppm/℃----40``85 125*250= 31250 /1000000 = 0.03125 变化为3.125%
/// 电阻的2113温度系数值(TCR)的单位为PPM或者PPM/摄氏度5261。
/// 其含义为当温度上升或者下降1摄氏度时,电阻的41021653阻值的变化为百万分之几。
/// 例如15PPM 1kΩ的 0.1%精度的电阻,如下图。
/// 温漂的含义在这回里为,当温度上升或下降1摄氏度时,阻值上升或者降低,百万分之答15.
//// 温度系数:±ppm/℃,bai即单位温度引起的电阻值的变化。ppm(Part Per Million)表示百万分之几,
////比如:标称阻值为1k的电du阻,温度系数为±100ppm/℃,意为温度变化一摄zhi氏度,
///电阻值的变化为1k±0.1Ω,变化100℃,阻值变化为1k±10Ω,精度非常高了。
////电阻的温度系数精密级的在几十ppm,普通dao的是200~250ppm,最差的也不过500ppm。
#define D_adc_delay() Lc_delay_nop(2)
#define D_adc_delay2() Lc_delay_nop(1)
/**************
IO DEFINE PIN
P1.0 DOUT2 1
P1.6 SCLK2 2
P1.7 LED1 3
P5.4 LED2 7
P5.5 485_RE 9
P1.1 PDWN 20
P1.2 GAIN0 19
P3.7 DOUT3 18
P3.6 DOUT1 17
P3.5 SCLK1 16
P3.4 SCLK3 15
P3.3 DOUT4 14
P3.2 SCLK4 13
P3.1 TXD0 12
P3.0 RXD0 11
*****************/
#define D_ADC_SCLK1_INIT() D_stdIO_P3(BITN5);D_ADC_SCLK1_OFF();
#define D_ADC_SCLK1_CLOSE() D_HighR_P3(BITN5);
#define D_ADC_SCLK1_ON() D_P35_ON();D_adc_delay2();
#define D_ADC_SCLK1_OFF() D_P35_OFF();D_adc_delay();
//#define D_ADC_DOUT1_INIT() D_stdIO_P3(BITN6);
#define D_ADC_DOUT1_INIT() D_HighR_P3(BITN6);
#define D_ADC_DOUT1_CLOSE() D_HighR_P3(BITN6);
//#define D_ADC_DOUT1_ON() D_P36_ON()
//#define D_ADC_DOUT1_OFF() D_P36_OFF()
#define D_ADC_DOUT1_AT() D_P36_AT()
#define D_ADC_SCLK2_INIT() D_stdIO_P1(BITN6);D_ADC_SCLK2_OFF();
#define D_ADC_SCLK2_CLOSE() D_HighR_P1(BITN6);
#define D_ADC_SCLK2_ON() D_P16_ON();D_adc_delay2();
#define D_ADC_SCLK2_OFF() D_P16_OFF();D_adc_delay();
#define D_ADC_DOUT2_INIT() D_HighR_P1(BITN0);
#define D_ADC_DOUT2_CLOSE() D_HighR_P1(BITN0);
#define D_ADC_DOUT2_ON() D_P10_ON()
#define D_ADC_DOUT2_OFF() D_P10_OFF()
#define D_ADC_DOUT2_AT() D_P10_AT()
#define D_ADC_SCLK3_INIT() D_stdIO_P3(BITN4);D_ADC_SCLK3_OFF();
#define D_ADC_SCLK3_CLOSE() D_HighR_P3(BITN4);
#define D_ADC_SCLK3_ON() D_P34_ON();D_adc_delay2();
#define D_ADC_SCLK3_OFF() D_P34_OFF();D_adc_delay();
#define D_ADC_DOUT3_INIT() D_HighR_P3(BITN7);
#define D_ADC_DOUT3_CLOSE() D_HighR_P3(BITN7);
#define D_ADC_DOUT3_ON() D_P37_ON()
#define D_ADC_DOUT3_OFF() D_P37_OFF()
#define D_ADC_DOUT3_AT() D_P37_AT()
#define D_ADC_SCLK4_INIT() D_stdIO_P3(BITN2);D_ADC_SCLK4_OFF();
#define D_ADC_SCLK4_CLOSE() D_HighR_P3(BITN2);
#define D_ADC_SCLK4_ON() D_P32_ON();D_adc_delay2();
#define D_ADC_SCLK4_OFF() D_P32_OFF();D_adc_delay();
#define D_ADC_DOUT4_INIT() D_HighR_P3(BITN3);
#define D_ADC_DOUT4_CLOSE() D_HighR_P3(BITN3);
#define D_ADC_DOUT4_ON() D_P33_ON()
#define D_ADC_DOUT4_OFF() D_P33_OFF()
#define D_ADC_DOUT4_AT() D_P33_AT()
#define D_ADC_GAIN0_INIT() D_stdIO_P1(BITN2)
#define D_ADC_GAIN0_CLOSE() D_HighR_P1(BITN2)
#define D_ADC_GAIN0_128() D_P12_ON()
#define D_ADC_GAIN0_64() D_P12_OFF()
#define D_ADC_PDWN_INIT() D_stdIO_P1(BITN1)
#define D_ADC_PDWN_CLOSE() D_HighR_P1(BITN1)
#define D_ADC_PD_WACKUP() D_P11_ON() //唤醒时间至少5.6ms
#define D_ADC_POWERDOWN() D_P11_OFF() ///持续26us以上
#define D_ADS1213_GAIN_64 64
#define D_ADS1213_GAIN_128 1
#define D_ADS1213_POWERDOWN 0
#define D_ADS1213_GAIN_VAL 128///FIXME
///xxxxxxxxxxxxxxxxxxxxxextern void L0_ADS1213_INIT(void);
extern void L0_ADS1213_INIT(vtype mode);
///void L0_ADS1231_readCH2(vtype ch,vU32 *rdata);
///void L0_ADS1231_readCH2(vtype ch,vU16 *d);
void L0_ADS1231_readCH2(vtype ch,vU32 *d);
extern vtype L0_adc_DOUT_AT(vtype ch);
#endif//_BSP_cs1232_H
/*********************************end file*********************************************/
/*******
extern void L1_ADS1213_main(void);
extern void L0_ADS1213_T(u8 onff);
extern void L0_ADS1213_CH(u8 ch);
//extern vS32 L0_ADS1213_read1(U8 *error);
//extern vS32 L0_ADS1213_read2(U8 *error);
//extern vS32 L0_ADS1213_read(U8 ch,U8 *error);
//extern U8 L0_ADS1213_is_low(U8 ch);
//extern U8 L0_ADS1213_is_high(U8 ch);
extern void L0_adc_SCLK(vtype ch,vtype onf);
extern vS32 L0_ADS1231_readCH(vtype ch);
extern vS32 L0_ADS1231_read(U8 ch);
typedef struct
{
// TS_task task;
vU8 t_stamp;
vU16 t_stamp2;
vU16 wakeup_timer;
vU32 u32_adc;//
/// vU8 long_hit;
// vU8 first_run;
vU32 u32_i;//
vU32 u32_m;//
vU16 u16_v;//
// unsigned char status;//
// unsigned char key;//
}TS_cs1232_;
extern TS_cs1232_ ts_adc;
*******/

53
source/bsp/backu/bsp_func.c

@ -0,0 +1,53 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_func.c
/// @brief bsp @ fuctiong ; io复用选择等,和cpu型号息息相关
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20180308
/// @note cc_AS_stc02
//////////////////////////////////////////////////////////////////////////////
#include "bsp_func.h"
#include "../msp/uart0.h"
//#include "../tpc/tpc_modbus.h"
///struct _s_sysclk s_sysclk;
////MCLK0 配置 不需要的时候关闭以节约电
void L0_MCLKO_init(U8 onf)
{
BITN_1(P_SW2,EAXFR);
CKSEL &= B0000_0011;
if (D_ON == onf)
{
///-----------------------------------------------------
// p107@stc8.pdf
///step 1 :设置system out clock
//BITS_CLR(CKSEL,BITC_4,BIT4); /// 对REG的 从BITx开始 清除 N位
///多位配置,一定要配对使用,先清除再设置。
BITS_SET(CKSEL,D_CLKODIV_DIV8);/// sytem out clock 300k
///step 2 :设置IO
BITN_0(CKSEL,MCLKO_S);/// P5.4 SELECTED
BITN_0(P5M1,BITN4);BITN_1(P5M0,BITN4);/// 01 推挽
}
else
{
BITS_CLR(CKSEL,BITC_4,BIT4);
BITN_1(P5M1,BITN4);BITN_0(P5M0,BITN4);/// 00 准双向口01 推挽输出10 高阻11 开漏
//// 32k 下L1_task_Tdelay(D_Tdelay_ms); 变成了大约8s
///fixme
/// BITN_1(P5M1,BITN4);BITN_0(P5M0,BITN4);/// 00 准双向口01 推挽输出10 高阻11 开漏
///? 使用10 功耗增加11.130 使用01 功耗为10.65
//P54 = 1; 推挽 居然比高阻省电 另外推挽下面 =1比=0省电 10uA
}
BITN_0(P_SW2,EAXFR);
}

52
source/bsp/backu/bsp_func.h

@ -0,0 +1,52 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2018, ´«¿Ø¿Æ¼¼ All rights reserved.
///-------------------------------------------------------------------------
/// @file bsp_func.c
/// @brief bsp_func
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20170122
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
#ifndef _bsp_func_H
#define _bsp_func_H
#include "../bsp/bsp_config.h"
#include "../clib/bit.h"
struct _s_sysclk
{
U32 m;
U32 clk;
U32 out;
};
extern struct _s_sysclk s_sysclk;
#define P3130 0
//#define P1617 0
#define P3736 1
extern void L0_MCLKO_init(U8 onf);
#define D_CLKODIV_NONE 0
#define D_CLKODIV_DIV1 B0001_0000
#define D_CLKODIV_DIV2 B0010_0000
#define D_CLKODIV_DIV4 B0100_0000
#define D_CLKODIV_DIV8 B0110_0000
#define D_CLKODIV_DIV16 B1000_0000
#define D_CLKODIV_DIV32 B1010_0000
#define D_CLKODIV_DIV64 B1100_0000
#define D_CLKODIV_DIV128 B1110_0000
#define D_CLKODIV_MCLKO_S BITN3
#define D_CLKODIV_MCKSEL_IN24M B0000_0000
#define D_CLKODIV_MCKSEL_EXTERN B0000_0001
#define D_CLKODIV_MCKSEL_IN32K B0000_0011
#endif // #ifndef _bsp_func_H

773
source/bsp/backu/bsp_gc032a.c

@ -0,0 +1,773 @@
#include "bsp_gc032a.h"
#if 0
const U8 GC6133_init_reg_sys[][2]= {
/*System*/
{0xf3,0xff},
{0xf5,0x06},
{0xf7,0x01},
{0xf9,0xce},
{0xfa,0x00},
//1002 {0xf8,0x03},//////分频 {0xf8,0x03},
{0xf8,0x0f},//////分频 {0xf8,0x03},
// {0xfa,D_0xfa}, // cc add
/// {0xfd,D_0xfa}, // cc add
/// {0xfa,D_0xfa}, // cc add
/// {0xfd,D_0xfa}, // cc add
///20181002启动时使用较高频率 当启动后恢复低频率
{0xfc,0x02},
{0x00,0x00}
/// ///20181003
//
};
const U8 GC6133_init_reg_tbl[][2]= {
{0xfe,0x02},//page 2
{0x81,0x03},
{0xfe,0x00},
{0x77,0x64},
{0x78,0x40},
{0x79,0x60},
/*ANALOG & CISCTL*/
{0xfe,0x00},//page 0
{0x03,0x01},
{0x04,0xce},
{0x05,0x01},
{0x06,0xad},
{0x07,0x00},
{0x08,0x10},
{0x0a,0x00},
{0x0c,0x00},
{0x0d,0x01},
{0x0e,0xe8},
{0x0f,0x02},
{0x10,0x88},
{0x17,0x54},
{0x19,0x08},
{0x1a,0x0a},
{0x1f,0x40},
{0x20,0x30},
{0x2e,0x80},
{0x2f,0x2b},
{0x30,0x1a},
{0xfe,0x02},
{0x03,0x02},
{0x05,0xd7},
{0x06,0x60},
{0x08,0x80},
{0x12,0x89},
/* BLK*/
{0xfe,0x00},//page 1
{0x18,0x02},
{0xfe,0x02},//page 2
{0x40,0x22},
{0x45,0x00},
{0x46,0x00},
{0x49,0x20},
{0x4b,0x3c},
{0x50,0x20},
{0x42,0x10},
/*ISP*/
{0xfe,0x01},//page 1
{0x0a,0xc5},
{0x45,0x00},
{0xfe,0x00},//page 0
{0x40,0xff},
{0x41,0x25},
{0x42,0xcd},///cc201805 close AWB{0x42,0xcf},
/// {0x44,0x83},///P0:0x44 Output_format [7] YUV420_row_switch 5’h03: Y Cr Y Cb
{0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5’h10: only Y
{0x43,0x12},////{0x43,D_P00x43},// ///EABLE CrCb fixed en 02
/** P0:0x43 special_effect 7 0x00 RW [7] NA
[6] subsample2
[5] subsample4
[4] GAMMA_en
[3:2] only_edge_map
[1] CrCb_ fixed_en
[0] inverse color*/
{0xda,0x00},
{0xdb,0x00},
/////{0x46,0x22},
////-------------------------------------
{0x46,B0010_1000},// hs high pclk polarity {0x46,0x22},
/* P0:0x46 sync_mode 8 0x0f RW
[7] data delay half
[6] hsync delay half
[5] odd_even_col_switch
[4] odd_even_row_switch
[3] opclk gated in HB
[2] opclk polarity
[1] hsync polarity
[0] vsync polarity*/
// {0x4c,D_P00x4c},//lsc test image
// {0x4D,0xfc},//lsc test image
// {0x4a,0x86},//////div_gate+clk_en 82
/**P0:0x4a Clock_gating_e
n
8 0x82 RW [7] ISP quiet mode
[6] close AAA pclk
[5]vb change
[4]vb chang flop
---------------------
[3]hb change
[2] DIV_gatedclk_en
[1] exception
[0] AEC_delay_mode*/
////-------------------------------------
{0x49,0x03},
{0x52,0x02},
{0x54,0x00},
{0xfe,0x02},
{0x22,0xf6},
/*Shading*/
{0xfe,0x01},//page 1
{0xc1,0x38},
{0xc2,0x4c},
{0xc3,0x00},
{0xc4,0x32},
{0xc5,0x24},
{0xc6,0x16},
{0xc7,0x08},
{0xc8,0x08},
{0xc9,0x00},
{0xca,0x20},
{0xdc,0x8a},
{0xdd,0xa0},
{0xde,0xa6},
{0xdf,0x75},
/*AWB*//*20170110*/
{0xfe, 0x01},//page 1
{0x7c, 0x09},
{0x65, 0x06},
{0x7c, 0x08},
{0x56, 0xf4},
{0x66, 0x0f},
{0x67, 0x84},
{0x6b, 0x80},
{0x6d, 0x12},
{0x6e, 0xb0},
{0xfe, 0x01},
{0x90, 0x00},
{0x91, 0x00},
{0x92, 0xf4},
{0x93, 0xd5},
{0x95, 0x0f},
{0x96, 0xf4},
{0x97, 0x2d},
{0x98, 0x0f},
{0x9a, 0x2d},
{0x9b, 0x0f},
{0x9c, 0x59},
{0x9d, 0x2d},
{0x9f, 0x67},
{0xa0, 0x59},
{0xa1, 0x00},
{0xa2, 0x00},
{0x86, 0x00},
{0x87, 0x00},
{0x88, 0x00},
{0x89, 0x00},
{0xa4, 0x00},
{0xa5, 0x00},
{0xa6, 0xd4},
{0xa7, 0x9f},
{0xa9, 0xd4},
{0xaa, 0x9f},
{0xab, 0xac},
{0xac, 0x9f},
{0xae, 0xd4},
{0xaf, 0xac},
{0xb0, 0xd4},
{0xb1, 0xa3},
{0xb3, 0xd4},
{0xb4, 0xac},
{0xb5, 0x00},
{0xb6, 0x00},
{0x8b, 0x00},
{0x8c, 0x00},
{0x8d, 0x00},
{0x8e, 0x00},
{0x94, 0x50},
{0x99, 0xa6},
{0x9e, 0xaa},
{0xa3, 0x0a},
{0x8a, 0x00},
{0xa8, 0x50},
{0xad, 0x55},
{0xb2, 0x55},
{0xb7, 0x05},
{0x8f, 0x00},
{0xb8, 0xb3},
{0xb9, 0xb6},
/*CC*/
{0xfe,0x01},//page 0
{0xd0,0x40},
{0xd1,0xf8},
{0xd2,0x00},
{0xd3,0xfa},
{0xd4,0x45},
{0xd5,0x02},
{0xd6,0x30},
{0xd7,0xfa},
{0xd8,0x08},
{0xd9,0x08},
{0xda,0x58},
{0xdb,0x02},
{0xfe,0x00},
/*Gamma*/
{0xfe,0x00},//page 0
{0xba,0x00},
{0xbb,0x04},
{0xbc,0x0a},
{0xbd,0x0e},
{0xbe,0x22},
{0xbf,0x30},
{0xc0,0x3d},
{0xc1,0x4a},
{0xc2,0x5d},
{0xc3,0x6b},
{0xc4,0x7a},
{0xc5,0x85},
{0xc6,0x90},
{0xc7,0xa5},
{0xc8,0xb5},
{0xc9,0xc2},
{0xca,0xcc},
{0xcb,0xd5},
{0xcc,0xde},
{0xcd,0xea},
{0xce,0xf5},
{0xcf,0xff},
/*Auto Gamma*/
{0xfe,0x00},
{0x5a,0x08},
{0x5b,0x0f},
{0x5c,0x15},
{0x5d,0x1c},
{0x5e,0x28},
{0x5f,0x36},
{0x60,0x45},
{0x61,0x51},
{0x62,0x6a},
{0x63,0x7d},
{0x64,0x8d},
{0x65,0x98},
{0x66,0xa2},
{0x67,0xb5},
{0x68,0xc3},
{0x69,0xcd},
{0x6a,0xd4},
{0x6b,0xdc},
{0x6c,0xe3},
{0x6d,0xf0},
{0x6e,0xf9},
{0x6f,0xff},
/*Gain*/
{0xfe,0x00},
{0x70,0x50},
/*AEC*/
{0xfe,0x00},//page 0
{0x4f,0x00},///cc201805 close ACE /// {0x4f,0x01},
{0xfe,0x01},//page 1
{0x0d,0x00},//08 add 20170110
{0x12,0xa0},
{0x13,0x3a},
{0x44,0x04},
{0x1f,0x30},
{0x20,0x40},
{0x26,0x9a},
{0x3e,0x20},
{0x3f,0x2d},
{0x40,0x40},
{0x41,0x5b},
{0x42,0x82},
{0x43,0xb7},
{0x04,0x0a},
{0x02,0x79},
{0x03,0xc0},
/*measure window*/
{0xfe,0x01},//page 1
{0xcc,0x08},
{0xcd,0x08},
{0xce,0xa4},
{0xcf,0xec},
/*DNDD*/
{0xfe,0x00},
{0x81,0xb8},
{0x82,0x12},
{0x83,0x0a},
{0x84,0x01},
{0x86,0x50},
{0x87,0x18},
{0x88,0x10},
{0x89,0x70},
{0x8a,0x20},
{0x8b,0x10},
{0x8c,0x08},
{0x8d,0x0a},
/*Intpee*/
{0xfe,0x00},
{0x8f,0xaa},
{0x90,0x9c},
{0x91,0x52},
{0x92,0x03},
{0x93,0x03},
{0x94,0x08},
{0x95,0x44},
{0x97,0x00},
{0x98,0x00},
/*ASDE*/
{0xfe,0x00},
{0xa1,0x30},
{0xa2,0x41},
{0xa4,0x30},
{0xa5,0x20},
{0xaa,0x30},
{0xac,0x32},
/*YCP*/
{0xfe,0x00},
{0xd1,0x3c},
{0xd2,0x3c},
{0xd3,0x38},
{0xd6,0xf4},
{0xd7,0x1d},
{0xdd,0x73},
{0xde,0x84},
/*Banding*/
{0xfe,0x00},
{0x05,0x01},
{0x06,0xad},
{0x07,0x00},
{0x08,0x10},
{0xfe,0x01},
{0x25,0x00},
{0x26,0x9a},
{0x27,0x01},
{0x28,0xce},
{0x29,0x03},
{0x2a,0x02},
{0x2b,0x04},
{0x2c,0x36},
{0x2d,0x07},
{0x2e,0xd2},
{0x2f,0x0b},
{0x30,0x6e},
{0x31,0x0e},
{0x32,0x70},
{0x33,0x12},
{0x34,0x0c},
{0x3c,0x30},
{0xfe,0x00},
{0x00,0x00}
};
#else
const U8 code GC6133_init_reg_tbl[][2]= {
/*System*/
{0xf3,0xff},
{0xf5,0x06},
{0xf7,0x01},
{0xf9,0xce},
{0xfa,0x00},
//1002 {0xf8,0x03},//////分频 {0xf8,0x03},
{0xf8,0x0f},//////分频 {0xf8,0x03},
// {0xfa,D_0xfa}, // cc add
/// {0xfd,D_0xfa}, // cc add
/// {0xfa,D_0xfa}, // cc add
/// {0xfd,D_0xfa}, // cc add
///20181002启动时使用较高频率 当启动后恢复低频率
{0xfc,0x02},
{0xfe,0x02},//page 2
{0x81,0x03},
{0xfe,0x00},
{0x77,0x64},
{0x78,0x40},
{0x79,0x60},
/*ANALOG & CISCTL*/
{0xfe,0x00},//page 0
{0x03,0x01},
{0x04,0xce},
{0x05,0x01},
{0x06,0xad},
{0x07,0x00},
{0x08,0x10},
{0x0a,0x00},
{0x0c,0x00},
{0x0d,0x01},
{0x0e,0xe8},
{0x0f,0x02},
{0x10,0x88},
{0x17,0x54},
{0x19,0x08},
{0x1a,0x0a},
{0x1f,0x40},
{0x20,0x30},
{0x2e,0x80},
{0x2f,0x2b},
{0x30,0x1a},
{0xfe,0x02},
{0x03,0x02},
{0x05,0xd7},
{0x06,0x60},
{0x08,0x80},
{0x12,0x89},
/* BLK*/
{0xfe,0x00},//page 1
{0x18,0x02},
{0xfe,0x02},//page 2
{0x40,0x22},
{0x45,0x00},
{0x46,0x00},
{0x49,0x20},
{0x4b,0x3c},
{0x50,0x20},
{0x42,0x10},
/*ISP*/
{0xfe,0x01},//page 1
{0x0a,0xc5},
{0x45,0x00},
{0xfe,0x00},//page 0
{0x40,0xff},
{0x41,0x25},
{0x42,0xcd},///cc201805 close AWB{0x42,0xcf},
/// {0x44,0x83},///P0:0x44 Output_format [7] YUV420_row_switch 5’h03: Y Cr Y Cb
{0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5’h10: only Y
{0x43,0x12},////{0x43,D_P00x43},// ///EABLE CrCb fixed en 02
/** P0:0x43 special_effect 7 0x00 RW [7] NA
[6] subsample2
[5] subsample4
[4] GAMMA_en
[3:2] only_edge_map
[1] CrCb_ fixed_en
[0] inverse color*/
{0xda,0x00},
{0xdb,0x00},
/////{0x46,0x22},
////-------------------------------------
{0x46,B0010_1000},// hs high pclk polarity {0x46,0x22},
/* P0:0x46 sync_mode 8 0x0f RW
[7] data delay half
[6] hsync delay half
[5] odd_even_col_switch
[4] odd_even_row_switch
[3] opclk gated in HB
[2] opclk polarity
[1] hsync polarity
[0] vsync polarity*/
// {0x4c,D_P00x4c},//lsc test image
// {0x4D,0xfc},//lsc test image
// {0x4a,0x86},//////div_gate+clk_en 82
/**P0:0x4a Clock_gating_e
n
8 0x82 RW [7] ISP quiet mode
[6] close AAA pclk
[5]vb change
[4]vb chang flop
---------------------
[3]hb change
[2] DIV_gatedclk_en
[1] exception
[0] AEC_delay_mode*/
////-------------------------------------
{0x49,0x03},
{0x52,0x02},
{0x54,0x00},
{0xfe,0x02},
{0x22,0xf6},
/*Shading*/
{0xfe,0x01},//page 1
{0xc1,0x38},
{0xc2,0x4c},
{0xc3,0x00},
{0xc4,0x32},
{0xc5,0x24},
{0xc6,0x16},
{0xc7,0x08},
{0xc8,0x08},
{0xc9,0x00},
{0xca,0x20},
{0xdc,0x8a},
{0xdd,0xa0},
{0xde,0xa6},
{0xdf,0x75},
/*AWB*//*20170110*/
{0xfe, 0x01},//page 1
{0x7c, 0x09},
{0x65, 0x06},
{0x7c, 0x08},
{0x56, 0xf4},
{0x66, 0x0f},
{0x67, 0x84},
{0x6b, 0x80},
{0x6d, 0x12},
{0x6e, 0xb0},
{0xfe, 0x01},
{0x90, 0x00},
{0x91, 0x00},
{0x92, 0xf4},
{0x93, 0xd5},
{0x95, 0x0f},
{0x96, 0xf4},
{0x97, 0x2d},
{0x98, 0x0f},
{0x9a, 0x2d},
{0x9b, 0x0f},
{0x9c, 0x59},
{0x9d, 0x2d},
{0x9f, 0x67},
{0xa0, 0x59},
{0xa1, 0x00},
{0xa2, 0x00},
{0x86, 0x00},
{0x87, 0x00},
{0x88, 0x00},
{0x89, 0x00},
{0xa4, 0x00},
{0xa5, 0x00},
{0xa6, 0xd4},
{0xa7, 0x9f},
{0xa9, 0xd4},
{0xaa, 0x9f},
{0xab, 0xac},
{0xac, 0x9f},
{0xae, 0xd4},
{0xaf, 0xac},
{0xb0, 0xd4},
{0xb1, 0xa3},
{0xb3, 0xd4},
{0xb4, 0xac},
{0xb5, 0x00},
{0xb6, 0x00},
{0x8b, 0x00},
{0x8c, 0x00},
{0x8d, 0x00},
{0x8e, 0x00},
{0x94, 0x50},
{0x99, 0xa6},
{0x9e, 0xaa},
{0xa3, 0x0a},
{0x8a, 0x00},
{0xa8, 0x50},
{0xad, 0x55},
{0xb2, 0x55},
{0xb7, 0x05},
{0x8f, 0x00},
{0xb8, 0xb3},
{0xb9, 0xb6},
/*CC*/
{0xfe,0x01},//page 0
{0xd0,0x40},
{0xd1,0xf8},
{0xd2,0x00},
{0xd3,0xfa},
{0xd4,0x45},
{0xd5,0x02},
{0xd6,0x30},
{0xd7,0xfa},
{0xd8,0x08},
{0xd9,0x08},
{0xda,0x58},
{0xdb,0x02},
{0xfe,0x00},
/*Gamma*/
{0xfe,0x00},//page 0
{0xba,0x00},
{0xbb,0x04},
{0xbc,0x0a},
{0xbd,0x0e},
{0xbe,0x22},
{0xbf,0x30},
{0xc0,0x3d},
{0xc1,0x4a},
{0xc2,0x5d},
{0xc3,0x6b},
{0xc4,0x7a},
{0xc5,0x85},
{0xc6,0x90},
{0xc7,0xa5},
{0xc8,0xb5},
{0xc9,0xc2},
{0xca,0xcc},
{0xcb,0xd5},
{0xcc,0xde},
{0xcd,0xea},
{0xce,0xf5},
{0xcf,0xff},
/*Auto Gamma*/
{0xfe,0x00},
{0x5a,0x08},
{0x5b,0x0f},
{0x5c,0x15},
{0x5d,0x1c},
{0x5e,0x28},
{0x5f,0x36},
{0x60,0x45},
{0x61,0x51},
{0x62,0x6a},
{0x63,0x7d},
{0x64,0x8d},
{0x65,0x98},
{0x66,0xa2},
{0x67,0xb5},
{0x68,0xc3},
{0x69,0xcd},
{0x6a,0xd4},
{0x6b,0xdc},
{0x6c,0xe3},
{0x6d,0xf0},
{0x6e,0xf9},
{0x6f,0xff},
/*Gain*/
{0xfe,0x00},
{0x70,0x50},
/*AEC*/
{0xfe,0x00},//page 0
{0x4f,0x00},///cc201805 close ACE /// {0x4f,0x01},
{0xfe,0x01},//page 1
{0x0d,0x00},//08 add 20170110
{0x12,0xa0},
{0x13,0x3a},
{0x44,0x04},
{0x1f,0x30},
{0x20,0x40},
{0x26,0x9a},
{0x3e,0x20},
{0x3f,0x2d},
{0x40,0x40},
{0x41,0x5b},
{0x42,0x82},
{0x43,0xb7},
{0x04,0x0a},
{0x02,0x79},
{0x03,0xc0},
/*measure window*/
{0xfe,0x01},//page 1
{0xcc,0x08},
{0xcd,0x08},
{0xce,0xa4},
{0xcf,0xec},
/*DNDD*/
{0xfe,0x00},
{0x81,0xb8},
{0x82,0x12},
{0x83,0x0a},
{0x84,0x01},
{0x86,0x50},
{0x87,0x18},
{0x88,0x10},
{0x89,0x70},
{0x8a,0x20},
{0x8b,0x10},
{0x8c,0x08},
{0x8d,0x0a},
/*Intpee*/
{0xfe,0x00},
{0x8f,0xaa},
{0x90,0x9c},
{0x91,0x52},
{0x92,0x03},
{0x93,0x03},
{0x94,0x08},
{0x95,0x44},
{0x97,0x00},
{0x98,0x00},
/*ASDE*/
{0xfe,0x00},
{0xa1,0x30},
{0xa2,0x41},
{0xa4,0x30},
{0xa5,0x20},
{0xaa,0x30},
{0xac,0x32},
/*YCP*/
{0xfe,0x00},
{0xd1,0x3c},
{0xd2,0x3c},
{0xd3,0x38},
{0xd6,0xf4},
{0xd7,0x1d},
{0xdd,0x73},
{0xde,0x84},
/*Banding*/
{0xfe,0x00},
{0x05,0x01},
{0x06,0xad},
{0x07,0x00},
{0x08,0x10},
{0xfe,0x01},
{0x25,0x00},
{0x26,0x9a},
{0x27,0x01},
{0x28,0xce},
{0x29,0x03},
{0x2a,0x02},
{0x2b,0x04},
{0x2c,0x36},
{0x2d,0x07},
{0x2e,0xd2},
{0x2f,0x0b},
{0x30,0x6e},
{0x31,0x0e},
{0x32,0x70},
{0x33,0x12},
{0x34,0x0c},
{0x3c,0x30},
{0xfe,0x00},
{0x00,0x00}
};
#endif

19
source/bsp/backu/bsp_gc032a.h

@ -0,0 +1,19 @@
#ifndef _gc_032a_H_
#define _gc_032a_H_
#include "../bsp/bsp_config.h"
#include "../clib/type.h"
#include "../clib/clib.h"
#include "../ctask/tick.h"
//#define GC6133_reg_tbl_len 291 GC6133_reg_tbl_len+1
#define GC6133_reg_tbl_len (292)
extern U8 code GC6133_init_reg_tbl[][2];
#endif///_gc_032a_H_

164
source/bsp/backu/bsp_iic3.c

@ -0,0 +1,164 @@
#include "bsp_iic3.h"
///#include "gplib.h"
#define SC7A20_SLAVE_ID 0x32//0x4E ,erichan 20150529
#define G_SlaveAddr SC7A20_SLAVE_ID
static INT8U g_level;
static OS_EVENT *sw_i2c_sem = NULL;
static INT8U G_sensor_status=0;
//====================================================================================================
void I2C_delay (
INT16U i
) {
INT16U j;
for (j=0;j<(i<<8);j++)
i=i;
}
void g_delay(INT16U i)
{
INT16U k;
for(k=0;k<i;k++)
I2C_delay(100);
}
//============================================
void I2C_start (void)
{
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
I2C_delay (1);
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
I2C_delay (1);
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
I2C_delay (1);
}
//===================================================================
void I2C_stop (void)
{
I2C_delay (1);
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
I2C_delay (1);
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
I2C_delay (1);
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
I2C_delay (1);
}
//===================================================================
void I2C_w_phase (INT16U value)
{
INT16U i;
for (i=0;i<8;i++)
{
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
I2C_delay (1);
if (value & 0x80)
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA1
else
gpio_write_io(I2C_SDA, DATA_LOW); //SDA0
// sccb_delay (1);
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
I2C_delay(1);
value <<= 1;
}
// The 9th bit transmission
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
gpio_init_io(I2C_SDA, GPIO_INPUT); //SDA is Hi-Z mode
I2C_delay(1);
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
I2C_delay(1);
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
gpio_init_io(I2C_SDA, GPIO_OUTPUT); //SDA is Hi-Z mode
}
//===================================================================
INT16U I2C_r_phase (void)
{
INT16U i;
INT16U data;
gpio_init_io(I2C_SDA, GPIO_INPUT); //SDA is Hi-Z mode
data = 0x00;
for (i=0;i<8;i++)
{
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
I2C_delay(1);
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
data <<= 1;
data |=( gpio_read_io(I2C_SDA));
I2C_delay(1);
}
// The 9th bit transmission
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
gpio_init_io(I2C_SDA, GPIO_OUTPUT); //SDA is output mode
gpio_write_io(I2C_SDA, DATA_HIGH); //SDA0, the nighth bit is NA must be 1
I2C_delay(1);
gpio_write_io(I2C_SCL, DATA_HIGH); //SCL1
I2C_delay(1);
gpio_write_io(I2C_SCL, DATA_LOW); //SCL0
return data;
}
//====================================================================================================
void I2C_gpio_init (
INT32U nSCL, // Clock Port No
INT32U nSDA // Data Port No
){
//init IO
gpio_set_port_attribute(nSCL, ATTRIBUTE_HIGH);
gpio_set_port_attribute(nSDA, ATTRIBUTE_HIGH);
gpio_init_io(nSCL, GPIO_OUTPUT); //set dir
gpio_init_io(nSDA, GPIO_OUTPUT); //set dir
gpio_write_io(nSCL, DATA_HIGH); //SCL1
gpio_write_io(nSDA, DATA_HIGH); //SDA0
}
void g_sensor_write(INT8U id, INT8U addr, INT8U data)
{
// 3-Phase write transmission cycle is starting now ...
I2C_start(); // Transmission start
I2C_w_phase(id); // Phase 1: Device ID
I2C_w_phase(addr); // Phase 2: Register address. High pass filter enable
I2C_w_phase(data); // Phase 3: Data value
I2C_stop(); // Transmission stop
}
INT16U g_sensor_read(INT8U id, INT8U addr)
{
INT16U redata;
I2C_start(); // Transmission start
I2C_w_phase(id); // Phase 1: Device ID
I2C_w_phase(addr); // Phase 2: Register address. Transient source
I2C_start(); // Transmission start
I2C_w_phase(id | 0x01); // Phase 1 (read)
redata = (INT8U) I2C_r_phase(); // Phase 2
I2C_stop(); // Transmission stop
return redata;
}
void sw_i2c_lock(void)
{
INT8U err;
OSSemPend(sw_i2c_sem, 0, &err);
}
void sw_i2c_unlock(void)
{
OSSemPost(sw_i2c_sem);
}

15
source/bsp/backu/bsp_iic3.h

@ -0,0 +1,15 @@
#ifndef __DRV_L1_GSENSOR_H__
#define __DRV_L1_GSENSOR_H__
extern void sw_i2c_lock(void);
extern void sw_i2c_unlock(void);
extern void I2C_delay (INT16U i) ;
extern void I2C_start (void);
extern void I2C_stop (void);
extern void I2C_w_phase (INT16U value);
extern INT16U I2C_r_phase (void);
extern void I2C_gpio_init (INT32U nSCL,INT32U nSDA);
#endif

110
source/bsp/backu/bsp_lora.c

@ -0,0 +1,110 @@
#include "bsp_lora.h"
//#include "tpc_debug.h"
#include "tpc_lora.h"
////#include "tpc_x.h"
#include "c_lib.h"
#include "msp_uart1.h"
#include "msp_uart2.h"
#include "debug_drv.h"
u8 test[]={
0x68 ,0x00 ,0x0D ,0x90 ,0x01 ,0x61 ,0x61 ,0x62 ,0x62 ,0x63 ,0x63 ,0xEA ,0x16
//1 2 3 4 5 6 7 8 9 10 11 12 13
//0 1 2 3 4 5 6 7 8 9 10 11 12
};
u8 test2[]={
0x68 ,0x00 ,0x07 ,0x91 ,0x03 ,0x9B ,0x16
//1 2 3 4 5 6 7 8 9 10 11 12 13
//0 1 2 3 4 5 6 7 8 9 10 11 12
};
#define D_lora_reset_ON() D_P47_ON()
#define D_lora_reset_OFF() D_P47_OFF()
#define D_lora_reset(); D_stdIO_P4(BITN7); D_lora_reset_OFF();Lc_delay_ms(1);D_lora_reset_ON();Lc_delay_ms(1);
#define D_lora_wakeup_ON() D_P24_ON()
#define D_lora_wakeup_OFF() D_P24_OFF()
#define D_lora_wakeup(); D_stdIO_P2(BITN4); D_lora_wakeup_ON();Lc_delay_ms(1);D_lora_wakeup_OFF();Lc_delay_ms(1);
void L2_lora_init(void)
{
D_lora_wakeup_ON();
D_lora_reset();
}
void L3_lora_debug(u8 filter)
{
if(filter == ts_debug_rec.filter)
{///filter num d1 d2 d3 ....dn
//// FD 08 11 22 33 44 55 66 77 88 Lc_delay_ms(1);
/// L1_uartD_uchexArray(TS_s2b_debug.sp,TS_debug_rec.R1);
printf("\r\n FD ok");
switch (ts_debug_rec.ocr)
{
case 0x11:
printf("11");
D_lora_wakeup(); L0_uart2_sendArray(test, 13);
printf(" lora send ");
L1_uartD_uchexArray(test, 13);
//1 2 3 4 5 6 7 8 9 10 11 12 13
break;
case 0x12:
printf("12");
D_lora_wakeup(); L0_uart2_sendArray(test2, 7);
printf(" lora send2 ");
L1_uartD_uchexArray(test2, 7);
//1 2 3 4 5 6 7 8 9 10 11 12 13
break;
default:
printf(" pp error\r\n ");
break;
};
printf("333");
}
}
void LORA_send(void)
{
vU8 add;
ts_lrdlora_send.filter = 0x68;
//// ts_lrdlora_send.len = DATA_LORA_LEN;
ts_lrdlora_send.DIR = 1;
ts_lrdlora_send.CMD = 0x37; /// 取值范围:0x7F~0x00;
/// ts_lrdlora_send.req = 0x01;
ts_lrdlora_send.filtert = 0x16;
L0_uart1_0d0a();
///L1_uartD_sendArray(&TS_lrdlora_send.filter,1);
///L1_uartD_sendArray(&TS_lrdlora_send.len,2);
///L1_uartD_sendArray(&TS_lrdlora_send.order,1);
///L1_uartD_sendArray(&TS_lrdlora_send.REQ,1);
///L1_uartD_sendArray(&TS_lrdlora_send.buf,6);
/// add = Fun_SC_Check(&ts_lrdlora_send.buf,4);
L1_uartD_sendArray(&add,1);
ts_lrdlora_send.ocr = add;
//buf 确定长度 for(i = 0;i<len;i++)(len是buf长度)
//打包函数 把数据整合 重新定义一个结构体(输入参数)
L1_uartD_sendArray(&ts_lrdlora_send.buf,14);
L0_uart1_0d0a();
}

14
source/bsp/backu/bsp_lora.h

@ -0,0 +1,14 @@
#ifndef BSP_lora_H
#define BSP_lora_H
#include "../bsp/bsp_config.h"
#include "msp_uart1.h"
//485_RE P33
//485_DE P32
///#define D_485_TX() P55 = 1;// >750us
///#define D_485_RX() P55 = 0;
#define D_cmd_filter_lora 0xfE
extern void L2_lora_init(void);
extern void L3_lora_debug(u8 filter);
#endif

261
source/bsp/backu/bsp_msa300.c

@ -0,0 +1,261 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file msa300.c
/// @brief msa300 driver app
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20170122
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/
#include "bsp_msa300.h"
#include "../msp/uart0.h"
struct _s_gsens_ s_as;//[D_as_ch_mun];
// data*3.91mg/LSB 1g = 90 1/2g = 45 1/3g = 30 333mg/3.91mg = 85d=0x55
/// 倾斜30度就启动
//#define D_actionTH_init 0x02
#define D_actionTH_init 0x0f
//#define D_actionTH_init 0x25 /// z轴调到25算是临界值
////#define D_actionTH_init 0x0c
////#define D_actionTH_init 0x04
/// 中断持续的时间为4s 4s后中断结束 产生下降沿
// #define D_latch_time_init D_latch_4s
#define D_latch_time_init D_latch_50ms
#if 0
void L1_as_power_mode(unsigned char dev,unsigned char ps)
{
// s_as[0].reg_power
s_as[0].reg_power &= 0x3f;
s_as[0].reg_power |= ps;
L2_I2C_WriteCmd(dev,MSA_REG_POWERMODE_BW,s_as[0].reg_power); // 进入normal 模式
}
/// D_sensor_active_close();DL_ms300_int_close();
/// L1_as_WorkStatus(D_wakeup);
///extern void L1_as_WorkStatus(unsigned char d);
void L1_as_WorkStatus(unsigned char d)
{
if(D_wakeup == d)
{
/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE);
D_sensor_active_open();BITN_0(DR_who_wakeup, DRB_who_wakeup_action);
}else
{
/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,0);
D_sensor_active_close();
}
}
void L1_as_action(void)
{
L2_I2C_ReadReg(D_i2c_addr_Gsensor,MSA_REG_Tape_Active_Status,&s_as[0].reg_temp,1); /// read only
///L0_uart0_uc('.');
s_as[0].reg_temp &= B0111_0111;/// 去掉符号位
if(s_as[0].reg_action == s_as[0].reg_temp)
{
}else
{
s_as[0].action_ok = 1;
s_as[0].reg_action = s_as[0].reg_temp;
}
/// L0_uart0_uchex(s_as[0].reg_temp)
}
#endif
/// msa300 初始化 调用前必须使用iic的初始化
/// 如需使用中断 还必须EA 启动
void L1_msa300_init(void)
{
///
///step 1: 读取power reg
LD_gsensor_power(D_PowerMode_normal );
/// 上电后是standby 模式 需要设置 00:normal mode, 01:low power mode, 10/11 suspend mode
///step 2: 设置分辨率和加速度范围
/// L1_ms300_reg_set(MSA_REG_G_RANGE,((D_MSA_14BIT)|(D_MSA_2G))); // 8b8t 2g
L1_ms300_reg_set(MSA_REG_G_RANGE,((D_MSA_8BIT)|(D_MSA_2G))); // 8b8t 2g
// L1_ms300_reg_set(NSA_REG_ODR_AXIS_DISABLE,
// D_ODR_31Hz25);
///step 3: 设置 输出频率和带宽bandwidth 带宽总是输出频率的一半
/// ODR BW
/// 15.63Hz (0100) 7.81Hz
/// CLOSE Y关闭 y轴 因为模块是竖着的
L1_ms300_reg_set(MSA_REG_ODR_AXIS_DISABLE,D_AXIS_DIS_Y|D_ODR_15P63Hz);
// L1_ms300_reg_set(MSA_REG_ODR_AXIS_DISABLE,D_ODR_31Hz25);
////--------------------------------------------------------------------------
//CC-MD-VH06
/// for pcb (INT1 PIN5 ) --- SENSINT2---(P3.0 INT1)
/// (INT2 PIN6 ) --- SENSINT3---(P3.1/INT0)
///step 4: active 中断 使能XZ轴
L1_ms300_reg_set(MSA_REG_INTERRUPT_SETTINGS1,
ACTIVE_INT_EN_Y|ACTIVE_INT_EN_X); /// fixme:需要调试ACTIVE_INT_EN_Y
L1_ms300_reg_set(D_Active_TH,D_actionTH_init);
///step 5:
/// ACTIVE 中断和 single tap中断映射到 int2上,也就是int2电平变化,通知mcu处理
/// ps3.sch msa300.int1==sensint2 msa300.int2==sensint3 ---rxd
/// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING1,INT1_ACTIVE|INT1_S_TAP_INT);
// L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_ACTIVE);
L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE);
/// INT2_OD 0: push-pull
/// INT2_LVL 0: low, 1:high
/// L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,D_INT2_OD|D_INT2_LVL_low);
L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,D_INT2_pull|D_INT2_LVL_low);
///L1_ms300_reg_set(MSA_REG_INT_PIN_CONFIG,0|D_INT2_LVL_high);
////--------------------------------------------------------------------------
///step 6 : 锁定1s的时间 ···\_____1s______/````
L1_ms300_reg_set(MSA_REG_INT_LATCH,D_latch_time_init);
///L1_i2c_Configure(0);DL_ms300_int_open
///();D_sensor_active_open();
/// L1_as_WorkStatus(D_wakeup);
// LD_gsensor_power(D_PowerMode_normal );
LD_gsensor_power(D_PowerMode_low );
}
#if 0///nouse
///0x02 ACC_X[5:0] 0x00
//0x03 ACC_X[13:6] 0x00
//0x04 ACC_Y[5:0] 0x00
//0x05 ACC_Y[13:6] 0x00
//0x06 ACC_Z[5:0] 0x00
//0x07 ACC_Z[13:6] 0x00
/// 0 1 2 3 4 5
// x5:0 x13:6 y5:0 y13:6 z5:0 z13:6
void L1_as_readXYZ(unsigned char CH)
{
/**********************************************
///read data
//S ADD W A REG A
//S ADD R A D1 A D2 A.....DX N P
L2_I2C_ReadReg(D_i2c_addr_AS1,0x02,(unsigned char *)s_as[CH].d,6);
////d 0 1 2 3 4 5
//// 02 03 04 05 06 07
//// XL XH YL YH ZL ZH
///
L0_uart0_uc(0x09);
// L0_uart0_uchex(s_as[0].d[0]); L0_uart0_uc(0x09);
L0_uart0_uchex(s_as[0].d[1]); L0_uart0_uc(0x09);
// L0_uart0_uchex(s_as[0].d[2]); L0_uart0_uc(0x09);
L0_uart0_uchex(s_as[0].d[3]); L0_uart0_uc(0x09);
// L0_uart0_uchex(s_as[0].d[4]); L0_uart0_uc(0x09);
L0_uart0_uchex(s_as[0].d[5]);
/// L0_uart0_sendArray((unsigned char *)&s_as[CH],6);
L0_uart0_uc(0x0d);
L0_uart0_uc(0x0a);
Lc_delay_ms(10);
*****************************************/
}
#endif //////nouse
/*****************
L2_I2C_ReadReg(D_i2c_addr_HP303B,0x0d,d,1);
L0_MUART_uc(d[0]);
L2_I2C_ReadReg(D_i2c_addr_AS1,0x05,d,1);// 11 =0f
L0_MUART_uc(d[0]);
L2_I2C_ReadReg(D_i2c_addr_AS2,0x05,d,1);//10 =0f
L0_MUART_uc(d[0]);
L1_as1_readXYZ();
s_p_rf.ucR1 = (U8)(s_as1.x>>8);
s_p_rf.ucR2 = (U8)(s_as1.y>>8);
s_p_rf.ucR3 = (U8)(s_as1.z>>8);
p = (U8*)&s_p_rf;
L0_MUART_uc(s_p_rf.ucR1);
L0_MUART_uc(s_p_rf.ucR2);
L0_MUART_uc(s_p_rf.ucR3);
L0_MUART_uc(0xc7);
*********************/
#if 0
void L3_msa300_fun(U8 *pPara)
{
U8 val = 0;
TS_P_debug *p = pPara;
/// Ac 01 02 03 ocr ---bsp_debug.c
/// p.cmd p.R2 p.R3 p.ocr
///Ac 00 03 01 00/// ACC_X[13:6]
switch(p->cmd)
{
case 0:
/// fc 00 02 01 xx 读取reg02 中的一个数据
///0x02 ACC_X[5:0] 0x00
//0x03 ACC_X[13:6] 0x00
//0x04 ACC_Y[5:0] 0x00
//0x05 ACC_Y[13:6] 0x00
//0x06 ACC_Z[5:0] 0x00
//0x07 ACC_Z[13:6] 0x00
//// Ac 00 03 01 00/// ACC_X[13:6]
//// Ac 00 05 01 00/// ACC_Y[13:6]
//// Ac 00 07 01 00/// ACC_Z[13:6]
L2_I2C_ReadReg(D_i2c_addr_AS1,p->R2 ,&val,p->R3);
///L0_uart0_uc(p->R2);
///L0_uart0_uc(p->R3);
L0_uart0_uc(val);
break;
case 2:
///Ac 02 22 01 00/// (05)=01
L0_uart0_uc('W');
///L2_I2C_WriteCmd(D_i2c_addr_AS1,p->R2,p->R3);
//L0_uart0_uc(pPara[2]);
// L0_uart0_uc(p->R2);
// L0_uart0_uc(p->R3);
break;
case 3:
///Ac 03 22 01 00/// (05)=01
L1_as_action();
if(1 == s_as[0].action_ok)
{
s_as[0].action_ok = 0;
L0_uart0_uc(s_as[0].reg_action);
}
/*********************
L2_I2C_ReadReg(D_i2c_addr_Gsensor,MSA_REG_Tape_Active_Status,&s_as[0].reg_temp,1); /// read only
///L0_uart0_uc('.');
s_as[0].reg_temp &= B0111_0111;
if(s_as[0].reg_power == s_as[0].reg_temp)
{
}else
{
L0_uart0_uc(s_as[0].reg_temp);
s_as[0].reg_power = s_as[0].reg_temp;
}*************************/
break;
default:
break;
};
}
///#else
void L3_msa300_fun(U8 *pPara)
{
}
#endif

473
source/bsp/backu/bsp_msa300.h

@ -0,0 +1,473 @@
////////////////////////////////////////////////////////////////////////////
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
///-------------------------------------------------------------------------
/// @file msa300.c
/// @brief msa300 driver app
///-------------------------------------------------------------------------
/// @version 1.0
/// @author CC
/// @date 20170122
/// @note cc_AS_stc01
//////////////////////////////////////////////////////////////////////////////
#ifndef _MSA300_H
#define _MSA300_H
#include "../clib/bit.h"
#include "../msp/iic_sim.h"
/***********************************************************************
U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB
0x4c 0x4e
AS1 AS2
**************************************************************************/
#define D_i2c_addr_AS1 0x4c // u51
//#define D_i2c_addr_AS2 0x4e
/* Register define for NSA asic */
#define MSA_REG_SPI_I2C 0x00
#define MSA_REG_WHO_AM_I 0x01
#define MSA_REG_ACC_X_LSB 0x02
#define MSA_REG_ACC_X_MSB 0x03
#define MSA_REG_ACC_Y_LSB 0x04
#define MSA_REG_ACC_Y_MSB 0x05
#define MSA_REG_ACC_Z_LSB 0x06
#define MSA_REG_ACC_Z_MSB 0x07
#define MSA_REG_Tape_Active_Status 0x0B
#define MSA_REG_G_RANGE 0x0f
#define MSA_REG_ODR_AXIS_DISABLE 0x10
#define MSA_REG_POWERMODE_BW 0x11
#define MSA_REG_SWAP_POLARITY 0x12
#define MSA_REG_FIFO_CTRL 0x14
#define MSA_REG_INTERRUPT_SETTINGS1 0x16
#define MSA_REG_INTERRUPT_SETTINGS2 0x17
#define MSA_REG_INTERRUPT_MAPPING1 0x19
#define MSA_REG_INTERRUPT_MAPPING2 0x1a
#define MSA_REG_INTERRUPT_MAPPING3 0x1b
#define MSA_REG_INT_PIN_CONFIG 0x20
#define MSA_REG_INT_LATCH 0x21
#define MSA_REG_ACTIVE_DURATION 0x27
#define MSA_REG_ACTIVE_THRESHOLD 0x28
#define MSA_REG_TAP_DURATION 0x2A
#define MSA_REG_TAP_THRESHOLD 0x2B
#define MSA_REG_CUSTOM_OFFSET_X 0x38
#define MSA_REG_CUSTOM_OFFSET_Y 0x39
#define MSA_REG_CUSTOM_OFFSET_Z 0x3a
#define MSA_REG_ENGINEERING_MODE 0x7f
#define MSA_REG_SENSITIVITY_TRIM_X 0x80
#define MSA_REG_SENSITIVITY_TRIM_Y 0x81
#define MSA_REG_SENSITIVITY_TRIM_Z 0x82
#define MSA_REG_COARSE_OFFSET_TRIM_X 0x83
#define MSA_REG_COARSE_OFFSET_TRIM_Y 0x84
#define MSA_REG_COARSE_OFFSET_TRIM_Z 0x85
#define MSA_REG_FINE_OFFSET_TRIM_X 0x86
#define MSA_REG_FINE_OFFSET_TRIM_Y 0x87
#define MSA_REG_FINE_OFFSET_TRIM_Z 0x88
#define MSA_REG_SENS_COMP 0x8c
#define MSA_REG_MEMS_OPTION 0x8f
#define MSA_REG_CHIP_INFO 0xc0
#define MSA_REG_CHIP_INFO_SECOND 0xc1
#define MSA_REG_SENS_COARSE_TRIM 0xd1
/*************
-------------------------------------------------------------------
Reg 0x0F(Resolution/Range)Read/Write
Bit7 Bit6 Bit5 Bit4 |Bit3 Bit2 |Bit1 Bit0 | Default
|RESOLUTION[1:0] | FS[1:0] | 0X00
RESOLUTION[1:0]: resolution of x/y/z axes,
00:14bit, 01:12bit, 10:10bit, 11:8bit
FS[1:0]: acceleration range of x/y/z axes,
00:+/-2g, 01:+/-4g, 10:+/-8g, 11:+/-16g
*********/
#define D_MSA_8BIT B0000_1100
#define D_MSA_12BIT B0000_0100
#define D_MSA_10BIT B0000_1000
#define D_MSA_14BIT B0000_0000
#define D_MSA_16G B0000_0011
#define D_MSA_8G B0000_0001
#define D_MSA_4G B0000_0010
#define D_MSA_2G B0000_0000
/**********
ODR Output data rate 1 1000 Hz
Reg0x10(ODR) Read/Write Default 0X0F
Bit7 Bit6 Bit5
X_AXIS_DIS Y_AXIS_DIS Z_AXIS_DIS
Bit4
Bit3 Bit2 Bit1 Bit0
ODR[3:0]
X_AXIS_DIS: 0:enable, 1:disable Y_AXIS_DIS: 0:enable, 1:disable Z_AXIS_DIS: 0:enable, 1:disable
ODR[3:0]:
0000:1Hz (not available in normal mode)
0001:1.95Hz (not available in normal mode)
0010:3.9Hz 0011:7.81Hz
0100:15.63Hz 0101: 31.25Hz 0110: 62.5Hz 0111: 125Hz 1000: 250Hz
1001: 500Hz (not available in low power mode)
1010-1111: (not available in low power mode)
Table 5: bandwidth under different ODR and BW settings in normal mode
ODR BW
1000Hz (1010-1111) 500Hz
500Hz (1001) 250Hz
250Hz (1000) 125Hz
125Hz (0111) 62.5Hz
62.5Hz (0110) 31.25Hz
31.25Hz (0101) 15.63Hz
15.63Hz (0100) 7.81Hz
7.81Hz (0011) 3.9Hz
3.9Hz (0010) 1.95Hz
MSA300 supports four different acceleration measurement ranges, it is selected
ODR BW
15.63Hz (0100) 7.81Hz
*********/
/// fixme: 实测和规格书不一致
#define D_AXIS_DIS_Y B1000_0000
#define D_AXIS_DIS_X B0100_0000
#define D_AXIS_DIS_Z B0010_0000
#define D_ODR_31Hz25 0x05
#define D_ODR_250Hz 0x08
#define D_ODR_125Hz 0x0f
#define D_ODR_15P63Hz B0000_0100
/**********
Reg0x11(Power Mode/Bandwidth) Read/Write
------------------------------------------------------------------
Bit7 Bit6 |Bit5 Bit4 Bit3 Bit2 Bit1 |Bit0 Default 0X9E
----------------------------------------------------------------------
PWR_MODE | LOW_POWER_BW[3:0] |
--------------------------------------------------------------------
PWR_MODE: 00:normal mode, 01:low power mode, 10/11 suspend mode
LOW_POWER_BW[3:0]:
0000-0010:1.95Hz
0011:3.9Hz,
0100:7.81Hz
0101:15.63Hz,
0110: 31.25Hz,
0111: 62.5Hz,
1000: 125Hz,
1001: 250Hz,
1010-1111:500Hz
***********/
//#define D_PowerMode_normal 0x00
//#define D_PowerMode_low 0x40
//#define D_PowerMode_suspend 0x80
#define D_lowPower_BW (0x0F<<1)
#define D_PowerMode_normal 0x1e
#define D_PowerMode_suspend 0x9e
#define D_gs_LPBW1H9 (0<<1)
#define D_gs_LPBW3H9 (3<<1)
#define D_gs_LPBW7H8 (4<<1)
#define D_gs_LPBW15H (5<<1)
#define D_gs_LPBW31H (6<<1)
#define D_gs_LPBW62H (7<<1)
#define D_gs_LPBW125H (8<<1)
#define D_gs_LPBW250H (9<<1)
#define D_gs_LPBW500H (10<<1)
///#define D_PowerMode_low 0x5e
#define D_PowerMode_low (0x50|D_gs_LPBW1H9)
//#define D_PowerMode_low 0x5e///(0x40|D_gs_LPBW62H)
#define LD_gsensor_power(Pmode) L2_I2C_WriteCmd(D_i2c_addr_Gsensor,MSA_REG_POWERMODE_BW,Pmode);s_as.power=Pmode
/**********
/**************************************
Reg 0x1B (Int_Map_2) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default
Bit6 INT2_ORIENT
Bit5 INT2_S_TAP
Bit4 INT2_D_TAP
Bit2 INT2_ACTIVE
Bit1 RESERVED
Bit0 INT2_FREEFALL
0X00
INT2_ORIENT: map orientation interrupt to INT2, 0:disable, 1:enable INT2_S_TAP: map single tap interrupt to INT2, 0:disable, 1:enable INT2_D_TAP: map double tap interrupt to INT2, 0:disable, 1:enable INT2_ACTIVE: map active interrupt to INT2, 0:disable, 1:enable INT2_FREEFALL: map freefall interrupt to INT2, 0:disable, 1:enable
***************************************/
#define D_INT2_ORIENT BITN6
#define D_INT2_S_TAP BITN5
#define D_INT2_D_TAP BITN4
#define D_INT2_ACTIVE BITN2
#define D_INT2_FREEFALL BITN1
/**********************************************
Reg 0x20 (Int_Map_2) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00
Bit3 INT2_OD
Bit2 NT2_LVL
Bit1 IINT1_OD
Bit0 INT1_LVL
INT2_OD: select output for INT2, 0: push-pull, 1:OD
INT2_LVL: select active level for INT2, 0: low, 1:high
INT1_OD: select output for INT1, 0: push-pull, 1:OD
INT1_LVL: select active level for INT1, 0: low, 1:high
***************************************/
#define D_INT2_pull 0
#define D_INT2_OD BITN3
#define D_INT2_LVL_high BITN2
#define D_INT2_LVL_low 0
#define D_INT1_pull 0
#define D_INT1_OD BITN1
#define D_INT1_LVL_high BITN0
#define D_INT1_LVL_low 0
/*************************************************************
U51(SDO=1) int2 P33 ----------------U10(SDO=0) int2 P32----------------MCU----USB
0x4c 0x4e
AS1 AS2
--------------------------------------------------------------------
Reg 0x16(Int_Set_0) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00
-------------------------------------------------------------------
Tap
使 s_tap_en 使d_tap_en
: s_tap_int , d_tap_int
Bit6 ORIENT_INT_EN
Bit5 S_TAP_INT_EN
Bit4 D_TAP_INT_EN
Bit2 ACTIVE_INT_EN_Z
Bit1 ACTIVE_INT_EN_Y
Bit0 ACTIVE_INT_EN_X
-------------------------------------------------------------------
ORIENT_INT_EN: orient interrupt, 0:disable, 1:enable
S_TAP_INT_EN: single tap interrupt, 0:disable, 1:enable
D_TAP_INT_EN: double tap interrupt, 0:disable, 1:enable
ACTIVE_INT_EN_Z: active interrupt for the z axis, 0:disable, 1:enable
ACTIVE_INT_EN_Y: active interrupt for the y axis, 0:disable, 1:enable
ACTIVE_INT_EN_X: active interrupt for the x axis, 0:disable, 1:enable
reg 0x16Reg 0x19
-------------------------------------------------------------------
Reg 0x19(Int_Map_0) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default
-------------------------------------------------------------------
INT1_ORIENT
INT1_S_TAP
INT1_D_TAP
INT1_ACTIVE
INT1_FREEFALL
0X00
-------------------------------------------------------------------
INT1_ORIENT: map orientation interrupt to INT1, 0:disable, 1:enable
INT1_S_TAP: map single tap interrupt to INT1, 0:disable, 1:enable
INT1_D_TAP: map double tap interrupt to INT1, 0:disable, 1:enable
INT1_ACTIVE: map active interrupt to INT1, 0:disable, 1:enable
INT1_FREEFALL: map freefall interrupt to INT1, 0:disable, 1:enable
-------------------------------------------------------------------
Reg 0x27 (Active_Dur) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default
ACTIVE_DUR[1:0] 0X00
ACTIVE_DUR[1:0]: active duration time is (ACTIVE_DUR[1:0]+1)ms
-------------------------------------------------------------------
Reg 0x28(Active_Th) Read/Write
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default
ACTIVE_TH[7:0] 0X14
ACTIVE_TH[7:0]: threshold of active interrupt
3.91mg/LSB(2g range)
7.81mg/LSB(4g range)
15.625mg/LSB(8g range)
31.25mg/LSB(16g range)
**************************************************************************/
#define ACTIVE_INT_EN_Z BITN2
#define ACTIVE_INT_EN_Y BITN1
#define ACTIVE_INT_EN_X BITN0
/***************************************
0x21 RESET_INT LATCH_INT[3:0] 0x00
latch_int Interrupt mode
0000 non-latched
0001 temporary latched 250ms
0010 temporary latched 500ms
0011 temporary latched 1s
0100 temporary latched 2s
0101 temporary latched 4s
0110 temporary latched 8s
0111 Latched
1000 non-latched
1001 temporary latched 1ms
1010 temporary latched 1ms
1011 temporary latched 2ms
1100 temporary latched 25ms
1101 temporary latched 50ms
1110 temporary latched 100ms
1111 Latched
_______/``latch period````\_______
****************************************/
#define D_no_latched 0x01
#define D_latch_250ms 0x01
#define D_latch_500ms 0x02
#define D_latch_1s 0x03
#define D_latch_2s 0x04
#define D_latch_4s 0x05
#define D_latch_8s 0x06
#define D_latched 0x07
#define D_no_latched2 0x08
#define D_latch_1ms 0x09
#define D_latch_1ms2 0x0a
#define D_latch_2ms 0x0B
#define D_latch_25ms 0x0C
#define D_latch_50ms 0x0D
#define D_latch_100ms 0x0E
#define D_latched2 0x0f
/****************************************************
Reg 0x09(Motion_Interrupt) :Read only
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default 0X00
Bit6 ORIENT_INT
Bit5 S_TAP_INT
Bit4 D_TAP_INT
Bit2 ACTIVE_INT
Bit0 FREEFALL_INT
5s以上之后再工作 5
ORIENT_INT: orientation interrupt status,0:inactive,1:active
S_TAP_INT: single tap interrupt status,0:inactive,1:active
D_TAP_INT: double tap interrupt status,0:inactive,1:active
ACTIVE_INT: active interrupt status,0:inactive,1:active
FREEFALL_INT: freefall interrupt status,0:inactive,1:active
-------------------------------------------------------------------
Reg 0x0B(Tape_Active_Status) :Read only
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Default
TAP_SIGN
TAP_FIRST_X
TAP_FIRST_Y
TAP_FIRST_Z
ACTIVE_SIGN
ACTIVE_FIRST_X
ACTIVE_FIRST_Y
ACTIVE_FIRST_Z
0X00
-------------------------------------------------------------------
TAP_SIGN: sign of tap triggering signal, 0:positive,1:negative
TAP_FIRST_X: tap interrupt triggered by x axis, 1:positive,0:negative
TAP_FIRST_Y: tap interrupt triggered by y axis, 1:positive,0:negative
TAP_FIRST_Z: tap interrupt triggered by z axis, 1:positive,0:negative
ACTIVE_SIGN: sign of active interrupt, 0:positive,1:negative
ACTIVE_FIRST_X: active interrupt triggered by x axis, 1:positive,0:negative
ACTIVE_FIRST_Y: active interrupt triggered by y axis, 1:positive,0:negative
ACTIVE_FIRST_Z: active interrupt triggered by z axis, 1:positive,0:negative
***************************************************/
#define INT1_S_TAP_INT BITN5 ///单击中断
#define INT1_D_TAP_INT BITN4 ///双击中断
#define INT1_ACTIVE BITN2 /// 振动中断
#define D_Active_TH 0x28
#define D_Active_Dur 0x27
#define D_i2c_addr_AS1 0x4c // u51
#define D_i2c_addr_AS2 0x4e
#define D_i2c_addr_Gsensor 0x4c // u51
#define D_i2c_addr_AS1 0x4c // u51
#define D_i2c_addr_AS2 0x4e
/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/
// 最高400Khz 1/400 ms 2.5us
//Symbol Parameter Condition Min Max Unit
//fscl Clock frequency 400 kHz
#define D_as_ch_mun 1
struct _s_gsens_
{//8byte
U8 d[6];
// U8 reg_action;
U8 power;
// U8 reg_temp;
// U8 action_ok;
// U16 x;
// U16 y;
// U16 z;
};
extern struct _s_gsens_ s_as;
extern void L1_as_readXYZ(unsigned char CH);
extern void L1_msa300_init(void);
extern void L3_msa300_fun(U8 *pPara);
extern void L1_as_action(void);
extern void L1_as_WorkStatus(unsigned char d);
///L1_msa300_power(D_sleep);
extern void L1_msa300_power(U8 mode);
#define L1_ms300_reg_set(x,y) L2_I2C_WriteCmd(D_i2c_addr_Gsensor, (x),(y) )
#define L1_ms300_reg_get(x,y) L2_I2C_ReadReg(D_i2c_addr_Gsensor,(x),1)
#define DL_ms300_int_open(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,D_INT2_S_TAP|D_INT2_ACTIVE);
#define DL_ms300_int_close(); L1_ms300_reg_set(MSA_REG_INTERRUPT_MAPPING3,0);
#endif // #ifndef _MSA300_H

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save