commit 22d11f316359004b5eb951ddb6261337f2a365eb Author: mr.zhangsan Date: Thu May 16 18:33:34 2024 +0800 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c353f76 --- /dev/null +++ b/.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/ diff --git a/backup/all/U4备份程序.bat b/backup/all/U4备份程序.bat new file mode 100644 index 0000000..cfd3acf --- /dev/null +++ b/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\*.* diff --git a/backup/all/U4备份程序全.bat b/backup/all/U4备份程序全.bat new file mode 100644 index 0000000..c31db8d --- /dev/null +++ b/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\*.* \ No newline at end of file diff --git a/backup/all/stc备份程序.bat b/backup/all/stc备份程序.bat new file mode 100644 index 0000000..609816a --- /dev/null +++ b/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 + diff --git a/backup/all/unzip.exe b/backup/all/unzip.exe new file mode 100644 index 0000000..e9dc44d Binary files /dev/null and b/backup/all/unzip.exe differ diff --git a/backup/all/zip.exe b/backup/all/zip.exe new file mode 100644 index 0000000..286227a Binary files /dev/null and b/backup/all/zip.exe differ diff --git a/backup/all/批处理备份程序 使用方法.zip b/backup/all/批处理备份程序 使用方法.zip new file mode 100644 index 0000000..4cee3b6 Binary files /dev/null and b/backup/all/批处理备份程序 使用方法.zip differ diff --git a/keilp/stcTTSS2_W5.uvprojx b/keilp/stcTTSS2_W5.uvprojx new file mode 100644 index 0000000..e7cfb2f --- /dev/null +++ b/keilp/stcTTSS2_W5.uvprojx @@ -0,0 +1,532 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + STC8H3K48S2 + 0x0 + MCS-51 + + + STC8H3K64S4 Series + STC + IRAM(0-0xFF) XRAM(0-0x0BFF) IROM(0-0xFFF8) CLOCK(35000000) MODP2 + + "LIB\STARTUP.A51" ("Standard 8051 Startup Code") + + 63300 + STC8.H + + + + + + + + + + + 0 + 0 + d:\Keil\C51\BIN\ + + + STC\ + STC\ + + 0 + 0 + 0 + 0 + 1 + + ..\out\ + stcTTSS2_w5 + 1 + 0 + 1 + 1 + 1 + ..\out\ + 0 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + 65535 + + + S8051.DLL + + DP51.DLL + -pDP8051 + S8051.DLL + + TP51.DLL + -p51 + + + + 0 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 10 + + + + + + + + + + + + + + BIN\STCMON51.DLL + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + "" () + + + + + 0 + + + + 2 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0xffff + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0xfff9 + + + 0 + 0x0 + 0x100 + + + 0 + 0x0 + 0xc00 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 0 + 1 + 0 + 0 + 1 + 3 + 0 + 2 + 0 + 1 + 0 + 0 + + + + + ..\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 + + + + 0 + 1 + 0 + 0 + + + + + + + + + 0 + 0 + 1 + 0 + 2 + 1 + + REMOVEUNUSED + + + + + + + + + + + + + + + + + + + + + + + + + + + app + + + app_weight.c + 1 + ..\source\app\app_weight.c + + + main.c + 1 + ..\source\app\main.c + + + app_config.c + 1 + ..\source\app\app_config.c + + + + + asp + + + asp_schain.c + 1 + ..\source\asp\asp_schain.c + + + asp_lowpower.c + 1 + ..\source\asp\asp_lowpower.c + + + + + cpu + + + STARTUP.A51 + 2 + ..\source\cpu\STARTUP.A51 + + + stc_8_delay.c + 1 + ..\source\cpu\stc_8_delay.c + + + + + msp + + + msp_uartN.c + 1 + ..\source\msp\uart\msp_uartN.c + + + msp_time2.c + 1 + ..\source\msp\msp_time2.c + + + msp_uart1.c + 1 + ..\source\msp\uart\msp_uart1.c + + + msp_iicMx.c + 1 + ..\source\msp\msp_iicMx.c + + + msp_eeprom.c + 1 + ..\source\msp\msp_eeprom.c + + + msp_adc.c + 1 + ..\source\msp\msp_adc.c + + + + + bsp + + + bsp_config.c + 1 + ..\source\bsp\TTSSbsp\bsp_config.c + + + bsp_led.c + 1 + ..\source\bsp\bsp_led.c + + + bsp_cs1232.c + 1 + ..\source\bsp\bsp_cs1232.c + + + + + ctask + + + TTSS_task.c + 1 + ..\source\ctask\TTSS_task.c + + + TTSS_tick.c + 1 + ..\source\ctask\TTSS_tick.c + + + TTSS_time_stc.c + 1 + ..\source\ctask\TTSS_time_stc.c + + + + + tpc + + + tpc_road.c + 1 + ..\source\tpc\tpc_road.c + + + + + clib + + + c_lib.c + 1 + ..\source\clib\c_lib.c + + + c_delay.c + 1 + ..\source\clib\c_delay.c + + + + + debug + + + cc_as_stc01_main.ini + 5 + ..\source\debug\cc_as_stc01_main.ini + + + debug_drv.c + 1 + ..\source\debug\debug_drv.c + + + + + + + +
diff --git a/si4/keywords.txt b/si4/keywords.txt new file mode 100644 index 0000000..d39a8c6 --- /dev/null +++ b/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 diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_sym b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_sym new file mode 100644 index 0000000..f05cfd8 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_sym differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xab b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xab new file mode 100644 index 0000000..c682a76 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xab differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xad b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xad new file mode 100644 index 0000000..66c1201 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xad differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xc b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xc new file mode 100644 index 0000000..d14ad57 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xc differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xf b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xf new file mode 100644 index 0000000..64c7aa2 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xf differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xm b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xm new file mode 100644 index 0000000..e1c3c70 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xm differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xr b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xr new file mode 100644 index 0000000..5303427 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xr differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsb b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsb new file mode 100644 index 0000000..b519d1c Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsb differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsd b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsd new file mode 100644 index 0000000..aaabe6d Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.sip_xsd differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj new file mode 100644 index 0000000..7281480 Binary files /dev/null and b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj differ diff --git a/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj_settings.xml b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj_settings.xml new file mode 100644 index 0000000..a34c654 --- /dev/null +++ b/si4/stcTTSS2_W5.si4project/stcTTSS2_W5.siproj_settings.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/source/New0001.h b/source/New0001.h new file mode 100644 index 0000000..34716eb --- /dev/null +++ b/source/New0001.h @@ -0,0 +1,23 @@ +day1 +驱动: 优化电路板 调程序 +手持 设计界面 +day2 +驱动: 电路板加急发板 、(在客户看到现在的板子和确定接插件之前?) +手持 设计界面交互 +day3 +驱动: 电路板发板 +手持 设计界面交互 +day4 +驱动: 备料 +手持 通讯程序控制 +day5 +驱动: 焊接并 调试程序 +手持 通讯程序控制 +day6 +驱动: 调程序 +手持 联调 +day7 +驱动: ECU功能验证 +手持 联调 + + diff --git a/source/app/app_config.c b/source/app/app_config.c new file mode 100644 index 0000000..2806e5a --- /dev/null +++ b/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 中,然后写入eeprom,返回step 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;iadd,); + +} + + + +//读取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= weight) + { + break; + } + } + if(i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + + + +///存放全局需要保存的数据 +///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 +字节中的0写为1时 擦除扇区 +最安全最简单,最逻辑清楚的事,就是 +每次擦一个扇区每次写一个扇区, +--->每次擦一个扇区每次写一个扇区的前面的有效数据, + +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 + + + + + + + + + diff --git a/source/app/app_task_reg.h b/source/app/app_task_reg.h new file mode 100644 index 0000000..6736157 --- /dev/null +++ b/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 + diff --git a/source/app/app_weight.c b/source/app/app_weight.c new file mode 100644 index 0000000..37715ec --- /dev/null +++ b/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 + + diff --git a/source/app/app_weight.h b/source/app/app_weight.h new file mode 100644 index 0000000..7a8f9f0 --- /dev/null +++ b/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 + diff --git a/source/app/main.c b/source/app/main.c new file mode 100644 index 0000000..349bebd --- /dev/null +++ b/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<<<<<<>>>>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<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<. + //-------------------------------------------------------------------------------------- + //>>>>>>4>>>>>>>4>>>>>>4>>>>>>4>>>>>>TTSS 4 并行任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. + + L3_task_weight_handler(&tst_weight); + + /// L2_task_move_handle(&ts_task_move); + //<<<<<4<<<<<<<<4<<<<<<4<<<<<<<4<<<<>>>>>5>>>>>>>5>>>>>>5>>>>>>5>>>>>>TTSS 5 日常任务 随机任务>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. + + + //<<<<<5<<<<<<<5<<<<<<<5<<<<<<5<<<<< +寄存器化的结构 +全局化调用 里面有需要保存的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(); + +瞡6辐3 = 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 + *********/ + + diff --git a/source/app/nouse/app_save.h b/source/app/nouse/app_save.h new file mode 100644 index 0000000..9b0cf39 --- /dev/null +++ b/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 +字节中的0写为1时 擦除扇区 +最安全最简单,最逻辑清楚的事,就是 +每次擦一个扇区每次写一个扇区, +--->每次擦一个扇区每次写一个扇区的前面的有效数据, + +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 + diff --git a/source/app/nouse/app_task_adc - 副本.c b/source/app/nouse/app_task_adc - 副本.c new file mode 100644 index 0000000..5acb5f6 --- /dev/null +++ b/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;ich)) + { + 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;imax;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;imax;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;idiff_val >= R.p.weight_show_limit[i].weight) + { + find = 1; + break; + } + } + if(find) + { + s->times[i]++; + for(j=0;jtimes[j] = 0; + } + } + } + else //小于显示分辨率(<0.02kg) + { + L3_task_show_times_reset(); + } + + for(i=0;itimes[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;ich_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 + + diff --git a/source/app/nouse/app_task_adc - 副本.h b/source/app/nouse/app_task_adc - 副本.h new file mode 100644 index 0000000..507a2e1 --- /dev/null +++ b/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 + diff --git a/source/app/nouse/app_task_adc.c b/source/app/nouse/app_task_adc.c new file mode 100644 index 0000000..3111473 --- /dev/null +++ b/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]); + ***********/ +} + + + diff --git a/source/app/nouse/app_task_adc.h b/source/app/nouse/app_task_adc.h new file mode 100644 index 0000000..8cfb184 --- /dev/null +++ b/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 + diff --git a/source/app/nouse/app_task_debug.c b/source/app/nouse/app_task_debug.c new file mode 100644 index 0000000..0944198 --- /dev/null +++ b/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.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 3.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1195 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年9月2日 + + 单片机型号: 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.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 3.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 + . 下次下载用户程序时,不擦除用户EEPROM区 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1195 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年9月2日 +芯片出厂序列号 : F74DC52602599C + + 单片机型号: STC8H3K48S2 + 固件版本号: 7.4.1U + + . 用户设定频率: 11.059MHz + . 调节后的频率: 11.057MHz + . 频率调节误差: -0.022% + + +操作成功 !(2022-01-08 10:36:46) + +*************/ + diff --git a/source/app/nouse/app_task_debug.h b/source/app/nouse/app_task_debug.h new file mode 100644 index 0000000..dd52148 --- /dev/null +++ b/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 + diff --git a/source/app/nouse/app_task_reg.c b/source/app/nouse/app_task_reg.c new file mode 100644 index 0000000..bb0a80f --- /dev/null +++ b/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(); + +} + + + + + diff --git a/source/app/nouse/app_task_reg.c.bak b/source/app/nouse/app_task_reg.c.bak new file mode 100644 index 0000000..80bc16c --- /dev/null +++ b/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(); + +} + + + + + diff --git a/source/app/nouse/app_task_uart0.c b/source/app/nouse/app_task_uart0.c new file mode 100644 index 0000000..3cb65dc --- /dev/null +++ b/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 + } +} + + diff --git a/source/app/nouse/app_task_uart0.h b/source/app/nouse/app_task_uart0.h new file mode 100644 index 0000000..2dcd893 --- /dev/null +++ b/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 diff --git a/source/app/nouse/app_weight.c b/source/app/nouse/app_weight.c new file mode 100644 index 0000000..6ddea18 --- /dev/null +++ b/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 + + diff --git a/source/app/nouse/app_weight.h b/source/app/nouse/app_weight.h new file mode 100644 index 0000000..4e2d4e0 --- /dev/null +++ b/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 + diff --git a/source/app/nouse/app_weightzero.c b/source/app/nouse/app_weightzero.c new file mode 100644 index 0000000..4007958 --- /dev/null +++ b/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(); + +} + + + + diff --git a/source/app/nouse/app_weightzero.h b/source/app/nouse/app_weightzero.h new file mode 100644 index 0000000..bc78906 --- /dev/null +++ b/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 + diff --git a/source/app/nouse/common.c b/source/app/nouse/common.c new file mode 100644 index 0000000..84a953d --- /dev/null +++ b/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= weight) + { + break; + } + } + if(i 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; + + + + +****/ + + diff --git a/source/asp/asp_lowpower.h b/source/asp/asp_lowpower.h new file mode 100644 index 0000000..a3836a5 --- /dev/null +++ b/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_ + diff --git a/source/asp/asp_move.c b/source/asp/asp_move.c new file mode 100644 index 0000000..3db5787 --- /dev/null +++ b/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>>>>>>>>>>>>>>>>>>>A| + + +|-----------A------M--------------------| +|A<<<<<<<<<<<------M--------------------| +|>>>>>>>>>>>>>>>>>>M>>>>>>>>>>>>>>>>>>>A| +|-----------A<<<<<>>>>>>>>>>>>A| +|A<<<<<<<<<<<<<<<<>>>>>>>>>>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 + + + diff --git a/source/asp/asp_move.h b/source/asp/asp_move.h new file mode 100644 index 0000000..52ddcfc --- /dev/null +++ b/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_ + diff --git a/source/asp/asp_mqtt.c b/source/asp/asp_mqtt.c new file mode 100644 index 0000000..b94e6c8 --- /dev/null +++ b/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(); +} + + diff --git a/source/asp/asp_mqtt.h b/source/asp/asp_mqtt.h new file mode 100644 index 0000000..a2d7bfe --- /dev/null +++ b/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_ + diff --git a/source/asp/asp_schain.c b/source/asp/asp_schain.c new file mode 100644 index 0000000..0dbfdd8 --- /dev/null +++ b/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;imax;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;imax;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 + + diff --git a/source/asp/asp_schain.h b/source/asp/asp_schain.h new file mode 100644 index 0000000..a34f602 --- /dev/null +++ b/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 + + + + + + + + + + diff --git a/source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.c b/source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.c new file mode 100644 index 0000000..e9c4127 --- /dev/null +++ b/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; +} + diff --git a/source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.h b/source/asp/新建文件夹/SL_Sc7a20_FreeFall_Driver.h new file mode 100644 index 0000000..7393345 --- /dev/null +++ b/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 */ + diff --git a/source/asp/新建文件夹/SL_algo1.h b/source/asp/新建文件夹/SL_algo1.h new file mode 100644 index 0000000..c20aeb9 --- /dev/null +++ b/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__*********/ + + + diff --git a/source/asp/新建文件夹/SL_algo1.lib b/source/asp/新建文件夹/SL_algo1.lib new file mode 100644 index 0000000..6e415e0 Binary files /dev/null and b/source/asp/新建文件夹/SL_algo1.lib differ diff --git a/source/asp/新建文件夹/SL_app.c b/source/asp/新建文件夹/SL_app.c new file mode 100644 index 0000000..8a57241 --- /dev/null +++ b/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_CNT200) +// { + /**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_ifilter) + {///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 + { + + } + } +} + + diff --git a/source/asp/新建文件夹/asp_moto.h b/source/asp/新建文件夹/asp_moto.h new file mode 100644 index 0000000..56010ac --- /dev/null +++ b/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 \ No newline at end of file diff --git a/source/asp/新建文件夹/asp_para.c b/source/asp/新建文件夹/asp_para.c new file mode 100644 index 0000000..0d9dd8a --- /dev/null +++ b/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; +} + + + + + + + + + diff --git a/source/asp/新建文件夹/asp_para.h b/source/asp/新建文件夹/asp_para.h new file mode 100644 index 0000000..71f3e3f --- /dev/null +++ b/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 + diff --git a/source/asp/新建文件夹/asp_schain.c b/source/asp/新建文件夹/asp_schain.c new file mode 100644 index 0000000..106f86b --- /dev/null +++ b/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;imax;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;imax;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 + + diff --git a/source/asp/新建文件夹/asp_schain.h b/source/asp/新建文件夹/asp_schain.h new file mode 100644 index 0000000..bb8188e --- /dev/null +++ b/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 + diff --git a/source/asp/新建文件夹/asp_weight_save.c b/source/asp/新建文件夹/asp_weight_save.c new file mode 100644 index 0000000..b7672b4 --- /dev/null +++ b/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 + + + +称重更换传感器后的步骤 +1,打印原始out_adc +2,添加10kg 修改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(); + +瞡6辐3 = 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 + *********/ + + diff --git a/source/asp/新建文件夹/asp_weight_save.h b/source/asp/新建文件夹/asp_weight_save.h new file mode 100644 index 0000000..604c8ba --- /dev/null +++ b/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 +字节中的0写为1时 擦除扇区 +最安全最简单,最逻辑清楚的事,就是 +每次擦一个扇区每次写一个扇区, +--->每次擦一个扇区每次写一个扇区的前面的有效数据, + +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 + diff --git a/source/bsp/TTSSbsp/bsp_config.c b/source/bsp/TTSSbsp/bsp_config.c new file mode 100644 index 0000000..79075d6 --- /dev/null +++ b/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 + +////////////////////////////////////////////////////////////////////////////// + + + diff --git a/source/bsp/TTSSbsp/bsp_config.h b/source/bsp/TTSSbsp/bsp_config.h new file mode 100644 index 0000000..7c9fbc8 --- /dev/null +++ b/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 + +#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 + #include + #include + + + //基本配置(工作频率、时钟、看门狗、字节序) + #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.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 2.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1195 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年9月2日 + + 单片机型号: 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.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 2.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1195 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年9月2日 +芯片出厂序列号 : 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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///#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 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE +#define TYPE_IDE_KEIL 1 +#define TYPE_IDE_MDK 2 +#define TYPE_IDE_IAR 3 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>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 + +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.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 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>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 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>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 +//<<<<<<<<<<<<<<<<<<<<<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应答信号 + * 入口参数: 无 + * 出口参数: 返回0表示正确应答,1表示无器件响应 + * 作  者: 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总线的GPIO,采用模拟IO的方式实现 +* 入口参数: 无 +* 出口参数: 无 +* 作  者: 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向发送设备地址,然后读取设备应答来判断该设备是否存在 + * 入口参数: _Address:设备的I2C总线地址 + * 出口参数: 返回值 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) **********************************/ + + + +内部配置: + +1)MLX90615只有3V供电,而MLX90614则有5V和3V选项; + +2)MLX90615只集成了IIR数字滤波,MLX90614同时集成FIR和IIR滤波; + +3)SMBus地址不兼容,MLX90615出厂设置为0x5B,而MLX90614为0x5B; + +4)PWM频率,MLX90615可选为10Hz或者1kHz,而MLX90614是在1Hz和1kHz之间支持编程调节; + +5)两者在对RAM和EEPROM进行操作时,其操作指令不同,开发者在两者切换时需要注意; + +6)唤醒指令脉冲施加引脚不同,MLX90615在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 + + + + + diff --git a/source/bsp/backu/MLX90615.h b/source/bsp/backu/MLX90615.h new file mode 100644 index 0000000..dd307da --- /dev/null +++ b/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) **********************************/ + diff --git a/source/bsp/backu/New0001.c b/source/bsp/backu/New0001.c new file mode 100644 index 0000000..77b8c2a --- /dev/null +++ b/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; +} + + diff --git a/source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar b/source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar new file mode 100644 index 0000000..f3236c8 Binary files /dev/null and b/source/bsp/backu/bsp2019低功耗采样line版本 20200301073727.rar differ diff --git a/source/bsp/backu/bsp_433.c b/source/bsp/backu/bsp_433.c new file mode 100644 index 0000000..42c4d12 --- /dev/null +++ b/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); + + + + + + + + diff --git a/source/bsp/backu/bsp_433.h b/source/bsp/backu/bsp_433.h new file mode 100644 index 0000000..f224617 --- /dev/null +++ b/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 + diff --git a/source/bsp/backu/bsp_cam - 副本.c b/source/bsp/backu/bsp_cam - 副本.c new file mode 100644 index 0000000..e9c132c --- /dev/null +++ b/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 + + + + + + + + + + + + + + diff --git a/source/bsp/backu/bsp_cam.c b/source/bsp/backu/bsp_cam.c new file mode 100644 index 0000000..00e44f6 --- /dev/null +++ b/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; +} + +//// ɼеij 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();/// 1ms433 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 + + diff --git a/source/bsp/backu/bsp_cam.h b/source/bsp/backu/bsp_cam.h new file mode 100644 index 0000000..bc1f645 --- /dev/null +++ b/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; /// ʼһ֡IJ յ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 + diff --git a/source/bsp/backu/bsp_cam_isr.c b/source/bsp/backu/bsp_cam_isr.c new file mode 100644 index 0000000..f3a7f8f --- /dev/null +++ b/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_gethsҲһеĵڼ + ///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 ÿIJ +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_gethsҲһеĵڼ + 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 ÿIJ +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 + + diff --git a/source/bsp/backu/bsp_cam_isr.h b/source/bsp/backu/bsp_cam_isr.h new file mode 100644 index 0000000..bac07b9 --- /dev/null +++ b/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 + diff --git a/source/bsp/backu/bsp_config_stc.h.bak b/source/bsp/backu/bsp_config_stc.h.bak new file mode 100644 index 0000000..7ec92cd --- /dev/null +++ b/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*********************************************/ + + + + diff --git a/source/bsp/backu/bsp_cs1232.c b/source/bsp/backu/bsp_cs1232.c new file mode 100644 index 0000000..2a96663 --- /dev/null +++ b/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 + + + +/*********************************************/ + + + diff --git a/source/bsp/backu/bsp_cs1232.h b/source/bsp/backu/bsp_cs1232.h new file mode 100644 index 0000000..f526548 --- /dev/null +++ b/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; + +*******/ + diff --git a/source/bsp/backu/bsp_func.c b/source/bsp/backu/bsp_func.c new file mode 100644 index 0000000..bcc170f --- /dev/null +++ b/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); +} + + diff --git a/source/bsp/backu/bsp_func.h b/source/bsp/backu/bsp_func.h new file mode 100644 index 0000000..194f7f0 --- /dev/null +++ b/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 + diff --git a/source/bsp/backu/bsp_gc032a.c b/source/bsp/backu/bsp_gc032a.c new file mode 100644 index 0000000..6650b50 --- /dev/null +++ b/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 5h03: Y Cr Y Cb + {0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5h10: 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 5h03: Y Cr Y Cb + {0x44,B1001_0000},///P0:0x44 Output_format [7] YUV420_row_switch 5h10: 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 diff --git a/source/bsp/backu/bsp_gc032a.h b/source/bsp/backu/bsp_gc032a.h new file mode 100644 index 0000000..7be8e1a --- /dev/null +++ b/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_ diff --git a/source/bsp/backu/bsp_iic3.c b/source/bsp/backu/bsp_iic3.c new file mode 100644 index 0000000..c0b69a8 --- /dev/null +++ b/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;k750us +///#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 \ No newline at end of file diff --git a/source/bsp/backu/bsp_msa300.c b/source/bsp/backu/bsp_msa300.c new file mode 100644 index 0000000..3e152fe --- /dev/null +++ b/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 /// z25ٽֵ +////#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 ʼ ǰʹiicijʼ +/// ʹж 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 + + diff --git a/source/bsp/backu/bsp_msa300.h b/source/bsp/backu/bsp_msa300.h new file mode 100644 index 0000000..4069586 --- /dev/null +++ b/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 0x16ӦReg 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 + + + diff --git a/source/bsp/backu/bsp_power.c b/source/bsp/backu/bsp_power.c new file mode 100644 index 0000000..ea64ceb --- /dev/null +++ b/source/bsp/backu/bsp_power.c @@ -0,0 +1,128 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file APP_POWER.c +/// @brief APP_POWER driver app 电源管理 + +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20170122 +/// @note cc_AS_stc01 +////////////////////////////////////////////////////////////////////////////// + + + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +//#include "app_Gsensor.h" + +#include "bsp_power.h" + +ts_task_power_ ts_task_power; + +void L1_app_POWER_init(void) +{ + DL0_WDT_init(); + //L0_INT4_OPEN(); +} + +/// INT1 和INT0可以可以终止掉电状态 这样唤醒后执行进入掉电模式语句的吓一条 +/// p32 + +//// SENSINT2 ccSensor_CG_V02_m08_debug p3.3 int 1 pin14 +//// gsensor 的中断给出来 cpu被唤醒 开始工作 +//// int4 只有下降沿中断 +void L0_sensor_active(void) interrupt D_sensor_active_isrNo +{ + NOP(); NOP(); NOP(); + //L0_INT4_CLEAR(); + BITN_1(DR_who_wakeup, DRB_who_wakeup_action); + NOP(); NOP(); NOP(); + +} + +#if 0 + + while (1) + { + /// P31 = 0; + /// NOP(); NOP(); NOP(); NOP(); NOP();///22m 5个 100ns 一个20ns + D_cam_led_on();///400us + // L0_delay_1us(); + Lc_delay_ms(gRccUs01);///300--200ms + D_cam_led_off(); + P31 = 1; + /// NOP(); NOP(); NOP(); NOP(); NOP(); + //L0_delay_1us(); + Lc_delay_ms(900);//100--70ms + } + + void L1_app_POWER_handle(void) + { + //// fixme: 需要调试 + /********************** + if(1 == s_mu_b.power) + { + s_mu_b.power = 0; + if(INT1)///___/``` + {// 催眠cpu + L0_uart0_uc('`'); + //给主循环传递标志 + s_mu_b.work = 0; + }else + {// 唤醒cpu/// ```\____ + L0_uart0_uc('L'); + s_mu_b.work = 1; + } + + } + if(P30)///___/``` + {// + + // L0_uart0_uc('`'); + }else + {// 唤醒cpu/// ```\____ + L0_uart0_uc('L'); + s_mu_b.work = 1; + } + + + + ************************/ + + + + if(1 == ts_task_power.power) + { + ts_task_power.power = 0; + ///L0_uart0_uc('L'); + + } + } + + if(0 == s_mu_b.work) + {/// step 1: 关闭一些耗电的东西 + /// fixme: vcc1 因为下载的原因需要 改进 + + /// vcc1 ch340e Uart4.txd +// L2_power_AS_OFF(); +/// L0_mcu_mode_powerdown(); + /// L2_power_AS_ON(); + + //// step : 打开电源 + } + + + + +void Int0_Routine(void) interrupt D_ISR_int1 +{ + s_mu_b.power = 1; +} + +#endif + + + diff --git a/source/bsp/backu/bsp_power.h b/source/bsp/backu/bsp_power.h new file mode 100644 index 0000000..4da7121 --- /dev/null +++ b/source/bsp/backu/bsp_power.h @@ -0,0 +1,132 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file BSP_POWER.c +/// @brief BSP_POWER driver app 电源管理 +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20170122 +/// @note cc_AS_stc01 +///////////////////////////////////////////////////////////////////////////////// @version 1.0 +/// @author CC +/// @date 20180921 +/// @note +////////////////////////////////////////////////////////////////////////////// + +#ifndef _BSP_POWER_H +#define _BSP_POWER_H + +#include "../bsp/bsp_config.h" + + +#define L1_cw63_reg_set(x,y) L2_I2C_WriteCmd(D_i2c_addr_cw63xx, (x),(y) ) +#define L1_cw63_reg_get(x,y) L2_I2C_ReadReg(D_i2c_addr_cw63xx,(x),1) + + +///#define D_cam_led_on(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_ON|D_CW63XX_2V8); +///#define D_cam_led_off(); L1_cw63_reg_set(D_power_VCC2,D_CW63XX_OFF|D_CW63XX_2V8); + + +///#define D_cam_led_off(); D_cam_led_on();/// + + +#define D_cam_DVDD_on(); L1_cw63_reg_set(D_power_VCC,D_CW63XX_ON|D_CW63XX_2V5); +#define D_cam_DVDD_off(); L1_cw63_reg_set(D_power_VCC,D_CW63XX_OFF|D_CW63XX_2V5); + +#define D_cam_AVDD_on(); L1_cw63_reg_set(D_power_VCC1,D_CW63XX_ON|D_CW63XX_2V8);////D_cam_AVDD_off(); +#define D_cam_AVDD_off(); L1_cw63_reg_set(D_power_VCC1,D_CW63XX_OFF|D_CW63XX_2V8);/// +/// + + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +////#include "../bsp/msa300.h" + +#include "../msp/uart0.h" + +#define L0_mcu_mode_powerdown() PCON |= 0x02;_nop_();_nop_();_nop_();_nop_(); +/// PCON |= 0x02; //将STOP(PCON.1)置1,MCU将进入掉电模式 +// //此时CPU无时钟,不执行指令,且所欲外设停止工作 +// //外部中断信号和外部复位信号可以终止掉电模式 +// + +#define L0_mcu_mode_powerIDL() PCON = 0x01;_nop_();_nop_();_nop_();_nop_(); +/// PCON |= 0x02; //将STOP(PCON.0)置1,MCU将进入 模式 +// //此时CPU 停止工作 +// //外部中断信号和外部复位信号可以终止 +// +///1000,000/32,000 x 16x(1+n) = +#define D_WKTC_16S 0X7FFF +#define D_WKTC_15S 29999 +#define D_WKTC_10S 19999 +#define D_WKTC_5S 9999 +#define D_WKTC_3S 5999 +#define D_WKTC_2S 3999 +#define D_WKTC_1S 1999 +#define D_WKTC_500MS 999 +#define D_WKTC_50mS 99 + +#define L0_mcu_WKTC(X) WKTC = 0x8000|(X) + +///#define L0_mcu_WKTC(X) WKTCH = B1111_1111;WKTCL = 0XFF + + + +#define D_sensor_active_isrNo D_ISR_int4 + + +typedef struct +{ + U8 TI:1; + U8 RI:1; + U8 Tx_en:1; + U8 Rx_en:1; //波特率的位数 eive bit number (8 data bits + 1 stop bit) + U8 work:1; + U8 show_mod:1; // =0 普通模式 //s_mu_b.show_mod + U8 power:1; // =0 普通模式 //s_mu_b.power + U8 power2:1; // =0 普通模式 //s_mu_b.show_mod +// U8 power; // =0 普通模式 //s_mu_b.show_mod + +}ts_task_power_; +extern ts_task_power_ ts_task_power; + + +extern void L1_app_POWER_init(void); +extern void L1_app_POWER_handle(void); + + // WDT_CONTR = 0x23; //11m使能看门狗,溢出时间约为0.5s + /// WDT_CONTR = 0x24; //11m使能看门狗,溢出时间约为1s + // WDT_CONTR = 0x27; //11m使能看门狗,溢出时间约为8s + // P32 = 0; //测试端口 +/// ///22m 2.5s +#ifdef D_use_WDT + +#define DL0_WDT_init() WDT_CONTR =BITN5|D_WDT_2520ms +#define DL0_WDT() WDT_CONTR |= 0x10 //清看门狗,否则系统复位 +#else + +#define DL0_WDT_init() +#define DL0_WDT() + +#endif +///注意和烧写界面的硬件看门狗启动 +#define D_WDT_315ms B0010_0011 +#define D_WDT_629ms B0010_0100 +#define D_WDT_1260ms B0010_0101 +#define D_WDT_2520ms B0010_0110 +#define D_WDT_5030ms B0010_0111 + +///11m +#define D_WDT_524ms B0010_0011 +#define D_WDT_1050ms B0010_0100 +#define D_WDT_2100ms B0010_0101 +#define D_WDT_4200ms B0010_0110 +#define D_WDT_8390ms B0010_0111 + + +#endif // #ifndef _BSP_POWER_H + + diff --git a/source/bsp/backu/bsp_sca720.c b/source/bsp/backu/bsp_sca720.c new file mode 100644 index 0000000..4f5cbc8 --- /dev/null +++ b/source/bsp/backu/bsp_sca720.c @@ -0,0 +1,911 @@ +#include "bsp_sca720.h" +#include "c_lib.h" +#include "debug_drv.h" + +#include "TTSS_task.h" +///u8 SC7A20_Msg = 8; + u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80}; +/// /// 0 1 2 3 4 5 6 7 8 9 + +TS_sca720_ ts_gs7= +{ + ///u8 reg[33];//0x1e +0x05,///00 #define D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +0x00,///01 #define D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +0x2f,///02 #define D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +0x04,///03 #define D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +0x80,///04 #define D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +0x08,///05 #define D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +0x00,///06 #define D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +0x02,///07 #define D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +0x00,///08 #define D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +0x00,///09 #define D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +0x00,///10 #define D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +0x00,///11 #define D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +0x00,///12 #define D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +0x00,///13 #define D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +0x00,///14 #define D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +0x00,///15 #define D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +0x00,///16 #define D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +0x00,///17 #define D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +0x00,///18 #define D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +0x00,///19 #define D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +0x00,///20 #define D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +0x00,///21 #define D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +0x00,///22 #define D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +0x00,///23 #define D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +0x00,///24 #define D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +0x00,///25 #define D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +0x15,///26 #define D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +0x00,///27 #define D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +0x00,///28 #define D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +0x05,///29 #define D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +0x01,///30 #define D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +0x00,///31 #define D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +0x00,///32 #define D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +0x00,///33 #define D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + +}; + +#define D_reg(x) ts_gs7.reg[x-D_0x1e] +#define L0_set_reg(x) Sensor_Write_Byte(x,D_reg(x)) + + + + +static INT8U g_level; + + +static INT8U G_sensor_status=0; + +///#define BITN_1(X,BITNx) (X)|= (BITNx) +///#define BITN_0(X,BITNx) (X)&=~(BITNx) + +#define D_SC7A20_ODR_Powerdown 0 ///电源关断模式 +#define D_SC7A20_ODR_10HZ 0x20///正常/低功耗10HZ +#define D_SC7A20_LPEN BITN3 +#define D_SC7A20_Zen BITN2 +#define D_SC7A20_Yen BITN1 +#define D_SC7A20_Xen BITN0 + +#define D_D_SC7A20_LowPower 1 +#define D_D_SC7A20_NormalPower 0 + +/// + +void L1_SC7A20_lowpower(vtype normallowpoer) +{ + D_reg(D_SC7A20_CTRL_REG1) = 0; + if(D_D_SC7A20_LowPower == normallowpoer) + { + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ|D_SC7A20_LPEN);///1,低功耗模式 + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能 + }else + { + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ);/// 正常模式//odr 10Hz + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能 + + } + +} + + + //INT1_CFG 30H +#define D_INT1_AOI BITN7 +#define D_INT1_6D BITN6 +#define D_INT1_ZHIE_ZUPE BITN5 +#define D_INT1_ZLIE_ZDOWNE BITN4 +#define D_INT1_YHIE_YUPE BITN3 +#define D_INT1_YLIE_YDOWNE BITN2 +#define D_INT1_XHIE_XUPE BITN1 +#define D_INT1_XLIE_XDOWNE BITN0 + +/************ + +12.2 控制寄存器 2 (21h) +B7 B6 B5 B4 B3 B2 B1 B0 +HPM1 HPM0 HPCF2 HPCF1 FDS HPCLICK HPIS2 HPIS1 +HPM1-HPM0 高通模式选择。默认值:00 +参考“高通模式配置” +HPCF2 -HPCF1 高通截止频率选择 +FDS 数据滤波选择。默认值:0 +(0:跳过内部滤波; 1:内部滤波以后的数据输出到数据寄存器或 FIFO +HPCLICK CLICK 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +HPIS2 中断 2 AOI 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +HPIS1 中断 1 AOI 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +***********/ + +#define HPCLICK BITN2 + +#define HPIS2 BITN1 +#define HPIS1 BITN0 + +/*********** +12.4 控制寄存器 4(23h) +B7 B6 B5 B4 B3 B2 B1 B0 +BDU BLE FS1 FS0 HR ST1 ST0 SIM +BDU 块数据更新。默认值:0 +(0:连续更新;1:输出数据寄存器不更新直到 MSB 和 LSB 被读取) +BLE 大端/小端数据选择。默认值:0 +(0:低字节数据在低地址;1:高字节数据在低地址) +FS1-FS0 全量程选择。默认值:00 +(00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G) +HR 高精度输出模式选择。默认值:0 +(0: 高精度禁止; 1:高精度使能) +ST1-ST0 自测试使能。默认值:00 +(00: 自测试禁止;其他: 参考“自测试模式配置” ) +SIM SPI 串行接口模式配置。默认值:0 +(0:4 线接口; 1:3 线接口) + +#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 + + + +12.5 控制寄存器 5(24h) +B7 B6 B5 B4 B3 B2 B1 B0 +BOOT FIFO_EN -- -- LIR_INT1 D4D_INT1 LIR_INT2 D4D_INT2 + +BOOT 重载修调值。默认值:0 +(0:正常模式; 1:重载修调值) +FIFO_EN FIFO 使能。默认值:0 +(0:FIFO 禁止; 1: FIFO 使能) +LIR_INT1 锁存中断 1 配置寄存器上指定的中断响应。 +通过读中断 1 配置寄存器可以清除相应的中断锁存信号。默认值:0 +(0: 不锁存中断信号; 1:锁存中断信号) +D4D_INT1 4D 使能: 在 INT1 管脚上使能 4D 检测,同时要把中断 1 配置寄存器中的 6D 为置 1。 +LIR_INT2 锁存中断 2 配置寄存器上指定的中断响应。 +通过读中断 2 配置寄存器可以清除相应的中断锁存信号。默认值:0 +(0: 不锁存中断信号; 1:锁存中断信号) +D4D_INT2 4 D 使能: 在 INT2 管脚上使能 4D 检测,同时要把中断 2 配置寄存器中的 6D 为置 1。 +***********/ +#define LIR_INT1 BITN3 +void L1_SC7A20_FF(void) +{ + D_reg(D_SC7A20_CTRL_REG1) = SL_SC7A20_ODR_100HZ; + L0_set_reg(D_SC7A20_CTRL_REG1); + + D_reg(D_SC7A20_CTRL_REG2) = 0;///0:滤波禁止 + L0_set_reg(D_SC7A20_CTRL_REG2); + + D_reg(D_SC7A20_CTRL_REG3) = 0;///中断全部禁止 + L0_set_reg(D_SC7A20_CTRL_REG3); + + D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认 + + ///D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_4G;///FIXME:高精度和功耗的关系需要FAE确认 + + + L0_set_reg(D_SC7A20_CTRL_REG4); + + D_reg(D_SC7A20_CTRL_REG5) = LIR_INT1;///FIXME:高精度和功耗的关系需要FAE确认 + L0_set_reg(D_SC7A20_CTRL_REG5); + + //FreeFall AOI1 + D_reg(D_SC7A20_INT1_CFG) = 0x95;///1001 0101 与中断 xyz低中断使能 高中断关闭 +/// D_reg(D_SC7A20_INT1_CFG) = D_INT1_AOI|D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE;///1001 0101 与中断 xz低中断使能 高中断关闭 +// D_reg(D_SC7A20_INT1_CFG) = D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE|D_INT1_YLIE_YDOWNE;///1001 0101 中断 xz低中断使能 高中断关闭 + L0_set_reg(D_SC7A20_INT1_CFG);/// + + #ifdef D_2g + + D_reg(D_SC7A20_INT1_THS) = 0x1F;/// + L0_set_reg(D_SC7A20_INT1_THS);/// + D_reg(D_SC7A20_INT1_DURATION) = 0x05;/// + L0_set_reg(D_SC7A20_INT1_DURATION);/// + + #else + + D_reg(D_SC7A20_INT1_THS) = 0x1F;/// + L0_set_reg(D_SC7A20_INT1_THS);/// + D_reg(D_SC7A20_INT1_DURATION) = 0x05;/// + L0_set_reg(D_SC7A20_INT1_DURATION);/// + + #endif +} + + +void L1_SC7A20_Init(u8 *Acc_Int_Thr) +{ + u8 temp1; + Acc_Int_Thr = 0; + Sensor_Read_Byte(CHIPID,&temp1); + printf("Chip_ID = %x\r\n", temp1); + + printf("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了 + { + printf("Error\r\n"); + } + + +#if 10 + + D_reg(D_SC7A20_CTRL_REG1) = 0x57;///1 + L0_set_reg(D_SC7A20_CTRL_REG1);/// + + + L1_SC7A20_lowpower(D_D_SC7A20_NormalPower);///L0_set_reg(D_SC7A20_CTRL_REG1);//odr 10Hz + L0_set_reg(D_SC7A20_CTRL_REG2);//fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + + D_reg(D_SC7A20_CTRL_REG3) = D_REG3_I1_AOI1;/// 0x22, 0x40);//AOI1 映射到INT1 + L0_set_reg(D_SC7A20_CTRL_REG3);/// + + D_reg(D_SC7A20_CTRL_REG4) = D_FS_4G; +/// D_reg(D_SC7A20_CTRL_REG4) = D_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认 + L0_set_reg(D_SC7A20_CTRL_REG4); + + L0_set_reg(D_SC7A20_NVM_WR); //开启控制开关 + + D_reg(D_SC7A20_CTRL_REG5) = 0x80;///B1000_0000 + L0_set_reg(D_SC7A20_CTRL_REG5);/// + /// Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻fixme:20220401 + + D_reg(D_SC7A20_CTRL_REG6) = D_REG6_H_LACTIVE;/// + L0_set_reg(D_SC7A20_CTRL_REG6);///0x25, 0x02);//INT1 默认高电平,有中断输出低电平 selects active level low for pin INT 正常是高电平,有效的时候是低电平 + + + + L1_SC7A20_FF(); + +/// L0_set_reg(D_SC7A20_CLICK_THS);// //设定中断阈值(触发阈值) +/// L0_set_reg(D_SC7A20_TIME_LIMIT);// + +#else + + reg( 20)=2f 47 + reg( 21)=4 4 + reg( 22)=80 128 + reg( 23)=88 136 + reg( 24)=0 0 + reg( 25)=2 2 + + /// u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80}; + /// 0 1 2 3 4 5 6 7 8 9 + Sensor_Write_Byte(D_SC7A20_CTRL_REG1,D_reg(D_SC7A20_CTRL_REG1));///SC7A20_REG[0]); //odr 10Hz + Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8 + //SDO 接地 + Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关 + Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻 + + Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平 + Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值) + Sensor_Write_Byte(0x3b,SC7A20_REG[6]); + + Sensor_Write_Byte(0x3c,SC7A20_REG[7]); + Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应)) + Sensor_Write_Byte(0x22,SC7A20_REG[9]); +#endif + +} + +///#define D_2uc_u16(H,L) (((u16)H)<<8 | (u16)L) +void L1_SC7A20_xyz(void) +{ + L2_IICM1_ReadReg(G_SlaveAddr,(D_SC7A20_ADD_INC|D_SC7A20_OUT_X_L), + &D_reg(D_SC7A20_OUT_X_L),6); + ///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3); + ///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3); + ts_gs7.x = D_2uc_u16(D_reg(D_SC7A20_OUT_X_H),D_reg(D_SC7A20_OUT_X_L)); + ts_gs7.y = D_2uc_u16(D_reg(D_SC7A20_OUT_Y_H),D_reg(D_SC7A20_OUT_Y_L)); + ts_gs7.z = D_2uc_u16(D_reg(D_SC7A20_OUT_Z_H),D_reg(D_SC7A20_OUT_Z_L)); + + printf("\r\n%d %d %d",ts_gs7.x,ts_gs7.y,ts_gs7.z); + + +} +/******* +12.12 中断 1 状态寄存器 (31h) +B7 B6 B5 B4 B3 B2 B1 B0 +0 IA ZH ZL YH YL XH XL +IA 中断激活。默认值:0 +(0: 中断没有产生; 1:一个或多个中断已经产生) +ZH Z 轴高。 默认值:0 +(0:没有中断, 1:Z 轴高事件已经产生) +ZL Z 轴低。默认值:0 +(0:没有中断, 1:Z 轴低事件已经产生) +YH Y 轴高。 默认值:0 +(0:没有中断, 1:Y 轴高事件已经产生) +YL Y 轴低。默认值:0 +(0:没有中断, 1:Y 轴低事件已经产生) +XH X 轴高。 默认值:0 +(0:没有中断, 1:X 轴高事件已经产生) +XL X 轴低。默认值:0 +(0:没有中断, 1:X 轴低事件已经产生) + + +*********/ + + + +//自由落体检测 +void L2_SC7A20_Freefall_Status(void) +{ + unsigned char sl_freefall_reg; + + Sensor_Read_Byte(D_SC7A20_INT1_SOURCE, &sl_freefall_reg); + //USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg); + if((sl_freefall_reg&0x40)==0x40) + {///跌落第一级判定 fixme: + if(ts_gs7.staus != sl_freefall_reg) + { + ts_gs7.staus = sl_freefall_reg; + if(sl_freefall_reg == 0x55) + { + ts_gs7.ff_temp ++; + printf(" 20000 INT1_SOURCE (%2x)= %2x %d", + (int)D_SC7A20_INT1_SOURCE,(int)sl_freefall_reg,(int)ts_gs7.ff_temp); + ts_gs7.n = 0; + ts_gs7.got = 1; + TTSS_overtime_init(ts_gs7.stamp,10); + } + } + } + if(1 == ts_gs7.got) + { + TTSS_overtime_get(ts_gs7.stamp) + {////空闲一段时间后 确定当前跌落持续的时间 + ts_gs7.ff = ts_gs7.ff_temp; + printf(" FF %d",(int)ts_gs7.ff); + ts_gs7.ff_temp = 0; + ts_gs7.got = 0; + } + TTSS_overtime_end + } +} + + +void L3_GSensor_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)/// + { //// fc R1 R2 R3 ocr + //// fc 04 33 44 01 + L1_SC7A20_Init(&Ts_debug.td->R2); + printf("SC7A20_Init2 %x \r\n",Ts_debug.td->R2); + ///L0_uart0_sendstr("\r\n G_Sensor_SC7A20_Init2\r\n"); + /// L3_adc_zero(); + }else if(0x01 == Ts_debug.td->R1)///设置重量的清? + { + //// fc R1 R2 R3 ocr + //// fc 01 33 44 01 + L1_SC7A20_xyz(); + + }else if(0x02 == Ts_debug.td->R1)///读取 + { + //// fc R1 R2 R3 ocr + //// fc 02 33 44 01 + + for(Ts_debug.td->R1 = 0; Ts_debug.td->R1 <= D_SC7A20_ACT_DURATION; Ts_debug.td->R1++) + { + Ts_debug.td->R2 = L2_IICM1_Read1Reg1D(G_SlaveAddr,Ts_debug.td->R1); + printf("reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R1,(int)Ts_debug.td->R2 ,(int)Ts_debug.td->R2 ); + + } + + }else if(0x03 == Ts_debug.td->R1)///设置重量的清? + { + //// fc R1 R2 R3 ocr + //// fc 03 reg dat 01 + /// fc 03 + g_sensor_write_add(Ts_debug.td->R2,Ts_debug.td->R3); + printf("g_sensor_write_add reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R2,(int)Ts_debug.td->R3 ,(int)Ts_debug.td->R3 ); + } + else + { + L0_uart0_sendstr("\r\n command error \r\n"); + + } + } + else + { + + } + + } +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef doc2342342343 + + 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); + + + + + + +#endif + + +#ifdef Doc09s780987 + +Aban + + +Aban +40 0A D0 05 60 C2 + +reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved +reg( 1)= F 15 OUT_TEMP_L r 0C 0001100 output +reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output +reg( 3)= B 11 Reserved(do not modify) 0E Reserved +reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001 +reg( 5)= C5 197 Reserved(do not modify) 10-12 Reserved +reg( 6)= 0 0 USER_CAL 13-1A +reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved +reg( 8)= 0 0 +reg( 9)= 0 0 +reg( A)= 0 0 +reg( B)= 0 0 +reg( C)= 0 0 +reg( D)= 0 0 +reg( E)= 0 0 +reg( F)= 11 17 +reg( 10)= FE 254 +reg( 11)= FF 255 +reg( 12)= 0 0 +reg( 13)= 10 16 +reg( 14)= FF 255 +reg( 15)= 8D 141 +reg( 16)= 7E 126 +reg( 17)= FF 255 +reg( 18)= 2 2 +reg( 19)= 2 2 +reg( 1A)= 2 2 +reg( 1B)= 2 2 +reg( 1C)= 0 0 +reg( 1D)= 0 0 +reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 0000000 +reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 0000011 +reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 0000000 +reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 0000000 +reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 0000000 +reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 0000000 +reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 0000000 +reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 0000000 +reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000 +reg( 28)= 60 96 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +reg( 29)= 8 8 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +reg( 2A)= F0 240 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +reg( 2B)= 6 6 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +reg( 2C)= 20 32 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +reg( 2D)= C2 194 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000 +reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 0000000 +reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 0000000 +reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 0000000 +reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000 +reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 0000000 +reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000 +reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 0000000 +reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 0000000 +reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000 +reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 1100000000 +reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 0000000 +reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + +B an +-7424 -19168 -32640 +-7360 -19184 -32640 +-7344 -19168 -32640 +reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved +reg( 1)= E8 232 OUT_TEMP_L r 0C 0001100 output +reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output +reg( 3)= B8 184 Reserved(do not modify) 0E Reserved +reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001 +reg( 5)= 80 128 Reserved(do not modify) 10-12 Reserved +reg( 6)= 0 0 USER_CAL 13-1A +reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved +reg( 8)= 0 0 +reg( 9)= 0 0 +reg( A)= 0 0 +reg( B)= 0 0 +reg( C)= 0 0 +reg( D)= 0 0 +reg( E)= 0 0 +reg( F)= 11 17 +reg( 10)= 0 0 +reg( 11)= 0 0 +reg( 12)= 0 0 +reg( 13)= 0 0 +reg( 14)= 0 0 +reg( 15)= 0 0 +reg( 16)= 0 0 +reg( 17)= 0 0 +reg( 18)= 0 0 +reg( 19)= 0 0 +reg( 1A)= 0 0 +reg( 1B)= 2 2 +reg( 1C)= 0 0 +reg( 1D)= 0 0 +reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +reg( 28)= 90 144 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +reg( 29)= E3 227 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +reg( 2A)= 30 48 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +reg( 2B)= B4 180 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +reg( 2C)= 80 128 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +reg( 2D)= 80 128 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 +70 E3 00 B5 80 80 +70 E3 80 B4 80 80 + + + + +void SC7A20_Enter_Interrupt_WakeUp_Mode(INT8U level) +{ + + + /// I2C_gpio_init(I2C_SCL,I2C_SDA); + DBG_PRINT("interupt wake up mode level=%d!\r\n",level); +#define USE_G_SENSOR_ACTIVE 1 +#if USE_G_SENSOR_ACTIVE ==0 + g_sensor_write_add(0x25,0x02); //selects active level low for pin INT +#else + g_sensor_write_add(0x25,0x00); //selects active level high for pin INT +#endif + + switch(level) + { + case 0://doesn't map to INT + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x22,0x00); + return ; + break; + case 1://low + g_sensor_write_add(0x3a,40); + break; + case 2://mid + g_sensor_write_add(0x3a,20); + break; + case 3://high + g_sensor_write_add(0x3a,10); + break; + } + g_sensor_write_add(0x3b,0x7f); + g_sensor_write_add(0x3c,0x6a); + g_sensor_write_add(0x38,0x15); + g_sensor_write_add(0x22,0x80); + + +} + +void ap_gsensor_set_sensitive(INT8U Gsensor) +{ + DBG_PRINT("ap_gsensor_set_sensitive level=%d\r\n",Gsensor); + ///sw_i2c_lock(); + + switch(Gsensor) + { + case 0://doesn't map to INT + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x22,0x00); + g_level = 0xff; + break; + case 1://low + g_sensor_write_add(0x3a,10); + g_level = 30; + break; + case 2://mid + g_sensor_write_add(0x3a,20); + g_level = 50; + break; + case 3://high + g_sensor_write_add(0x3a,40); + g_level = 70; + break; + default: + + break; + } + // g_sensor_write_add(INT_LATCH, 0x81); //clear gsensor interrupt flag + + ///sw_i2c_unlock(); +} + + +void G_Sensor_park_mode_init(INT8U level) +{ + SC7A20_Enter_Interrupt_WakeUp_Mode(level); +} + + +/*read accelertion data , only X and Y axis*/ +u8 Read_XY_Data(s8 *buf) +{ + u8 cd[2]; +/// Sensor_Read_Byte(0x28+1,&cd[0]); +/// Sensor_Read_Byte(0x28+3,&cd[1]); + buf[0]=cd[0]; + buf[1]=cd[1]; + return 0; +} + +void G_Sensor_SC7A20_Init2(u8 *Acc_Int_Thr) +{ + u8 temp1; + + Sensor_Read_Byte(CHIPID,&temp1); + printf("Chip_ID = %x\r\n", temp1); + + printf("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了 + { + printf("Error\r\n"); + } + + /*click */ + Sensor_Write_Byte(0x20,SC7A20_REG[0]); //odr 10Hz + Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8 + //SDO 接地 + Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关 + Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻 + + Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平 + Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值) + Sensor_Write_Byte(0x3b,SC7A20_REG[6]); + + Sensor_Write_Byte(0x3c,SC7A20_REG[7]); + Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应)) + Sensor_Write_Byte(0x22,SC7A20_REG[9]); + +// g_sensor_write(G_SlaveAddr,0x20,0x2f); //odr +// g_sensor_write(G_SlaveAddr,0x21,0x04); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) +// g_sensor_write(G_SlaveAddr,0x23,0x98); //range bdu 0x20--0xA8 +// +// //SDO 接地 +// g_sensor_write(G_SlaveAddr,0x1e,0x05); //开启控制开关 +// g_sensor_write(G_SlaveAddr,0x57,0x08); //关闭SDO管脚上的上拉电阻 + + /*AOI*/ +// g_sensor_write(G_SlaveAddr,0x20,0x2f); //设置odr +// g_sensor_write(G_SlaveAddr,0x23,0x98); //设置量程range bdu 0x20--0xA8 +} + + +/*read accelertion data */ +u8 read_acceler_data(s8 *buf) +{ + u8 i; + u8 cd[6]; + for(i=0;i<6;i++){ + /// Sensor_Read_Byte(0x28+i,&cd[i]); + } + buf[0]=cd[1]; + buf[1]=cd[3]; + buf[2]=cd[5]; + +// if(((buf[0]==0)&&(buf[1]==0)&&(buf[2]==0)) +// ||((buf[0]==-1)&&(buf[1]==-1)&&(buf[2]==-1)) +// ) +// { +// return 1; +// } + + return 0; +} + +INT16U G_sensor_get_int_active(void) +{ + INT16U temp=0x00; + INT8S x,y,z=0; +/// sw_i2c_lock(); +{ + x = g_sensor_read(G_SlaveAddr, 0x29); //erichan 20150529 + y = g_sensor_read(G_SlaveAddr, 0x2b); //erichan 20150529 + z = g_sensor_read(G_SlaveAddr, 0x2d); //erichan 20150529 + DBG_PRINT("abs(x)=%d,abs(y)=%d,abs(z)=%d\r\n",abs(x),abs(y),abs(z)); + if((abs(x) > g_level) || (abs(y) > g_level) || (abs(z) > g_level)) + temp=0x40; +} + +/// sw_i2c_unlock(); + return temp; +} + +void G_Sensor_Init(INT8U level) +{ + G_sensor_status=0; +/// G_Sensor_SC7A20_Init(level); +} + + +INT32U G_Get_ACC_Data(INT8U addr, INT8U Num) +{ + INT16U Redata,temp; + + if(Num==1){ +/// L2_iicx_Read1Reg(&ts_siic1,8); + Redata = g_sensor_read(G_SlaveAddr,addr); + /// Redata = L2_iicx_Read1Reg(&ts_siic1,addr); + }else{ + temp = g_sensor_read(G_SlaveAddr,addr); + Redata = g_sensor_read(G_SlaveAddr,addr+1); + + Redata = (Redata<<8)|(temp&0x00ff); + } + + return Redata; +} + +INT8U ap_gsensor_power_on_get_status(void) +{ + return G_sensor_status; +} + +void ap_gsensor_power_on_set_status(INT8U status) +{ + if(status) + G_sensor_status=1; //gsensor power on + else + G_sensor_status=0; //key power on +} +#if 0 +void G_Sensor_SC7A20_Init(INT8U level) +{ + INT8U temp1; + + INT8U MTPSETTING,B57H,B1BH,i; + + MTPSETTING= 0x07; + B57H=0x00; + B1BH=0x08;//for iicaddr=0x3a + + temp1 = g_sensor_read(G_SlaveAddr,CHIPID); + DBG_PRINT("chip_id = %x\r\n", temp1); + DBG_PRINT("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed + { + for(i=0;i<3;i++) + { + g_sensor_write(0x30,0x59,MTPSETTING); + g_sensor_write(0x30,0x1e,0x05); + g_sensor_write(0x30,0x1b,B1BH); + g_sensor_write(0x30,0x57,B57H); + + + g_sensor_write(0x32,0x59,MTPSETTING); + g_sensor_write(0x32,0x1e,0x05); + g_sensor_write(0x32,0x1b,B1BH); + g_sensor_write(0x32,0x57,B57H); + + + g_sensor_write(0x34,0x59,MTPSETTING); + g_sensor_write(0x34,0x1e,0x05); + g_sensor_write(0x34,0x1b,B1BH); + g_sensor_write(0x34,0x57,B57H); + + + + g_sensor_write(0x36,0x59,MTPSETTING); + g_sensor_write(0x36,0x1e,0x05); + g_sensor_write(0x36,0x1b,B1BH); + g_sensor_write(0x36,0x57,B57H); + + + g_sensor_write(0x38,0x59,MTPSETTING); + g_sensor_write(0x38,0x1e,0x05); + g_sensor_write(0x38,0x1b,B1BH); + g_sensor_write(0x38,0x57,B57H); + + + + g_sensor_write(0x3a,0x59,MTPSETTING); + g_sensor_write(0x3a,0x1e,0x05); + g_sensor_write(0x3a,0x1b,B1BH); + g_sensor_write(0x3a,0x57,B57H); + + + g_sensor_write(0x3c,0x59,MTPSETTING); + g_sensor_write(0x3c,0x1e,0x05); + g_sensor_write(0x3c,0x1b,B1BH); + g_sensor_write(0x3c,0x57,B57H); + + + + g_sensor_write(0x3e,0x59,MTPSETTING); + g_sensor_write(0x3e,0x1e,0x05); + g_sensor_write(0x3e,0x1b,B1BH); + g_sensor_write(0x3e,0x57,B57H); + } + + + g_sensor_write(G_SlaveAddr,0x1e,0x05); //to comment + + } + + //g_sensor_write(0x32,0x24,0x80); + //--------------------------------------------------- + temp1 = g_sensor_read(G_SlaveAddr, 0x39); + if(temp1 & 0x40 ) //active int flag + { + ap_gsensor_power_on_set_status(1); + DBG_PRINT("==========gsensor power on=========\r\n"); + }else{ + ap_gsensor_power_on_set_status(0); + DBG_PRINT("==========key power on=============\r\n"); + } + + g_sensor_write_add(0x22,0x00); + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x24,0x80); + /*temp1 = g_sensor_read(G_SlaveAddr,0x57); + if(!(temp1 & 0x04)) + { + g_sensor_write_add(0x1e,0x05); + temp1 |= 0x04; + g_sensor_write_add(0x57,temp1); + g_sensor_write_add(0x1e,0x15); + g_delay(500); + }*/ + //else + //g_sensor_write_add(0x1e,0x00); + + g_sensor_write_add(0x20,0x37); + g_sensor_read(G_SlaveAddr, 0x26);// + g_sensor_write_add(0x21,0x0d); + g_sensor_write_add(0x23,0x80); + +} + + + +#endif + + +#endif + + diff --git a/source/bsp/backu/bsp_sca720.h b/source/bsp/backu/bsp_sca720.h new file mode 100644 index 0000000..2211dc3 --- /dev/null +++ b/source/bsp/backu/bsp_sca720.h @@ -0,0 +1,399 @@ +#ifndef __bsp_sca720_H__ +#define __bsp_sca720_H__ + +#include "msp_iicM1.h" +#define SC7A20_SLAVE_ID 0x32//0x4E ,erichan 20150529 + #define G_SlaveAddr SC7A20_SLAVE_ID + + + +/***使用驱动前请根据实际接线情况配置******/ +/**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 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 + +#if 0 + +#define P_SENSITIVE_LOW 0x60 +#define P_SENSITIVE_MID 0x38 +#define P_SENSITIVE_HIGH 0x10 + +#define DMT_SENSITIVE_LOW 0xB0 +#define DMT_SENSITIVE_MID 0x60 +#define DMT_SENSITIVE_HIGH 0x20 + +//========================================== +// SC7A20 Register +//========================================== +#define SOFT_RESET 0x00 +//#define CHIPID 0x01 +#define CHIPID 0x0f// erichan 20150529 + +#define ACC_X_LSB 0x02 +#define ACC_X_MSB 0x03 + +#define ACC_Y_LSB 0x04 +#define ACC_Y_MSB 0x05 + +#define ACC_Z_LSB 0x06 +#define ACC_Z_MSB 0x07 + +#define MOTION_FLAG 0x09 +#define NEWDATA_FLAG 0x0A + +#define TAP_ACTIVE_STATUS 0x0B + +#define RESOLUTION_RANGE 0x0F // Resolution bit[3:2] -- 00:14bit + // 01:12bit + // 10:10bit + // 11:8bit + + // FS bit[1:0] -- 00:+/-2g + // 01:+/-4g + // 10:+/-8g + // 11:+/-16g +#define ODR_AXIS 0x10 +#define MODE_BW 0x11 +#define SWAP_POLARITY 0x12 +#define INT_SET1 0x16 +#define INT_SET2 0x17 +#define INT_MAP1 0x19 +#define INT_MAP2 0x1A +#define INT_CONFIG 0x20 +#define CHIPID 0x0f +#define INT_LATCH 0x21 +#define FREEFALL_DUR 0x22 +#define FREEFALL_THS 0x23 +#define FREEFALL_HYST 0x24 +#define ACTIVE_DUR 0x27 +#define ACTIVE_THS 0x28 +#define TAP_DUR 0x2A +#define TAP_THS 0x2B +#define ORIENT_HYST 0x2C +#define Z_BLOCK 0x2D +#define SELF_TEST 0x32 +#define ENGINEERING_MODE 0x7f + + + + +#endif +//========================================================== + + +extern void G_Sensor_SC7A20_Init(INT8U level); +extern void SC7A20_Enter_Interrupt_WakeUp_Mode(INT8U level); + +extern void ap_gsensor_set_sensitive(INT8U Gsensor); +extern void G_Sensor_Init(INT8U level); +extern void G_Sensor_park_mode_init(INT8U level); + +extern void G_sensor_clear_int_flag(void); +extern INT16U G_sensor_get_int_active(void); + +extern void ap_gsensor_power_on_set_status(INT8U status); +extern INT8U ap_gsensor_power_on_get_status(void); +#if 0 +#define g_sensor_write(x,y,z); {ts_siic[D_IIC_GSENSOR].sal = x; L1_iicx_Write2Reg(&ts_siic[D_IIC_GSENSOR],y,z);} + +#define g_sensor_write_add(y,z); L1_iicx_Write2Reg(&ts_siic[D_IIC_GSENSOR],y,(z)); +#define g_sensor_read(x,y) L2_iicx_Read1Reg1DataR(&ts_siic[D_IIC_GSENSOR],y) +#define Sensor_Read_Byte(x,y) L2_iicx_Read1Reg1Data(&ts_siic[D_IIC_GSENSOR],x,(y)) + +#else + + + + +#endif + + +extern void G_Sensor_SC7A20_Init2 (u8 *Acc_Int_Thr); + +///extern void g_sensor_write(INT8U id, INT8U addr, INT8U data); +///extern INT16U g_sensor_read(INT8U id, INT8U addr); +///g_sensor_read + +///temp1 = g_sensor_read(G_SlaveAddr,CHIPID); + + + + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +///1e 30 +///3f 63 33 +#define D_0x1e 0x1e +typedef struct +{ + u8 reg[34];//0x1e + u8 staus; + u8 ff_temp; + u8 ff; + u8 got; + U32 n; + U32 stamp; + S16 x,y,z; +}TS_sca720_; + +extern TS_sca720_ ts_gs7; + +///1e 30 +///3f 63 33 + +#define D_SC7A20_OUT_TEMP_L 0x0c +#define D_SC7A20_OUT_TEMP_H 0x0D +#define D_SC7A20_WHO_AM_I 0x0F + +#define CHIPID D_SC7A20_WHO_AM_I +#define D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +#define D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +#define D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +#define D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +#define D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +#define D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +#define D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +#define D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +#define D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +#define D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +#define D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +#define D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +#define D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +#define D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +#define D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +#define D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +#define D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +#define D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +#define D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +#define D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +#define D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +#define D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +#define D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +#define D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +#define D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +#define D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +#define D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +#define D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +#define D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +#define D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +#define D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +#define D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +#define D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +#define D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + + + +#define D_SC7A20_ADD_INC 0x80 +////1000 +////0010 +////1010 + + +//reg4 23h +#define D_BDU BITN7 +#define D_FS_2G 0///,(BITN5|BITN4) +#define D_FS_4G (BITN4) +#define D_FS_8G (BITN5) +#define D_HR (BITN3) + + +/*** +12.3 控制寄存器 3(22h) +B7 B6 B5 B4 B3 B2 B1 B0 +I1_CLICK I1_AOI1 I1_AOI2 I1_DRDY1 I1_DRDY2 HI1_WTM I1_OVERRUN -- + +I1_CLICK CLICK 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_AOI1 AOI1 中断在 on INT1。 默认值:0 +(0:禁止; 1:使能) +I1_AOI2 AOI2 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_DRDY1 DRDY1 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_DRDY2 DRDY2 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_WTM FIFO 水印中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_OVERRUN FIFO 溢出中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) + +***/ + +#define D_REG3_I1_CLICK BITN7 +#define D_REG3_I1_AOI1 BITN6 +#define D_REG3_I1_AOI2 BITN5 +#define D_REG3_I1_DRDY1 BITN4 +#define D_REG3_I1_DRDY2 BITN3 +#define D_REG3_I1_WTM BITN2 +#define D_REG3_I1_OVERRUN BITN1 + + + /*** + 12.6 控制寄存器 6(25h) + B7 B6 B5 B4 B3 B2 B1 B0 + I2_CLICK I2_INT1 I2_INT2 BOOT_I2 0 -- H_LACTIVE -- + + I2_CLICK CLICK 中断在 INT2 上。默认值:0 + (0:禁止; 1:使能) + I2_INT1 AOI2 中断在 on INT1。 默认值:0 + (0:禁止; 1:使能) + I2_INT2 AOI2 中断在 on INT2。 默认值:0 + (0:禁止; 1:使能) + BOOT_I2 BOOT 状态在 INT2 上。 默认值:0 + (0:禁止; 1:使能) + H_LACTIVE 0:高电平触发中断;1:低电平触发中断 + + + ***/ + +#define D_REG6_I2_CLICK BITN7 +#define D_REG6_I1_INT1 BITN6 +#define D_REG6_I1_INT2 BITN5 +#define D_REG6_BOOT_I2 BITN4 +#define D_REG6_0 BITN3 + ///#define D_REG3_I1_WTM BITN2 +#define D_REG6_H_LACTIVE BITN1 + + +///#define g_sensor_write(x,y,z) L2_IICM1_WriteCmd(D_cmd_filter_GSensor,x,y) +#define g_sensor_write_add(reg,cmd) L2_IICM1_WriteCmd(G_SlaveAddr,reg,cmd) +/// g_sensor_write_add(0x38,0x00); +#define g_sensor_read(sla,reg) L2_IICM1_Read1Reg1D(sla,reg) +/// x = g_sensor_read(G_SlaveAddr, 0x29); //erichan 20150529 +#define Sensor_Read_Byte(reg,d) L2_IICM1_ReadReg(G_SlaveAddr,reg,(d),1) + +///Sensor_Read_Byte(CHIPID,&temp1); + + + + + +#define D_cmd_filter_GSensor 0xfc +extern void L3_GSensor_setPara(u8 filter); +extern void L1_SC7A20_Init(u8 *Acc_Int_Thr); +extern void L2_SC7A20_Freefall_Status(void); +extern void L1_SC7A20_xyz(void); + + + +#define Sensor_Write_Byte g_sensor_write_add + + +#define DBG_PRINT printf + + + + + + + + + + + +#endif///#ifndef __bsp_sca720_H__ + + diff --git a/source/bsp/backu/cw63xx.c b/source/bsp/backu/cw63xx.c new file mode 100644 index 0000000..c171c3e --- /dev/null +++ b/source/bsp/backu/cw63xx.c @@ -0,0 +1,191 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, ؿƼ All rights reserved. +///------------------------------------------------------------------------- +/// @file cw63xx.c +/// @brief cw630x driver app +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20170122 +/// @note cc_AS_stc01 + +/// @version 1.1 +/// @author CC +/// @date 20170619 +/// @note for + + +////////////////////////////////////////////////////////////////////////////// + +#include "cw63xx.h" +//#include "../debug/debug_drv.h" +#include "../msp/iic_sim.h" +#include "../msp/uart0.h" +//#include "msa300.h" + +///------------------------------------------------------------------------- +/// @breif L1_cw63xx_init +/// @param a s_task_PWON +/// @param s "L1_cw63xx_init" +/// @return none +/// @see Test() οصĺһӣ +/// @note (noteҪע) +///------------------------------------------------------------------------- +#define D_lowPower_warnning 0x02 +#define D_lowPower_BAT_FULL 0x08 + + + + +/***************************** + +if(BITN_G(I2CTXD,BITN1)) + +CHG_IN DCIN 5V Դ룬⵽粢жϣĴ 0x03[5] 0 1 +BAT_FULLس磬Ϊ 0򴥷жϣĴ 0x03[4] 0 1 +BAT_OT¶ȹߣĬֵ 60ң򴥷жϲֹͣ磬Ĵ 0x03[3] 0 1 +BAT_UT¶ȹͣĬֵ 0ң򴥷жϲֹͣ磬Ĵ 0x03[2] 0 1 +LOW_BATصѹڸ澯ֵʱĬΪ 3.4V򴥷жϣĴ 0x03[1] 0 1 +BUTTON£ᴥһжϣĴ 0x03[0] 0 1 + +ʵУȥغ BAT_FULLжϡ + +***************************/ +void L1_cw63xx_sta(void) +{ + U8 d; + L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Interrupt,&d,1); + if(BITN_G(d, BITN1))///յ͵ѹ + { + I2CTXD = 1; + } + + if(BITN_G(d, BITN4))///ֻгŵѹ־ + { + I2CTXD = 0; + } + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Interrupt,0); +} +#if 0 +void L1_cw63xx_init(void) +{ + U8 val = 0; + // LDO1 LDO2 LDO3 LDO4 + #if 0 + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO1,D_CW63XX_ON|D_CW63XX_3V2); // normal ģʽ + Lc_delay_ms(100);// 2000--7s + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO2,D_CW63XX_ON|D_CW63XX_3V2); // LDO1 Ϊ1.8v + Lc_delay_ms(100); + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO3,D_CW63XX_ON|D_CW63XX_3V2); // normal ģʽ + Lc_delay_ms(100);// 2000--7s + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_LDO4,D_CW63XX_ON|D_CW63XX_3V2); // LDO1 Ϊ1.8v +//#else + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC,D_CW63XX_ON|D_CW63XX_2V5); // mcu gsensor + Lc_delay_ms(10);// 2000--7s + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC1,D_CW63XX_ON|D_CW63XX_3V); // uart4 sed ch430 mcu_program + Lc_delay_ms(10); + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_2V5); //uart 4 receive + Lc_delay_ms(10);// 2000--7s + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_ON|D_CW63XX_2V5); // AS cpu 2.5v + + //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_1V8); // AS cpu 2.5v + //Lc_delay_ms(600); + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_ON|D_CW63XX_2V8); // AS cpu 2.5v + Lc_delay_ms(10); + + #endif + + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,0x3F);///150mA CHARGE + ///L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,&val,1); +// L0_uart0_uchex(val); +// Lc_delay_ms(10); + //// Lc_delay_ms(10); + //// L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,&val,1); + //// L0_uart0_uc(val); + //// Lc_delay_ms(10); + /****************** + while(9) + { + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_2V8); L0_uart0_uc('e'); + Lc_delay_ms(30); + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_OFF|D_CW63XX_2V8); + Lc_delay_ms(30); + + } +*****************/ + +///-------------------------------------------------------------------- +// L2_I2C_ReadReg(D_i2c_addr_cw63xx,D_CW63X_REG_LDO1,s_as1.d,4);// press +// L0_uart0_uchex(s_as1.d[0]); L0_uart0_uchex(s_as1.d[1]); L0_uart0_uchex(s_as1.d[2]); L0_uart0_uchex(s_as1.d[3]); + +} + +void L3_cw63xx_fun(U8 *pPara) +{ +*pPara=0; +} + +///#else + +//// FX CMD R2 R3 4 +void L3_cw63xx_fun(U8 *pPara) +{ + U8 val = 0; + TS_P_debug *p = pPara; + switch(p->cmd) + { + /********** + case 0: + L1_cw63xx_init(); + L0_uart0_uc('C'); + L0_uart0_uc(p->R1); + L0_uart0_uc(p->R2); + L0_uart0_uc(p->R3); + break; + ***********/ + case 1: //// + //// AX CMDR2 R3 R4 + /// AD 01 01 03 04 ȡreg 01ֵ + //void L2_I2C_ReadReg(unsigned char sla,unsigned char reg, + // unsigned char *r,unsigned char n) + L2_I2C_ReadReg(D_i2c_addr_cw63xx,p->R2,&val,1); + L0_uart0_uc(val); + break; + + + case 2: //FD 02 03 04 00 + ///aD 02 0A 38 00 //vcc1 off + ///aD 02 0A B8 00 //vcc1 ON + ///FD 02 0B 04 00 B0011_1000 + ///FD 02 0C 04 00 + ///FD 02 01 3a 00 100mA + + L0_uart0_uc('W'); + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,p->R2,p->R3); + //L0_uart0_uc(pPara[2]); + + L0_uart0_uc(p->R2); + L0_uart0_uc(p->R3); + break; + + + default: + break; + }; +} + +L2_I2C_ReadReg(D_i2c_addr_cw63xx,0,s_as.d,4); +L0_uart0_sendArray(s_as.d,4); +L2_I2C_WriteCmd(D_i2c_addr_cw63xx,0x03,0);////жϺҪдж +CHG_IN DCIN 5V Դ룬⵽粢жϣĴ 0x03[5] 0 1 +BAT_FULLس磬Ϊ 0򴥷жϣĴ 0x03[4] 0 1 +BAT_OT¶ȹߣĬֵ 60ң򴥷жϲֹͣ磬Ĵ 0x03[3] 0 1 +BAT_UT¶ȹͣĬֵ 0ң򴥷жϲֹͣ磬Ĵ 0x03[2] 0 1 +LOW_BATصѹڸ澯ֵʱĬΪ 3.4V򴥷жϣĴ 0x03[1] 0 1 +BUTTON£ᴥһжϣĴ 0x03[0] 0 1 + +ʵУȥغ BAT_FULLжϡ + +#endif + + diff --git a/source/bsp/backu/cw63xx.h b/source/bsp/backu/cw63xx.h new file mode 100644 index 0000000..5b741bb --- /dev/null +++ b/source/bsp/backu/cw63xx.h @@ -0,0 +1,123 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 _cw63xx_H +#define _cw63xx_H + +#define D_i2c_addr_cw63xx 0x12 + + +#include "../msp/iic_sim.h" +//#include "../bsp/type_hs.h" +///-------------------------------------------------------------------- +#define D_CW63X_REG_system 0X00 +#define D_CW63X_REG_Charge 0X01 +#define D_CW63X_EN_NTC BITN7 ///Enable NTC check +#define D_CW63X_EN_CHG BITN6 /// Enable charging +#define D_CW63X_EN_TIMER BITN5 // Enalble charging timer + +// in power-off state,the IC will turn off LDO1,2,3,B ut hte LDORTC/LDO4 will remain on +#define D_CW63X_power_off 0x0a +//L1_cw63xx_set(D_CW63X_REG_Safety,D_CW63X_EN_NTC|D_CW63X_EN_CHG|D_CW63X_EN_TIMER|D_CW63X_power_off); +//L1_cw63xx_set(D_CW63X_REG_Safety,D_CW63X_EN_NTC|D_CW63X_EN_CHG|D_CW63X_EN_TIMER); + +///-------------------------------------------------------------------- + +#define D_CW63X_REG_Safety 0X02 +#define D_CW63X_LowBateryThreshold 0 +#define L0_set_LBT(x) ((x) - 28) +// L0_set_LBT(28) +/// L1_cw63xx_set(D_CW63X_REG_Safety,L0_set_LBT(28));/// 2.8v +/// fixme ʵֵԴIJ +///-------------------------------------------------------------------- +#define D_CW63X_REG_Interrupt 0X03 +#define D_CW63X_REG_Interrupt_type 0X04 +#define D_CW63X_INT_CHG_OUT BITN7 ///Charging unplugged +#define D_CW63X_INT_TIMER_EXPIRE BITN6 ///Charging timer expire +#define D_CW63X_INT_CHG_INT BITN5 ///Charger detected +#define D_CW63X_INT_BAT_FULL BITN4 ///Battery full + +#define D_CW63X_INT_BAT_OT BITN3 ///Battery over temperature +#define D_CW63X_INT_BAT_UT BITN2 ///Battery under temperature +#define D_CW63X_INT_LOW_BAT BITN1 ///Battery low voltage +#define D_CW63X_INT_BUTTON BITN0 ///button detected + +///-------------------------------------------------------------------- + +#define D_CW63X_REG_LDO1 0X0A +#define D_CW63X_REG_LDO2 0X0B +#define D_CW63X_REG_LDO3 0X0C +#define D_CW63X_REG_LDO4 0X0D + + +//// reg[]543] reg[210] +//// 54 3 +//// || |210 +#define D_CW63XX_V800 B0000_0000 +#define D_CW63XX_V975 B0000_0111 +#define D_CW63XX_1V4 B0001_0100 + + +#define D_CW63XX_1V8 B0001_1100 +#define D_CW63XX_2V1 B0011_0001 +#define D_CW63XX_2V5 B0011_0101 +#define D_CW63XX_2V8 B0011_1000 +#define D_CW63XX_3V B0011_1010 +#define D_CW63XX_3V2 B0011_1100 + +#define D_CW63XX_ON B1000_0000 +#define D_CW63XX_OFF B0000_0000 + + +////extern void L1_cw63xx_init(void); +extern void L3_cw63xx_fun(U8 *pPara); +extern void L1_cw63xx_sta(void); + +///debug ʹU8 +////ine L3_cw63xx_fun(x); + + +///--------------------------------- + + + + + +#define D_power_VCC1 D_CW63X_REG_LDO1 +#define D_power_VCC2 D_CW63X_REG_LDO2 +#define D_power_VCC3 D_CW63X_REG_LDO3 +#define D_power_VCC D_CW63X_REG_LDO4 +/* +#define D_power_rf_Rxd D_power_VCC2 /// rfģ +#define D_power_rf_Txd D_power_VCC1 /// rf ģ + +#define D_power_AS D_power_VCC3 /// ASģ + +#define L2_power_AS_OFF(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_AS,D_CW63XX_OFF|D_CW63XX_3V); +#define L2_power_AS_ON(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_AS,D_CW63XX_ON|D_CW63XX_3V); +#define L2_power_rf_Rxd_OFF(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_OFF|D_CW63XX_3V); +#define L2_power_rf_Rxd_ON(); L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_ON|D_CW63XX_3V); + +//#define L2_power_rf_Txd_OFF(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Txd,D_CW63XX_OFF|D_CW63XX_3V); +//#define L2_power_rf_Txd_ON(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Txd,D_CW63XX_ON|D_CW63XX_3V); + +/// fixme for the +#define L2_power_rf_Txd_OFF(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_OFF|D_CW63XX_3V); +#define L2_power_rf_Txd_ON(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_rf_Rxd,D_CW63XX_ON|D_CW63XX_3V); +*/ + +#define L1_cw63xx_init() L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Charge,0x3F);\ + L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_CW63X_REG_Safety,0x05);///n3.3v baongjin + + +#endif // #ifndef _cw63xx_H + diff --git a/source/bsp/backu/max30102.c b/source/bsp/backu/max30102.c new file mode 100644 index 0000000..ac1442f --- /dev/null +++ b/source/bsp/backu/max30102.c @@ -0,0 +1,259 @@ +#include "MAX30102.h" +#include "debug_drv.h" + + + +TS_max30102_ ts_max30102; + +/// ts_max30102.d[6]; +uint8 Max30102_reset(void) +{ + +#if 0 + if(L1_max30102_WB(REG_MODE_CONFIG, 0x40)) + return 1; + else + return 0; + + +#else + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + return 1; + +#endif + + +} + +void MAX30102_Config(void) +{ + L1_max30102_WB(REG_MODE_CONFIG, 0x40);///reset = 1; + Lc_delay_ms(30); + L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (50 Hz), LED pulseWidth (400uS) + L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED + + +} + +void MAX30102_Configbbb(void) +{ + u8 id1,id2,rr = 0xE5; + + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + Lc_delay_ms(200); + //read and clear statu + id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID); + + id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID); + ///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2); + printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2); + + + + L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting + + + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + + ///清空 + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x2B); // //SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit + L1_max30102_WB(REG_LED1_PA,0x40);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x40);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x01);// Choose value for ~ 25mA for Pilot LED + + L1_max30102_WB(REG_TEMP_CONFIG,1); +} + +void MAX30102_Config222(void) +{ + u8 id1,id2,rr = 0xE5; + + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + Lc_delay_ms(200); + //read and clear statu + id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID); + + id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID); + ///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2); + printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2); + +L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting + + + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (50 Hz), LED pulseWidth (400uS) + L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED + + L1_max30102_WB(REG_TEMP_CONFIG,1); +} + +uint32 un_temp; +int i=0; +u8 m,s,s2; + + + +void max30102_read_fifo22(void) +{ + +} + + +void max30102_read_fifo(void) +{ + /************** + + ts_max30102.fifo_red=0; + ts_max30102.fifo_ir=0; + + for(i=0;i<6;i++) + { + ts_max30102.d[i]=0; + } + + printf("\r\n"); + + for(m = 0;m<=0x12;m ++) + { + s=IIC_Read_Byte(MAX30102_Device_address,m); + printf("\r\nreg(%2x %d) = %2X %d ",(int)m,(int)m,(int)s,(u16)s); + } + printf("\r\n"); + *************/ + + + //read and clear statu + s= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1); + // s=0x12; + s2= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_2); +/// printf("\r\nsta %X %X %X --",(int)0xAA,(int)s,(int)s2); + + + s= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_INTR); + // s=0x12; + s2= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_FRAC); +/// printf(" tmp %2X %2X %d.%d",(int)s,(int)s2,(int)s,(int)s2); + + + ts_max30102.d[0]=REG_FIFO_DATA; + L1_max30102_Read_Array(REG_FIFO_DATA,ts_max30102.d,6); + + +/******** + printf("fifo :%2X %2X %2X %2X %2X %2X ", + (int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2], + (int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]); + + + + for(i=0;i<6;i++) + { + ts_max30102.d[i]=0x40+i; + } + + printf("fifo :%2X %2X %2X %2X %2X %2X ", + (int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2], + (int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]); + +*******/ + un_temp=ts_max30102.d[0]; + + ts_max30102.fifo_red=un_temp<<16; + + un_temp=ts_max30102.d[1]; + un_temp<<=8; + ts_max30102.fifo_red|=un_temp; + un_temp=ts_max30102.d[2]; +// un_temp>>=2; + ts_max30102.fifo_red|=un_temp; + + + + + un_temp=ts_max30102.d[3]; + ts_max30102.fifo_ir = un_temp<<16; + un_temp=ts_max30102.d[4]; + un_temp<<=8; + ts_max30102.fifo_ir|=un_temp; + un_temp=ts_max30102.d[5]; +/// un_temp>>=2; + ts_max30102.fifo_ir|=un_temp; + + ts_max30102.u16out_c = D_2uc_u16(ts_max30102.d[2],ts_max30102.d[5]); + + L1_uartD_sendulhex(ts_max30102.fifo_red); +/// Lc_delay_ms(1); + L1_uartD_senduc('R'); + L1_uartD_sendulhex(ts_max30102.fifo_ir); +// if(ts_max30102.fifo_ir<=10000) +// { +// ts_max30102.fifo_ir=0; +// } +// if(ts_max30102.fifo_red<=10000) +// { +// ts_max30102.fifo_red=0; +// } + + +// USART_SendData(USART_PORT,ts_max30102.fifo_red); +// while (USART_GetFlag Status(USART_PORT, USART_FLAG_TXE) == RESET); +// printf("%d %d\r\n",ts_max30102.fifo_red,ts_max30102.fifo_ir); +// Delay_ms(100); +} + + +float max30102_getSpO2(float *ir_input_data,float *red_input_data,uint16_t cache_nums) +{ + float ir_max=*ir_input_data,ir_min=*ir_input_data; + float red_max=*red_input_data,red_min=*red_input_data; + float R; + uint16_t i; + for(i=1;i*(ir_input_data+i)) + { + ir_min=*(ir_input_data+i); + } + if(red_max<*(red_input_data+i)) + { + red_max=*(red_input_data+i); + } + if(red_min>*(red_input_data+i)) + { + red_min=*(red_input_data+i); + } + } + R=((ir_max+ir_min)*(red_max-red_min))/((red_max+red_min)*(ir_max-ir_min)); + return ((-45.060)*R*R + 30.354*R + 94.845); +} + + + diff --git a/source/bsp/backu/max30102.h b/source/bsp/backu/max30102.h new file mode 100644 index 0000000..7c35363 --- /dev/null +++ b/source/bsp/backu/max30102.h @@ -0,0 +1,62 @@ +#ifndef _MAX30102_H +#define _MAX30102_H + +#include "msp_iicMx.h"/////使用iic1 作为 +#include "c_type51.h"///// +#define MAX30102_Device_address 0xAE + +//register addresses +#define REG_INTR_STATUS_1 0x00 +#define REG_INTR_STATUS_2 0x01 +#define REG_INTR_ENABLE_1 0x02 +#define REG_INTR_ENABLE_2 0x03 +#define REG_FIFO_WR_PTR 0x04 +#define REG_OVF_COUNTER 0x05 +#define REG_FIFO_RD_PTR 0x06 +#define REG_FIFO_DATA 0x07 +#define REG_FIFO_CONFIG 0x08 +#define REG_MODE_CONFIG 0x09 +#define REG_SPO2_CONFIG 0x0A +#define REG_LED1_PA 0x0C +#define REG_LED2_PA 0x0D +#define REG_PILOT_PA 0x10 +#define REG_MULTI_LED_CTRL1 0x11 +#define REG_MULTI_LED_CTRL2 0x12 +#define REG_TEMP_INTR 0x1F +#define REG_TEMP_FRAC 0x20 +#define REG_TEMP_CONFIG 0x21 +#define REG_PROX_INT_THRESH 0x30 +#define REG_REV_ID 0xFE +#define REG_PART_ID 0xFF +#define SAMPLES_PER_SECOND 100 //Ƶ +uint8 Max30102_reset(void); +void MAX30102_Config(void); +void max30102_read_fifo(void); + + +typedef struct +{ + u8 d[6]; + + u16 u16_xy; + + uint32 fifo_red; + uint32 fifo_ir; + +/// u32 u32a; + u16 u16b; + u16 u16t; + u16 u16out_c;///参考数值 fifo的2和5 +}TS_max30102_; +extern TS_max30102_ ts_max30102; + + +#define L1_max30102_WB(reg,dat) L2_IICMx_WriteCmd(D_iicch_max13102,MAX30102_Device_address,reg,dat) + +#define IIC_Read_Byte(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_max13102,adr,reg) + +#define L1_max30102_Read(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_max13102,MAX30102_Device_address,reg) + +#define L1_max30102_Read_Array(reg,dat,n) L2_IICMx_ReadReg(D_iicch_max13102,MAX30102_Device_address,reg,dat,n) + +#endif diff --git a/source/bsp/board support/msa300.c b/source/bsp/board support/msa300.c new file mode 100644 index 0000000..85331b9 --- /dev/null +++ b/source/bsp/board support/msa300.c @@ -0,0 +1,75 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 "msa300.h" +struct _s_gsens_ s_as1,s_as2; +void L1_msa300_init(void) +{ + /// ϵstandby ģʽ Ҫ + L2_I2C_WriteCmd(D_i2c_addr_AS1,0x11,0x1e); // normal ģʽ + L2_I2C_WriteCmd(D_i2c_addr_AS2,0x11,0x1e); // normal ģʽ + +} + +void L1_as1_readXYZ(void) +{ +///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_as1,6); +// L2_I2C_ReadReg(D_i2c_addr_AS2,0,(unsigned char *)&s_as2,3); +} + +void L1_as2_readXYZ(void) +{ +///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_AS2,0x02,(unsigned char *)&s_as2,6); +} + + + + + + +#if 0 + +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); + + +#endif + + + diff --git a/source/bsp/board support/msa300.h b/source/bsp/board support/msa300.h new file mode 100644 index 0000000..34b0714 --- /dev/null +++ b/source/bsp/board support/msa300.h @@ -0,0 +1,63 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 "../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 + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +// 400Khz 1/400 ms 2.5us + +//Symbol Parameter Condition Min Max Unit +//fscl Clock frequency 400 kHz + +struct _s_gsens_ +{//8byte + + U8 d[6]; + // U16 x; + // U16 y; + // U16 z; + +}; +extern struct _s_gsens_ s_as1,s_as2; + +extern void L1_as1_readXYZ(void); +extern void L1_as2_readXYZ(void); +extern void L1_msa300_init(void); + +#endif // #ifndef _MSA300_H + + + diff --git a/source/bsp/bsp_485.c b/source/bsp/bsp_485.c new file mode 100644 index 0000000..feb1501 --- /dev/null +++ b/source/bsp/bsp_485.c @@ -0,0 +1,24 @@ +///#include "bsp_485.h" +#include "tpc_debug.h" +////#include "tpc_x.h" +#include "c_lib.h" + +#if 10 +void L2_485_init(void) +{} +#else + +void L2_485_init(void) +{ + //485配置强推挽输出 P33 P32 + //BITN_0(P3M1,BITN3);BITN_1(P3M0,BITN3); + ///BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); + D_UART0_485_INIT(); + ///while(9) + { + + D_UART0_485_TX(); + } +} + +#endif \ No newline at end of file diff --git a/source/bsp/bsp_485.h b/source/bsp/bsp_485.h new file mode 100644 index 0000000..d3748ca --- /dev/null +++ b/source/bsp/bsp_485.h @@ -0,0 +1,13 @@ +#ifndef BSP_485_H +#define BSP_485_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; + +extern void L2_485_init(void); +#endif \ No newline at end of file diff --git a/source/bsp/bsp_cs1232.c b/source/bsp/bsp_cs1232.c new file mode 100644 index 0000000..cd999ee --- /dev/null +++ b/source/bsp/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 + + + +/*********************************************/ + + + diff --git a/source/bsp/bsp_cs1232.h b/source/bsp/bsp_cs1232.h new file mode 100644 index 0000000..7402029 --- /dev/null +++ b/source/bsp/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_config.h" +#include "msp_uart1.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; + +*******/ + diff --git a/source/bsp/bsp_led.c b/source/bsp/bsp_led.c new file mode 100644 index 0000000..074f6d0 --- /dev/null +++ b/source/bsp/bsp_led.c @@ -0,0 +1,141 @@ +#include "bsp_led.h" +#include "c_delay.h" +#include "debug_drv.h" + +TS_key_ ts_key; + + + + +void L0_board_init(unsigned char onf) +{ + if(onf) + { +/// SWITCH_INIT(); +/// LED1_INIT(); + D_LED2_INIT(); + }else + { + + /// SWITCH_OFF(); +/// LED1_OFF(); + D_LED2_OFF(); + + } +} + + + + +/* + + +void L0_board_key(void) +{ + ts_key.now = D_P32_AT(); + if(ts_key.pool != ts_key.now) + { + if(ts_key.now) + { + + }else + {///``\____ + ts_key.val = 1; + } + ts_key.pool = ts_key.now; + } +} + +void L0_sw_key(void)///限位开关判定 +{ + ts_key.now = L0_Mmin_AT(); + if(ts_key.pool != ts_key.now) + { + if(ts_key.now) + { + + }else + {///``\____ + ts_key.val = 1; + } + ts_key.pool = ts_key.now; + } +} + +*/ + + +TS_task_keyled_ ts_task_keyled; + + + +void L2_task_keyled_register(void) +{ + L1_task_reg_clear(&ts_task_keyled.task); + L3_task_s_go(ts_task_keyled,D_task_init); + +} + + + +#define D_task_keyled_set 0x41 + +#define D_task_keyled_cmd_init 0x41 +#define D_task_keyled_cmd_mac 0x42 + +#define D_task_keyled_1 0x52 +#define D_task_keyled_2 0x43 +#define D_task_keyled_3 0x53 +#define D_task_keyled_4 0x44 +#define D_task_keyled_cmd_innet 0x45 +#define D_task_keyled_cmd_innet_ok 0x55 + +#define D_task_keyled_cmd_32 0x46 +#define D_task_keyled_cmd_32_ok 0x56 + + +#define D_delay_pt D_Tdelay_3s + + +/* + + +////L2_task_keyled_handle(&ts_task_keyled); +void L2_task_keyled_handle(TS_task_keyled_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(): + printf("\r\nL2_task_keyled_handle TTSS_Task_init"); + + L2_task_go(D_task_keyled_2); + TTSS_Task_step(D_task_keyled_2): + + + /// L2_task_Tdelay_go(D_Tdelay_2s,D_task_keyled_cmd_netid); + TTSS_Task_step(D_task_keyled_3): + + +/// L0_moto_run(D_MOTO_FORWARD); + if(s->loc_now) + + + /// L2_task_go(D_task_keyled_2); + + ///L2_task_Tdelay_go(D_Tdelay_500ms,D_task_keyled_1); + + + TTSS_Task_end(); + //////////////////////////////////////////////////////////// + + + L0_board_key(); + +} + + + + +*/ + + + diff --git a/source/bsp/bsp_led.h b/source/bsp/bsp_led.h new file mode 100644 index 0000000..fdc34dc --- /dev/null +++ b/source/bsp/bsp_led.h @@ -0,0 +1,37 @@ +#ifndef _BSP_LED_H_ +#define _BSP_LED_H_ + +#include "bsp_config.h" +#include "msp_uart1.h" +#include "TTSS_task.h" + +typedef struct +{ + u8 pool; + u8 now; + u8 val; +}TS_key_; +extern TS_key_ ts_key; + +typedef struct +{ + TS_task task; + u8 ch; + u8 ok; + u8 loc_now;////当前的位置 + u8 loc_want;////想要达到的位置; + + u8 loc_max;////最大位置; + u8 loc_min;////最小位置; + + u8 tmp; + +}TS_task_keyled_; +extern TS_task_keyled_ ts_task_keyled; + +extern void L2_task_keyled_register(void); +extern void L2_task_keyled_handle(TS_task_keyled_ *s); + + +#endif////#ifndef _BSP_LED_H_ + diff --git a/source/bsp/bsp_moto.c b/source/bsp/bsp_moto.c new file mode 100644 index 0000000..2861f82 --- /dev/null +++ b/source/bsp/bsp_moto.c @@ -0,0 +1,70 @@ +#include "bsp_moto.h" +#include "c_delay.h" +#include "debug_drv.h" +TS_moto_ ts_moto= +{ + D_MOTO_STOP + +}; + +void L0_moto_run(unsigned char mode) +{ + switch (mode) + { + case D_MOTO_FORWARD: + D_Motor_BI_ON(); + ///D_Motor_BI_OFF(); + ///D_Motor_FI_ON(); + D_Motor_FI_OFF(); + ts_moto.mode = mode|0x80; + printf(" F "); + break; + case D_MOTO_BACKWARD: + ///D_Motor_BI_ON(); + D_Motor_BI_OFF(); + D_Motor_FI_ON(); + ts_moto.mode = mode|0x80; + + printf(" B "); + ///D_Motor_FI_OFF(); + break; + case D_MOTO_STOP: + D_Motor_BI_ON(); + ///D_Motor_BI_OFF(); + D_Motor_FI_ON(); + ts_moto.mode = mode; + printf(" T "); + ///D_Motor_FI_OFF(); + break; + default : + ///D_Motor_BI_ON(); + D_Motor_BI_OFF(); + ///D_Motor_FI_ON(); + D_Motor_FI_OFF(); + ts_moto.mode = mode; + ////:D_MOTO_STANDBY + printf(" S "); + break; + } +} + + +void L0_moto_init(unsigned char onf) +{ + if(onf) + { + L0_moto_run(D_MOTO_STANDBY); + D_MOTOR_IO_OPEN(); + + printf("\r\nD_MOTOR_IO_OPEN\r\n"); + + }else + { + L0_moto_run(D_MOTO_STANDBY); + D_MOTOR_IO_CLOSE(); + } +} + + + + diff --git a/source/bsp/bsp_moto.h b/source/bsp/bsp_moto.h new file mode 100644 index 0000000..26efdcc --- /dev/null +++ b/source/bsp/bsp_moto.h @@ -0,0 +1,40 @@ +#ifndef _BSP_MOTO_H_ +#define _BSP_MOTO_H_ + + +#include "c_type51.h" +#include "bsp_config.h" + +typedef struct +{ + vU8 mode; //// + +}TS_moto_; +extern TS_moto_ ts_moto; + + + +//// +/******** +BI FI +INA INB OUTA OUTB +L L Hi-Z Hi-Z 待命状态 +H L H L 前进 +L H L H 后退 +H H L L 刹车 + +按板子的设计 顺时针为正 前 +*********/ +#define D_MOTO_STANDBY 0 +#define D_MOTO_FORWARD 2 +#define D_MOTO_BACKWARD 1 +#define D_MOTO_STOP 3 + +void L0_moto_run(unsigned char mode); + +void L0_moto_init(unsigned char onf); + + + +#endif////#ifndef _BSP_MOTO_H_ + diff --git a/source/bsp/bsp_msa300.c b/source/bsp/bsp_msa300.c new file mode 100644 index 0000000..69a009a --- /dev/null +++ b/source/bsp/bsp_msa300.c @@ -0,0 +1,201 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 +////////////////////////////////////////////////////////////////////////////// +/// @version 2.0 +/// @author CC +/// @date 20230310 +/// @note 适用于震动报警 +////////////////////////////////////////////////////////////////////////////// + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include "bsp_msa300.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 + +/// msa300 初始化 调用前必须使用iic的初始化 +/// 如需使用中断 还必须EA 启动 +void L1_msa300_reg_init(void) +{ + /// +///step 1: 读取power reg + + LD_gsensor_power(D_PowerMode_normal|D_gs_LPBW62H ); + + /// 上电后是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_ODR_15P63Hz);////D_AXIS_DIS_Y| +// 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(); + +// LD_gsensor_power(D_PowerMode_suspend|D_gs_LPBW1H9 ); + + ///while(9) 测试使用 上电后一直动1秒内采集两次 传感器数据不一致就ok + { + + L1_ms300_xyz_read(s_as.d,6); + Lc_delay_ms(100); + L1_uartD_uchexArray(s_as.d,6); + L1_ms300_xyz_read(s_as.d,6); + Lc_delay_ms(100); + L1_uartD_uchexArray(s_as.d,6); + Lc_delay_ms(2); + } +} + + +#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); + *****************************************/ + +} + +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; + }; +} + +#endif + + diff --git a/source/bsp/bsp_msa300.h b/source/bsp/bsp_msa300.h new file mode 100644 index 0000000..3f1d970 --- /dev/null +++ b/source/bsp/bsp_msa300.h @@ -0,0 +1,491 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 "bsp_config.h" +#include "msp_uart1.h" +#include "msp_iicMx.h" +#include "debug_drv.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 B0000_0000 +#define D_PowerMode_suspend B1000_0000 + +#define D_PowerMode_lowpower B0100_0000 + + +#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) + + + +/********** + + +/************************************** +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 0x16对应的Reg 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 powermode;/// + // U16 x; + // U16 y; + // U16 z; +}; +extern struct _s_gsens_ s_as; + +extern void L1_msa300_reg_init(void); + +#define L1_ms300_reg_set(reg,dat) L2_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat) +////#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); + +#define L1_ms300_xyz_read(dat,num) L2_IICMx_ReadReg(D_iicch_MSA,D_i2c_addr_Gsensor,MSA_REG_ACC_X_LSB,dat,num) + + + +/********* + +extern void L1_as_readXYZ(unsigned char CH); +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); + + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) + + +#define L1_max30102_WB(reg,dat) L2_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat) + +#define IIC_Read_Byte(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_MSA,adr,reg) + +#define L1_max30102_Read(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_MSA,D_i2c_addr_Gsensor,reg) + +#define L1_max30102_Read_Array(reg,dat,n) L2_IICMx_ReadReg(D_iicch_MSA,D_i2c_addr_Gsensor,reg,dat,n) + +*******/ +///#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_IICMx_WriteCmd(D_iicch_MSA,D_i2c_addr_Gsensor,MSA_REG_POWERMODE_BW,Pmode);s_as.powermode=Pmode + + + + +#endif // #ifndef _MSA300_H + + + diff --git a/source/bsp/bsp_pt100x.c b/source/bsp/bsp_pt100x.c new file mode 100644 index 0000000..0153836 --- /dev/null +++ b/source/bsp/bsp_pt100x.c @@ -0,0 +1,15 @@ +#include "bsp_pt100x.h" +#include "c_delay.h" +#include "debug_drv.h" + +////23.5 1.103k +//// 0 -1,09 + + + + +float code find_Rt[2] = + {1 }; + + + diff --git a/source/bsp/bsp_pt100x.h b/source/bsp/bsp_pt100x.h new file mode 100644 index 0000000..1e69d22 --- /dev/null +++ b/source/bsp/bsp_pt100x.h @@ -0,0 +1,18 @@ +#ifndef _BSP_PT100X_H_ +#define _BSP_PT100X_H_ + +#include "bsp_config.h" +#include "msp_uart1.h" +#include "TTSS_task.h" + +typedef struct +{ + u8 pool; + u8 now; + u8 val; +}TS_key_; +extern TS_key_ ts_key; + + +#endif////#ifndef _BSP_PT100X_H_ + diff --git a/source/bsp/bsp_relay.c b/source/bsp/bsp_relay.c new file mode 100644 index 0000000..2f51cf2 --- /dev/null +++ b/source/bsp/bsp_relay.c @@ -0,0 +1,82 @@ +#include "bsp_relay.h" + + + + + +void L1_motor_11(vtype ch) +{ + switch(ch) + { + case D_motor_ch_1 :D_motor1_BI_ON(); D_motor1_FI_ON();break; + case D_motor_ch_2 :D_motor2_BI_ON(); D_motor2_FI_ON();break; + case D_motor_ch_3 :D_motor3_BI_ON(); D_motor3_FI_ON();break; + case D_motor_ch_4 :D_motor4_BI_ON(); D_motor4_FI_ON();break; + case D_motor_ch_5 :D_motor5_BI_ON(); D_motor5_FI_ON();break; + case D_motor_ch_6 :D_motor6_BI_ON(); D_motor6_FI_ON();break; + case D_motor_ch_7 :D_motor7_BI_ON(); D_motor7_FI_ON();break; + case D_motor_ch_8 :D_motor8_BI_ON(); D_motor8_FI_ON();break; + case D_motor_ch_9 :D_motor9_BI_ON(); D_motor9_FI_ON();break; + case D_motor_ch_10 :D_motor10_BI_ON(); D_motor10_FI_ON();break; + default: + break; + } +} + +void L1_motor_10(vtype ch) +{ + switch(ch) + { + case D_motor_ch_1 :D_motor1_BI_ON(); D_motor1_FI_OFF();break; + case D_motor_ch_2 :D_motor2_BI_ON(); D_motor2_FI_OFF();break; + case D_motor_ch_3 :D_motor3_BI_ON(); D_motor3_FI_OFF();break; + case D_motor_ch_4 :D_motor4_BI_ON(); D_motor4_FI_OFF();break; + case D_motor_ch_5 :D_motor5_BI_ON(); D_motor5_FI_OFF();break; + case D_motor_ch_6 :D_motor6_BI_ON(); D_motor6_FI_OFF();break; + case D_motor_ch_7 :D_motor7_BI_ON(); D_motor7_FI_OFF();break; + case D_motor_ch_8 :D_motor8_BI_ON(); D_motor8_FI_OFF();break; + case D_motor_ch_9 :D_motor9_BI_ON(); D_motor9_FI_OFF();break; + case D_motor_ch_10 :D_motor10_BI_ON(); D_motor10_FI_OFF();break; + default: + break; + } +} + +void L1_motor_01(vtype ch) +{ + switch(ch) + { + case D_motor_ch_1 :D_motor1_BI_OFF(); D_motor1_FI_ON();break; + case D_motor_ch_2 :D_motor2_BI_OFF(); D_motor2_FI_ON();break; + case D_motor_ch_3 :D_motor3_BI_OFF(); D_motor3_FI_ON();break; + case D_motor_ch_4 :D_motor4_BI_OFF(); D_motor4_FI_ON();break; + case D_motor_ch_5 :D_motor5_BI_OFF(); D_motor5_FI_ON();break; + case D_motor_ch_6 :D_motor6_BI_OFF(); D_motor6_FI_ON();break; + case D_motor_ch_7 :D_motor7_BI_OFF(); D_motor7_FI_ON();break; + case D_motor_ch_8 :D_motor8_BI_OFF(); D_motor8_FI_ON();break; + case D_motor_ch_9 :D_motor9_BI_OFF(); D_motor9_FI_ON();break; + case D_motor_ch_10 :D_motor10_BI_OFF(); D_motor10_FI_ON();break; + default: + break; + } +} + +void L1_motor_00(vtype ch) +{ + switch(ch) + { + case D_motor_ch_1 :D_motor1_BI_OFF(); D_motor1_FI_OFF();break; + case D_motor_ch_2 :D_motor2_BI_OFF(); D_motor2_FI_OFF();break; + case D_motor_ch_3 :D_motor3_BI_OFF(); D_motor3_FI_OFF();break; + case D_motor_ch_4 :D_motor4_BI_OFF(); D_motor4_FI_OFF();break; + case D_motor_ch_5 :D_motor5_BI_OFF(); D_motor5_FI_OFF();break; + case D_motor_ch_6 :D_motor6_BI_OFF(); D_motor6_FI_OFF();break; + case D_motor_ch_7 :D_motor7_BI_OFF(); D_motor7_FI_OFF();break; + case D_motor_ch_8 :D_motor8_BI_OFF(); D_motor8_FI_OFF();break; + case D_motor_ch_9 :D_motor9_BI_OFF(); D_motor9_FI_OFF();break; + case D_motor_ch_10 :D_motor10_BI_OFF(); D_motor10_FI_OFF();break; + default: + break; + } +} + diff --git a/source/bsp/bsp_relay.h b/source/bsp/bsp_relay.h new file mode 100644 index 0000000..2bd5f25 --- /dev/null +++ b/source/bsp/bsp_relay.h @@ -0,0 +1,102 @@ +#ifndef _BSP_RELAY_H +#define _BSP_RELAY_H + + +#include "c_type51.h" +#include "bsp_config.h" + + + + + + + + +#define D_motor1_BI_rev(); D_P25_REV(); + +#define D_motor1_BI_ON(); D_P25_ON(); +#define D_motor1_FI_ON(); D_P24_ON(); +#define D_motor2_BI_ON(); D_P23_ON(); +#define D_motor2_FI_ON(); D_P22_ON(); +#define D_motor3_BI_ON(); D_P21_ON(); +#define D_motor3_FI_ON(); D_P42_ON(); +#define D_motor4_BI_ON(); D_P20_ON(); +#define D_motor4_FI_ON(); D_P73_ON(); +#define D_motor5_BI_ON(); D_P72_ON(); +#define D_motor5_FI_ON(); D_P71_ON(); +#define D_motor6_BI_ON(); D_P70_ON(); +#define D_motor6_FI_ON(); D_P41_ON(); +#define D_motor7_BI_ON(); D_P37_ON(); +#define D_motor7_FI_ON(); D_P36_ON(); +#define D_motor8_BI_ON(); D_P35_ON(); +#define D_motor8_FI_ON(); D_P34_ON(); +#define D_motor9_BI_ON(); D_P66_ON(); +#define D_motor9_FI_ON(); D_P65_ON(); +#define D_motor10_BI_ON(); D_P64_ON(); +#define D_motor10_FI_ON(); D_P40_ON(); + + + +#define D_motor1_FI_rev(); D_P24_REV(); + +#define D_motor1_BI_OFF(); D_P25_OFF(); +#define D_motor1_FI_OFF(); D_P24_OFF(); +#define D_motor2_BI_OFF(); D_P23_OFF(); +#define D_motor2_FI_OFF(); D_P22_OFF(); +#define D_motor3_BI_OFF(); D_P21_OFF(); +#define D_motor3_FI_OFF(); D_P42_OFF(); +#define D_motor4_BI_OFF(); D_P20_OFF(); +#define D_motor4_FI_OFF(); D_P73_OFF(); +#define D_motor5_BI_OFF(); D_P72_OFF(); +#define D_motor5_FI_OFF(); D_P71_OFF(); +#define D_motor6_BI_OFF(); D_P70_OFF(); +#define D_motor6_FI_OFF(); D_P41_OFF(); +#define D_motor7_BI_OFF(); D_P37_OFF(); +#define D_motor7_FI_OFF(); D_P36_OFF(); +#define D_motor8_BI_OFF(); D_P35_OFF(); +#define D_motor8_FI_OFF(); D_P34_OFF(); +#define D_motor9_BI_OFF(); D_P66_OFF(); +#define D_motor9_FI_OFF(); D_P65_OFF(); +#define D_motor10_BI_OFF(); D_P64_OFF(); +#define D_motor10_FI_OFF(); D_P40_OFF(); + +#define D_motor_ch_1 0 +#define D_motor_ch_2 1 +#define D_motor_ch_3 2 +#define D_motor_ch_4 3 +#define D_motor_ch_5 4 +#define D_motor_ch_6 5 + +#define D_motor_ch_7 6 +#define D_motor_ch_8 7 +#define D_motor_ch_9 8 +#define D_motor_ch_10 9 + +void L1_motor_00(vtype ch); + +void L1_motor_10(vtype ch); + +void L1_motor_01(vtype ch); + +void L1_motor_11(vtype ch); + + + +#if 0 +#define In_A1 Relay_01; +#define In_B1 Relay_02; + +#define Out_A1 Relay_03; +#define Out_B1 Relay_04; +#define Pressure_Relief_A1 Relay_05; +#define Pressure_Relief_B1 Relay_06; +#define None 0x99; +#define In_A2 Relay_07; +#define In_B2 Relay_08; + +#define Out_A2 Relay_09; +#define Out_B2 Relay_10; +#define Pressure_Relief_A2 Relay_11; +#define Pressure_Relief_B2 Relay_12; +#endif + diff --git a/source/bsp/cam/backup/bsp_cam_isr.c b/source/bsp/cam/backup/bsp_cam_isr.c new file mode 100644 index 0000000..6a583b5 --- /dev/null +++ b/source/bsp/cam/backup/bsp_cam_isr.c @@ -0,0 +1,100 @@ +//////////////////////////////////////////////////////////////////////////// +///@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_cam_isr.h" + + +#ifdef doc_98989 +vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________ +hs /\————————/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480个__/\____/\____/\____/\————————/\ + +hs /``\________________________hs______________________/``\ +pclk |||||||||||||||||||||||||||||||||||||||||||||||640 +#endif ///doc_98989 + +void L0_VSYNCS_Isr(void) D_SERVE_VS +{////找到一帧数据的开头:第一行 + ///s_task_GC032A.usHs_count = 0; +/// EA = 0; + D_LED4_REV(); + ts_task_GC032a.HS_max = DR_Hs_count; + ///D_PCLK_open(); + + DR_Hs_count = 0; +/// EA = 1; +} + +void L0_HSYNCS_Isr(void) D_SERVE_HS/// using 1 +{///hs 下沿有效 + //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 +///EA = 0; + ET0 = 0; +/// ts_task_GC032a.HS[DR_Hs_count] = ts_task_GC032a.pclk_n; +/// ts_task_GC032a.HS[DR_Hs_count] = DR_Hs_count;// +/// ts_task_GC032a.pclk_n = 0; + // + + DR_Hs_count ++; + + ts_task_GC032a.vs_ok = 1; + + D_LED1_REV();//////// if(0)//// + + + //// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据 + if(DR_Hs_count == D_row_get) + {///D_P33_REV(); + DR_pclk_n = 0; + D_PCLK_open(); + ET0 = 0; //add by cc + + }else if(DR_Hs_count == (1+D_row_get)) + { + D_PCLK_close(); + ET0 = 1; + ts_task_GC032a.status = 1; + ts_task_GC032a.pclk_max = DR_pclk_n; + }else + { + ET0 = 1; + } +/// EA = 1; +} + +//// 读取不为0x80的数据 +//// 放入s_task_GC032A.buf +////D_pclk_per_hs 数量满足后 s_task_GC032A.status = 1; +void l0_PCLK_Isr(void) D_SERVE_CLK /// using 1 +{///PCLK + D_LED2_REV(); + DR_Dat = P2; + /////if(DR_Dat != 0X80) + { + ts_task_GC032a.buf[0][DR_pclk_n] = DR_Dat; + DR_pclk_n++;// + } + ts_task_GC032a.pclk_n ++; +} + +void L0_cam_INT_init(void) +{ + ///D_VSYNCS_open(); + D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//使能INT2中断 + D_PCLK_init(); +} + + diff --git a/source/bsp/cam/backup/bsp_gc032a.c b/source/bsp/cam/backup/bsp_gc032a.c new file mode 100644 index 0000000..0c34dd0 --- /dev/null +++ b/source/bsp/cam/backup/bsp_gc032a.c @@ -0,0 +1,380 @@ +#include "bsp_gc032a.h" +const U8 GC6133_init_reg_tbl[][2]= { + + /*System*/ + {0xf3,0xff}, + {0xf5,0x06}, + {0xf7,0x01}, + {0xf9,0xce}, + {0xfa,0x00}, + {0xf8,0x03},//////分频 {0xf8,0x03}, + // {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + /// {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + + + {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}, + + {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} + +}; + diff --git a/source/bsp/cam/backup/bsp_gc032a.h b/source/bsp/cam/backup/bsp_gc032a.h new file mode 100644 index 0000000..3e285e4 --- /dev/null +++ b/source/bsp/cam/backup/bsp_gc032a.h @@ -0,0 +1,18 @@ + +#ifndef _gc_032a_H_ +#define _gc_032a_H_ + +#include "bsp_config.h" + +#include "c_type51.h" +#include "c_lib.h" +#include "TTSS_tick.h" + +//#define GC6133_reg_tbl_len 291 +#define GC6133_reg_tbl_len 292 + + +extern U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]; + + +#endif///_gc_032a_H_ diff --git a/source/bsp/cam/bsp_cam.c b/source/bsp/cam/bsp_cam.c new file mode 100644 index 0000000..f450afc --- /dev/null +++ b/source/bsp/cam/bsp_cam.c @@ -0,0 +1,485 @@ +//////////////////////////////////////////////////////////////////////////// +///@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_drv.h" +///#include "bsp_func.h" +#include "bsp_cam_isr.h" +#include "bsp_cam.h" +#include "msp_uart1.h" +#include "msp_iicMx.h" +////#include "cw63xx.h" +#include "c_lib.h" +#include "c_bit.h" +#include "debug_drv.h" +#include "TTSS_time_stc.h" + +TS_clk_ data ts_clk; + +/************ + +TS_P_rf TS_paer_value= +{ + 0xad, + 0x0123, +// 0x00,///U16 paperNum:12; //12bit纸张数据 + ///U8 cameraIndex:2; //摄像头编号 + ///U8 cameraWorking:1; //是否正常工作 + ///U8 reserved: 1; //保留 + 0x56,///U8 cameraBoardPower; //电量 + 0xcc + +}; +void L0_p_send(void) +{ + unsigned char *p; + TS_paer_value.r123.cameraBoardPower = 0; + TS_paer_value.filter1 = 0x0a; +// TS_paer_value.r123.paperNum = 0x1234; + p = (unsigned char *)&TS_paer_value.r123; + TS_paer_value.ocr = *p; + + p ++; + TS_paer_value.ocr += *p; + p ++; + TS_paer_value.ocr += *p; + + //TS_paer_value.ocr = 0x88; + +/// L0_Uart0_Init4800(); + L0_uart0_sendArray( (unsigned char *)&TS_paer_value,5); + //L0_uart0_init(); + +} +********/ + +//// mclk out init 系统时钟输出配置,可以提供给其他外设作为时钟 +void L0_MCLKO_init(void) +{ + BITN_1(P_SW2,EAXFR); + CLKSEL = CLKSET_IRC; + MCLKOCR = MCLKOCR_P54|MCLKOCR_DIV; + D_stdIO_P5(BITN4);///BITN_0(P5M1,BITN4);BITN_1(P5M0,BITN4);/// 01 推挽 +/// BITN_0(P_SW2,EAXFR);// P_SW2 = 0x80; +} + + + +void GC032A_port_init(void) +{ +/***** volatile unsigned short j; + + for(j = 0;j < D_row_max;j ++) + { + ts_task_GC032a.buf[j] = 0; + } + *****/ + + + ///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(); + +} + + +////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>> + +TS_task_GC032A_ ts_task_GC032a; + +void L2_task_GC032A_init(void) +{ + + L1_task_init(&ts_task_GC032a.task); + L3_task_s_go(ts_task_GC032a,D_task_init); + //L3_task_s_go(ts_task_GC032a,0); +/// ts_task_GC032a.line_onf = 1; + ts_task_GC032a.fisrt = 0; //发送完成一次有效数据后,时钟开始分频 + + ts_clk.pclk_n = 0; + ts_task_GC032a.HS_n = 0; + + ts_task_GC032a.m = 0; + + + + D_CAM_IO_INIT(); + L0_cam_INT_init(); + + L0_IICMx_INIT(D_iicch_gc032a,1); + + ts_iicm.t0[D_iicch_gc032a]= 0;///模拟iic的时候低电平和高电平的时间经常不确定 + ts_iicm.t1[D_iicch_gc032a]= 1;///使用iic前需要配置iic的速率 根据规格书的要求 +/******** + while(0) + { + Lc_delay_ms(400); + L2_IICMx_Read1Reg1D(D_iicch_gc032a,D_i2c_addr_gc032A,0xf6); + + }*******/ +} + +///L2_task_GC032A_handle(&ts_task_GC032a); +#if 1 +#define GC032a_L0_uart0_uc L1_uartD_senduc +///#define GC032a_L0_uart0_uc(x); +#define L0_uart0_sendArraylong(x,y,z) L1_uartD_sendArrayLong(x,y,z) + +#define GC032a_L0_uart0_sendArray(x,Y) L1_uartD_sendArray(x,Y) +#else + +#define GC032a_L0_uart0_uc(x); +#define GC032a_L0_uart0_sendArray(x,Y) +#endif + #define D_task_GC032A_line1 0x81 + #define D_task_GC032A_line2 0x82 + #define D_task_GC032A_line3 0x83 +#define D_paper_gate 0x20//0x10+ + + +///20221112_184132 CCmodify 只有在打印的时候使用 +#define D_send_us(x) DR_pdata_n = x;GC032a_L0_uart0_uc(DR_pdata_n_H);GC032a_L0_uart0_uc(DR_pdata_n_L); +#define D_uart0_free() (0 == ts_uart[0].now) +#define D_uart0_busy() (0 != ts_uart[0].now) + + +static unsigned char GC032A_init_flag = 1; +////L2_task_GC032A_handle(&ts_task_GC032a); + +vU16 data gdataUs02,gdataUs03,gdataUs05;/// +/////// +////gRccUs03; + +/*************/ + +void L2_task_GC032A_handle(TS_task_GC032A_ *s) +{ + vU16 i = 0; + TTSS_Task_init(): + //PWDN引脚拉低(0 -- 正常工作,1 -- 休眠) + L0_GC032A_standby(); + D_cam_DVDD_off(); + GC032a_L0_uart0_uc(0x31); + printf("TTSS_Task_init"); + 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(); + + for(i = 0;i < 640;i ++) + { + ts_task_GC032a.buf[1][i] = 0x20; + } + + //L1_uartD_senduc(0x39); + 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(); + L2_task_go(D_task_GC032A_init_pwdn); + TTSS_Task_step(D_task_GC032A_init_pwdn): + //提供032A系统频率 + L0_MCLKO_init(); + //PWDN引脚拉高,延时,拉低 + L0_GC032A_standby(); + + + 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('r'); + printf(" L0_GC032A_work "); + gRccUs03 = 0; + D_cam_led_on(); + L2_task_go(D_task_GC032A_write_reg); + L1_task_Tdelay(D_Tdelay_10ms); + + //while(9); + TTSS_Task_step(D_task_GC032A_write_reg): + //设置摄像头参数 + if(0 != GC6133_init_reg_tbl[gRccUs03][0]) + { + L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]); + gRccUs03 ++; + /// printf("\r\n gRccUs03 = %d (%X)= %x ",gRccUs03,(int)GC6133_init_reg_tbl[gRccUs03][0],(int)GC6133_init_reg_tbl[gRccUs03][1]); + /// printf("\r\n%d:(%2X)= %2X ",gRccUs03,(int)GC6133_init_reg_tbl[gRccUs03][0],(int)GC6133_init_reg_tbl[gRccUs03][1]); + ///L1_uartD_senduc(s->usN); + L2_task_go(D_task_GC032A_write_reg); + L1_task_Cdelay(D_Cdelay_200us); + }else + { + L2_task_go(D_task_GC032A_div); + //L1_task_Tdelay(D_Tdelay_1s); + L1_task_Tdelay(250); + } + TTSS_Task_step(D_task_GC032A_div): + if(0 == s->fisrt) + { + s->fisrt = 1; + GC032a_L0_uart0_uc(0x3c); + D_VSYNCS_open(); + ///D_HSYNCS_open(); + L0_GC032A_write(0xfa,D_0xfa); + } + L2_task_go(D_task_GC032A_start_time); + TTSS_Task_step(D_task_GC032A_start_time): + D_cam_led_on(); + GC032a_L0_uart0_uc(0x3D); + + printf(" D_task_GC032A_start_time "); + GC032A_init_flag = 0; + s->status = 0; + L2_task_go(D_task_GC032A_wait); + L1_task_Tdelay(D_Tdelay_10ms); + TTSS_Task_step(D_task_GC032A_wait): + + if(1 == s->vs_ok) + { + s->vs_ok = 0;///s->m + printf("\r\nf\r\n ----------------------------------------------------------------- \r\n\r\n\r\n"); + + } + if(1 == s->hs_ok) + { + s->hs_ok = 0;///s->m + ///DR_Hs_count --; + if((ts_clk.hs_n-1)%D_480_div == s->m) + { + ///D_HSYNCS_close(); + ///printf("\r\n%x ",s->pclk_max);//,DR_Hs_count + + printf("\r\nU%5d %3d %3X %d",ts_task_GC032a.VS_max,ts_clk.hs_n-1,s->pclk_max,(int)s->m);//,DR_Hs_count + s->pclk_max = 0; + //ts_task_GC032a.buf[0][ts_task_GC032a.pclk_n] + // L1_uartD_sendArrayhex(ts_task_GC032a.buf[0],100);/// + /// ////hex /// /// + L1_uartD_sendArray(ts_task_GC032a.buf[0],640);//////// + // L1_uartD_sendArray(ts_task_GC032a.buf[1],640); + /// + + D_HSYNCS_open(); + } + + + + ////printf("\r\n%d %d %d",DR_Hs_count,s->pclk_max,s->pclk_n); + /// s->pclk_n = 0; + + /*** + 0D 0A 20 32 34 09 32 30 37 09 32 38 31 09 13 21 13 20 15 21 16 25 1B 2F 25 4E 45 84 5B 97 62 98 61 A0 69 A5 66 A6 64 A0 5F 87 38 3C 1E 2A 1B 28 1B 28 1D 29 1E 29 1D 2A 1E 2B 20 2A 1E 2B 20 2E 1F 2F 21 30 21 30 22 32 23 31 21 31 23 37 2B 5A 6D C3 89 C0 7E B8 77 AF 6B A3 5A 7E 4B 75 2E 4F 2E 5C 2C 5D 43 79 40 75 39 58 20 37 20 2F 28 34 29 31 26 2B 27 2A 1B 2A 32 74 42 4C 2B 3C 29 38 25 32 1F 2A 1E 2E 20 33 23 34 26 34 25 39 28 3B 29 3F 2A 41 2C 41 2D 44 30 46 2D 44 2C 42 2D 47 2E 46 2E 4A 30 47 30 49 2F 4A 2E 48 2F 47 2F 49 32 4A 31 49 32 4B 30 4A 30 48 31 4B 34 50 3D 77 61 9E 69 9F 6C A6 71 BA 7E BD 7B BB 7F BC 78 A4 64 96 59 81 57 87 57 82 4D 74 42 5F 3B 61 38 4E 2F 47 2B 47 2B 43 2A 40 2A 3F 29 40 2A 41 28 3E 27 3B 26 38 26 3F 29 3E 24 2B 16 21 16 23 16 27 25 42 2A 47 2D 47 2A 42 2F 51 31 4B 30 48 2D 3E 2B 41 31 51 3E 5E 41 5E 40 5B 37 53 3A 58 3F 6B 47 6C 48 6D 48 72 47 71 49 72 4A 70 4B 73 4B 70 46 6E 46 65 41 66 45 6D 44 63 40 61 47 6F 46 64 42 5E 3C 5B 3B 5B 3D 5B 3D 59 3D 5A 3D 5C 3C 58 3A 58 3A 57 39 59 3D 59 5B 3B 5D 3A 5B 3A 59 39 5A 3A 59 39 5B 38 5A 3A 58 3A 59 3A 57 39 5B 3C 59 39 5B 3C 59 3A 5A 3D 5A 3B 5A 3D 59 3B 59 3B 5B 3D 5A 3C 5B 3D 5B 3D 5B 3D 59 3D 59 3B 5B 3D 5C 3B 59 3B 5C 3E 5A 3C 5C 3E 5A 3D 5B 3C 5A 3D 5C 3C 5A 3E 5A 3C 5C 3E 5D 3F 5D 3E 5F 3D 5A 3E 5B 3E 5D 3C 5B 3F 5C 3E 5D 3E 5D 40 5E 3D 5C 3D 5A 3D 5B 3E 5C 3D 5B 3E 5E 3C 5E 41 5C 3C 5D 3E 5D 3D 5B 3B 59 3E 5B 40 5B 3E 59 3F 5F 3D 5D 40 5A 3E 5A 3C 5D 3E 5C 41 59 3C 5A 3E 5B 3D 5C 40 5E 3C 5A 3C 5B 3E 5A 3B 5C 3D 5D 3C 5A 3B 5A 3A 59 3A 5D 3D 59 3C 5D 3C 5A 3C 58 3C 5A 3F 58 3A 58 3B 5A 3B 59 3D 59 3C 57 3B 58 3B 55 3B 58 3C 56 39 55 3A 54 3B 54 3B 56 38 56 3A 54 3A 54 39 53 38 54 3B 54 3A 55 3B 54 3A 55 3A 57 38 54 3B 53 38 4F 39 51 38 51 38 50 39 54 38 51 37 54 37 4F 37 4E 38 50 36 4E 38 50 35 51 38 4C 37 51 37 4E 37 4B 36 4F 34 4D 35 4E 35 4D 35 4D 36 50 34 4E 35 4F 36 4C 33 4F 32 4C 33 4E 36 4B 33 4C 35 4F 36 52 37 4B 36 4B 34 4A 35 4C 35 4D 34 + + + printf("\r\nclk= %d \r\n",s->pclk_max); + printf("\r\n22clk= %d \r\n",s->pclk_n);s->pclk_n = 0; + /// L1_uartD_sendArrayhex(ts_task_GC032a.buf,s->pclk_max); + + printf("\r\nHS= %d \r\n",s->HS_max); + /// L1_uartD_ushexArray(ts_task_GC032a.HS,s->HS_max); + /// L1_uartD_ushexArray(ts_task_GC032a.HS,12); + + **/ + } + TTSS_Task_step(D_task_GC032A_send1): + + + TTSS_Task_step(D_task_GC032A_sleep): + ////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms + /////1160-10 - 20 = 1130ms + D_cam_led_on();//printf("\r\n D_task_GC032A_sleep "); + L2_task_go(D_task_GC032A_wait); + TTSS_Task_end(); +} + +void L1_GC032A_sleep(unsigned char onf) +{ + if(onf) + { + /// 进入standby: + L0_GC032A_write(0xfc,0x03); + L0_GC032A_write(0xf7,0x00); + L0_GC032A_write(0xf9,0xcf); + L0_GC032A_write(0xf3,0x00); + }else + { + /// 退出standby: + L0_GC032A_write(0xfc,0x02); + L0_GC032A_write(0xf7,0x01); + L0_GC032A_write(0xf9,0xce); + L0_GC032A_write(0xf3,0xff); + } +} + +void L3_GC032A_debug(u8 filter) +{ + + U8 i,val[16]; + 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_sendArrayhex(TS_s2b_debug.sp,TS_debug_rec.R1); + + printf("\r\n GC032A ok"); + + switch (ts_debug_rec.ocr) + { + + case 0x11: + //// FI R1 R2 R3 OCR + ///// FC 11 F6 04 11 + /// r2 寄存器 R3 数量 ,val + L0_GC032A_read(ts_debug_rec.R2,val,ts_debug_rec.R3); + + Lc_delay_ms(400); + L2_IICMx_Read1Reg1D(D_iicch_gc032a,D_i2c_addr_gc032A,0xf6); + + printf("\r\n GC032A_read reg(%2X) num= %d ",(int)ts_debug_rec.R2,(int)ts_debug_rec.R3); + L1_uartD_sendArrayhex(val, ts_debug_rec.R3); + break; + //读取摄像头配置参数 + + //1/ 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x12: + //设置当前页面01 + L0_GC032A_write(ts_debug_rec.R2,ts_debug_rec.R3); + L1_uartD_senduc(ts_debug_rec.R2); + L1_uartD_senduc(ts_debug_rec.R3); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x05: + L1_uartD_senduc(0x81); + ///1.standby + L1_GC032A_sleep(0); + break; + case 0x15: + L1_GC032A_sleep(1);///standby + L1_uartD_senduc(0x80); + break; + case 0x35: + L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma + L1_uartD_senduc(0x31); + break; + case 0x36: + /// 退出standby: + L0_GC032A_work(); + L1_uartD_senduc(0x30); + break; + case 6: + D_cam_led_off(); + break; + case 7: + D_cam_led_on(); + + break; + + + default: + printf(" pp error\r\n "); + + break; + }; + + printf("333"); + } +} + +#if 0 +//// fe 01 reg data 0cx +void L3_GC032A_fun(U8 *pPara) +{ + U8 i,val[2]; + + TS_pp_debug_ *p = pPara; + switch(p->ocr) + { + case 0x00: + L0_GC032A_read(p->R2,val,p->R3); +/// L1_uartD_senduc(p->cmd); + L1_uartD_senduc(p->R2); + L1_uartD_senduc(p->R3); + L1_uartD_senduc('G'); + for(i = 0;i < p->R3;i++) + { + L1_uartD_senduc(val[i]); + } + break; + //读取摄像头配置参数 + case 0x01: +/// sysreg FE 01 FE 33 44 //读取当前页面 +/// sysreg FE 01 F0 33 44 //读取id = 0x23 + L0_GC032A_read(p->R2,&i,1); + L1_uartD_senduc(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); + L1_uartD_senduc(p->R2); + L1_uartD_senduc(p->R3); + break; + //启动摄像头进行拍照; + case 0x03:/// sysreg FE 03 03 04 05 //设置是否发送一line数据(数据分为一帧=640Line = 640line*480pclk ) + ///ts_task_GC032a.task.sh = D_task_GC032A_start_time; + if(1== ts_task_GC032a.line_onf) + { + ts_task_GC032a.line_onf = 0; + L1_uartD_senduc(0x30|ts_task_GC032a.line_onf);Lc_delay_ms(2); + }else + { + ts_task_GC032a.line_onf = 1; + L1_uartD_senduc(0x30|ts_task_GC032a.line_onf);Lc_delay_ms(2); + } + L1_uartD_senduc(0x30|ts_task_GC032a.line_onf); + break; + case 0x05: + L1_uartD_senduc(0x81); + ///1.standby + L1_GC032A_sleep(0); + break; + case 0x15: + L1_GC032A_sleep(1);///standby + L1_uartD_senduc(0x80); + break; + case 0x35: + L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma + L1_uartD_senduc(0x31); + break; + case 0x36: + /// 退出standby: + L0_GC032A_work(); + L1_uartD_senduc(0x30); + break; + case 6: + D_cam_led_off(); + break; + case 7: + D_cam_led_on(); + + break; + default: + break; + }; +} + +#endif + diff --git a/source/bsp/cam/bsp_cam.h b/source/bsp/cam/bsp_cam.h new file mode 100644 index 0000000..6a9eb6f --- /dev/null +++ b/source/bsp/cam/bsp_cam.h @@ -0,0 +1,209 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 "msp_uart1.h" + +#include "TTSS_task.h" + +#include "bsp_gc032a.h" + +#include "msp_iicMx.h" + +//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask + +//#define D_i2c_addr_gc61xx 0x80 //page8/30 @pdf +#define D_i2c_addr_gc032A 0x42 //page15/31 @pdf +#define D_0xfa 0x33 + + +///16 2ms 921600bps发送一帧数据耗时640*0.1/4 = 8ms +///8 1ms 921600bps发送一帧数据耗时640*0.1/4 = 8ms + +///921600bps 92,160Byte 92B/ms 1ms发送90Bytes +////640 / 90 = 6.9ms +///640x480 = 307,200 307200 / 90 = 3,333ms = 3.3s = 6.9msx480 + +////div = 16 每1/480行数据 采样耗时 2ms 那么发送 1s多发送一帧画面(640x480) 发送一行(640点)的时间为6.9ms +/// div = 16 发送就是4等份 + + +///div = 8 0.5ms 一帧 发送8等分 +#define MCLKOCR_P54 0 +#define MCLKOCR_P16 BITN7 + +#define D_cam_speed 16 + + +#if(D_cam_speed == 16) + +#define D_480_div 8 //// 和MCLKOCR_DIV关联 +//#define D_row_max 640 +#define MCLKOCR_DIV D_cam_speed//4分频 需要测试 16 = 1.2svs 4= 300ms 32不出数据 + +#elif(D_cam_speed == 8) +#define D_480_div 4 //// 和MCLKOCR_DIV关联 +//#define D_row_max 640 +#define MCLKOCR_DIV D_cam_speed//4分频 需要测试 16 = 1.2svs 4= 300ms 32不出数据 + +#elif(D_cam_speed == 4) +#define D_480_div 4 //// 和MCLKOCR_DIV关联 +//#define D_row_max 640 +#define MCLKOCR_DIV D_cam_speed//4分频 需要测试 16 = 1.2svs 4= 300ms 32不出数据 + +#elif(D_cam_speed == 2) + +#define D_480_div 96 //// 和MCLKOCR_DIV关联 +//#define D_row_max 640 +#define MCLKOCR_DIV D_cam_speed//4分频 需要测试 16 = 1.2svs 4= 300ms 32不出数据 + + +#endif + + +#define L0_GC032A_write(R,D) L2_IICMx_WriteCmd(D_iicch_gc032a,D_i2c_addr_gc032A,(R),(D))////L2_I2C_WriteCmd(D_i2c_addr_gc032A,(R),(D)) +#define L0_GC032A_read(R,D,N) L2_IICMx_ReadReg(D_iicch_gc032a,D_i2c_addr_gc032A,(R),(D),(N))/// L2_I2C_ReadReg(D_i2c_addr_gc032A,(R),(D),(N)) + +#define L0_GC032A_reg(R,D) L2_tws_ReadReg(D_iicch_gc032a,D_i2c_addr_gc032A,(R),(D)) + + +#define L0_GC032A_work() D_P35_OFF(); +#define L0_GC032A_standby() D_P35_ON();//fixme D_P55_ON(); +///Sensor power down control:0: normal work 1: standby + +///#define L0_GC032A_RCLK() D_P35_OFF();D_P35_ON(); //λ74hc595洢 +///#define L0_GC032A_RCLK_ok() D_P35_OFF(); + + +#define GC6123_SERIAL_write_cmos_sensor L0_GC032A_write +//#define D_row_max 640 +//#define D_row_max 680 +///#define D_row_max 510 +#define D_row_max 1200 + + +extern vU16 data gdataUs02,gdataUs03,gdataUs05; +/****** +/// +gRccUs03, +gRccUs01_H,// +gRccUs01_L, +gRccUs04,//// +;// + +******/ + + +typedef struct +{ + vU16 pclk_n; + vU16 hs_n; + + +}TS_clk_; +extern TS_clk_ data ts_clk; +typedef struct +{ + TS_task task; +/// vU32 t_stamp; + vU16 pclk_max; + vU16 HS_max; + vU16 VS_max; +//// vU16 HS_max; + + vU16 HS_n; +//// vU16 pclk_n; + vU16 pclk_m; + + vU16 HS[481]; + + u8 hs_ok; + + + u8 vs_ok; + + u8 m; + + unsigned char status; +// volatile unsigned short usHs_count; +// volatile unsigned short usPclk; +//volatile unsigned short up_point; +//volatile unsigned short down_point; +/// unsigned char line_onf; + unsigned char fisrt; +/// volatile unsigned short usN; +////// unsigned short usMax; + unsigned char buf[4][D_row_max +2]; +}TS_task_GC032A_; +extern TS_task_GC032A_ ts_task_GC032a; + +void L2_task_GC032A_init(void); + +#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_GC032A_write_reg 0x40 +#define D_task_GC032A_start_time 0x41 +#define D_task_GC032A_wait 0x42 + + +#define D_task_GC032A_div 0x43 + +#define D_task_GC032A_dat 0x34 + +#define D_task_GC032A_send_line 0x35 +#define D_task_GC032A_send1 0x55 + +#define D_task_GC032A_send2 0x36 +#define D_task_GC032A_send3 0x37 +#define D_task_GC032A_send4 0x38 +#define D_task_GC032A_send5 0x39 + +////#define D_task_GC032A_over 0x63 +#define D_task_GC032A_cal 0x63 +#define D_task_GC032A_433 0x64 + +#define D_task_GC032A_sleep 0x67 + +void L2_task_GC032A_handle(TS_task_GC032A_ *s); + +#define D_cam_led_on(); LED3 = 1;////L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_ON|D_CW63XX_3V2); +#define D_cam_led_off(); LED3 = 0;//L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC2,D_CW63XX_OFF|D_CW63XX_2V8); + + +#define D_cam_DVDD_on(); ///LED3 = 1;//L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC,D_CW63XX_ON|D_CW63XX_2V8); +#define D_cam_DVDD_off(); //L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC,D_CW63XX_OFF|D_CW63XX_2V8); + +#define D_cam_AVDD_on(); ///L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_ON|D_CW63XX_2V8); +#define D_cam_AVDD_off(); ////L2_I2C_WriteCmd(D_i2c_addr_cw63xx,D_power_VCC3,D_CW63XX_OFF|D_CW63XX_2V8); + + +//////////////////////////////////////////////////////////////////// + + +////extern TS_P_rf TS_paer_value; + +void GC032A_port_init(void); +void L3_GC032A_fun(U8 *pPara); +void L1_GC032A_sleep(unsigned char onf); +void L3_GC032A_debug(u8 filter); + + +#endif // #ifndef _bsp_gc6133_H + diff --git a/source/bsp/cam/bsp_cam_isr.c b/source/bsp/cam/bsp_cam_isr.c new file mode 100644 index 0000000..d6a63b6 --- /dev/null +++ b/source/bsp/cam/bsp_cam_isr.c @@ -0,0 +1,179 @@ +//////////////////////////////////////////////////////////////////////////// +///@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_cam_isr.h" + + +#ifdef doc_98989 +vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________ +hs /\————————/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480个__/\____/\____/\____/\————————/\ + +hs /``\________________________hs______________________/``\ +pclk |||||||||||||||||||||||||||||||||||||||||||||||640 +#endif ///doc_98989 + +void L0_VSYNCS_Isr(void) D_SERVE_VS +{////找到一帧数据的开头:第一行 + ts_task_GC032a.HS_max = ts_clk.hs_n; + if(ts_task_GC032a.m > D_480_div ) + { + ts_task_GC032a.m = 0; + ts_task_GC032a.vs_ok = 1; + }else + { + ts_task_GC032a.m ++; + } + ts_task_GC032a.VS_max ++; + ts_clk.hs_n = 0; + D_HSYNCS_open(); + +} + +void L0_HSYNCS_Isr(void) D_SERVE_HS/// using 1 +{///hs 下沿有效 + //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 + ET0 = 0; + ts_clk.hs_n ++; + ts_task_GC032a.hs_ok = 1; + ts_task_GC032a.pclk_max = ts_clk.pclk_n; + D_LED1_REV();//////// if(0)//// + D_PCLK_open(); + ts_clk.pclk_n = 0; + ET0 = 1; +} + +//// 读取不为0x80的数据 +//// 放入s_task_GC032A.buf +////D_pclk_per_hs 数量满足后 s_task_GC032A.status = 1; +void l0_PCLK_Isr(void) D_SERVE_CLK /// using 1 +{///PCLK + //D_LED2_REV(); + D_LED2_ON(); +/// DR_Dat = P2; +/// if(DR_Dat != 0X80)////////// + { + ///ts_task_GC032a.buf[0][ts_task_GC032a.pclk_n] = DR_Dat;/// + ts_task_GC032a.buf[0][ts_clk.pclk_n] = P2; + + ts_clk.pclk_n++;//! + + if(P37) + { + D_PCLK_close(); + } + } + D_LED2_OFF(); +/// ts_task_GC032a.pclk_n ++; +} + +void L0_cam_INT_init(void) +{ + ///D_VSYNCS_open(); +/// D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//使能INT2中断 + D_HSYNCS_close(); + D_PCLK_init(); +} + + + +#if 0 +void L0_HSYNCS_Isr(void) D_SERVE_HS/// using 1 +{///hs 下沿有效 + //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 +///EA = 0; + ET0 = 0; +/// ts_task_GC032a.HS[DR_Hs_count] = ts_task_GC032a.pclk_n; +/// ts_task_GC032a.HS[DR_Hs_count] = DR_Hs_count;// +/// ts_task_GC032a.pclk_n = 0; + + DR_Hs_count ++; + + ts_task_GC032a.vs_ok = 1; + + ts_task_GC032a.pclk_max = ts_task_GC032a.pclk_n; + + D_LED1_REV();//////// if(0)//// + D_PCLK_open(); +/// DR_pclk_n = 0; +ET0 = 1; + + +/// EA = 1; +} + +//// 读取不为0x80的数据 +//// 放入s_task_GC032A.buf +////D_pclk_per_hs 数量满足后 s_task_GC032A.status = 1; +void l0_PCLK_Isr(void) D_SERVE_CLK /// using 1 +{///PCLK + D_LED2_REV(); + ///DR_Dat = P2; + /////if(DR_Dat != 0X80) + { + ///ts_task_GC032a.buf[0][DR_pclk_n] = DR_Dat; +/// ts_task_GC032a.buf[0][DR_pclk_n] = P2; + ts_task_GC032a.buf[0][ts_task_GC032a.pclk_n] = P2; + + + //// DR_pclk_n++;// + } + ts_task_GC032a.pclk_n ++; +} + + + +void L0_HSYNCS_Isr(void) D_SERVE_HS/// using 1 +{///hs 下沿有效 + //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 +///EA = 0; + ET0 = 0; +/// ts_task_GC032a.HS[DR_Hs_count] = ts_task_GC032a.pclk_n; +/// ts_task_GC032a.HS[DR_Hs_count] = DR_Hs_count;// +/// ts_task_GC032a.pclk_n = 0; + // + + DR_Hs_count ++; + + ts_task_GC032a.vs_ok = 1; + + D_LED1_REV();//////// if(0)//// + + + //// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据 + if(DR_Hs_count == D_row_get) + {///D_P33_REV(); + DR_pclk_n = 0; + D_PCLK_open(); + ET0 = 0; //add by cc + + }else if(DR_Hs_count == (1+D_row_get)) + { + D_PCLK_close(); + ET0 = 1; + ts_task_GC032a.status = 1; + ts_task_GC032a.pclk_max = DR_pclk_n; + }else + { + ET0 = 1; + } +/// EA = 1; +} + +#endif + + + diff --git a/source/bsp/cam/bsp_cam_isr.h b/source/bsp/cam/bsp_cam_isr.h new file mode 100644 index 0000000..69bb9e5 --- /dev/null +++ b/source/bsp/cam/bsp_cam_isr.h @@ -0,0 +1,128 @@ +//////////////////////////////////////////////////////////////////////////// +///@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 "bsp_cam.h" + +#include "msp_uart1.h" + +#include "bsp_gc032a.h" + +#define D_CAM_INT_CLOSE(); D_VSYNCS_close();D_HSYNCS_close();D_PCLK_close(); + + +#define D_VSYNCS_close(); L0_INT2_CLOSE(); +#define D_VSYNCS_open(); L0_INT2_OPEN(); + +#define D_HSYNCS_close(); L0_INT3_CLOSE(); +#define D_HSYNCS_open(); L0_INT3_OPEN(); + + + +#define D_PCLK_init(); L0_INT1_D(); +///#define D_PCLK_init(); L0_INT1_UD(); + +#define D_PCLK_open(); L0_INT1_OPEN(); +#define D_PCLK_close(); L0_INT1_CLOSE(); + +#define D_SERVE_VS D_SERVE_INT2 +#define D_SERVE_HS D_SERVE_INT3 +#define D_SERVE_CLK D_SERVE_INT1 + + +///#define DR_pclk_n gRccUs05 + +///#define DR_pdata_n gRccUs01 +///#define DR_pdata_n_H gRccUs01_H +//#define DR_pdata_n_L gRccUs01_L + + +//#define DR_Hs_count gRccUs02//s_task_GC032A.usPclk +///#define DR_Dat CCAP1L +#define DR_Dat SPDAT + +//>>>>>>>>>>>>>>>>>>>>>0gc63xxtask +#define D_pclk_per_hs D_row_max +#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 + + +#define D_row_get 100 +#define D_row_get2 4 + + +//////////////////////////////////////////////////////////////////// + + +extern void L0_cam_INT_init(void); + + + + /********** + +////sfr CL = 0xe9; +//sfr16 CCAP16 = 0xea; +///sfr16 T4HL = 0xea; +#define T4HL (*(unsigned int volatile data *)0xd2) + +#define CCAP16 (*(unsigned int volatile data *)0xea) +///T4H + +#define CCAP1633 (*(unsigned char volatile data *)0xea) +while (1) + { + Lc_delay_ms(3); + //// L1_uartD_senduc(0x30+(u8)P17); + CCAP16 ++;T3L++;CCAP1633++;T4HL++;CCAP0L++; + printf("\r\nmain while=CCAP16 %d T3L %d CCAP1633 %d T4HL %d CCAP0L %d ",(int)CCAP16,(int)T3L,(int)CCAP1633,(int)T4HL,(int)CCAP0L); + + } + + + +#define T4HL (*(unsigned int volatile data *)0xd2) + +#define CCAP16 (*(unsigned int volatile data *)0xea) +///T4H + +#define CCAP1633 (*(unsigned char volatile data *)0xea) + while(0) + { + gRccUs01 ++; + gRccUs02 ++; +SPDAT++; + gdataUs02++; + gRccUs03 ++; + gRccUs05 ++; + CCAP16++; + T4HL++; + CCAP1633++; + ts_clk.pclk_n++; + ts_clk.pclk_m++; + + } +****/ + + + + +#endif // #ifndef _bsp_cam_isr_H + diff --git a/source/bsp/cam/bsp_gc032a - old.h b/source/bsp/cam/bsp_gc032a - old.h new file mode 100644 index 0000000..9cac0bb --- /dev/null +++ b/source/bsp/cam/bsp_gc032a - old.h @@ -0,0 +1,18 @@ + +#ifndef _gc_032a_H_ +#define _gc_032a_H_ + +#include "bsp_config.h" + +#include "c_type51.h" +#include "c_lib.h" +#include "TTSS_tick.h" + +//#define GC6133_reg_tbl_len 291 +#define GC6133_reg_tbl_len 293 + + +extern code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]; + + +#endif///_gc_032a_H_ diff --git a/source/bsp/cam/bsp_gc032a oh.c b/source/bsp/cam/bsp_gc032a oh.c new file mode 100644 index 0000000..1c8fe7b --- /dev/null +++ b/source/bsp/cam/bsp_gc032a oh.c @@ -0,0 +1,420 @@ + #include "bsp_gc032a.h" +code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]= { + + /*System*/ + {0xf3,0xff}, + {0xf5,0x06}, + {0xf7,0x01}, + {0xf9,0xce}, + {0xfa,0x00}, + {0xf8,0x03},//////分频 {0xf8,0x03}, + // {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + /// {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + + + {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},///Denoise enable P0:0x40[2] 1’b1 使能去噪模块DD enable P0:0x40[1] 1’b1 使能去坏点模块 + + + + {0x41,0x25}, + {0x42,0xcd},///cc201805 close AWB{0x42,0xcf}, +#define D_ony_Y 0x11///输出为零 +#define D_YCrYCb 0x3 +#define D_CbYCrY 0x1 + + {0x44,0x40|D_CbYCrY}, ///{0x44,0x86},//// + + +/**********20221115_0249 CCmodify + +P0:0x44 Output_format 8 0x22 RW +[7] NA +[6] Smooth Y +[5] average neighbor chroma +[4:0]output data mode, check details in +OUT +5’h00 + + + +******/ + + + {0x43,0x12},///{0x43,0x10},////{ /{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}, +/*****20221115_02010 CCmodify +P0:0xda Fixed_Cb 8 0x00 RW S7, +if fixed CbCr function is enabled, +current image Cb value will be replace by this value to achieve special effect +P0:0xdb Fixed_Cr 8 0x00 RW S7, if fixed CbCr function is enabled, +current image Cr value will be replace by this value to achieve special effect + +****/ + + /////{0x46,0x22}, +////------------------------------------- + {0x46,B0010_1000}, //{0x46,0x22},|0x02},hs high pclk polarity +/* 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,0x08|0x03}, /// {0x49,0x03}, ///clk的频率发生变化 + + {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}, + + +/// {0x4c,0x08},///20221113_11469 CCmodify// + + + {0x00,0x00} + +}; + diff --git a/source/bsp/cam/bsp_gc032a.c b/source/bsp/cam/bsp_gc032a.c new file mode 100644 index 0000000..82aa374 --- /dev/null +++ b/source/bsp/cam/bsp_gc032a.c @@ -0,0 +1,448 @@ +#include "bsp_gc032a.h" + + +#define D_cam_set_page_0 {0xfe,0x00} +#define D_cam_set_page_1 {0xfe,0x01} +#define D_cam_set_page_2 {0xfe,0x02} +#define D_cam_set_page_3 {0xfe,0x03} + + +code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]= { + + /*System*/ + {0xf3,0xff}, + {0xf5,0x06}, + {0xf7,0x01}, + {0xf9,0xce}, + {0xfa,0x00}, + {0xf8,0x03},//////分频 {0xf8,0x03}, + // {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + /// {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + + + {0xfc,0x02}, +{0xfe,0x02},//page 2 + {0x81,0x03}, + + {0xfe,0x00}, + {0x77,0x64}, + {0x78,0x40}, + {0x79,0x60}, + /*ANALOG & CISCTL*/ + {0xfe,0x00},//page 0 + + #if 0 + + {0x03,0x01}, + {0x04,0xce}, + {0x05,0x01}, + {0x06,0xad}, + {0x07,0x00}, + {0x08,0x10}, + + + {0x0a,0x78}, + {0x0c,0xa0}, + {0x0d,0x00}, + {0x0e,0xf8}, + {0x0f,0x01}, + {0x10,0x48}, + + + #else + + {0x03,0x01}, + {0x04,0xce}, + {0x05,0x01}, + {0x06,0xad}, + {0x07,0x00}, + {0x08,0x10}, + {0x0a,0x00}, + {0x0c,0x00}, + {0x0d,0x01}, + {0x0e,0xe8}, + {0x0f,0x02}, + {0x10,0x88}, + + #endif + + + + // {0x17,0x54},//镜像翻转 P0:0x17[1:0] 01 + {0x17,B0101_0101}, + {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}, + + +D_cam_set_page_0,////{0xfe,0x00},//page 0 + {0x40,0xff},///Denoise enable P0:0x40[2] 1’b1 使能去噪模块DD enable P0:0x40[1] 1’b1 使能去坏点模块 + +#if 0 + {0x41,0x25}, + {0x42,0xcd}, + {0x43,0x12},//// {0x43,0x10}, + {0x44,0x83}, + {0x46,0x22},//////28 + {0x49,0x03},// {0x49,0x08|0x03}, + + +#else + {0x41,0x25}, + {0x42,B1100_1101},/// {0x42,0xcd},/// {0x42,0xcd}, B1100_1101///变成cf Auto_EE_en P0:0x42[6] 1’b0 暗光下弱化 EE 的使能 P0:0x42 AAAA_enable 8 0xcf RW [7:2] Reserved [1] AWB enable P0:0x42 AAAA_enable 8 0xcf RW [7:2]预留[1] AWB启用 + {0x43,0x12},//// {0x43,0x10}, + {0x44,0x83},////// + /// {0x46,0x28},// {0x46,0x28},/// ////28 0010 1000 + {0x46,0x2c},// {0x46,0x28},/// ////28 0010 1000 20221125_215824 CCmodify + {0x49,0x08|0x03},//281/ {0x49,0x03},//500 + /// P0:0x46[2] 0 ->下降沿出 data, default 值。 1 –>上升沿出 data。 + + +#endif + + + {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}, + +#if 10//20221127_0234 CCmodify + {0x59,0x33}, + + {0x5a,0x08},////P0:0x5a [5:4] + + {0x5b,0x00}, + {0x5c,0x00}, + {0x5d,0x00}, + {0x5e,0x00}, + {0x5f,0x00}, + {0x60,0x00}, + {0x61,0x00}, + {0x62,0x00}, +#else + {0x5a,0x08}, + {0x5b,0x0f}, + {0x5c,0x15}, + {0x5d,0x1c}, + {0x5e,0x28}, + {0x5f,0x36}, + {0x60,0x45}, + {0x61,0x51}, + {0x62,0x6a}, + +#endif + {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*/ + D_cam_set_page_0,//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}, + + #if 1 + /*DNDD*/ + {0xfe,0x00}, ///Denoise enable P0:0x40[2] 1’b1 使能去噪模块 + {0x81,0x02},//// C_weight_adaptive_ratio P0:0x81[5:4] 2’b10 越大去噪越弱 dn_b_mode_ratio P0:0x81[1:0] 2’b10 越大去噪越强 + {0x82,B0011_0010},///DN_bilat_b P0:0x82[5:0] 0x15 越大去噪越强 {0x82,0x12}, B0011_0010// + {0x83,0x00},//DN_C_weight_base P0:0x83[3:0] 0x05 越大去噪越弱 + {0x84,0x01},///Dark threshold P0:0x84[7:4] 0x0e 暗点门限值 Bright threshold P0:0x84[3:0] 0x05 亮点门限值 + {0x86,0x50}, + {0x87,0x18}, + {0x88,0x10}, + {0x89,0x70}, + {0x8a,0x20}, + {0x8b,0x10}, + {0x8c,0x08}, + {0x8d,0x0a}, + + + #else + /*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}, + #endif + + + /*Intpee*/ + {0xfe,0x00}, + {0x8f,0xaa}, + {0x90,0x9c}, + {0x91,0x52}, + {0x92,0x03}, + {0x93,0x03}, + {0x94,0x08}, + {0x95,0x44},/// {0x95,0x44},///边缘加强(Edge enhancement) Edge1_effect P0:0x95[7:4] -- Edge1 上的增强效果 Edge2_effect P0:0x95[3:0] -- Edge2 上的增强效果 + {0x97,0x00}, + {0x98,0x00}, + + /*ASDE*/ + {0xfe,0x00}, + {0xa1,0x30}, + {0xa2,0x41},////ASDE_auto_EE1 {0xa2,0x41}, + +//_effect_start +//P0:0xa2[7:4] -- 暗光下对 Edge1 的增强进行削弱的幅度 +//ASDE_auto_EE2 +//_effect_start +//P0:0xa2[3:0] -- 暗光下对 Edge2 的增强进行削弱的幅度 + {0xa4,0x30}, + {0xa5,0x20}, + {0xaa,0x30}, + {0xac,0x32}, + + /*YCP*/ + {0xfe,0x00}, + {0xd1,0x00}, + {0xd2,0x00}, + {0xd3,0xff},/// {0xd3,0x38},///20221127_01345 CCmodify Luma_contrast P0:0xd3 0x40 对比度调整,0x40 为一倍 + {0xd4,0x80},///20221127_01345 CCmodify L + + +///Contrast_center P0:0xd4 0x80 对比度中心值 + {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}, + + +/// {0x4c,0x08},///20221113_11469 CCmodify// + + + {0x00,0x00} + +}; + diff --git a/source/bsp/cam/bsp_gc032a.c.bak b/source/bsp/cam/bsp_gc032a.c.bak new file mode 100644 index 0000000..c1112bf --- /dev/null +++ b/source/bsp/cam/bsp_gc032a.c.bak @@ -0,0 +1,352 @@ + #include "bsp_gc032a.h" +code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]= { + + /*System*/ + {0xf3,0xff}, + {0xf5,0x06}, + {0xf7,0x01}, + {0xf9,0xce}, + {0xfa,0x00}, + {0xf8,0x03},//////分频 {0xf8,0x03}, + // {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + /// {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + + + {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},///Denoise enable P0:0x40[2] 1’b1 使能去噪模块DD enable P0:0x40[1] 1’b1 使能去坏点模块 + + + + {0x41,0x25}, + {0x42,0xcf}, + {0x43,0x12},//// {0x43,0x10}, + {0x44,0x83}, + {0x46,0x22}, + {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,0x00}, + {0xd2,0x00}, + {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}, + + +/// {0x4c,0x08},///20221113_11469 CCmodify// + + + {0x00,0x00} + +}; + diff --git a/source/bsp/cam/bsp_gc032a.h b/source/bsp/cam/bsp_gc032a.h new file mode 100644 index 0000000..33c2518 --- /dev/null +++ b/source/bsp/cam/bsp_gc032a.h @@ -0,0 +1,18 @@ + +#ifndef _gc_032a_H_ +#define _gc_032a_H_ + +#include "bsp_config.h" + +#include "c_type51.h" +#include "c_lib.h" +#include "TTSS_tick.h" + +//#define GC6133_reg_tbl_len 291 +#define GC6133_reg_tbl_len 294 + + +extern code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]; + + +#endif///_gc_032a_H_ diff --git a/source/bsp/cam/bsp_gc032a999.c b/source/bsp/cam/bsp_gc032a999.c new file mode 100644 index 0000000..bbc0da6 --- /dev/null +++ b/source/bsp/cam/bsp_gc032a999.c @@ -0,0 +1,352 @@ + #include "bsp_gc032a.h" +code U8 GC6133_init_reg_tbl[GC6133_reg_tbl_len+1][2]= { + + /*System*/ + {0xf3,0xff}, + {0xf5,0x06}, + {0xf7,0x01}, + {0xf9,0xce}, + {0xfa,0x00}, + {0xf8,0x03},//////分频 {0xf8,0x03}, + // {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + /// {0xfa,D_0xfa}, // cc add + /// {0xfd,D_0xfa}, // cc add + + + {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},///Denoise enable P0:0x40[2] 1’b1 使能去噪模块DD enable P0:0x40[1] 1’b1 使能去坏点模块 + + + + {0x41,0x25}, + {0x42,0xcf}, + {0x43,0x10}, + {0x44,0x83}, + {0x46,0x22}, + {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,0x00}, + {0xd2,0x00}, + {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}, + + +/// {0x4c,0x08},///20221113_11469 CCmodify// + + + {0x00,0x00} + +}; + diff --git a/source/bsp/cam/bsp_lora_jx.h b/source/bsp/cam/bsp_lora_jx.h new file mode 100644 index 0000000..29e949e --- /dev/null +++ b/source/bsp/cam/bsp_lora_jx.h @@ -0,0 +1,31 @@ +#ifndef BSP_lora_jx_H +#define BSP_lora_jx_H + +#include "../bsp/bsp_config.h" +#include "msp_uart1.h" +#include "tpc_lora.h" +#include "debug_drv.h" +#include "msp_UART2.h" +#include "bsp_lora.h" +#include "MLX90615.h" +typedef struct +{ + U16 Oxygen_saturation; + U16 body_temperature; + U16 heart_rate; + U16 sphygmus; +}TS_Lora_param_; + +extern TS_Lora_param_ ts_lora_param; + +extern ts_s2b_lrdlora_ ts_s2b_lrdlora_send; +extern vU8 Oxygen_saturation, body_temperature, heart_rate; + +extern void L3_lora_analysis_init(void); +extern void L3_lora_send_pkg(TS_pp_lrdlora_ *p, U8 *buf,U8 blen); + +extern void L3_lora_send(void); +extern U8 Fun_SC_Check(U8 *p1, unsigned short int len);//累加和校验 + +#endif + diff --git a/source/bsp/nouse/MLX90615.c b/source/bsp/nouse/MLX90615.c new file mode 100644 index 0000000..4ae9238 --- /dev/null +++ b/source/bsp/nouse/MLX90615.c @@ -0,0 +1,1026 @@ +#include "MLX90615.h" +#include "stc_8_delay.h"///// +//............................................................................... +#define D_task_m95_01 0x20 +#define D_task_m95_HR 0x31 +#define D_task_m95_SPO 0x32 +#define D_task_m95_sample 0x34 +#define D_task_m95_cal 0x35 +#define D_task_m95_out 0x25 + +#define D_task_m95_wakeup_01 0x23 +#define D_task_m95_wakeup_02 0x26 +#define D_task_m95_wakeup_03 0x27 +#define D_task_m95_05 0x28 +#define D_task_m95_06 0x29 + + +//............................................................................... +/******************************************************************************* +* 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_task_m95_ ts_task_m95; +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.u16out_10o = ts_mx95.u16out_o/10; + + + 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; + ts_mx95.u16out_10a = ts_mx95.u16out_a/10; + +/// printf("obj*100 %d A: %d ",(int)ts_mx95.u16out_o,(int)ts_mx95.u16out_10a); +} + + +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(); +} + + + + +void L2_task_m95_register(void) +{ + L1_task_reg_clear(&ts_task_m95.task); + L3_task_s_go(ts_task_m95,D_task_init); +} + +///step 1 init +///step 2 启动hr模式 +///step 3 等待采样完成 +///step 4 启动spo模式 +///step 5 等待采样完成 +///step 6 + +///L2_task_m95_handle(&ts_task_m95); + + + +void L2_task_m95_handle(TS_task_m95_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(): + + printf("\r\nL2_task_m95_handle_ TTSS_Task_init333\r\n"); + ts_mx95.u16out_10o_temp = ts_mx95.u16out_10o+1; + D_SHOW_tmp(ts_mx95.u16out_10o); + printf("\r\n u16out_10o =%d ", ts_mx95.u16out_10o); + L0_IICMx_SCL(D_iicch_mlx96015,1); + L2_task_go(D_task_m95_wakeup_01); + TTSS_Task_step(D_task_m95_wakeup_01): + L0_IICMx_SCL(D_iicch_mlx96015,0); + /// printf(" D_task_m95_wakeup_01"); + L2_task_Tdelay_go(D_Tdelay_40ms,D_task_m95_wakeup_02); + L2_task_go(D_task_m95_wakeup_02); + TTSS_Task_step(D_task_m95_wakeup_02): + L0_IICMx_SCL(D_iicch_mlx96015,1); + /// L2_task_Tdelay_go(D_Tdelay_40ms,D_task_m95_sample); + L2_task_go(D_task_m95_sample); + TTSS_Task_step(D_task_m95_sample): + L1_mlx95_get_tmp(); + L2_task_go(D_task_m95_cal); + TTSS_Task_step(D_task_m95_cal): + L1_mlx95_cal_tmp(); + ///printf("\r\nL2_task_m95_handle_5 "); + L2_task_go(D_task_m95_out); + TTSS_Task_step(D_task_m95_out): + if(ts_mx95.u16out_10o_temp != ts_mx95.u16out_10o) + { + /// printf("\r\n u16out_10o =%d ", ts_mx95.u16out_10o); + /// printf("\r\n u16out_10a =%d ", ts_mx95.u16out_10a); + D_SHOW_tmp(ts_mx95.u16out_10o); + ts_mx95.u16out_10o_temp = ts_mx95.u16out_10o; + } + /// printf("\r\n222222222222 u16out_10o =%d ", ts_mx95.u16out_10o); + /// printf("\r\n22222222222 u16out_10a =%d ", ts_mx95.u16out_10a); +////999999999999 L2_OLED_Show_sint21(11*8,0,ts_mx95.u16out_a/10,8);/// + L2_task_Tdelay_go(D_Tdelay_1s,D_task_m95_wakeup_01); + /// L2_task_Tdelay_go(D_Tdelay_10s,D_task_m95_sample); + TTSS_Task_end(); +} + + + + + + + + + + + +#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应答信号 + * 入口参数: 无 + * 出口参数: 返回0表示正确应答,1表示无器件响应 + * 作  者: 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总线的GPIO,采用模拟IO的方式实现 +* 入口参数: 无 +* 出口参数: 无 +* 作  者: 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向发送设备地址,然后读取设备应答来判断该设备是否存在 + * 入口参数: _Address:设备的I2C总线地址 + * 出口参数: 返回值 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) **********************************/ + + + +内部配置: + +1)MLX90615只有3V供电,而MLX90614则有5V和3V选项; + +2)MLX90615只集成了IIR数字滤波,MLX90614同时集成FIR和IIR滤波; + +3)SMBus地址不兼容,MLX90615出厂设置为0x5B,而MLX90614为0x5B; + +4)PWM频率,MLX90615可选为10Hz或者1kHz,而MLX90614是在1Hz和1kHz之间支持编程调节; + +5)两者在对RAM和EEPROM进行操作时,其操作指令不同,开发者在两者切换时需要注意; + +6)唤醒指令脉冲施加引脚不同,MLX90615在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 + + + + + diff --git a/source/bsp/nouse/MLX90615.h b/source/bsp/nouse/MLX90615.h new file mode 100644 index 0000000..00c5ce1 --- /dev/null +++ b/source/bsp/nouse/MLX90615.h @@ -0,0 +1,111 @@ + + +/******************************************************************************* +* 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 "TTSS_task.h"///// +#include "stc_8_delay.h"///// +////#include "bsp_lora_jx.h"///// +#include "bsp_oled.h"///// +#include "MAX30102.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 + +#define D_m95_mode_HR 0x02 +#define D_m95_mode_SPO2 0x03 + + + + +/* 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; + s16 u16out_o;///目标温度 放大100倍 + s16 u16out_10o;///目标温度 放大10倍 + s16 u16out_10o_temp;///目标温度 放大10倍 + + s16 u16out_a;///环境温度 放大100倍 + s16 u16out_10a;///环境温度 放大10倍 + s16 u16out_10a_temp;///环境温度 放大10倍 +}TS_mx95_; +extern TS_mx95_ ts_mx95; + + +void L1_mlx95_get_tmp(void); + + + +typedef struct +{ + TS_task task; +}TS_task_m95_; + +extern TS_task_m95_ ts_task_m95; + +extern void L2_task_m95_register(void); +extern void L2_task_m95_handle(TS_task_m95_ *s); + + + +#endif +/***************************** (END OF FILE) **********************************/ + diff --git a/source/bsp/nouse/bsp_485.c b/source/bsp/nouse/bsp_485.c new file mode 100644 index 0000000..feb1501 --- /dev/null +++ b/source/bsp/nouse/bsp_485.c @@ -0,0 +1,24 @@ +///#include "bsp_485.h" +#include "tpc_debug.h" +////#include "tpc_x.h" +#include "c_lib.h" + +#if 10 +void L2_485_init(void) +{} +#else + +void L2_485_init(void) +{ + //485配置强推挽输出 P33 P32 + //BITN_0(P3M1,BITN3);BITN_1(P3M0,BITN3); + ///BITN_0(P5M1,BITN5);BITN_1(P5M0,BITN5); + D_UART0_485_INIT(); + ///while(9) + { + + D_UART0_485_TX(); + } +} + +#endif \ No newline at end of file diff --git a/source/bsp/nouse/bsp_485.h b/source/bsp/nouse/bsp_485.h new file mode 100644 index 0000000..d3748ca --- /dev/null +++ b/source/bsp/nouse/bsp_485.h @@ -0,0 +1,13 @@ +#ifndef BSP_485_H +#define BSP_485_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; + +extern void L2_485_init(void); +#endif \ No newline at end of file diff --git a/source/bsp/nouse/bsp_AiP650E.c b/source/bsp/nouse/bsp_AiP650E.c new file mode 100644 index 0000000..1791d8a --- /dev/null +++ b/source/bsp/nouse/bsp_AiP650E.c @@ -0,0 +1,303 @@ +/********************************************************************* + * INCLUDES + */ + +#include "bsp_AiP650E.h" +#include "debug_drv.h" + +/********************************************************************* + * LOCAL VARIABLES + */ +u8 s_7number[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 7段显示方式0~9 +u8 s_8number[10] = {0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; // 8段显示方式0~9 + +/************************************************************* + +SYSOFF 4800 系统禁止,时钟振荡,不显示 √ +SYSON 4801 系统使能,开启显示,按键,8 级亮度 +SLEEPOFF 4800 睡眠禁止 +SLEEPON 4804 睡眠使能,时钟停振 +7SEG_ON 4809 系统使能,7 段显示 +8SEG_ON 4801 系统使能,8 段显示,DP 作 SEG 显示驱动,8 级亮度 +SYSON_1,8SEG_ON 4811 系统使能,8 段显示,1 级亮度 +SYSON_2,8SEG_ON 4821 系统使能,8 段显示,2 级亮度 +SYSON_3,8SEG_ON 4831 系统使能,8 段显示,3 级亮度 +SYSON_4,8SEG_ON 4841 系统使能,8 段显示,4 级亮度 +SYSON_5,8SEG_ON 4851 系统使能,8 段显示,5 级亮度 +SYSON_6,8SEG_ON 4861 系统使能,8 段显示,6 级亮度 + +SYSON_7,8SEG_ON 4871 系统使能,8 段显示,7 级亮度 +SYSON_8,8SEG_ON 4801 系统使能,8 段显示,8 级亮度 +SYSON_1,7SEG_ON 4819 系统使能,7 段显示,1 级亮度 +SYSON_2,7SEG_ON 4829 系统使能,7 段显示,2 级亮度 +SYSON_3,7SEG_ON 4839 系统使能,7 段显示,3 级亮度 +SYSON_4,7SEG_ON 4849 系统使能,7 段显示,4 级亮度 +SYSON_5,7SEG_ON 4859 系统使能,7 段显示,5 级亮度 +SYSON_6,7SEG_ON 4869 系统使能,7 段显示,6 级亮度 +SYSON_7,7SEG_ON 4879 系统使能,7 段显示,7 级亮度 +SYSON_8,7SEG_ON 4809 系统使能,7 段显示,8 级亮度 +DIG0 68XX 写 DIG0 的 8 段显示数据,‘1’亮,‘0’暗。 +DIG1 6AXX 写 DIG1 的 8 段显示数据,‘1’亮,‘0’暗。 +DIG2 6CXX 写 DIG2 的 8 段显示数据,‘1’亮,‘0’暗。 +DIG3 6EXX 写 DIG0 的 8 段显示数据,‘1’亮,‘0’暗。 +GET_KEY 4F00 读取按键数据 + +|----------------------------------------------------------------| +| led5 led1 led2 | ref +| | +| 88 88 88 | show +| DIG56 DIG45 DIG23 | sch +| 12 34 12 | ic +| SEG_CLK2 SEG_CLK1 | +| num12 num34 num56 | +| | +| ch2+ 12 ch1+34 ch1+12| +| | -----------------------------------------------| +| | +| | +| | +| | +| | +| | +|---------------| +num ic,addr + + + + +**************************************************/ +u8 num_ic_addr[6][2]=////[行][列] +{ + D_iicch_DIG2,0x68,////0 1, + D_iicch_DIG2,0x6a,////1 2, + D_iicch_DIG1,0x6c,////2 3, + D_iicch_DIG1,0x6e,////3 4, + D_iicch_DIG1,0x68,////4 5, + D_iicch_DIG1,0x6a ////5 6, + + +}; +void L1_LEDSEG_init(void) +{ + + L0_IICMx_INIT(D_iicch_DIG1,1); + L0_IICMx_INIT(D_iicch_DIG2,1); + L0_IICMx_INIT(D_iicch_DIG4,1); + + L2_IICMx_Write1Reg(D_iicch_DIG1,0x68,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG1,0x6a,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG1,0x6c,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG1,0x6e,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG1,0x48,0x21); + + L2_IICMx_Write1Reg(D_iicch_DIG2,0x68,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG2,0x6a,0xff); +// L2_IICMx_Write1Reg(D_iicch_DIG2,0x6c,0xff); +// L2_IICMx_Write1Reg(D_iicch_DIG2,0x6e,0xff); + L2_IICMx_Write1Reg(D_iicch_DIG2,0x48,0x21); + + +/********* + D_SEG_DIO2_INIT(); + D_SEG_CLK2_INIT(); + + + D_SEG_DIO1_INIT(); + D_SEG_CLK1_INIT(); + + L0_LEDSEG1_SendData(0x68,0xff); + L0_LEDSEG1_SendData(0x6a,0xff); + L0_LEDSEG1_SendData(0x6c,0xff); + L0_LEDSEG1_SendData(0x6e,0xff); + L0_LEDSEG1_SendData(0x48,0x21); +*******/ +} + +void L0_LEDSEG1_SetNumber(uint8_t index, uint8_t mode, uint8_t num) +{ + uint8_t numValue = 0; + + if(mode == 7) // 7段显示方式 + { + numValue = s_7number[num]; + } + else if(mode == 8) // 8段显示方式 + { + numValue = s_8number[num]; + } + + /// printf("index:%02x, num:%02x\n", indexAddr, numValue); +/// TM1650_Write(indexAddr, numValue); + L2_IICMx_Write1Reg(num_ic_addr[index][0],num_ic_addr[index][1],numValue); + +} + +/******************** +void L0_LEDSEG1_SendData(unsigned char H,unsigned char L ) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + L0_LEDSEG1_SDA_OFF(); + Lc_delay_us(2);///FIXme 移植的饿时候需要验证 + L0_LEDSEG1_SCL_OFF(); + Lc_delay_us(1); +/// + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((H << BitCnt ) & 0x80) + { L0_LEDSEG1_SDA_ON(); //判断发送位 + } + else + { L0_LEDSEG1_SDA_OFF(); + } + Lc_delay_us(1); + L0_LEDSEG1_SCL_ON(); //置时钟线为高,通知被控器开始接收数据位 + Lc_delay_us(1); + L0_LEDSEG1_SCL_OFF(); + Lc_delay_us(1); + }//8clk + L0_LEDSEG1_SDA_ON(); //8位发送完后释放数据线,准备接收应答位 + L0_LEDSEG1_SCL_ON(); + Lc_delay_us(1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_LEDSEG1_SCL_OFF(); + + Lc_delay_us(1); + + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((L << BitCnt ) & 0x80) + { L0_LEDSEG1_SDA_ON(); //判断发送位 + } + else + { L0_LEDSEG1_SDA_OFF(); + } + Lc_delay_us(1); + L0_LEDSEG1_SCL_ON(); //置时钟线为高,通知被控器开始接收数据位 + Lc_delay_us(1); + L0_LEDSEG1_SCL_OFF(); + Lc_delay_us(1); + }//8clk + L0_LEDSEG1_SDA_ON(); //8位发送完后释放数据线,准备接收应答位 + L0_LEDSEG1_SCL_ON(); + Lc_delay_us(1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_LEDSEG1_SCL_OFF(); + + Lc_delay_us(1); + L0_LEDSEG1_SCL_ON(); + Lc_delay_us(1); + L0_LEDSEG1_SDA_ON(); + Lc_delay_us(2);///FIXme 移植的饿时候需要验证 +} + +******************/ + +void L3_test_ledseg(u8 filter) +{ + if(filter == pd->filter) + {///filter num d1 d2 d3 ....dn + //// FD 08 11 22 33 44 55 66 77 88 + switch (pd->ocr) + { + case 0x11: + printf("ch(%X):%X=%x ",(int)pd->R1,(int)pd->R2 ,(int)pd->R3); + + L2_IICMx_Write1Reg(pd->R1,pd->R2 ,pd->R3); + + /// L0_LEDSEG1_SendData(pd->R1 ,pd->R2); + break; + case 0x12: + printf("num(%X):%X=%x ",(int)pd->R1,(int)pd->R2 ,(int)pd->R3); + + L0_LEDSEG1_SetNumber(pd->R1,pd->R2 ,pd->R3); +////F2 02 08 04 12 + /// L0_LEDSEG1_SendData(pd->R1 ,pd->R2); + break; + + + + default: + printf(" pp error\r\n "); + + break; + }; + + printf("333"); + } +} + + + +/** + + + @brief 显示设置 + @param brightness -[in] 亮度1~8级 + @param mode -[in] 7/8段显示方式 + @param state -[in] 开启/关闭显示 + @return 无 + +void TM1650_SetDisplay(uint8_t brightness,uint8_t mode,uint8_t state) +{ + if(state) + { + if(mode == 7) // 7段显示方式 + { + TM1650_Write(0x48, brightness*16 + 1*4 + 1); + } + else if(mode == 8) // 8段显示方式 + { + TM1650_Write(0x48, brightness*16 + 1); + } + } + else + { + TM1650_Write(0x48, 0x00); // 关闭显示 + } +} + + @brief 显示数字 + @param index -[in] 第几个数 + @param mode -[in] 7/8段显示方式 + @param num -[in] 显示数 + @return 无 + +void TM1650_SetNumber(uint8_t index, uint8_t mode, uint8_t num) +{ + uint8_t indexAddr = 0; + uint8_t numValue = 0; + + if(index == 1) + { + indexAddr = 0x68; + } + else if(index == 2) + { + indexAddr = 0x6A; + } + else if(index == 3) + { + indexAddr = 0x6C; + } + else if(index == 4) + { + indexAddr = 0x6E; + } + + if(mode == 7) // 7段显示方式 + { + numValue = s_7number[num]; + } + else if(mode == 8) // 8段显示方式 + { + numValue = s_8number[num]; + } + + printf("index:%02x, num:%02x\n", indexAddr, numValue); + TM1650_Write(indexAddr, numValue); +} + +*************/ +/****************************************************END OF FILE****************************************************/ diff --git a/source/bsp/nouse/bsp_AiP650E.h b/source/bsp/nouse/bsp_AiP650E.h new file mode 100644 index 0000000..4376179 --- /dev/null +++ b/source/bsp/nouse/bsp_AiP650E.h @@ -0,0 +1,37 @@ +#ifndef _bsp_AiP650E_H_ +#define _bsp_AiP650E_H_ + +#include "msp_iicMx.h" + +typedef struct +{ + uint8_t downnow; //按键立即按下的标志 + uint8_t keynow; + + uint8_t key; + uint8_t up; //按键抬起标志 + uint8_t down; //按键按下标志 + uint8_t longk; //按键的时长 +}TS_key_out_; + +#define L0_LEDSEG1_SDA_ON() D_SEG_DIO1_ON(); +#define L0_LEDSEG1_SDA_OFF() D_SEG_DIO1_OFF(); + +#define L0_LEDSEG1_SCL_ON() D_SEG_CLK1_ON(); +#define L0_LEDSEG1_SCL_OFF() D_SEG_CLK1_OFF(); + +#define L0_LEDSEG2_SDA_ON() D_SEG_DIO2_ON(); +#define L0_LEDSEG2_SDA_OFF() D_SEG_DIO2_OFF(); + +#define L0_LEDSEG2_SCL_ON() D_SEG_CLK2_ON(); +#define L0_LEDSEG2_SCL_OFF() D_SEG_CLK2_OFF(); + +void L1_LEDSEG_init(void); + +void L0_LEDSEG1_SendData(unsigned char H,unsigned char L ); + +void L3_test_ledseg(u8 filter); + +#define D_cmd_filter_ledseg 0xf2 + +#endif /* _bsp_AiP650E_H_ */ diff --git a/source/bsp/nouse/bsp_lora.c b/source/bsp/nouse/bsp_lora.c new file mode 100644 index 0000000..c08e09b --- /dev/null +++ b/source/bsp/nouse/bsp_lora.c @@ -0,0 +1,818 @@ +#include "bsp_lora.h" +//#include "tpc_debug.h" +#include "tpc_lora.h" +//// +#include "c_lib.h" +#include "msp_uart1.h" +#include "msp_uart2.h" + +#include "debug_drv.h" +#include "msp_eeprom.h" + +#include "max30102.h" + +#include "MLX90615.h" + + +///[2023-02-07 00:40:43.110 T]68 00 0D 90 01 32 33 34 35 36 39 DB 16 +//// | 1 2 3 4 5 6 | +///[2023-02-07 00:40:43.172 R]68 00 07 20 00 27 16 +u8 Lora_mac[10][6]={ + {0x61 ,0x61 ,0x62 ,0x62 ,0x63 ,0x64 }, + {0x71 ,0x61 ,0x62 ,0x62 ,0x63 ,0x64 }, + {0x81 ,0x61 ,0x62 ,0x62 ,0x63 ,0x64 }, + {0x91 ,0x61 ,0x62 ,0x62 ,0x63 ,0x64 }, + {0xa1 ,0x61 ,0x62 ,0x62 ,0x63 ,0x64 } +}; +/******** +TS_uc2info_ code ts_ucinfo_lora[12]={ +0x00,"succses 成功", ///0 +0x01 ,"head tail error帧头帧尾非法",///0 +0x02 ," 帧长度非法",///0 +0x03 ," 帧方向异常",///0 +0x04 ," 非法命令",///0 +0x05 ," 校验和错误",///0 +0x06 ," 网内无设备",///0 +0x07 ,"MAC 地址错误",///0 +0x08 ," 数据内容错误",///0 +0x09 ," FLASH 写入错误",///0 +0x0A ," 存储溢出错误",///0 +0x0B ," 设备忙",///11 +}; +*********/ +TS_uc2info_ code ts_ucinfo_lora[12]={ +0x00 ,"R:ack success" ,///0 01 "success 成功", +0x01 ,"E:head tail " ,///1 02 "head tail error帧头帧尾非法", +0x02 ,"E:len" ,///2 03 " 帧长度非法", +0x03 ,"E:dir" ,///3 04 " 帧方向异常", +0x04 ,"E:cmd" ,///4 05 " 非法命令", +0x05 ,"E:ocr " ,///5 06 " 校验和错误", +0x06 ,"E:no device in net " ,///6 07 " 网内无设备", +0x07 ,"E:mac addr " ,///7 08 "MAC 地址错误", +0x08 ,"E:data " ,///8 09 " 数据内容错误", +0x09 ,"E:flash write " ,///9 10 " FLASH 写入错误", +0x0A ,"E:mem overflow " ,///10 11 " 存储溢出错误", +0x0B ,"R:busy" ///11 12 " 设备忙", +}; +#define D_lora_SUCCESS 0 +#define D_lora_FAIL 1 +#define D_lora_NONE 0xff + +TS_uc2info_ code ts_ucinfo_inet[5]={ +0x05 ,"R:inet none " ,///0 01 +0x00 ,"R:inet success " ,///1 02 0x01-设备入网成功, +0x01 ,"E:inet fail " ,///2 03 0x02-设备入网失败 +0x03 ,"E:out of net " ,///3 04 ,0x03-设备已离网 +0x04 ,"E:cmd" ///4 05 " 非法命令", +}; + +TS_uc2info_ code ts_ucinfo_sf[3]={ +0x00 ,"R:data up success " ,///0 01 +0x01 ,"E:data up fail" ,///1 02 0x01-设备入网成功, +0x02 ,"E:??" + +}; + +TS_Lora_lrd_ ts_lora_lrd= +{ + 0x68,////u8 head;/// 1、帧头: 帧起始标志,固定值为 0x68。 + 0x00,////U16 len;////帧头到帧尾的总字节长度。 + 0x27,////u8 dcmd; + ///u8 cmd:7; /// CMD: 命令字,指示不同的帧类型。 + ///u8 dir:1; ///高位 DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 + /////////////////////////////// + ////u8 buf[D_Lora_lrd_max]; + 0x0A, + 0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0x06 ,0x07 ,0x08 ,0x09 ,0x10, + 0x11 ,0x12 ,0x13 ,0x14 ,0x15 ,0x16 ,0x17 ,0x18 ,0x19 ,0x20, + 0x21 ,0x22 ,0x23 ,0x24 ,0x25 ,0x26 ,0x27 ,0x28 ,0x29 ,0x30, + 0x31, 0x32, + ///d2 68 00 27 85 0A 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 + ////21 22 23 24 25 26 27 28 29 30 31 32 B0 16 + + /////////////////////////////// + 0xb0,////u8 cs; //// 校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + 0x16,////u8 tail; //// 帧尾: 帧结束标志,固定值为 0x16 + + +}; +TS_Lora_lrd_ ts_lora_lrd32 = +{ + 0x68,////u8 head;/// 1、帧头: 帧起始标志,固定值为 0x68。 + 0x0027,////U16 len;////帧头到帧尾的总字节长度。 + 0x85,////u8 dcmd; + ///u8 cmd:7; /// CMD: 命令字,指示不同的帧类型。 + ///u8 dir:1; ///高位 DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 + /////////////////////////////// + ////u8 buf[D_Lora_lrd_max]; + 0x0A, + 0x01 ,0x02 ,0x03 ,0x04 ,0x05 ,0x06 ,0x07 ,0x08 ,0x09 ,0x10, + 0x11 ,0x12 ,0x13 ,0x14 ,0x15 ,0x16 ,0x17 ,0x18 ,0x19 ,0x20, + 0x21 ,0x22 ,0x23 ,0x24 ,0x25 ,0x26 ,0x27 ,0x28 ,0x29 ,0x30, + 0x31, 0x32, + ///d2 68 00 27 85 0A 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 + ////21 22 23 24 25 26 27 28 29 30 31 32 B0 16 + + /////////////////////////////// + 0xb0,////u8 cs; //// 校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + 0x16,////u8 tail; //// 帧尾: 帧结束标志,固定值为 0x16 + + +}; + + +void L2_lora_rec(void); +void L3_lora_set_d32(u8 *d); +void L3_lora_set_d8(u8 *d,u8 len); + +TS_task_lora_ ts_task_lora; +TS_para_ ts_para; +TS_Lora_param_ ts_lora_param; + +void L2_lora_init(void) +{ + D_lora_wakeup_ON(); + D_lora_reset(); + + ts_task_lora.ok = 0; + printf("\r\n read ts_para (%d) = ",(int)sizeof(ts_para)); + L0_Iap_Read_array(D_eeprom_para,(char*)&ts_para,sizeof(ts_para)); + if (ts_para.mac[0] == 0xff) + { + Lc_buf_copy_uc(ts_para.mac,Lora_mac[0],6); + ts_para.req = 0x01; + ts_para.netid = 0xAB; + ts_para.band = 0x09; + printf("\r\n reset ts_para to factory"); + } + L0_Iap_Program_array(D_eeprom_para,(char*)&ts_para,sizeof(ts_para)); +/// L1_uartD_uchexArray((char*)&ts_para, sizeof(ts_para)); + +} + +void L2_task_lora_register(void) +{ + L1_task_reg_clear(&ts_task_lora.task); + L3_task_s_go(ts_task_lora,D_task_init); + +} + +///step 1 init +///step 2 查询mac地址和eeprom是否一致 不一致使用eeprom中 +///step 3 查询netid +///step 4 查询bank +///step 5 入网 +///step 6 + + +#define D_task_lora_set 0x41 + +#define D_task_Lora_cmd_init 0x41 +#define D_task_Lora_cmd_mac 0x42 + +#define D_task_Lora_cmd_mac_ok 0x52 +#define D_task_Lora_cmd_netid 0x43 +#define D_task_Lora_cmd_netid_ok 0x53 +#define D_task_Lora_cmd_band 0x44 +#define D_task_Lora_cmd_band_ok 0x54 +#define D_task_Lora_cmd_innet 0x45 +#define D_task_Lora_cmd_innet_ok 0x55 + +#define D_task_Lora_cmd_32 0x46 +#define D_task_Lora_cmd_32_ok 0x56 + +///发送32个字节 +////d2 68 00 27 85 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 a5 16 + + +#define D_delay_lorat D_Tdelay_3s + + +////集中器网关必须使能白名单?? +////L2_task_lora_handle(&ts_task_lora); +void L2_task_lora_handle(TS_task_lora_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(): + printf("\r\nL2_task_lora_handle TTSS_Task_init"); + L2_lora_init(); + L2_task_Tdelay_go(D_Tdelay_2s,D_task_Lora_cmd_init); + + TTSS_Task_step(D_task_Lora_cmd_init): + L3_lora_set_mac(Lora_mac[0]);//// + ts_task_lora.ok = D_lora_NONE; + L2_task_Tdelay_go(D_delay_lorat,D_task_Lora_cmd_mac); + TTSS_Task_step(D_task_Lora_cmd_mac): + + printf("\r\n read ts_para (%d) = ",(int)sizeof(ts_para)); + L0_Iap_Read_array(D_eeprom_para,(char*)&ts_para,sizeof(ts_para)); + printf("\r\n---> lora Lora_cmd_mac "); + L3_lora_set_mac(ts_para.mac); + L2_task_go(D_task_Lora_cmd_mac_ok); + TTSS_Task_step(D_task_Lora_cmd_mac_ok): + if(D_lora_SUCCESS == ts_task_lora.ok) + { + ts_task_lora.ok = D_lora_NONE; + L2_task_go(D_task_Lora_cmd_netid); + } + /// 0x68 ,0x00 ,0x08 ,0x90 ,0x02 ,0xAB ,0x45 ,0x16 + TTSS_Task_step(D_task_Lora_cmd_netid): + printf("\r\n---> lora Lora_cmd_netid %X ",(int)ts_para.netid); + L3_lora_set_netid(ts_para.netid ); + L2_task_go(D_task_Lora_cmd_netid_ok); + TTSS_Task_step(D_task_Lora_cmd_netid_ok): + if(D_lora_SUCCESS == ts_task_lora.ok) + { + printf("D_lora_SUCCESS:cmd_netid"); + ts_task_lora.ok = D_lora_NONE; + L2_task_go(D_task_Lora_cmd_band); + } + TTSS_Task_step(D_task_Lora_cmd_band): + printf("\r\n---> lora Lora_cmd_band %X ",(int)ts_para.band); + L3_lora_set_band(ts_para.band); + /// 0x68 ,0x00 ,0x08 ,0x90 ,0x03 ,0x09 ,0xA4 ,0x16 + //68 00 08 90 03 09 A4 16 + L2_task_go(D_task_Lora_cmd_band_ok); + TTSS_Task_step(D_task_Lora_cmd_band_ok): + if(D_lora_SUCCESS == ts_task_lora.ok) + { + printf("D_lora_SUCCESS:Lora_cmd_band"); + ts_task_lora.ok = D_lora_NONE; + L2_task_go(D_task_Lora_cmd_innet); + } + TTSS_Task_step(D_task_Lora_cmd_innet): + /// 68 00 07 81 01 89 16 ///节点主动入网(band、NetID默认暂不保存, + printf("\r\n---> lora Lora_cmd_innet "); + L3_lora_set_netin(); + L1_OLED_ShowChar(0,0,'O',D_6X8);////表示没有入网成功 + L2_task_go(D_task_Lora_cmd_innet_ok); + TTSS_Task_step(D_task_Lora_cmd_innet_ok): + if(D_lora_NONE != ts_task_lora.ok) + { + if(D_lora_SUCCESS == ts_task_lora.ok) + { + L1_OLED_ShowChar(0,0,'Y',D_6X8);////表示 入网成功 + printf("D_lora_SUCCESS: innet_ok"); + L2_task_go(D_task_Lora_cmd_32); + }else + { + L2_task_go(D_task_Lora_cmd_innet); + } + ts_task_lora.ok = D_lora_NONE; + + }else + { + } + TTSS_Task_step(D_task_Lora_cmd_32): + + printf("\r\n D_task_Lora_cmd_32 %2X %c",(int)ts_lora_lrd32.buf[0],ts_lora_lrd32.buf[0]); + if(ts_lora_lrd32.buf[0] < ' ') + { + ts_lora_lrd32.buf[0] = ' '; + + }else if(ts_lora_lrd32.buf[0] > '~') + { + + ts_lora_lrd32.buf[0] = ' '; + }else + { + ts_lora_lrd32.buf[0] ++; + } + + + + L1_OLED_ShowChar(6,0,'s',D_6X8);///发送一个数据累加一个 + /// L3_lora_set_d32(ts_max30102.send); + + ts_lora_param.Oxygen_saturation = (int)ts_max30102.SPO2_out; + ts_lora_param.body_temperature = (int)ts_mx95.u16out_10o; + ts_lora_param.heart_rate = (int)ts_max30102.hr_out2; + ts_lora_param.sphygmus = (int)ts_max30102.hr_out; + + /// L3_lora_set_d8((char *)&ts_lora_param,8); + L3_lora_set_d10((char *)&ts_lora_param,10); + + ///L3_lora_set_d8(ts_max30102.send,8); + L2_task_go(D_task_Lora_cmd_32_ok); + TTSS_Task_step(D_task_Lora_cmd_32_ok): + if(D_lora_NONE != ts_task_lora.ok) + { + if(D_lora_SUCCESS == ts_task_lora.ok) + { + L1_OLED_ShowChar(0,0,'y',D_6X8);////表示 发送成功 + printf("D_lora_SUCCESS: cmd_32_ok"); + }else + { + L1_OLED_ShowChar(0,0,'O',D_6X8);////表示 + } + ts_task_lora.ok = D_lora_NONE; + L1_OLED_ShowChar(8,0,ts_lora_lrd32.buf[0],D_6X8);///发送一个数据累加一个 + L2_task_Tdelay_go(D_Tdelay_15s,D_task_Lora_cmd_32); + } + TTSS_Task_end(); + //////////////////////////////////////////////////////////// + L2_lora_rec(); + if(ts_key.val) + { + ts_key.val = 0; + printf("\r\n```\\_____ "); + L3_lora_set_d32(ts_max30102.send);////按下按键 发送波形数据 + L2_task_go(D_task_Lora_cmd_32_ok); + } + +} + +//// add +32字节数据 add为子机地址 +///d2 68 00 27 85 0A 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 B0 16 + +void L2_lora_rec(void) +{ + + if(1 == ts_Urec[D_UART2].ok) + { ts_Urec[D_UART2].ok = 0;////收到一帧数据 + printf("\r\n<--- lora ask: "); +/// sprintf(," %s ",ts_Urecbuf.r2); + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_uchexArray(ts_Urecbuf.r2, ts_Urec[D_UART2].num); + ts_task_lora.p = (TS_Lora_lrd_ *)ts_Urecbuf.r2; + //ts_task_lora.ok = ts_task_lora.p->buf[0]; + + + printf(" cmd:%2X=(%2X) ",(int)ts_task_lora.p->dcmd,(int)ts_task_lora.p->buf[0] ); + switch (ts_task_lora.p->dcmd) + {////68 00 07 02 02 0B 16 + ///buf 0 1 2 + case D_lora_cmd_ACK: + printf(" %s ", ts_ucinfo_lora[ts_task_lora.p->buf[0] ].pstr); + ts_task_lora.ok = ts_ucinfo_lora[ts_task_lora.p->buf[0] ].n; + break; + case D_lora_cmd_net_ack: + printf(" %s ", ts_ucinfo_inet[ts_task_lora.p->buf[0] ].pstr); + ts_task_lora.ok = ts_ucinfo_inet[ts_task_lora.p->buf[0] ].n; + break; + case D_lora_cmd_01_ack:///06 + printf(" %s ", ts_ucinfo_sf[ts_task_lora.p->buf[0] ].pstr); + ts_task_lora.ok = ts_ucinfo_sf[ts_task_lora.p->buf[0] ].n; + break; + default: + break; + } + } + + +} + + +////通过debug串口 透传协议 +u8 L3_tpc_lora(char *buf) +{//// + u16 num=0; + u8 d = 0; + TS_Lora_lrd_ *p; +////debug协议使用串口1 故而再次简单解析 要求第一个字符必须为Fx + if(0x68 == buf[0]) + { + p= (TS_Lora_lrd_ *)buf; + if(p->dcmd&0x80) + { + printf("\r\n user-->mod "); + }else + { + printf("\r\n user<<--mod "); + } + printf("D=%X ",(int)buf[5]); + printf(" len %d cmd %X REQ=%d(00=succes) ",p->len,(int)p->dcmd,(int)p->buf[0]); + L0_uartN_Arrayhex_withoutbuf(D_UART1,&buf[5], p->len-6-1); + ///L0_uartN_Arrayhex_withoutbuf(D_UART1,&ts_Urecbuf.r2[5], p->len-6);////(U8 *)&pd,错误的表达方式 pd就是地址 + ////return 1; + }else + { + printf("\r\n cmd error!!"); + } + return 0; +} + + +///0x68 0x00 0x08 1 0 0 1 0 0 0 0 REQ DATA CS 0x16 +/// 0 1 2 3 4 5 6 7 +////////// 01 mac6 +////68 00 07 91 01 99 16 +////0 1 2 3 (4) 5 6 +/// 0 1 2 3 ocr + +///填报mac时 01 mac0 mac1 mac2 mac3 mac4 mac5 +///填报dat时 addr d[0] d[1] d[2] d[3] d[4] d[5]........ + +void L2_lora_tianbao(char *buf,u16 len)///填报协议 把buf中的len长度 填入到 lora的结构体ts_lora_lrd中 +{ //需要把buf长度传进来 blen 参数还需要buf + int i; +/// u8 t; + vU16 ocr = 0; + char *p; + p = (char*)&ts_lora_lrd; + ts_lora_lrd.head = 0x68; + ts_lora_lrd.tail= 0x16; + ///ts_lora_lrd.len = ; + +/// buf[0] = ts_lora_lrd.req; + + ///<<<<<<<<<ocr) + { + case 0x11: //配置节点MAC地址是61 61 62 62 63 64 + + printf("11"); + D_lora_wakeup(); L1_uart2_Array(Lora_cmd_mac, 13); + printf(" lora send "); + L1_uartD_uchexArray(Lora_cmd_mac, 13); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x12: //查询MAC地址指令 + + printf("12"); + D_lora_wakeup(); L1_uart2_Array(Lora_cmd_mac_que, 7); + printf(" lora send2 "); + L1_uartD_uchexArray(Lora_cmd_mac_que, 7); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x14: //配置NetID=AB + + printf("14"); + D_lora_wakeup(); L1_uart2_Array(Lora_cmd_netid_AB, 8); + printf(" lora send4 "); + L1_uartD_uchexArray(Lora_cmd_netid_AB, 8); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x15: //查询到NetID=AB + + printf("15"); + D_lora_wakeup(); L1_uart2_Array(test5, 7); + printf(" lora send5 "); + L1_uartD_uchexArray(test5, 7); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x16: //配置band=09 + + printf("16"); + D_lora_wakeup(); L1_uart2_Array(Lora_cmd_band, 8); + printf(" lora send6 "); + L1_uartD_uchexArray(Lora_cmd_band, 8); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x17: //查询到band=09 + + printf("17"); + D_lora_wakeup(); L1_uart2_Array(test7, 7); + printf(" lora send7 "); + L1_uartD_uchexArray(test7, 7); + //1 2 3 4 5 6 7 8 9 10 11 12 13 + break; + case 0x18: //节点主动入网 + + printf("18"); + D_lora_wakeup(); L1_uart2_Array(Lora_cmd_innet, 7); + printf(" lora send8 "); + L1_uartD_uchexArray(Lora_cmd_innet, 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用户。1:用户->模组。 +/////////////////////////////// + u8 buf[D_Lora_lrd_max]; +/////////////////////////////// + u8 cs; //// 校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + u8 tail; //// 帧尾: 帧结束标志,固定值为 0x16 + u8 *pbuf; +/////////////////////////////// +}TS_Lora_lrd_; +extern TS_Lora_lrd_ ts_lora_lrd; + + +#define D_cmd_filter_lora 0xfE +extern void L2_lora_init(void); +extern void L3_lora_debug(u8 filter); +extern void lora_param_init(void); + +typedef struct +{ + TS_task task; + TS_Lora_lrd_ *p; + u8 ok; +}TS_task_lora_; +extern TS_task_lora_ ts_task_lora; + +extern u8 Lora_mac[10][6]; +/***** +节点对用户的交互接口为串口协议帧形式, +(串口波特率 115200,无校验,8 位数据位,1 位停止位), +大端模式。帧内字段以 HEX 形式表示,以下为整体帧结构: + +1、帧头: 帧起始标志,固定值为 0x68。 +2、长度: 帧头到帧尾的总字节长度。 +3、DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 +4、CMD: 命令字,指示不同的帧类型。 +5、数据: 可变长的数据部分,不同命令的数据字段内容不同,参照各条命令中的定义。 +6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 +7、帧尾: 帧结束标志,固定值为 0x16。 + +1、配置项目字段:0x01-MAC 地址,0x02-NetID,0x03-通信频段 + +数据 = 配置项目(1Byte)+ 内容(1-200byte) + +0x68 0x00 0x08 1 0 0 1 0 0 0 0 REQ DATA + +char buf[12]={ 0x68 ,0x00 ,0x07 ,0x91 ,0x01 ,0x99 ,0x16}; +TS_Lora_lrd_ *p; + +p= (TS_Lora_lrd_ *)buf; +p->len =9; + + +项目中的重要定义:需要在设计文档中详述,在程序中明确 +///>>>>>>>>>>>>>>part 1: 网络拓扑 + +///-------P1--------------------------------------P2---------------------------P3-----------协议段 +///PC--usb2ttl_uart--DM集中器(CC)/网关.`..`..470M-510M`.`..`.`-WB 节点1/NODE1---MCU1(用户) +/// .`..`..470M-510M`.`..`.`-WB 节点2/NODE2---MCU2(用户) +/// .`..`..470M-510M`.`..`.`-WB 节点3/NODE3---MCU3(用户) +/// .`..`..470M-510M`.`..`.`-WB 节点4/NODE4---MCU4(用户) +/// .`..`..470M-510M`.`..`.`-WB 节点5/NODE5---MCU5(用户) + +///>>>>>>>>>>>>>>part 2: 硬件明细 + + +////LoRa 自组网 荧火系列节点 L-LRNWB25-75TN4 -----------------WB 节点 panel point; hybrid; packing; node;---NODE +///LoRa 自组网 荧火系列集中器\对应型号: L-LRNDM34-77TN4-------DM集中器 concentrator -CC + +///>>>>>>>>>>>>>>part 3: 文档(规格书)明细 + +P1 协议参考文档 DS_LoRa自组网_荧火系列集中器_接口协议_V1.0.220414_Release +P3 协议参考文档 DS_LoRa自组网_荧火系列节点_接口协议_V1.0.220414_Release + +///>>>>>>>>>>>>>>part 4: 协议明细 + +P3协议:P3 协议参考文档 DS_LoRa自组网_荧火系列节点_接口协议_V1.0.220414_Release + +0:模组->用户。1:用户->模组。 对于节点而言 用户指的是节点MCU 也就是本文字所在的这个程序的载体 +0:模组-用户>MCU。1:用户MCU->模组。 + +集中器下发到节点--针对P3就是 节点到MCU--------《很关键,容易迷糊和误解!!!》 + + +**********/ + +//>>>>>>>>>>>>>>>>>P3协议>命令和配置类 + +#define D_lora_lrd_mod2userMcu 0////0:模组->用户。1:用户->模组。 +#define D_lora_lrd_userMcu2mod 1 +#define D_lora_lrd_mod2userMcu_B (D_lora_lrd_mod2userMcu<<7) +#define D_lora_lrd_userMcu2mod_B (D_lora_lrd_userMcu2mod<<7) +///1.1.1 信息查询/配置类 + +#define D_lora_REQ_query_OK 0 +#define D_lora_REQ_query_MAC 0x01 +#define D_lora_REQ_query_NetID 0x02 +#define D_lora_REQ_query_BAND 0x03///1、查询内容字段:0x01-MAC 地址,0x02-NetID,0x03-通信频段 + +#define D_lora_cmd_ACK (D_lora_lrd_mod2userMcu_B|B0010_0000)////20 +#define D_lora_cmd_config (D_lora_lrd_userMcu2mod_B|B0001_0000)////90 1、配置项目字段:0x01-MAC 地址,0x02-NetID,0x03-通信频段 +#define D_lora_cmd_query (D_lora_lrd_userMcu2mod_B|B0001_0001)////91 1、查询内容字段:0x01-MAC 地址,0x02-NetID,0x03-通信频段 + +////>>>>>>>>>>>>>>>>>P3协议>数据类 +////数据下发 +////1、用户数据:该字段内容为集中器下发至节点的用户数据,例如控制指令 +////2、用户收到该帧后需回复“数据下发应答帧” +#define D_lora_cmd_dat_ack (D_lora_lrd_mod2userMcu_B|B0000_0100)////04 1、用户数据:该字段内容会上报至集中器,例如传感器数据。 +#define D_lora_cmd_data (D_lora_lrd_userMcu2mod_B|B0000_0011)////93 + +////>>>>>>>>>>>>>>>>>P3协议>网络类 + +///1.1.3 网络/数据类 +///1、控制字内容:0x01-主动入网 +///2、设备主动入网结束后,模块返回“入网信息帧”指示入网结果。 + +//// +#define D_lora_cmd_net_ack (D_lora_lrd_mod2userMcu_B|B0000_0010)////02 +#define D_lora_cmd_net (D_lora_lrd_userMcu2mod_B|B0000_0001)////81 1、用户数据:该字段内容会上报至集中器,例如传感器数据。 + + +#define D_lora_cmd_net_ctrl 0x01/// 1、控制字内容:0x01-主动入网 + +#define D_lora_cmd_01_ack (D_lora_lrd_mod2userMcu_B|B0000_0110)////06 主动上报应答 +#define D_lora_cmd_data_zudong (D_lora_lrd_userMcu2mod_B|B0000_0101)////85 主动数据上报 + +#define D_eeprom_para 0 + + +#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(100);D_lora_reset_ON();Lc_delay_ms(1); +#define D_lora_wakeup_ON() D_P14_ON() +#define D_lora_wakeup_OFF() D_P14_OFF() +#define D_lora_wakeup(); D_stdIO_P1(BITN4); D_lora_wakeup_ON();Lc_delay_ms(1);D_lora_wakeup_OFF();Lc_delay_ms(1); + + + +extern u8 L3_tpc_lora(char *buf); +extern void L2_task_lora_register(void); +extern void L2_task_lora_handle(TS_task_lora_ *s); +extern void L2_lora_tianbao(char *buf,u16 len); +extern void L2_lora_send(void); +extern void L3_lora_set_mac(u8 *mac); + +extern void L3_lora_set_netid(u8 netid); +void L3_lora_set_d10(u8 *d,u8 len); +extern void L3_lora_set_band(u8 band); +void L3_lora_set_netin(void); +u8 L3_tpc_FEdebug(void); + + +void L2_lora_send(void); +#endif \ No newline at end of file diff --git a/source/bsp/nouse/bsp_lora_jx.c b/source/bsp/nouse/bsp_lora_jx.c new file mode 100644 index 0000000..36b8373 --- /dev/null +++ b/source/bsp/nouse/bsp_lora_jx.c @@ -0,0 +1,124 @@ +#include "tpc_lora.h" +#include "c_lib.h" +#include "debug_drv.h" +#include "bsp_lora_jx.h" +#include "msp_UART2.h" +#include "bsp_lora.h" +#include "max30102.h" + +///#include "app_config.h" + +ts_s2b_lrdlora_ ts_s2b_lrdlora_send;////协议处理变量 + +Lora_param lora_param; + +vU8 send[12]; +vU8 Oxygen_saturation, body_temperature, heart_rate,sphygmus; + + +void L3_lora_analysis_init(void) //给ts_lrdlora_send赋值初始化 +{ + ts_s2b_lrdlora_send.ok = 0; + ts_s2b_lrdlora_send.debugok = 0; + ts_s2b_lrdlora_send.head = 0; + ts_s2b_lrdlora_send.len = 0; + ts_s2b_lrdlora_send.num = 0; + ts_s2b_lrdlora_send.sp = (U8 *)&ts_lrdlora_send; + ts_s2b_lrdlora_send.tp = &ts_lrdlora_send; +} + +//需要传入的数据准备好 ,作为此函数的输入参数 +void L3_lora_send_pkg(TS_pp_lrdlora_ *p, U8 *buf,U8 blen) +{ //需要把buf长度传进来 blen 参数还需要buf + int i; + vU16 ocr = 0; + p->filter = 0x68; + p->len = 0x000E; + p->CMD = 0x05; + p->DIR = 0x01; + for(i=0;ibuf[i] = *(buf+i); + } + + ocr = Fun_SC_Check(&p->len,11); + p->ocr = (vU8)ocr; + p->filtert = 0x16; + p->buf[blen] = p->ocr; + p->buf[blen+1] = p->filtert; +} +////u16out_10a + +void L3_lora_send(void) +{ + D_lora_wakeup(); + lora_param.Oxygen_saturation = (int)ts_max30102.SPO2_out; + lora_param.body_temperature = (int)ts_mx95.u16out_10o; + lora_param.heart_rate = (int)ts_max30102.hr_out2; + lora_param.sphygmus = (int)ts_max30102.hr_out; + L3_lora_send_pkg(&ts_lrdlora_send,&lora_param,8); + L1_uart2_Array((U8 *)&ts_lrdlora_send, ts_lrdlora_send.len); + L1_uartD_uchexArray((U8 *)&ts_lrdlora_send, ts_lrdlora_send.len); +} +/*************/ + + +U8 Fun_SC_Check(U8 *p1, unsigned short int len)//累加和校验 +{ + U8 sum = 0; + for(;len > 0; len--) + { + sum += *p1++; + } + + return sum; +} + + + + +//当收到 68 00 0A 03 66 77 77 66 C7 16 指令后将传感器参数发送出去 + +/*(d->sp[0] == 0x68)&&(d->sp[1] == 0x00)&&(d->sp[2] == 0x0A)&&(d->sp[3] == 0x03)&&(d->sp[4] == 0x66) + &&(d->sp[5] == 0x77)&&(d->sp[6] == 0x77)&&(d->sp[7] == 0x66)&&(d->sp[8] == 0x48)&&(d->sp[9] == 0x16)*/ + +//通过变量ts_lrdlora_send + + +/* +void L3_lora_analysis(ts_s2b_lrdlora_ *p, ts_s2b_lrdlora_ *d, U8 a, U8 b, U8 h) +{ + if(d->sp[0] == 0x68) + { + if((d->[1] == 0x00)&&(d->[2] == 0x0A)) + { + } + } + if() + { + U8 num; + vU16 ocr = 0; + p->sp[0] = 0x68; + p->sp[1] = 0x00; + p->sp[2] = 0x09; + p->sp[3] = 0x84; + p->sp[4] = a; + p->sp[5] = b; + p->sp[6] = h; + for(num = 1;num <= 6;num++) + { + ocr = ocr + p->sp[num]; + } + ocr = D_us2uc_L(ocr); + + p->tp->ocr = ocr; + p->tp->filtert = 0x16; + ts_s2b_lrdlora_send.ok = 1; + ts_s2b_lrdlora_send.len = 9; + } + else + { + L3_lora_analysis_init(); + } +} +*/ diff --git a/source/bsp/nouse/bsp_pressure.c b/source/bsp/nouse/bsp_pressure.c new file mode 100644 index 0000000..ed4d5a0 --- /dev/null +++ b/source/bsp/nouse/bsp_pressure.c @@ -0,0 +1,551 @@ +#include "bsp_pressure.h" +//#include "tpc_debug.h" +////#include "tpc_x.h" +#include "msp_uart1.h" +#include "msp_uart2.h" +#include "msp_uart4.h" +#include +#include "debug_drv.h" + +#include "TTSS_task.h" + +TS_task_sw_ ts_task_sw; + +void L2_pressure_init(void) +{ + D_stdIO_P5(BITN2);//485RE + D_HighI_P3(BITN2);//led1 +/// D_485_TX(); + D_SW_IO_INIT(); + + +} + +U8 Fun_SC_Check(U8 *p1, unsigned short int len)//累加和校验 +{ + U8 sum = 0; + for(;len > 0; len--) + { + sum += *p1++; + } + + return sum; +} + + +//pressure数据初始化 +void l2_task_pressure_init() +{ + L1_task_init(&ts_task_sw.task); + L3_task_s_go(ts_task_sw,D_task_init); +} +////二维数组的第一个参数是行,第二个参数是列。 +///二维数组定义的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2], +////其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。 + + + +void L3_hang_judge(u8 hang) +{ + printf(" H %d ",(int)hang); + switch (hang) + { + case 0x00: { + L0_adc_S0_OFF(); + L0_adc_S1_OFF(); + L0_adc_S2_OFF(); + L0_adc_S3_OFF(); + break; + } + case 0x01: { + L0_adc_S0_ON(); + L0_adc_S1_OFF(); + L0_adc_S2_OFF(); + L0_adc_S3_OFF(); + break; + } + case 0x02: { + L0_adc_S0_OFF(); + L0_adc_S1_ON(); + L0_adc_S2_OFF(); + L0_adc_S3_OFF(); + break; + } + case 0x03: { + L0_adc_S0_ON(); + L0_adc_S1_ON(); + L0_adc_S2_OFF(); + L0_adc_S3_OFF(); + break; + } + case 0x04: { + L0_adc_S0_OFF(); + L0_adc_S1_OFF(); + L0_adc_S2_ON(); + L0_adc_S3_OFF(); + break; + } + case 0x05: { + L0_adc_S0_ON(); + L0_adc_S1_OFF(); + L0_adc_S2_ON(); + L0_adc_S3_OFF(); + break; + } + case 0x06: { + L0_adc_S0_OFF(); + L0_adc_S1_ON(); + L0_adc_S2_ON(); + L0_adc_S3_OFF(); + break; + } + case 0x07: { + L0_adc_S0_ON(); + L0_adc_S1_ON(); + L0_adc_S2_ON(); + L0_adc_S3_OFF(); + break; + } + case 0x08: { + L0_adc_S0_OFF(); + L0_adc_S1_OFF(); + L0_adc_S2_OFF(); + L0_adc_S3_ON(); + break; + } + case 0x09: { + L0_adc_S0_ON(); + L0_adc_S1_OFF(); + L0_adc_S2_OFF(); + L0_adc_S3_ON(); + break; + } + case 0x0A: { + L0_adc_S0_OFF(); + L0_adc_S1_ON(); + L0_adc_S2_OFF(); + L0_adc_S3_ON(); + break; + } + case 0x0B: { + L0_adc_S0_ON(); + L0_adc_S1_ON(); + L0_adc_S2_OFF(); + L0_adc_S3_ON(); + break; + } + case 0x0C: { + L0_adc_S0_OFF(); + L0_adc_S1_OFF(); + L0_adc_S2_ON(); + L0_adc_S3_ON(); + break; + } + case 0x0D: { + L0_adc_S0_ON(); + L0_adc_S1_OFF(); + L0_adc_S2_ON(); + L0_adc_S3_ON(); + break; + } + case 0x0E: { + L0_adc_S0_OFF(); + L0_adc_S1_ON(); + L0_adc_S2_ON(); + L0_adc_S3_ON(); + break; + } + case 0x0F: { + L0_adc_S0_ON(); + L0_adc_S1_ON(); + L0_adc_S2_ON(); + L0_adc_S3_ON(); + break; + } + default: + break; + + } + /// Lc_delay_us(2); + /* + if((hang & 0x01) == 0x01) + { + L0_adc_S0_ON(); + } + else + { + L0_adc_S0_OFF(); + } + if((hang & 0x02) == 0x02) + { + L0_adc_S1_ON(); + } + else + { + L0_adc_S1_OFF(); + } + if((hang & 0x04) == 0x04) + { + L0_adc_S2_ON(); + } + else + { + L0_adc_S2_OFF(); + } + if((hang & 0x08) == 0x08) + { + L0_adc_S3_ON(); + } + else + { + L0_adc_S3_OFF(); + } +*/ +} + + +void L3_lie_judge(u8 lie) +{ + printf(" L %d ",(int)lie); + switch (lie) + { + case 0x00: { + D_GND_S0_OFF(); + D_GND_S1_OFF(); + D_GND_S2_OFF(); + D_GND_S3_OFF(); + break; + } + case 0x01: { + D_GND_S0_ON(); + D_GND_S1_OFF(); + D_GND_S2_OFF(); + D_GND_S3_OFF(); + break; + } + case 0x02: { + D_GND_S0_OFF(); + D_GND_S1_ON(); + D_GND_S2_OFF(); + D_GND_S3_OFF(); + break; + } + case 0x03: { + D_GND_S0_ON(); + D_GND_S1_ON(); + D_GND_S2_OFF(); + D_GND_S3_OFF(); + break; + } + case 0x04: { + D_GND_S0_OFF(); + D_GND_S1_OFF(); + D_GND_S2_ON(); + D_GND_S3_OFF(); + break; + } + case 0x05: { + D_GND_S0_ON(); + D_GND_S1_OFF(); + D_GND_S2_ON(); + D_GND_S3_OFF(); + break; + } + case 0x06: { + D_GND_S0_OFF(); + D_GND_S1_ON(); + D_GND_S2_ON(); + D_GND_S3_OFF(); + break; + } + case 0x07: { + D_GND_S0_ON(); + D_GND_S1_ON(); + D_GND_S2_ON(); + D_GND_S3_OFF(); + break; + } + case 0x08: { + D_GND_S0_OFF(); + D_GND_S1_OFF(); + D_GND_S2_OFF(); + D_GND_S3_ON(); + break; + } + case 0x09: { + D_GND_S0_ON(); + D_GND_S1_OFF(); + D_GND_S2_OFF(); + D_GND_S3_ON(); + break; + } + case 0x0A: { + D_GND_S0_OFF(); + D_GND_S1_ON(); + D_GND_S2_OFF(); + D_GND_S3_ON(); + break; + } + case 0x0B: { + D_GND_S0_ON(); + D_GND_S1_ON(); + D_GND_S2_OFF(); + D_GND_S3_ON(); + break; + } + case 0x0C: { + D_GND_S0_OFF(); + D_GND_S1_OFF(); + D_GND_S2_ON(); + D_GND_S3_ON(); + break; + } + case 0x0D: { + D_GND_S0_ON(); + D_GND_S1_OFF(); + D_GND_S2_ON(); + D_GND_S3_ON(); + break; + } + case 0x0E: { + D_GND_S0_OFF(); + D_GND_S1_ON(); + D_GND_S2_ON(); + D_GND_S3_ON(); + + break; + } + case 0x0F: { + D_GND_S0_ON(); + D_GND_S1_ON(); + D_GND_S2_ON(); + D_GND_S3_ON(); + break; + } + default: + break; + + } + /// Lc_delay_us(2); +/* + if((lie & 0x01) == 0x01) + { + D_GND_S0_ON(); + } + else + { + D_GND_S0_OFF(); + } + if((lie & 0x02) == 0x02) + { + D_GND_S1_ON(); + } + else + { + D_GND_S1_OFF(); + } + if((lie & 0x04) == 0x04) + { + D_GND_S2_ON(); + } + else + { + D_GND_S2_OFF(); + } + if((lie & 0x08) == 0x08) + { + D_GND_S3_ON(); + } + else + { + L0_adc_S3_OFF(); + } +*/ +} + + + +#define D_3232_left() D_CD3_ON();D_CD2_OFF(); ts_task_sw.ch = D_DW_left; +#define D_3232_right() D_CD2_ON();D_CD3_OFF(); ts_task_sw.ch = D_DW_right; +#define D_3232_odd() D_CD4_OFF(); D_CD1_ON();///D_CD2_ON();D_CD3_OFF(); +#define D_3232_even() D_CD1_OFF(); D_CD4_ON(); + +//// 和电路的排列息息相关 +void L4_SW_set3232(u8 hang,u8 lie) +{ + if((hang%2) == 0) + { + D_3232_even(); + /// 0->0 2->1 4->2 6->3 + hang /= 2; + L3_hang_judge(hang); + }else + { + D_3232_odd(); ///偶数 + /// 1->15 3->14 5->13 + /// 0 1 2 + hang --; + hang /= 2;/// (hang - 1)/2; + L3_hang_judge(15 - hang); + } + + + if(lie < 16)//左 + { + /// 0->15 1->14 2->13 ...15->0 + D_3232_left(); + L3_lie_judge(15 - lie); + }else + {/// 16-----31 + /// 16->15 17->14 18->13 ... 31->0 + D_3232_right(); + L3_lie_judge(31-lie); + } +} + + +//点的切换 + + +#if 0 + +ch =0 +set +adc +ch =1 +set +adc + + + + +#endif +/// 硬件先切换 行列切换---之后通道 然后当前adc采样, +//// 行切换 hang++ +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// +//// 列切换.... + +//// 行切换 hang++ +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// 列切换 lie++ +//// 通道切换 ch++ +//// adc +//// 通道切换 ch++ +//// adc +//// +#if 0 +#define D_SW_hang_max 16 +#define D_SW_lie_max 16 +#define D_SW_hang_max (6-1) +#define D_SW_lie_max (6-1) + +#else + +#define D_SW_hang_max (2-1) +#define D_SW_lie_max (2-1) + +#endif + +#define D_SW_all_hang_max 32 +#define D_SW_all_lie_max 32 + + +#define D_SW_ch_max (2-1) + +void L3_task_sw(TS_task_sw_ *s) +{ + + TTSS_Task_init(): + printf("\r\n task_sw "); + s->H = 0; + s->L = 0; + ts_task_adc.chok1 = 0; + ts_task_adc.chok2 = 0; + L2_pressure_init(); + L2_task_go(D_TASK_SW_change); + TTSS_Task_step(D_TASK_SW_change): + L4_SW_set3232(s->H,s->L); + printf("\r\n %d %d ",(int)s->H,(int)s->L); + + ts_task_adc.change = 1; + ts_task_adc.ch_now = s->ch; + L2_task_go(D_TASK_SW_wait_adc); + /// L2_task_Cdelay_go(1000,D_TASK_SW_ch);////100000--2s + TTSS_Task_step(D_TASK_SW_wait_adc): + if(ts_task_adc.chok1) + { + ts_task_adc.chok1 = 0; + /// printf("\r\n %d %d %d %d ",(int)s->ch,(int)s->H,(int)s->L,(int)ts_task_adc.chok1); + //// L2_task_go(D_TASK_SW_ch_ok); + L2_task_Cdelay_go(10000,D_TASK_SW_lie);////100000--2s + } + TTSS_Task_step((D_TASK_SW_lie)): + if(s->L >= D_SW_all_lie_max) + { + s->L = 0; + if(s->H >= D_SW_all_hang_max) + { + s->H = 0; + printf("\r\n next circle"); + }else + { + s->H ++; + } + + }else + { + s->L ++; + } + + L2_task_go(D_TASK_SW_change); + + TTSS_Task_end(); + + +} + + +void L3_pressure_debug(u8 filter) +{ + + //u8 D_pressure_hang1 = 0x00; + //u8 D_pressure_hang2 = 0x0f; + if( filter == ts_debug_rec.filter) + { + if(0x33 == ts_debug_rec.ocr ) + { + printf("\r\nhang : %d lie: %d ",(int)ts_debug_rec.R1,(int)ts_debug_rec.R2); + L4_SW_set3232(ts_debug_rec.R1,ts_debug_rec.R2); + }else + { + printf("\r\n 44444 "); + } + + } + +} + diff --git a/source/bsp/nouse/bsp_pressure.h b/source/bsp/nouse/bsp_pressure.h new file mode 100644 index 0000000..14d42d1 --- /dev/null +++ b/source/bsp/nouse/bsp_pressure.h @@ -0,0 +1,122 @@ +#ifndef BSP_pressure_H +#define BSP_pressure_H + +#include "bsp_config.h" +#include "msp_uart1.h" +#include "msp_adc.h" +#include "TTSS_task.h" + +//引脚初始化 +#define D_CD1_init() D_stdIO_P4(BITN5) +#define D_CD2_init() D_stdIO_P2(BITN3) +#define D_CD3_init() D_stdIO_P4(BITN3) +#define D_CD4_init() D_stdIO_P5(BITN3) +#define L0_adc_S0_init() D_stdIO_P2(BITN2) +#define L0_adc_S1_init() D_stdIO_P2(BITN1) +#define L0_adc_S2_init() D_stdIO_P2(BITN0) +#define L0_adc_S3_init() D_stdIO_P4(BITN4) +#define D_GND_S0_init() D_stdIO_P2(BITN7) +#define D_GND_S1_init() D_stdIO_P2(BITN6) +#define D_GND_S2_init() D_stdIO_P2(BITN5) +#define D_GND_S3_init() D_stdIO_P2(BITN4) + + +#define D_SW_IO_INIT(); D_CD1_init();\ + D_CD2_init();\ + D_CD3_init();\ + D_CD4_init();\ + L0_adc_S0_init();\ + L0_adc_S1_init();\ + L0_adc_S2_init();\ + L0_adc_S3_init();\ + D_GND_S0_init();\ + D_GND_S1_init();\ + D_GND_S2_init();\ + D_GND_S3_init();\ + D_CD1_ON();\ + D_CD2_ON();\ + D_CD3_ON();\ + D_CD4_ON(); +///左列 对应的是ADC1 右列 对应的是ADC2 + + +//奇数行 U1 +#define D_CD1_ON() D_P45_ON() +#define D_CD1_OFF() D_P45_OFF() + +//左列U2 +#define D_CD2_ON() D_P23_ON() +#define D_CD2_OFF() D_P23_OFF() + +//右列U3 +#define D_CD3_ON() D_P43_ON() +#define D_CD3_OFF() D_P43_OFF() + +//偶数行 +#define D_CD4_ON() D_P53_ON() +#define D_CD4_OFF() D_P53_OFF() + +//ADC S0 +#define L0_adc_S0_ON() D_P22_ON() +#define L0_adc_S0_OFF() D_P22_OFF() +//ADC S1 +#define L0_adc_S1_ON() D_P21_ON() +#define L0_adc_S1_OFF() D_P21_OFF() +//ADC S2 +#define L0_adc_S2_ON() D_P20_ON() +#define L0_adc_S2_OFF() D_P20_OFF() +//ADC S3 +#define L0_adc_S3_ON() D_P44_ON() +#define L0_adc_S3_OFF() D_P44_OFF() +//GND S0 +#define D_GND_S0_ON() D_P27_ON() +#define D_GND_S0_OFF() D_P27_OFF() +//GND S1 +#define D_GND_S1_ON() D_P26_ON() +#define D_GND_S1_OFF() D_P26_OFF() +//GND S2 +#define D_GND_S2_ON() D_P25_ON() +#define D_GND_S2_OFF() D_P25_OFF() +//GND S3 +#define D_GND_S3_ON() D_P24_ON() +#define D_GND_S3_OFF() D_P24_OFF() + + +#define D_cmd_filter_adc 0xfa//设备 +#define L0_adc_S1 0x01; +#define L0_adc_S2 0x02 +#define L0_adc_S3 0x03 +//#define D_lie_left 0 +//#define D_lie_right 1 +#define D_DW_left 0 +#define D_DW_right 1 + + + +#define D_TASK_SW_hang 0x50 +#define D_TASK_SW_lie 0x51 +#define D_TASK_SW_ch 0x52 +#define D_TASK_SW_wait_adc 0x53 +#define D_TASK_SW_change 0x54 +#define D_TASK_SW_ch_ok 0x55 + + +typedef struct +{ + TS_task task; + vU8 ch; + vU8 H; ///全局变量行 + vU8 L; ///全局变量列 +}TS_task_sw_; + +extern TS_task_sw_ ts_task_sw; + +extern void L2_pressure_init(void); +extern void L3_pressure_debug(u8 filter); + +U8 Fun_SC_Check(U8 *p1, unsigned short int len); + +extern void l2_task_pressure_init(); +extern void L3_task_sw(TS_task_sw_ *s); + +#endif diff --git a/source/bsp/nouse/bsp_sca720.c b/source/bsp/nouse/bsp_sca720.c new file mode 100644 index 0000000..4f5cbc8 --- /dev/null +++ b/source/bsp/nouse/bsp_sca720.c @@ -0,0 +1,911 @@ +#include "bsp_sca720.h" +#include "c_lib.h" +#include "debug_drv.h" + +#include "TTSS_task.h" +///u8 SC7A20_Msg = 8; + u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80}; +/// /// 0 1 2 3 4 5 6 7 8 9 + +TS_sca720_ ts_gs7= +{ + ///u8 reg[33];//0x1e +0x05,///00 #define D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +0x00,///01 #define D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +0x2f,///02 #define D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +0x04,///03 #define D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +0x80,///04 #define D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +0x08,///05 #define D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +0x00,///06 #define D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +0x02,///07 #define D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +0x00,///08 #define D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +0x00,///09 #define D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +0x00,///10 #define D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +0x00,///11 #define D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +0x00,///12 #define D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +0x00,///13 #define D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +0x00,///14 #define D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +0x00,///15 #define D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +0x00,///16 #define D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +0x00,///17 #define D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +0x00,///18 #define D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +0x00,///19 #define D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +0x00,///20 #define D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +0x00,///21 #define D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +0x00,///22 #define D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +0x00,///23 #define D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +0x00,///24 #define D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +0x00,///25 #define D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +0x15,///26 #define D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +0x00,///27 #define D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +0x00,///28 #define D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +0x05,///29 #define D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +0x01,///30 #define D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +0x00,///31 #define D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +0x00,///32 #define D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +0x00,///33 #define D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + +}; + +#define D_reg(x) ts_gs7.reg[x-D_0x1e] +#define L0_set_reg(x) Sensor_Write_Byte(x,D_reg(x)) + + + + +static INT8U g_level; + + +static INT8U G_sensor_status=0; + +///#define BITN_1(X,BITNx) (X)|= (BITNx) +///#define BITN_0(X,BITNx) (X)&=~(BITNx) + +#define D_SC7A20_ODR_Powerdown 0 ///电源关断模式 +#define D_SC7A20_ODR_10HZ 0x20///正常/低功耗10HZ +#define D_SC7A20_LPEN BITN3 +#define D_SC7A20_Zen BITN2 +#define D_SC7A20_Yen BITN1 +#define D_SC7A20_Xen BITN0 + +#define D_D_SC7A20_LowPower 1 +#define D_D_SC7A20_NormalPower 0 + +/// + +void L1_SC7A20_lowpower(vtype normallowpoer) +{ + D_reg(D_SC7A20_CTRL_REG1) = 0; + if(D_D_SC7A20_LowPower == normallowpoer) + { + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ|D_SC7A20_LPEN);///1,低功耗模式 + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能 + }else + { + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_ODR_10HZ);/// 正常模式//odr 10Hz + BITN_1(D_reg(D_SC7A20_CTRL_REG1),D_SC7A20_Xen|D_SC7A20_Yen|D_SC7A20_Zen);///xyz使能 + + } + +} + + + //INT1_CFG 30H +#define D_INT1_AOI BITN7 +#define D_INT1_6D BITN6 +#define D_INT1_ZHIE_ZUPE BITN5 +#define D_INT1_ZLIE_ZDOWNE BITN4 +#define D_INT1_YHIE_YUPE BITN3 +#define D_INT1_YLIE_YDOWNE BITN2 +#define D_INT1_XHIE_XUPE BITN1 +#define D_INT1_XLIE_XDOWNE BITN0 + +/************ + +12.2 控制寄存器 2 (21h) +B7 B6 B5 B4 B3 B2 B1 B0 +HPM1 HPM0 HPCF2 HPCF1 FDS HPCLICK HPIS2 HPIS1 +HPM1-HPM0 高通模式选择。默认值:00 +参考“高通模式配置” +HPCF2 -HPCF1 高通截止频率选择 +FDS 数据滤波选择。默认值:0 +(0:跳过内部滤波; 1:内部滤波以后的数据输出到数据寄存器或 FIFO +HPCLICK CLICK 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +HPIS2 中断 2 AOI 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +HPIS1 中断 1 AOI 功能高通滤波使能。 +(0:滤波禁止; 1:滤波使能) +***********/ + +#define HPCLICK BITN2 + +#define HPIS2 BITN1 +#define HPIS1 BITN0 + +/*********** +12.4 控制寄存器 4(23h) +B7 B6 B5 B4 B3 B2 B1 B0 +BDU BLE FS1 FS0 HR ST1 ST0 SIM +BDU 块数据更新。默认值:0 +(0:连续更新;1:输出数据寄存器不更新直到 MSB 和 LSB 被读取) +BLE 大端/小端数据选择。默认值:0 +(0:低字节数据在低地址;1:高字节数据在低地址) +FS1-FS0 全量程选择。默认值:00 +(00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G) +HR 高精度输出模式选择。默认值:0 +(0: 高精度禁止; 1:高精度使能) +ST1-ST0 自测试使能。默认值:00 +(00: 自测试禁止;其他: 参考“自测试模式配置” ) +SIM SPI 串行接口模式配置。默认值:0 +(0:4 线接口; 1:3 线接口) + +#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 + + + +12.5 控制寄存器 5(24h) +B7 B6 B5 B4 B3 B2 B1 B0 +BOOT FIFO_EN -- -- LIR_INT1 D4D_INT1 LIR_INT2 D4D_INT2 + +BOOT 重载修调值。默认值:0 +(0:正常模式; 1:重载修调值) +FIFO_EN FIFO 使能。默认值:0 +(0:FIFO 禁止; 1: FIFO 使能) +LIR_INT1 锁存中断 1 配置寄存器上指定的中断响应。 +通过读中断 1 配置寄存器可以清除相应的中断锁存信号。默认值:0 +(0: 不锁存中断信号; 1:锁存中断信号) +D4D_INT1 4D 使能: 在 INT1 管脚上使能 4D 检测,同时要把中断 1 配置寄存器中的 6D 为置 1。 +LIR_INT2 锁存中断 2 配置寄存器上指定的中断响应。 +通过读中断 2 配置寄存器可以清除相应的中断锁存信号。默认值:0 +(0: 不锁存中断信号; 1:锁存中断信号) +D4D_INT2 4 D 使能: 在 INT2 管脚上使能 4D 检测,同时要把中断 2 配置寄存器中的 6D 为置 1。 +***********/ +#define LIR_INT1 BITN3 +void L1_SC7A20_FF(void) +{ + D_reg(D_SC7A20_CTRL_REG1) = SL_SC7A20_ODR_100HZ; + L0_set_reg(D_SC7A20_CTRL_REG1); + + D_reg(D_SC7A20_CTRL_REG2) = 0;///0:滤波禁止 + L0_set_reg(D_SC7A20_CTRL_REG2); + + D_reg(D_SC7A20_CTRL_REG3) = 0;///中断全部禁止 + L0_set_reg(D_SC7A20_CTRL_REG3); + + D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认 + + ///D_reg(D_SC7A20_CTRL_REG4) = SL_SC7A20_FS_4G;///FIXME:高精度和功耗的关系需要FAE确认 + + + L0_set_reg(D_SC7A20_CTRL_REG4); + + D_reg(D_SC7A20_CTRL_REG5) = LIR_INT1;///FIXME:高精度和功耗的关系需要FAE确认 + L0_set_reg(D_SC7A20_CTRL_REG5); + + //FreeFall AOI1 + D_reg(D_SC7A20_INT1_CFG) = 0x95;///1001 0101 与中断 xyz低中断使能 高中断关闭 +/// D_reg(D_SC7A20_INT1_CFG) = D_INT1_AOI|D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE;///1001 0101 与中断 xz低中断使能 高中断关闭 +// D_reg(D_SC7A20_INT1_CFG) = D_INT1_ZLIE_ZDOWNE|D_INT1_XLIE_XDOWNE|D_INT1_YLIE_YDOWNE;///1001 0101 中断 xz低中断使能 高中断关闭 + L0_set_reg(D_SC7A20_INT1_CFG);/// + + #ifdef D_2g + + D_reg(D_SC7A20_INT1_THS) = 0x1F;/// + L0_set_reg(D_SC7A20_INT1_THS);/// + D_reg(D_SC7A20_INT1_DURATION) = 0x05;/// + L0_set_reg(D_SC7A20_INT1_DURATION);/// + + #else + + D_reg(D_SC7A20_INT1_THS) = 0x1F;/// + L0_set_reg(D_SC7A20_INT1_THS);/// + D_reg(D_SC7A20_INT1_DURATION) = 0x05;/// + L0_set_reg(D_SC7A20_INT1_DURATION);/// + + #endif +} + + +void L1_SC7A20_Init(u8 *Acc_Int_Thr) +{ + u8 temp1; + Acc_Int_Thr = 0; + Sensor_Read_Byte(CHIPID,&temp1); + printf("Chip_ID = %x\r\n", temp1); + + printf("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了 + { + printf("Error\r\n"); + } + + +#if 10 + + D_reg(D_SC7A20_CTRL_REG1) = 0x57;///1 + L0_set_reg(D_SC7A20_CTRL_REG1);/// + + + L1_SC7A20_lowpower(D_D_SC7A20_NormalPower);///L0_set_reg(D_SC7A20_CTRL_REG1);//odr 10Hz + L0_set_reg(D_SC7A20_CTRL_REG2);//fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + + D_reg(D_SC7A20_CTRL_REG3) = D_REG3_I1_AOI1;/// 0x22, 0x40);//AOI1 映射到INT1 + L0_set_reg(D_SC7A20_CTRL_REG3);/// + + D_reg(D_SC7A20_CTRL_REG4) = D_FS_4G; +/// D_reg(D_SC7A20_CTRL_REG4) = D_FS_2G;///FIXME:高精度和功耗的关系需要FAE确认 + L0_set_reg(D_SC7A20_CTRL_REG4); + + L0_set_reg(D_SC7A20_NVM_WR); //开启控制开关 + + D_reg(D_SC7A20_CTRL_REG5) = 0x80;///B1000_0000 + L0_set_reg(D_SC7A20_CTRL_REG5);/// + /// Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻fixme:20220401 + + D_reg(D_SC7A20_CTRL_REG6) = D_REG6_H_LACTIVE;/// + L0_set_reg(D_SC7A20_CTRL_REG6);///0x25, 0x02);//INT1 默认高电平,有中断输出低电平 selects active level low for pin INT 正常是高电平,有效的时候是低电平 + + + + L1_SC7A20_FF(); + +/// L0_set_reg(D_SC7A20_CLICK_THS);// //设定中断阈值(触发阈值) +/// L0_set_reg(D_SC7A20_TIME_LIMIT);// + +#else + + reg( 20)=2f 47 + reg( 21)=4 4 + reg( 22)=80 128 + reg( 23)=88 136 + reg( 24)=0 0 + reg( 25)=2 2 + + /// u8 SC7A20_REG[10] = {0x2f,0x04,0x98,0x05,0x08,0x02,0x05,0x01,0x15,0x80}; + /// 0 1 2 3 4 5 6 7 8 9 + Sensor_Write_Byte(D_SC7A20_CTRL_REG1,D_reg(D_SC7A20_CTRL_REG1));///SC7A20_REG[0]); //odr 10Hz + Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8 + //SDO 接地 + Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关 + Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻 + + Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平 + Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值) + Sensor_Write_Byte(0x3b,SC7A20_REG[6]); + + Sensor_Write_Byte(0x3c,SC7A20_REG[7]); + Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应)) + Sensor_Write_Byte(0x22,SC7A20_REG[9]); +#endif + +} + +///#define D_2uc_u16(H,L) (((u16)H)<<8 | (u16)L) +void L1_SC7A20_xyz(void) +{ + L2_IICM1_ReadReg(G_SlaveAddr,(D_SC7A20_ADD_INC|D_SC7A20_OUT_X_L), + &D_reg(D_SC7A20_OUT_X_L),6); + ///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3); + ///L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3); + ts_gs7.x = D_2uc_u16(D_reg(D_SC7A20_OUT_X_H),D_reg(D_SC7A20_OUT_X_L)); + ts_gs7.y = D_2uc_u16(D_reg(D_SC7A20_OUT_Y_H),D_reg(D_SC7A20_OUT_Y_L)); + ts_gs7.z = D_2uc_u16(D_reg(D_SC7A20_OUT_Z_H),D_reg(D_SC7A20_OUT_Z_L)); + + printf("\r\n%d %d %d",ts_gs7.x,ts_gs7.y,ts_gs7.z); + + +} +/******* +12.12 中断 1 状态寄存器 (31h) +B7 B6 B5 B4 B3 B2 B1 B0 +0 IA ZH ZL YH YL XH XL +IA 中断激活。默认值:0 +(0: 中断没有产生; 1:一个或多个中断已经产生) +ZH Z 轴高。 默认值:0 +(0:没有中断, 1:Z 轴高事件已经产生) +ZL Z 轴低。默认值:0 +(0:没有中断, 1:Z 轴低事件已经产生) +YH Y 轴高。 默认值:0 +(0:没有中断, 1:Y 轴高事件已经产生) +YL Y 轴低。默认值:0 +(0:没有中断, 1:Y 轴低事件已经产生) +XH X 轴高。 默认值:0 +(0:没有中断, 1:X 轴高事件已经产生) +XL X 轴低。默认值:0 +(0:没有中断, 1:X 轴低事件已经产生) + + +*********/ + + + +//自由落体检测 +void L2_SC7A20_Freefall_Status(void) +{ + unsigned char sl_freefall_reg; + + Sensor_Read_Byte(D_SC7A20_INT1_SOURCE, &sl_freefall_reg); + //USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg); + if((sl_freefall_reg&0x40)==0x40) + {///跌落第一级判定 fixme: + if(ts_gs7.staus != sl_freefall_reg) + { + ts_gs7.staus = sl_freefall_reg; + if(sl_freefall_reg == 0x55) + { + ts_gs7.ff_temp ++; + printf(" 20000 INT1_SOURCE (%2x)= %2x %d", + (int)D_SC7A20_INT1_SOURCE,(int)sl_freefall_reg,(int)ts_gs7.ff_temp); + ts_gs7.n = 0; + ts_gs7.got = 1; + TTSS_overtime_init(ts_gs7.stamp,10); + } + } + } + if(1 == ts_gs7.got) + { + TTSS_overtime_get(ts_gs7.stamp) + {////空闲一段时间后 确定当前跌落持续的时间 + ts_gs7.ff = ts_gs7.ff_temp; + printf(" FF %d",(int)ts_gs7.ff); + ts_gs7.ff_temp = 0; + ts_gs7.got = 0; + } + TTSS_overtime_end + } +} + + +void L3_GSensor_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)/// + { //// fc R1 R2 R3 ocr + //// fc 04 33 44 01 + L1_SC7A20_Init(&Ts_debug.td->R2); + printf("SC7A20_Init2 %x \r\n",Ts_debug.td->R2); + ///L0_uart0_sendstr("\r\n G_Sensor_SC7A20_Init2\r\n"); + /// L3_adc_zero(); + }else if(0x01 == Ts_debug.td->R1)///设置重量的清? + { + //// fc R1 R2 R3 ocr + //// fc 01 33 44 01 + L1_SC7A20_xyz(); + + }else if(0x02 == Ts_debug.td->R1)///读取 + { + //// fc R1 R2 R3 ocr + //// fc 02 33 44 01 + + for(Ts_debug.td->R1 = 0; Ts_debug.td->R1 <= D_SC7A20_ACT_DURATION; Ts_debug.td->R1++) + { + Ts_debug.td->R2 = L2_IICM1_Read1Reg1D(G_SlaveAddr,Ts_debug.td->R1); + printf("reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R1,(int)Ts_debug.td->R2 ,(int)Ts_debug.td->R2 ); + + } + + }else if(0x03 == Ts_debug.td->R1)///设置重量的清? + { + //// fc R1 R2 R3 ocr + //// fc 03 reg dat 01 + /// fc 03 + g_sensor_write_add(Ts_debug.td->R2,Ts_debug.td->R3); + printf("g_sensor_write_add reg( %2X)= %2X %d\r\n",(int)Ts_debug.td->R2,(int)Ts_debug.td->R3 ,(int)Ts_debug.td->R3 ); + } + else + { + L0_uart0_sendstr("\r\n command error \r\n"); + + } + } + else + { + + } + + } +} +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef doc2342342343 + + 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); + + + + + + +#endif + + +#ifdef Doc09s780987 + +Aban + + +Aban +40 0A D0 05 60 C2 + +reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved +reg( 1)= F 15 OUT_TEMP_L r 0C 0001100 output +reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output +reg( 3)= B 11 Reserved(do not modify) 0E Reserved +reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001 +reg( 5)= C5 197 Reserved(do not modify) 10-12 Reserved +reg( 6)= 0 0 USER_CAL 13-1A +reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved +reg( 8)= 0 0 +reg( 9)= 0 0 +reg( A)= 0 0 +reg( B)= 0 0 +reg( C)= 0 0 +reg( D)= 0 0 +reg( E)= 0 0 +reg( F)= 11 17 +reg( 10)= FE 254 +reg( 11)= FF 255 +reg( 12)= 0 0 +reg( 13)= 10 16 +reg( 14)= FF 255 +reg( 15)= 8D 141 +reg( 16)= 7E 126 +reg( 17)= FF 255 +reg( 18)= 2 2 +reg( 19)= 2 2 +reg( 1A)= 2 2 +reg( 1B)= 2 2 +reg( 1C)= 0 0 +reg( 1D)= 0 0 +reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 0000000 +reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 0000011 +reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 0000000 +reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 0000000 +reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 0000000 +reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 0000000 +reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 0000000 +reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 0000000 +reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000 +reg( 28)= 60 96 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +reg( 29)= 8 8 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +reg( 2A)= F0 240 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +reg( 2B)= 6 6 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +reg( 2C)= 20 32 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +reg( 2D)= C2 194 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000 +reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 0000000 +reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 0000000 +reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 0000000 +reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000 +reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 0000000 +reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000 +reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 0000000 +reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 0000000 +reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000 +reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 1100000000 +reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 0000000 +reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + +B an +-7424 -19168 -32640 +-7360 -19184 -32640 +-7344 -19168 -32640 +reg( 0)= 0 0 Reserved(do not modify) 00-0B Reserved +reg( 1)= E8 232 OUT_TEMP_L r 0C 0001100 output +reg( 2)= 0 0 OUT_TEMP_H r 0D 0001101 output +reg( 3)= B8 184 Reserved(do not modify) 0E Reserved +reg( 4)= 0 0 WHO_AM_I r 0F 000 1111 00010001 +reg( 5)= 80 128 Reserved(do not modify) 10-12 Reserved +reg( 6)= 0 0 USER_CAL 13-1A +reg( 7)= 0 0 Reserved(do not modify) 1B-1D Reserved +reg( 8)= 0 0 +reg( 9)= 0 0 +reg( A)= 0 0 +reg( B)= 0 0 +reg( C)= 0 0 +reg( D)= 0 0 +reg( E)= 0 0 +reg( F)= 11 17 +reg( 10)= 0 0 +reg( 11)= 0 0 +reg( 12)= 0 0 +reg( 13)= 0 0 +reg( 14)= 0 0 +reg( 15)= 0 0 +reg( 16)= 0 0 +reg( 17)= 0 0 +reg( 18)= 0 0 +reg( 19)= 0 0 +reg( 1A)= 0 0 +reg( 1B)= 2 2 +reg( 1C)= 0 0 +reg( 1D)= 0 0 +reg( 1E)= 5 5 D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +reg( 1F)= 0 0 D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +reg( 20)= 2F 47 D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +reg( 21)= 4 4 D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +reg( 22)= 80 128 D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +reg( 23)= 88 136 D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +reg( 24)= 0 0 D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +reg( 25)= 2 2 D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +reg( 26)= 0 0 D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +reg( 27)= FF 255 D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +reg( 28)= 90 144 D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +reg( 29)= E3 227 D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +reg( 2A)= 30 48 D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +reg( 2B)= B4 180 D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +reg( 2C)= 80 128 D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +reg( 2D)= 80 128 D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +reg( 2E)= 0 0 D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +reg( 2F)= 20 32 D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +reg( 30)= 0 0 D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +reg( 31)= 0 0 D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +reg( 32)= 0 0 D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +reg( 33)= 0 0 D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +reg( 34)= 0 0 D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +reg( 35)= 0 0 D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +reg( 36)= 0 0 D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +reg( 37)= 0 0 D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +reg( 38)= 0 0 D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +reg( 39)= 0 0 D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +reg( 3A)= 0 0 D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +reg( 3B)= 5 5 D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +reg( 3C)= 0 0 D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +reg( 3D)= 0 0 D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +reg( 3E)= 0 0 D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +reg( 3F)= 0 0 D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 +70 E3 00 B5 80 80 +70 E3 80 B4 80 80 + + + + +void SC7A20_Enter_Interrupt_WakeUp_Mode(INT8U level) +{ + + + /// I2C_gpio_init(I2C_SCL,I2C_SDA); + DBG_PRINT("interupt wake up mode level=%d!\r\n",level); +#define USE_G_SENSOR_ACTIVE 1 +#if USE_G_SENSOR_ACTIVE ==0 + g_sensor_write_add(0x25,0x02); //selects active level low for pin INT +#else + g_sensor_write_add(0x25,0x00); //selects active level high for pin INT +#endif + + switch(level) + { + case 0://doesn't map to INT + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x22,0x00); + return ; + break; + case 1://low + g_sensor_write_add(0x3a,40); + break; + case 2://mid + g_sensor_write_add(0x3a,20); + break; + case 3://high + g_sensor_write_add(0x3a,10); + break; + } + g_sensor_write_add(0x3b,0x7f); + g_sensor_write_add(0x3c,0x6a); + g_sensor_write_add(0x38,0x15); + g_sensor_write_add(0x22,0x80); + + +} + +void ap_gsensor_set_sensitive(INT8U Gsensor) +{ + DBG_PRINT("ap_gsensor_set_sensitive level=%d\r\n",Gsensor); + ///sw_i2c_lock(); + + switch(Gsensor) + { + case 0://doesn't map to INT + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x22,0x00); + g_level = 0xff; + break; + case 1://low + g_sensor_write_add(0x3a,10); + g_level = 30; + break; + case 2://mid + g_sensor_write_add(0x3a,20); + g_level = 50; + break; + case 3://high + g_sensor_write_add(0x3a,40); + g_level = 70; + break; + default: + + break; + } + // g_sensor_write_add(INT_LATCH, 0x81); //clear gsensor interrupt flag + + ///sw_i2c_unlock(); +} + + +void G_Sensor_park_mode_init(INT8U level) +{ + SC7A20_Enter_Interrupt_WakeUp_Mode(level); +} + + +/*read accelertion data , only X and Y axis*/ +u8 Read_XY_Data(s8 *buf) +{ + u8 cd[2]; +/// Sensor_Read_Byte(0x28+1,&cd[0]); +/// Sensor_Read_Byte(0x28+3,&cd[1]); + buf[0]=cd[0]; + buf[1]=cd[1]; + return 0; +} + +void G_Sensor_SC7A20_Init2(u8 *Acc_Int_Thr) +{ + u8 temp1; + + Sensor_Read_Byte(CHIPID,&temp1); + printf("Chip_ID = %x\r\n", temp1); + + printf("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed --> 读取系统ID,如果异常就需要重新写入原厂数据了 + { + printf("Error\r\n"); + } + + /*click */ + Sensor_Write_Byte(0x20,SC7A20_REG[0]); //odr 10Hz + Sensor_Write_Byte(0x21,SC7A20_REG[1]); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) + Sensor_Write_Byte(0x23,SC7A20_REG[2]); //range bdu 0x20--0xA8 + //SDO 接地 + Sensor_Write_Byte(0x1e,SC7A20_REG[3]); //开启控制开关 + Sensor_Write_Byte(0x57,SC7A20_REG[4]); //关闭SDO管脚上的上拉电阻 + + Sensor_Write_Byte(0x25,SC7A20_REG[5]); //selects active level low for pin INT 正常是高电平,有效的时候是低电平 + Sensor_Write_Byte(0x3a,*Acc_Int_Thr); //设定中断阈值(触发阈值) + Sensor_Write_Byte(0x3b,SC7A20_REG[6]); + + Sensor_Write_Byte(0x3c,SC7A20_REG[7]); + Sensor_Write_Byte(0x38,SC7A20_REG[8]); //前一次中断和后一次中断的保持时间(1就是保持1个ODR,2就是2个ODR(比如10HZ,2就是每次中断保持200mS,200mS期间的中断不响应)) + Sensor_Write_Byte(0x22,SC7A20_REG[9]); + +// g_sensor_write(G_SlaveAddr,0x20,0x2f); //odr +// g_sensor_write(G_SlaveAddr,0x21,0x04); //fds -->开启高通滤波器(滤掉地球G)(一定要开启,否则阈值要超过1G,而且动作也要超过1G) +// g_sensor_write(G_SlaveAddr,0x23,0x98); //range bdu 0x20--0xA8 +// +// //SDO 接地 +// g_sensor_write(G_SlaveAddr,0x1e,0x05); //开启控制开关 +// g_sensor_write(G_SlaveAddr,0x57,0x08); //关闭SDO管脚上的上拉电阻 + + /*AOI*/ +// g_sensor_write(G_SlaveAddr,0x20,0x2f); //设置odr +// g_sensor_write(G_SlaveAddr,0x23,0x98); //设置量程range bdu 0x20--0xA8 +} + + +/*read accelertion data */ +u8 read_acceler_data(s8 *buf) +{ + u8 i; + u8 cd[6]; + for(i=0;i<6;i++){ + /// Sensor_Read_Byte(0x28+i,&cd[i]); + } + buf[0]=cd[1]; + buf[1]=cd[3]; + buf[2]=cd[5]; + +// if(((buf[0]==0)&&(buf[1]==0)&&(buf[2]==0)) +// ||((buf[0]==-1)&&(buf[1]==-1)&&(buf[2]==-1)) +// ) +// { +// return 1; +// } + + return 0; +} + +INT16U G_sensor_get_int_active(void) +{ + INT16U temp=0x00; + INT8S x,y,z=0; +/// sw_i2c_lock(); +{ + x = g_sensor_read(G_SlaveAddr, 0x29); //erichan 20150529 + y = g_sensor_read(G_SlaveAddr, 0x2b); //erichan 20150529 + z = g_sensor_read(G_SlaveAddr, 0x2d); //erichan 20150529 + DBG_PRINT("abs(x)=%d,abs(y)=%d,abs(z)=%d\r\n",abs(x),abs(y),abs(z)); + if((abs(x) > g_level) || (abs(y) > g_level) || (abs(z) > g_level)) + temp=0x40; +} + +/// sw_i2c_unlock(); + return temp; +} + +void G_Sensor_Init(INT8U level) +{ + G_sensor_status=0; +/// G_Sensor_SC7A20_Init(level); +} + + +INT32U G_Get_ACC_Data(INT8U addr, INT8U Num) +{ + INT16U Redata,temp; + + if(Num==1){ +/// L2_iicx_Read1Reg(&ts_siic1,8); + Redata = g_sensor_read(G_SlaveAddr,addr); + /// Redata = L2_iicx_Read1Reg(&ts_siic1,addr); + }else{ + temp = g_sensor_read(G_SlaveAddr,addr); + Redata = g_sensor_read(G_SlaveAddr,addr+1); + + Redata = (Redata<<8)|(temp&0x00ff); + } + + return Redata; +} + +INT8U ap_gsensor_power_on_get_status(void) +{ + return G_sensor_status; +} + +void ap_gsensor_power_on_set_status(INT8U status) +{ + if(status) + G_sensor_status=1; //gsensor power on + else + G_sensor_status=0; //key power on +} +#if 0 +void G_Sensor_SC7A20_Init(INT8U level) +{ + INT8U temp1; + + INT8U MTPSETTING,B57H,B1BH,i; + + MTPSETTING= 0x07; + B57H=0x00; + B1BH=0x08;//for iicaddr=0x3a + + temp1 = g_sensor_read(G_SlaveAddr,CHIPID); + DBG_PRINT("chip_id = %x\r\n", temp1); + DBG_PRINT("G_Sensor_SC7A20_Init \r\n"); + if(temp1 != 0x11)// I2C address fixed + { + for(i=0;i<3;i++) + { + g_sensor_write(0x30,0x59,MTPSETTING); + g_sensor_write(0x30,0x1e,0x05); + g_sensor_write(0x30,0x1b,B1BH); + g_sensor_write(0x30,0x57,B57H); + + + g_sensor_write(0x32,0x59,MTPSETTING); + g_sensor_write(0x32,0x1e,0x05); + g_sensor_write(0x32,0x1b,B1BH); + g_sensor_write(0x32,0x57,B57H); + + + g_sensor_write(0x34,0x59,MTPSETTING); + g_sensor_write(0x34,0x1e,0x05); + g_sensor_write(0x34,0x1b,B1BH); + g_sensor_write(0x34,0x57,B57H); + + + + g_sensor_write(0x36,0x59,MTPSETTING); + g_sensor_write(0x36,0x1e,0x05); + g_sensor_write(0x36,0x1b,B1BH); + g_sensor_write(0x36,0x57,B57H); + + + g_sensor_write(0x38,0x59,MTPSETTING); + g_sensor_write(0x38,0x1e,0x05); + g_sensor_write(0x38,0x1b,B1BH); + g_sensor_write(0x38,0x57,B57H); + + + + g_sensor_write(0x3a,0x59,MTPSETTING); + g_sensor_write(0x3a,0x1e,0x05); + g_sensor_write(0x3a,0x1b,B1BH); + g_sensor_write(0x3a,0x57,B57H); + + + g_sensor_write(0x3c,0x59,MTPSETTING); + g_sensor_write(0x3c,0x1e,0x05); + g_sensor_write(0x3c,0x1b,B1BH); + g_sensor_write(0x3c,0x57,B57H); + + + + g_sensor_write(0x3e,0x59,MTPSETTING); + g_sensor_write(0x3e,0x1e,0x05); + g_sensor_write(0x3e,0x1b,B1BH); + g_sensor_write(0x3e,0x57,B57H); + } + + + g_sensor_write(G_SlaveAddr,0x1e,0x05); //to comment + + } + + //g_sensor_write(0x32,0x24,0x80); + //--------------------------------------------------- + temp1 = g_sensor_read(G_SlaveAddr, 0x39); + if(temp1 & 0x40 ) //active int flag + { + ap_gsensor_power_on_set_status(1); + DBG_PRINT("==========gsensor power on=========\r\n"); + }else{ + ap_gsensor_power_on_set_status(0); + DBG_PRINT("==========key power on=============\r\n"); + } + + g_sensor_write_add(0x22,0x00); + g_sensor_write_add(0x38,0x00); + g_sensor_write_add(0x24,0x80); + /*temp1 = g_sensor_read(G_SlaveAddr,0x57); + if(!(temp1 & 0x04)) + { + g_sensor_write_add(0x1e,0x05); + temp1 |= 0x04; + g_sensor_write_add(0x57,temp1); + g_sensor_write_add(0x1e,0x15); + g_delay(500); + }*/ + //else + //g_sensor_write_add(0x1e,0x00); + + g_sensor_write_add(0x20,0x37); + g_sensor_read(G_SlaveAddr, 0x26);// + g_sensor_write_add(0x21,0x0d); + g_sensor_write_add(0x23,0x80); + +} + + + +#endif + + +#endif + + diff --git a/source/bsp/nouse/bsp_sca720.h b/source/bsp/nouse/bsp_sca720.h new file mode 100644 index 0000000..2211dc3 --- /dev/null +++ b/source/bsp/nouse/bsp_sca720.h @@ -0,0 +1,399 @@ +#ifndef __bsp_sca720_H__ +#define __bsp_sca720_H__ + +#include "msp_iicM1.h" +#define SC7A20_SLAVE_ID 0x32//0x4E ,erichan 20150529 + #define G_SlaveAddr SC7A20_SLAVE_ID + + + +/***使用驱动前请根据实际接线情况配置******/ +/**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 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 + +#if 0 + +#define P_SENSITIVE_LOW 0x60 +#define P_SENSITIVE_MID 0x38 +#define P_SENSITIVE_HIGH 0x10 + +#define DMT_SENSITIVE_LOW 0xB0 +#define DMT_SENSITIVE_MID 0x60 +#define DMT_SENSITIVE_HIGH 0x20 + +//========================================== +// SC7A20 Register +//========================================== +#define SOFT_RESET 0x00 +//#define CHIPID 0x01 +#define CHIPID 0x0f// erichan 20150529 + +#define ACC_X_LSB 0x02 +#define ACC_X_MSB 0x03 + +#define ACC_Y_LSB 0x04 +#define ACC_Y_MSB 0x05 + +#define ACC_Z_LSB 0x06 +#define ACC_Z_MSB 0x07 + +#define MOTION_FLAG 0x09 +#define NEWDATA_FLAG 0x0A + +#define TAP_ACTIVE_STATUS 0x0B + +#define RESOLUTION_RANGE 0x0F // Resolution bit[3:2] -- 00:14bit + // 01:12bit + // 10:10bit + // 11:8bit + + // FS bit[1:0] -- 00:+/-2g + // 01:+/-4g + // 10:+/-8g + // 11:+/-16g +#define ODR_AXIS 0x10 +#define MODE_BW 0x11 +#define SWAP_POLARITY 0x12 +#define INT_SET1 0x16 +#define INT_SET2 0x17 +#define INT_MAP1 0x19 +#define INT_MAP2 0x1A +#define INT_CONFIG 0x20 +#define CHIPID 0x0f +#define INT_LATCH 0x21 +#define FREEFALL_DUR 0x22 +#define FREEFALL_THS 0x23 +#define FREEFALL_HYST 0x24 +#define ACTIVE_DUR 0x27 +#define ACTIVE_THS 0x28 +#define TAP_DUR 0x2A +#define TAP_THS 0x2B +#define ORIENT_HYST 0x2C +#define Z_BLOCK 0x2D +#define SELF_TEST 0x32 +#define ENGINEERING_MODE 0x7f + + + + +#endif +//========================================================== + + +extern void G_Sensor_SC7A20_Init(INT8U level); +extern void SC7A20_Enter_Interrupt_WakeUp_Mode(INT8U level); + +extern void ap_gsensor_set_sensitive(INT8U Gsensor); +extern void G_Sensor_Init(INT8U level); +extern void G_Sensor_park_mode_init(INT8U level); + +extern void G_sensor_clear_int_flag(void); +extern INT16U G_sensor_get_int_active(void); + +extern void ap_gsensor_power_on_set_status(INT8U status); +extern INT8U ap_gsensor_power_on_get_status(void); +#if 0 +#define g_sensor_write(x,y,z); {ts_siic[D_IIC_GSENSOR].sal = x; L1_iicx_Write2Reg(&ts_siic[D_IIC_GSENSOR],y,z);} + +#define g_sensor_write_add(y,z); L1_iicx_Write2Reg(&ts_siic[D_IIC_GSENSOR],y,(z)); +#define g_sensor_read(x,y) L2_iicx_Read1Reg1DataR(&ts_siic[D_IIC_GSENSOR],y) +#define Sensor_Read_Byte(x,y) L2_iicx_Read1Reg1Data(&ts_siic[D_IIC_GSENSOR],x,(y)) + +#else + + + + +#endif + + +extern void G_Sensor_SC7A20_Init2 (u8 *Acc_Int_Thr); + +///extern void g_sensor_write(INT8U id, INT8U addr, INT8U data); +///extern INT16U g_sensor_read(INT8U id, INT8U addr); +///g_sensor_read + +///temp1 = g_sensor_read(G_SlaveAddr,CHIPID); + + + + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +///1e 30 +///3f 63 33 +#define D_0x1e 0x1e +typedef struct +{ + u8 reg[34];//0x1e + u8 staus; + u8 ff_temp; + u8 ff; + u8 got; + U32 n; + U32 stamp; + S16 x,y,z; +}TS_sca720_; + +extern TS_sca720_ ts_gs7; + +///1e 30 +///3f 63 33 + +#define D_SC7A20_OUT_TEMP_L 0x0c +#define D_SC7A20_OUT_TEMP_H 0x0D +#define D_SC7A20_WHO_AM_I 0x0F + +#define CHIPID D_SC7A20_WHO_AM_I +#define D_SC7A20_NVM_WR 0x1E ////rw 001 1110 00000000 +#define D_SC7A20_TEMP_CFG 0x1F ////rw 001 1111 output +#define D_SC7A20_CTRL_REG1 0x20 ////rw 010 0000 00000111 +#define D_SC7A20_CTRL_REG2 0x21 ////rw 010 0001 00000000 +#define D_SC7A20_CTRL_REG3 0x22 ////rw 010 0010 00000000 +#define D_SC7A20_CTRL_REG4 0x23 ////rw 010 0011 00000000 +#define D_SC7A20_CTRL_REG5 0x24 ////rw 010 0100 00000000 +#define D_SC7A20_CTRL_REG6 0x25 ////rw 010 0101 00000000 +#define D_SC7A20_REFERENCE 0x26 ////rw 010 0110 00000000 +#define D_SC7A20_STATUS_REG 0x27 ////rw 010 0111 00000000 +#define D_SC7A20_OUT_X_L 0x28 ////r 010 1000 output +#define D_SC7A20_OUT_X_H 0x29 ////r 010 1001 output +#define D_SC7A20_OUT_Y_L 0x2A ////r 010 1010 output +#define D_SC7A20_OUT_Y_H 0x2B ////r 010 1011 output +#define D_SC7A20_OUT_Z_L 0x2C ////r 010 1100 output +#define D_SC7A20_OUT_Z_H 0x2D ////r 010 1101 output +#define D_SC7A20_FIFO_CTRL_REG 0x2E ////rw 010 1110 00000000 +#define D_SC7A20_FIFO_SRC_REG 0x2F ////r 010 1111 +#define D_SC7A20_INT1_CFG 0x30 ////rw 011 0000 00000000 +#define D_SC7A20_INT1_SOURCE 0x31 ////r 011 0001 00000000 +#define D_SC7A20_INT1_THS 0x32 ////rw 011 0010 00000000 +#define D_SC7A20_INT1_DURATION 0x33 ////rw 011 0011 00000000 +#define D_SC7A20_INT2_CFG 0x34 ////rw 011 010000000000 +#define D_SC7A20_INT2_SOURCE 0x35 ////r 011 0101 00000000 +#define D_SC7A20_INT2_THS 0x36 ////rw 011 0110 00000000 +#define D_SC7A20_INT2_DURATION 0x37 ////rw 011 0111 00000000 +#define D_SC7A20_CLICK_CFG 0x38 ////rw 011 1000 00000000 +#define D_SC7A20_CLICK_SRC 0x39 ////r 011 1001 00000000 +#define D_SC7A20_CLICK_THS 0x3A ////rw 011 1010 00000000 +#define D_SC7A20_TIME_LIMIT 0x3B ////rw 011 1011 00000000 +#define D_SC7A20_TIME_LATENCY 0x3C ////rw 011 110000000000 +#define D_SC7A20_TIME_WINDOW 0x3D ////rw 011 1101 00000000 +#define D_SC7A20_ACT_THS 0x3E ////rw 011 1110 +#define D_SC7A20_ACT_DURATION 0x3F ////rw 011 1111 + + + +#define D_SC7A20_ADD_INC 0x80 +////1000 +////0010 +////1010 + + +//reg4 23h +#define D_BDU BITN7 +#define D_FS_2G 0///,(BITN5|BITN4) +#define D_FS_4G (BITN4) +#define D_FS_8G (BITN5) +#define D_HR (BITN3) + + +/*** +12.3 控制寄存器 3(22h) +B7 B6 B5 B4 B3 B2 B1 B0 +I1_CLICK I1_AOI1 I1_AOI2 I1_DRDY1 I1_DRDY2 HI1_WTM I1_OVERRUN -- + +I1_CLICK CLICK 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_AOI1 AOI1 中断在 on INT1。 默认值:0 +(0:禁止; 1:使能) +I1_AOI2 AOI2 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_DRDY1 DRDY1 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_DRDY2 DRDY2 中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_WTM FIFO 水印中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) +I1_OVERRUN FIFO 溢出中断在 INT1 上。默认值:0 +(0:禁止; 1:使能) + +***/ + +#define D_REG3_I1_CLICK BITN7 +#define D_REG3_I1_AOI1 BITN6 +#define D_REG3_I1_AOI2 BITN5 +#define D_REG3_I1_DRDY1 BITN4 +#define D_REG3_I1_DRDY2 BITN3 +#define D_REG3_I1_WTM BITN2 +#define D_REG3_I1_OVERRUN BITN1 + + + /*** + 12.6 控制寄存器 6(25h) + B7 B6 B5 B4 B3 B2 B1 B0 + I2_CLICK I2_INT1 I2_INT2 BOOT_I2 0 -- H_LACTIVE -- + + I2_CLICK CLICK 中断在 INT2 上。默认值:0 + (0:禁止; 1:使能) + I2_INT1 AOI2 中断在 on INT1。 默认值:0 + (0:禁止; 1:使能) + I2_INT2 AOI2 中断在 on INT2。 默认值:0 + (0:禁止; 1:使能) + BOOT_I2 BOOT 状态在 INT2 上。 默认值:0 + (0:禁止; 1:使能) + H_LACTIVE 0:高电平触发中断;1:低电平触发中断 + + + ***/ + +#define D_REG6_I2_CLICK BITN7 +#define D_REG6_I1_INT1 BITN6 +#define D_REG6_I1_INT2 BITN5 +#define D_REG6_BOOT_I2 BITN4 +#define D_REG6_0 BITN3 + ///#define D_REG3_I1_WTM BITN2 +#define D_REG6_H_LACTIVE BITN1 + + +///#define g_sensor_write(x,y,z) L2_IICM1_WriteCmd(D_cmd_filter_GSensor,x,y) +#define g_sensor_write_add(reg,cmd) L2_IICM1_WriteCmd(G_SlaveAddr,reg,cmd) +/// g_sensor_write_add(0x38,0x00); +#define g_sensor_read(sla,reg) L2_IICM1_Read1Reg1D(sla,reg) +/// x = g_sensor_read(G_SlaveAddr, 0x29); //erichan 20150529 +#define Sensor_Read_Byte(reg,d) L2_IICM1_ReadReg(G_SlaveAddr,reg,(d),1) + +///Sensor_Read_Byte(CHIPID,&temp1); + + + + + +#define D_cmd_filter_GSensor 0xfc +extern void L3_GSensor_setPara(u8 filter); +extern void L1_SC7A20_Init(u8 *Acc_Int_Thr); +extern void L2_SC7A20_Freefall_Status(void); +extern void L1_SC7A20_xyz(void); + + + +#define Sensor_Write_Byte g_sensor_write_add + + +#define DBG_PRINT printf + + + + + + + + + + + +#endif///#ifndef __bsp_sca720_H__ + + diff --git a/source/bsp/nouse/max30102.c b/source/bsp/nouse/max30102.c new file mode 100644 index 0000000..bb5b187 --- /dev/null +++ b/source/bsp/nouse/max30102.c @@ -0,0 +1,1177 @@ +#include "MAX30102.h" +#include "debug_drv.h" + +#define D_task_m32_01 0x20 +#define D_task_m32_HR 0x31 +#define D_task_m32_SPO 0x32 +#define D_task_m32_sample 0x34 +#define D_task_m32_cal 0x35 +#define D_task_m32_out 0x25 +#define D_task_m32_ask 0x24 + +#define D_task_m32_read 0x28 + + +////>>>>>>>>>>>>>>>>>>>>>_s_task_m32_>>>>>>>>>>>>>>>>>>>>>> +TS_task_m32_ ts_task_m32; +TS_max30102_ ts_max30102; + + +/// ts_max30102.d[6]; +uint8 Max30102_reset(void) +{ + +#if 0 + if(L1_max30102_WB(REG_MODE_CONFIG, 0x40)) + return 1; + else + return 0; + + +#else + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + return 1; + +#endif + + +} + + +/**** +SPO2_ADC_RGE[1:0] LSB SIZE (pA) FULL SCALE (nA) +00 7.81 2048 +01 15.63 4096 +10 31.25 8192 +11 62.5 16384 + + +LED_PW[1:0] PULSE WIDTH (µs) ADC RESOLUTION (bits) +00 69 (68.95) 15 +01 118 (117.78) 16 +10 215 (215.44) 17 +11 411 (410.75) 18 + +27 +0010 0111 +0 01 0 01 11 +*********/ + +#define D_LED_PW_16BITS 0X01 +#define D_LED_PW_18BITS 0X03 + +#define D_SPO2_SR_50pS (0X00<<2) ///SAMPLE RATE +#define D_SPO2_SR_100pS (0X01<<2) ///SAMPLE RATE +#define D_SPO2_SR_200pS (0X02<<2) ///SAMPLE RATE +#define D_SPO2_SR_400pS (0X03<<2) ///SAMPLE RATE + + +#define SPO2_ADC_RGE_2048 (0X00<<5) +#define SPO2_ADC_RGE_4096 (0X01<<5) +#define SPO2_ADC_RGE_8192 (0X02<<5) +/********* +REGISTER FIFO Configuration +B7 B6 B5 B4 B3 B2 B1 B0 REG ADDR POR STATE +SMP_AVE[2:0] FIFO_ROL LOVER_EN FIFO_A_FULL[3:0] 0x08 0x00 R/W +****/ + + void L0_MAX30102_mode(u8 mode) + { + if(D_m32_mode_SPO2 == mode) + { + + /// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0 + ////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断 + + L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_SPO2);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + ////27 + L1_max30102_WB(REG_SPO2_CONFIG,SPO2_ADC_RGE_8192|D_SPO2_SR_50pS|D_LED_PW_18BITS); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS) + + /// L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS) + + + L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED + + + + }else + { + /// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0 + ////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断 + + L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_HR);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + + L1_max30102_WB(REG_SPO2_CONFIG,SPO2_ADC_RGE_8192|D_SPO2_SR_400pS|D_LED_PW_18BITS); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS) + L1_max30102_WB(REG_LED1_PA,0x10);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x10);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x01);// Choose value for ~ 25mA for Pilot LED + + + } + + + } + + + void L1_MAX30102_Config(void) + { + L1_max30102_WB(REG_MODE_CONFIG, 0x40);///reset = 1; + Lc_delay_ms(30); +// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN +// L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + L1_max30102_WB(REG_INTR_ENABLE_1,0x80);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + + + L0_MAX30102_mode(D_m32_mode_HR); + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + +} +#define D_max3_sp 3 +#define D_max3_figer 868236L +#define D_max3_NoFiger 6000L +void L2_max30102_init(void) +{ + + L2_task_m32_register(); + + L0_IICMx_INIT(D_iicch_max13102,1); + ts_iicm.t0[D_iicch_max13102]= 0;///模拟iic的时候低电平和高电平的时间经常不确定 + ts_iicm.t1[D_iicch_max13102]= 1;///使用iic前需要配置iic的速率 根据规格书的要求 + + ts_max30102.fifook = 0; + ts_max30102.havefigle = 0; + ts_max30102.datok = 0; + ts_max30102.sum = D_max3_figer << D_max3_sp;; + ts_max30102.sum2 = D_max3_figer << D_max3_sp; + + +} +void L3_max_spo2(void) +{ + if(ts_max30102.i >= 64) + {//39数据为1周期 + ts_max30102.i = 0; + ts_max30102.havefigle = 0; + //取得周期内最大最小数据 + ts_max30102.ac=ts_max30102.IR_max-ts_max30102.IR_min; //单个周期内最大最小数据差为交流分量 + ts_max30102.dc=ts_max30102.IR_min; //数据=直流分量+交流分量 + ts_max30102.ac2=ts_max30102.RED_max-ts_max30102.RED_min;//同理 + ts_max30102.dc2=ts_max30102.RED_min; + + ts_max30102.ac_ir=(float)ts_max30102.ac;//注意转换,否则无法赋值 + ts_max30102.dc_ir=(float)ts_max30102.dc; + ts_max30102.ac_red=(float)ts_max30102.ac2; + ts_max30102.dc_red=(float)ts_max30102.dc2; + ts_max30102.R2=(ts_max30102.ac_red* ts_max30102.dc_ir)/(ts_max30102.ac_ir*ts_max30102.dc_red); + ts_max30102.SPO2 =-45.060*ts_max30102.R2*ts_max30102.R2+ 30.354 *ts_max30102.R2 + 94.845; + ts_max30102.u16d =(U16)ts_max30102.SPO2; + ts_max30102.SPO2_out =(U8)ts_max30102.u16d; +/// printf(" SPO2 = %2.2f (%d) ",ts_max30102.SPO2,(int)ts_max30102.SPO2_out); + ts_max30102.SPO2_ok = 1; + ///printf(" %lu--%lu ",ts_max30102.IR_min,ts_max30102.IR_max); + ///printf(" %lu--%lu ",ts_max30102.RED_min,ts_max30102.RED_max); + ts_max30102.IR_max=ts_max30102.IR_out2; + ts_max30102.IR_min=ts_max30102.IR_out2; + ts_max30102.RED_max=ts_max30102.RED_out2; + ts_max30102.RED_min=ts_max30102.RED_out2; + } +} + +///进行简单的分析 +void L2_max30102_hh(void) +{ +////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>shift average + ts_max30102.sum += ts_max30102.red; + ts_max30102.sum -= ts_max30102.RED_out2; + ts_max30102.RED_out2 = ts_max30102.sum >> D_max3_sp; + + +// 0 red,red_out2 +/// 0 -red_out2 +red +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<> D_max3_sp; + +/// printf(" H %lu %lu f%d ",ts_max30102.RED_out2,ts_max30102.IR_out2,(int)ts_max30102.havefigle); + if(0 == ts_max30102.havefigle) + { + if((ts_max30102.IR_out2 +ts_max30102.RED_out2) > D_max3_figer) + { + //// printf("\r\n have figle "); + ts_max30102.havefigle = 1; + ts_max30102.i=0; + ts_max30102.IR_max=ts_max30102.IR_out2; + ts_max30102.IR_min=ts_max30102.IR_out2; + ts_max30102.RED_max=ts_max30102.RED_out2; + ts_max30102.RED_min=ts_max30102.RED_out2; + }else + { + /// printf(" clear figle \r\n");///需要显示清零 + ts_max30102.havefigle = 0; + ts_max30102.i = 0; + ts_max30102.hr_out = 1; + ts_max30102.hr_out2 = 0; + ts_max30102.hr_out2_temp = ts_max30102.hr_out2+1; + ts_max30102.hr_ok = 1; + ts_max30102.SPO2 = 0; + ts_max30102.SPO2_out = 0; + ts_max30102.SPO2_ok = 1; + ts_max30102.SPO2_out_temp = ts_max30102.SPO2_ok+ 1; + } + }else + {///have figle + ts_max30102.havefigle++; + if (ts_max30102.havefigle > 16)///过滤掉最开始的几个数据 + {ts_max30102.havefigle = 16; + ts_max30102.cashe[2] = ts_max30102.cashe[1]; + ts_max30102.cashe[1] = ts_max30102.cashe[0]; + ts_max30102.cashe[0] = ts_max30102.RED_out2; + + if((ts_max30102.cashe[1] >= ts_max30102.cashe[2])&&(ts_max30102.cashe[1] > ts_max30102.cashe[0])) + {///求波峰 + ts_max30102.hr_s = ts_max30102.hr_i; + ts_max30102.hr_s *= 20L;///20ms 间隔的周期 200hz采样决定的 + ts_max30102.hr = 60000L/ts_max30102.hr_s; + ts_max30102.u16d = (U16)ts_max30102.hr; + ts_max30102.hr_out = (U8)ts_max30102.u16d; + + //// printf( "hr = %d ",(int)ts_max30102.hr_out); + + + if((ts_max30102.hr_out >= 100) ||(ts_max30102.hr_out <= 50)) //缓存套路 + { + ts_max30102.hr_out = ts_max30102.hr_out2; + }else + { + ts_max30102.hr_out2 = ts_max30102.hr_out; + } + //// printf( "hr_out2 = %d ",(int)ts_max30102.hr_out2); + ts_max30102.hr_ok = 1; + ts_max30102.hr_i = 0; + } + else + { + ts_max30102.hr_i ++; + } + + /// printf(" i=%lu ",ts_max30102.i); + if(ts_max30102.RED_max < ts_max30102.RED_out2){ ts_max30102.RED_max=ts_max30102.RED_out2; } + if(ts_max30102.RED_min > ts_max30102.RED_out2){ ts_max30102.RED_min=ts_max30102.RED_out2; } + //printf(" %lu--%lu ",ts_max30102.RED_min,ts_max30102.RED_max); + + if(ts_max30102.IR_max < ts_max30102.IR_out2){ ts_max30102.IR_max=ts_max30102.IR_out2; } + if(ts_max30102.IR_min > ts_max30102.IR_out2){ ts_max30102.IR_min=ts_max30102.IR_out2; } + //printf(" %lu--%lu ",ts_max30102.IR_min,ts_max30102.IR_max); + + ts_max30102.i++;//记录周期数 + L3_max_spo2(); + + } + } +} +#if 0 +void L2_timer4max30102_callback(void) +{ + max30102_read_fifo();//数据读入 + +} + +void max30102_read_fifo(void) +{ + U8 i; + ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR); + + ///L1_uartD_senduc('W'); + ///L1_uartD_senduchex(ts_max30102.s); + + if(ts_max30102.s > 0x1e) + {///L1_uartD_senduc('r'); + ts_max30102.fifook = 1; + + } + + if(ts_max30102.fifook) + {////ts_max30102.s + ts_max30102.fifook = 0; + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + for(i = 0;i < 32;i ++) + { + L1_max30102_Read_Array(REG_FIFO_DATA,(u8 *)&ts_max30102.dfifo[i],6); + if (ts_max30102.mode == D_m32_mode_SPO2) + { + if(i ==0x1f) + { + ts_max30102.dfifo[i].RED0 = ts_max30102.dfifo[i-1].RED0 ; + ts_max30102.dfifo[i].RED1 = ts_max30102.dfifo[i-1].RED1 ; + ts_max30102.dfifo[i].RED2 = ts_max30102.dfifo[i-1].RED2 ; + ts_max30102.dfifo[i].IR0 = ts_max30102.dfifo[i-1].IR0 ; + ts_max30102.dfifo[i].IR1 = ts_max30102.dfifo[i-1].IR1 ; + ts_max30102.dfifo[i].IR2 = ts_max30102.dfifo[i-1].IR2 ; + /// L1_uartD_senduchex(i); L1_uartD_senduc('f');L1_uartD_senduc(' '); + }else + { + // L1_uartD_senduchex(i); L1_uartD_senduc(' '); + } + }else + { + /// L1_uartD_senduchex(i); L1_uartD_senduc(' '); + } + + ts_max30102.u16b = ts_max30102.dfifo[i].RED2; + ts_max30102.red =(U32)ts_max30102.u16b; + ts_max30102.red <<= 16 ; + + ts_max30102.u16d = ts_max30102.dfifo[i].RED1; + ts_max30102.u16d <<= 8; + ts_max30102.u16d |= ts_max30102.dfifo[i].RED0; + + ts_max30102.red |= (U32)ts_max30102.u16d; + +////////////////////// + ts_max30102.u16b = ts_max30102.dfifo[i].IR2; + ts_max30102.ir =(U32)ts_max30102.u16b; + ts_max30102.ir <<= 16 ; + + ts_max30102.u16d = ts_max30102.dfifo[i].IR1; + ts_max30102.u16d <<= 8; + + ts_max30102.u16d |= ts_max30102.dfifo[i].IR0; + + ts_max30102.ir |= (U32)ts_max30102.u16d; + + //printf("\r\n %lu %lu ",ts_max30102.red,ts_max30102.ir); + /// ts_max30102.datok = 1; + L2_max30102_hh(); + + } + } +} + +#endif + + +void L2_task_m32_register(void) +{ + L1_task_reg_clear(&ts_task_m32.task); + L3_task_s_go(ts_task_m32,D_task_init); +} + +///step 1 init +///step 2 启动hr模式 +///step 3 等待采样完成 +///step 4 启动spo模式 +///step 5 等待采样完成 +///step 6 + +///L2_task_m32_handle(&ts_task_m32); +void L2_task_m32_handle(TS_task_m32_ *s) +{ + unsigned char i = 0; + + TTSS_Task_init(): + + ts_max30102.HRok = 0; + printf("\r\nL2_task_m32_handle "); + L2_task_go(D_task_m32_HR); + TTSS_Task_step(D_task_m32_HR): + L1_MAX30102_Config(); + ts_max30102.mode = D_m32_mode_SPO2; + ///ts_max30102.mode = D_m32_mode_HR; + printf("\r\nD_m32_mode_SPO2 "); + ///printf("\r\nD_m32_mode_HR "); + L0_MAX30102_mode(ts_max30102.mode); + + ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR); + printf("REG_FIFO_WR_PTR = %d \r\n",(int)ts_max30102.s); + ts_max30102.s2 = ts_max30102.s +1; + ts_max30102.fifo_ok = 0; + L2_task_go(D_task_m32_ask); + TTSS_Task_step(D_task_m32_ask): + /// ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1); + /// printf("S%d ",(int)ts_max30102.s);/// + + ts_max30102.s = IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR); + + + /// printf("S%d ",(int)ts_max30102.s);/// + if(ts_max30102.s == 0) + { + printf(" Z%d ",(int)ts_max30102.s); + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + L2_task_go(D_task_m32_HR); + }else if(ts_max30102.s >31 ) + { + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + printf(" E%d ",(int)ts_max30102.s); + L2_task_go(D_task_m32_HR); + }else + { + if(ts_max30102.s2 != ts_max30102.s) + { + ts_max30102.s2 = ts_max30102.s; + ////printf("\r\n%d ",(int)ts_max30102.s); + if(ts_max30102.s == 31) + {///printf("\r\n %d ",(int)ts_max30102.s); + /// printf("\r\nFull:"); + L2_task_go(D_task_m32_read); + }else + { + /// L1_uartD_senduc('&'); + } + } + } + TTSS_Task_step(D_task_m32_read): + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + for(i = 0;i < 32;i ++) + { + L1_max30102_Read_Array(REG_FIFO_DATA,(u8 *)&ts_max30102.dfifo[i],6); + /// L1_uartD_0d0a(); + /// L1_uartD_uc(' ');L1_uartD_Arrayhex((u8 *)&ts_max30102.dfifo[i],6); + // L1_uartD_uc(' ');L1_uartD_uchex(i); + + if (ts_max30102.mode == D_m32_mode_SPO2) + { + if(i ==0x1f)///31 + { + + ts_max30102.dfifo[i].RED0 = ts_max30102.dfifo[i-1].RED0 ; + ts_max30102.dfifo[i].RED1 = ts_max30102.dfifo[i-1].RED1 ; + ts_max30102.dfifo[i].RED2 = ts_max30102.dfifo[i-1].RED2 ; + ts_max30102.dfifo[i].IR0 = ts_max30102.dfifo[i-1].IR0 ; + ts_max30102.dfifo[i].IR1 = ts_max30102.dfifo[i-1].IR1 ; + ts_max30102.dfifo[i].IR2 = ts_max30102.dfifo[i-1].IR2 ; + + /**/ + ///L1_uartD_senduchex(i); L1_uartD_senduc('f');L1_uartD_senduc(' '); + }else + { + } + ////L1_uartD_senduchex(i); L1_uartD_senduc(' '); + }else + { + + } + + ts_max30102.u16b = ts_max30102.dfifo[i].RED2; + ts_max30102.red =(U32)ts_max30102.u16b; + ts_max30102.red <<= 16 ; + + ts_max30102.u16d = ts_max30102.dfifo[i].RED1; + ts_max30102.u16d <<= 8; + ts_max30102.u16d |= ts_max30102.dfifo[i].RED0; + + ts_max30102.red |= (U32)ts_max30102.u16d; + +////////////////////// + ts_max30102.u16b = ts_max30102.dfifo[i].IR2; + ts_max30102.ir =(U32)ts_max30102.u16b; + ts_max30102.ir <<= 16 ; + + ts_max30102.u16d = ts_max30102.dfifo[i].IR1; + ts_max30102.u16d <<= 8; + + ts_max30102.u16d |= ts_max30102.dfifo[i].IR0; + + ts_max30102.ir |= (U32)ts_max30102.u16d; + + L2_max30102_hh();///// + + + ts_max30102.u322 = ts_max30102.RED_out2/4000L; + ts_max30102.u162 = ts_max30102.u322; + ts_max30102.u81 = ts_max30102.u162; + ts_max30102.send[i] = ts_max30102.u81; + + + /// printf("\r\n%d %lu %lu ",(int)i,ts_max30102.red,ts_max30102.ir); + /// ts_max30102.datok = 1; + + } + + ///ts_max30102.fifo_ok = 1; + L2_task_go(D_task_m32_SPO); + TTSS_Task_step(D_task_m32_SPO): + /// L2_max30102_hh(); + + + /// printf("\r\n%d %lu %lu ",(int)i,ts_max30102.red,ts_max30102.ir); + L2_task_go(D_task_m32_out); + TTSS_Task_step(D_task_m32_out): + //// 0-1-2-3-4-5-6-7 127/8=16 + + + + if(ts_max30102.SPO2_ok) + { + ts_max30102.SPO2_ok = 0; + if(ts_max30102.SPO2_out_temp != ts_max30102.SPO2_out) + { + ts_max30102.SPO2_out_temp = ts_max30102.SPO2_out; + D_SHOW_oxygen(ts_max30102.SPO2_out); + } + } + if(ts_max30102.hr_ok) + { + ts_max30102.hr_ok = 0; + if(ts_max30102.hr_out2_temp != ts_max30102.hr_out2) + { + ts_max30102.hr_out2_temp = ts_max30102.hr_out2; + D_SHOW_heart(ts_max30102.hr_out2); + } + } + + /// ts_max30102.SPO2_out = 99; + /// ts_max30102.hr_out2 = 123; + // L2_OLED_Showint2(5*8,0,ts_max30102.SPO2_out,16); + // L2_OLED_Showint3(5*8,2,ts_max30102.hr_out2,16); + + L2_task_go(D_task_m32_ask); + TTSS_Task_end(); +} + + + + + + +#if 0 +8x16 +128/8=16 +0 1 2 3 4 5 6 7 + + + + +void max30102_read_fifo222222(void) +{ + + U32 un_temp; + + /************** + + ts_max30102.fifo_red=0; + ts_max30102.fifo_ir=0; + + for(i=0;i<6;i++) + { + ts_max30102.d[i]=0; + } + + printf("\r\n"); + + for(m = 0;m<=0x12;m ++) + { + s=IIC_Read_Byte(MAX30102_Device_address,m); + printf("\r\nreg(%2x %d) = %2X %d ",(int)m,(int)m,(int)s,(u16)s); + } + printf("\r\n"); + + + + + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_INTR); + // s=0x12; + ts_max30102.s2= IIC_Read_Byte(MAX30102_Device_address,REG_TEMP_FRAC); + /// printf(" tmp %2X %2X %d.%d",(int)s,(int)s2,(int)s,(int)s2); + //read and clear statu + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1); + // s=0x12; + ts_max30102.s2= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_2); + //// printf("\r\nsta %X %X %X --",(int)0xAA,(int)ts_max30102.s,(int)ts_max30102.s2); + + +#define REG_FIFO_WR_PTR 0x04 +#define REG_OVF_COUNTER 0x05 +#define REG_FIFO_RD_PTR 0x06 + 40 40 1C 00 00 + 40 00 1D 00 00 + 40 00 1E 00 00 + 40 C0 00 00 00 + + + Status 1 + B7 B6 B5 B4 B3 B2 B1 B0 ADDR POR_STATE + A_FULL PPG_RDY ALC_OVF PWR_RDY 0x00 0X00 R + + *************/ + + Lc_delay_ms(1); + + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1); + L1_uartD_senduc(' '); + L1_uartD_senduchex(ts_max30102.s); + +// ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_CONFIG); +// L1_uartD_senduc(' '); +// L1_uartD_senduchex(ts_max30102.s); + + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR); + L1_uartD_senduc(' '); + L1_uartD_senduchex(ts_max30102.s); + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_OVF_COUNTER); + L1_uartD_senduc(' '); + L1_uartD_senduchex(ts_max30102.s); + ts_max30102.s= IIC_Read_Byte(MAX30102_Device_address,REG_FIFO_RD_PTR); + L1_uartD_senduc(' '); + L1_uartD_senduchex(ts_max30102.s); + + + L1_uartD_0d0a(); + +/// ts_max30102.d[0]=REG_FIFO_DATA; +/// L1_max30102_Read_Array(REG_FIFO_DATA,ts_max30102.d,6); +/// +/// L1_uartD_uchexArray(ts_max30102.d,6); + + +/******** + printf("fifo :%2X %2X %2X %2X %2X %2X ", + (int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2], + (int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]); + + + + for(i=0;i<6;i++) + { + ts_max30102.d[i]=0x40+i; + } + + printf("fifo :%2X %2X %2X %2X %2X %2X ", + (int)ts_max30102.d[0],(int)ts_max30102.d[1],(int)ts_max30102.d[2], + (int)ts_max30102.d[3],(int)ts_max30102.d[4],(int)ts_max30102.d[5]); + +*******/ + +/************ + un_temp=ts_max30102.d[0]; + + ts_max30102.fifo_red=un_temp<<16; + + un_temp=ts_max30102.d[1]; + un_temp<<=8; + ts_max30102.fifo_red|=un_temp; + un_temp=ts_max30102.d[2]; +// un_temp>>=2; + ts_max30102.fifo_red|=un_temp; + + + + + un_temp=ts_max30102.d[3]; + ts_max30102.fifo_ir = un_temp<<16; + un_temp=ts_max30102.d[4]; + un_temp<<=8; + ts_max30102.fifo_ir|=un_temp; + un_temp=ts_max30102.d[5]; +/// un_temp>>=2; + ts_max30102.fifo_ir|=un_temp; + + ts_max30102.u16out_c = D_2uc_u16(ts_max30102.d[2],ts_max30102.d[5]); + + + L1_uartD_sendulhex(ts_max30102.fifo_red); +/// Lc_delay_ms(1); + L1_uartD_senduc('R'); + L1_uartD_sendulhex(ts_max30102.fifo_ir); +// if(ts_max30102.fifo_ir<=10000) +// { +// ts_max30102.fifo_ir=0; +// } +// if(ts_max30102.fifo_red<=10000) +// { +// ts_max30102.fifo_red=0; +// } + + +// USART_SendData(USART_PORT,ts_max30102.fifo_red); +// while (USART_GetFlag Status(USART_PORT, USART_FLAG_TXE) == RESET); +// printf("%d %d\r\n",ts_max30102.fifo_red,ts_max30102.fifo_ir); +// Delay_ms(100); + + ****************/ + +} + + + + +void L0_MAX30102_Config(void) +{ + L1_max30102_WB(REG_MODE_CONFIG, 0x40);///reset = 1; + Lc_delay_ms(30); +// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN +// L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// INTR setting 1100 A_FULL_EN PPG_RDY_EN + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + +/********* + REGISTER FIFO Configuration + B7 B6 B5 B4 B3 B2 B1 B0 REG ADDR POR STATE + SMP_AVE[2:0] FIFO_ROL LOVER_EN FIFO_A_FULL[3:0] 0x08 0x00 R/W + ****/ + + + /// 20220913_82240 CCmodify L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_FIFO_CONFIG,0x00);//sample avg = 1, fifo rollover=false, fifo almost full = 0 + ////需要配置成中断的时候获取 在定时器中读取标志位作为fifo ok的判断 + + L1_max30102_WB(REG_MODE_CONFIG, D_m32_mode_SPO2);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), 18bits LED pulseWidth (400uS) + L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED + + + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + +} + +if(d > 4) +{ + d = 0; + L2_task_go(D_task_m32_01); + L1_task_Tdelay(D_Tdelay_100ms); +}else +{ + d ++; +} + + +if(d > 8) +{ + d = 0; + L2_task_go(D_task_m32_02); + L1_task_Cdelay(D_Cdelay_200us); +}else +{ + d ++; +} + +void L2_timer4max30102_callbackyyyy(void) +{ + +//// TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 + max30102_read_fifo();//数据读入 + ts_max30102.i++;//记录周期数 + int temp=fifo_ir; + int temp2=fifo_red; + while(ts_max30102.temp+ts_max30102.temp2<20000) + {//未检测出手指时代码会在此处跑死,原因为拟合函数只在检测到手指时有效 + printf("未检测出手指\r\n"); + max30102_read_fifo(); + ts_max30102.temp=ts_max30102.fifo_ir; + ts_max30102.temp2=ts_max30102.fifo_red; + } + + + if(ts_max30102.i==0){//周期数值初始 + ts_max30102.max=ts_max30102.temp; + ts_max30102.min=ts_max30102.temp; + ts_max30102.max2=ts_max30102.temp2; + ts_max30102.min2=ts_max30102.temp2; + } + //取得周期内最大最小数据 + if(ts_max30102.maxts_max30102.temp){ ts_max30102.min=ts_max30102.temp; } + if(ts_max30102.max2ts_max30102.temp2){ ts_max30102.min2=ts_max30102.temp2; } + + if(ts_max30102.i>=39) + {//39数据为1周期 + ts_max30102.i=0; + ts_max30102.ac=ts_max30102.max-ts_max30102.min;//单个周期内最大最小数据差为交流分量 + ts_max30102.dc=ts_max30102.min; //数据=直流分量+交流分量 + ts_max30102.ac2=ts_max30102.max2-ts_max30102.min2;//同理 + ts_max30102.dc2=ts_max30102.min2; + ts_max30102.max=ts_max30102.temp; + ts_max30102.min=ts_max30102.temp; + ts_max30102.max2=ts_max30102.temp2; + ts_max30102.min2=ts_max30102.temp2; + } + + //结果生成,数据较为稳定,开头几个数据可以不要,比较不稳 + ts_max30102.ac_ir=(float)ts_max30102.ac;//注意转换,否则无法赋值 + ts_max30102.dc_ir=(float)ts_max30102.dc; + ts_max30102.ac_red=(float)ts_max30102.ac2; + ts_max30102.dc_red=(float)ts_max30102.dc2; + ts_max30102.R2=(ts_max30102.ac_red* ts_max30102.dc_ir)/(ts_max30102.ac_ir*ts_max30102.dc_red); + ts_max30102.SPO2 =-45.060*ts_max30102.R2*ts_max30102.R2+ 30.354 *ts_max30102.R2 + 94.845; + +} + + +void MAX30102_Config222(void) +{ + u8 id1,id2,rr = 0xE5; + + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + Lc_delay_ms(200); + //read and clear statu + id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID); + + id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID); + ///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2); + printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2); + +L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting + + + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x27); // SPO2_ADC range = 4096nA, SPO2 sample rate (50 Hz), LED pulseWidth (400uS) + L1_max30102_WB(REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x7f);// Choose value for ~ 25mA for Pilot LED + + L1_max30102_WB(REG_TEMP_CONFIG,1); +} + +void MAX30102_Configbbb(void) +{ + u8 id1,id2,rr = 0xE5; + + L1_max30102_WB(REG_MODE_CONFIG, 0x40); + Lc_delay_ms(200); + //read and clear statu + id1= IIC_Read_Byte(MAX30102_Device_address,REG_REV_ID); + + id2= IIC_Read_Byte(MAX30102_Device_address,REG_PART_ID); + ///printf("\r\nMAX30102_Config %x %x \r\n",(int)id1,(int)id2); + printf("\r\nMAX30102_Config %X %X %X \r\n",(int)rr,(int)id1,(int)id2); + + + + L1_max30102_WB(REG_INTR_ENABLE_1,0x00);//// L1_max30102_WB(REG_INTR_ENABLE_1,0xc0);//// INTR setting + + + L1_max30102_WB(REG_INTR_ENABLE_2,0x00);// + + ///清空 + L1_max30102_WB(REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0] + L1_max30102_WB(REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0] + L1_max30102_WB(REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0] + + L1_max30102_WB(REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17 + L1_max30102_WB(REG_MODE_CONFIG,0x03);//0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED + L1_max30102_WB(REG_SPO2_CONFIG,0x2B); // //SPO2_ADC range = 4096nA, 200Hz, LED pulseWidth (411uS) ,18bit + L1_max30102_WB(REG_LED1_PA,0x40);//Choose value for ~ 10mA for LED1 + L1_max30102_WB(REG_LED2_PA,0x40);// Choose value for ~ 10mA for LED2 + L1_max30102_WB(REG_PILOT_PA,0x01);// Choose value for ~ 25mA for Pilot LED + + L1_max30102_WB(REG_TEMP_CONFIG,1); +} + + + +[16:32:10.800]收←◆ + stcTTSS2_lora v4.4 +Sep 15 202223:40:47 +main while +L0_OLED_io_int +[16:32:11.837]收←◆OLED_Clear +[16:32:13.002]收←◆. +L2_task_m32_handle +D_task_m32_HR 41 00 01 00 00 + 40 00 02 00 00 + 40 00 03 00 00 + 40 00 04 00 00 + 40 00 05 00 00 + 40 00 06 00 00 + 40 00 07 00 00 + 40 00 08 00 00 + 40 00 09 00 00 + 40 00 0A 00 00 + 40 00 0B 00 00 + 40 00 0C 00 00 + 40 00 0D 00 00 + 40 00 0E 00 00 + 40 00 0F 00 00 + 40 00 10 00 00 + 40 00 11 00 00 + 40 00 12 00 00 + 40 00 13 00 00 + 40 00 14 00 00 + 40 00 15 00 00 + 40 00 16 00 00 + 40 00 17 00 00 + 40 00 18 00 00 + 40 00 19 00 00 + 40 00 1A 00 00 + 40 00 1B 00 00 + 40 00 1C 00 00 + 40 00 1D 00 00 + 40 00 1E 00 00 + 40 00 1F 00 00 + C0 00 00 01 00 + 40 00 00 02 00 + 40 00 00 03 00 + 40 00 00 04 00 + 40 00 00 05 00 + 40 00 00 06 00 + 40 00 00 07 00 + 40 00 00 08 00 + 40 00 00 09 00 + ts_max30102.HRok 40 00 00 0A 00 + 40 00 00 0B 00 + 40 00 00 0C 00 + 40 00 00 0D 00 + +[16:32:13.474]收←◆ 40 00 00 0E 00 + 40 00 00 0F 00 + 40 00 00 10 00 + 40 00 00 11 00 + 40 00 +[16:32:13.525]收←◆ 00 12 00 + 40 00 00 13 00 + 40 00 00 14 00 + 40 00 00 15 00 + 40 00 00 16 00 + 40 00 00 17 +[16:32:13.589]收←◆ 00 + 40 00 00 18 00 + 40 00 00 19 00 + 40 00 00 1A 00 + 40 00 00 1B 00 + 40 00 00 1C 00 + 40 00 00 1D +[16:32:13.632]收←◆ 00 + 40 00 00 1E 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 +[16:32:13.687]收←◆ 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 +[16:32:13.712]收←◆ 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + 40 00 00 1F 00 + +[16:32:13.775]收←◆ 40 00 00 1F 00 + 40 00 00 1F 00 + 40 + + + + + stcTTSS2_lora v4.4 + Sep 15 202223:40:47 + main while + L0_OLED_io_intOLED_Clear. + L2_task_m32_handle + D_task_m32_HR 41 00 01 00 00 + 00 00 03 00 02 + 40 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 00 00 08 00 08 + 00 00 09 00 09 + 00 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 40 00 0F 00 0E + 00 00 10 00 10 + 00 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 40 00 16 00 15 + 00 00 17 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1B 00 1B + 00 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 40 00 01 00 00 + 00 00 02 00 02 + 00 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 40 00 08 00 07 + 00 00 09 00 09 + 00 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0D 00 0D + 00 00 0F 00 0E + 00 00 10 00 10 + 00 00 12 00 11 + 40 00 13 00 12 + 00 00 14 00 14 + 00 00 16 00 15 + 00 00 17 00 17 + ts_max30102.HRok 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1C 00 1B + 40 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 00 00 01 00 01 + 00 00 03 00 02 + 40 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 00 00 08 00 08 + 00 00 09 00 09 + 00 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 40 00 0F 00 0E + 00 00 10 00 10 + 00 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 40 00 16 00 15 + 00 00 17 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1B 00 1B + 00 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 40 00 01 00 00 + 00 00 02 00 02 + 00 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 40 00 08 00 07 + 00 00 09 00 09 + 00 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0D 00 0D + ts_max30102.HRok . 40 00 0F 00 0E + 00 00 11 00 10 + 40 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 00 00 16 00 16 + 00 00 17 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1C 00 1B + 40 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 00 00 01 00 01 + 00 00 03 00 02 + 40 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 00 00 08 00 08 + 00 00 09 00 09 + 00 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 40 00 0F 00 0E + 00 00 10 00 10 + 00 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 40 00 16 00 15 + 00 00 17 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1C 00 1B + 40 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 40 00 01 00 00 + 00 00 02 00 02 + 00 00 04 00 03 + ts_max30102.HRok 00 00 05 00 05 + 00 00 07 00 06 + 00 00 08 00 08 + 00 00 0A 00 09 + 40 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 00 00 0F 00 0F + 00 00 11 00 10 + 40 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 00 00 16 00 16 + 00 00 18 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + 00 00 1C 00 1B + 40 00 1D 00 1C + 00 00 1E 00 1E + 00 00 00 00 1F + 00 00 01 00 01 + 00 00 03 00 02 + 40 00 04 00 03 + 00 00 05 00 05 + 00 00 07 00 06 + 00 00 08 00 08 + 00 00 0A 00 09 + 40 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 40 00 0F 00 0E + 00 00 10 00 10 + 00 00 12 00 11 + 00 00 13 00 13 + 00 00 15 00 14 + 40 00 16 00 15 + 00 00 17 00 17 + 00 00 19 00 18 + 00 00 1A 00 1A + ts_max30102.HRok 00 00 1C 00 1B + 00 00 1D 00 1D + 00 00 1F 00 1E + 40 00 00 00 1F + 00 00 01 00 01 + 00 00 03 00 02 + 00 00 04 00 04 + 00 00 06 00 05 + 40 00 07 00 06 + 00 00 08 00 08 + 00 00 0A 00 09 + 40 00 0B 00 0A + 00 00 0C 00 0C + 00 00 0E 00 0D + 00 00 0F 00 0F + 00 00 11 00 10 + 40 00 12 00 11 + + +#endif + +/******************************END*********************************/ + + diff --git a/source/bsp/nouse/max30102.h b/source/bsp/nouse/max30102.h new file mode 100644 index 0000000..36d2371 --- /dev/null +++ b/source/bsp/nouse/max30102.h @@ -0,0 +1,145 @@ +#ifndef _MAX30102_H +#define _MAX30102_H + +#include "msp_iicMx.h"///// +#include "c_type51.h"///// +#include "TTSS_task.h"///// +///#include "bsp_lora_jx.h" +#include "bsp_oled.h" +#define MAX30102_Device_address 0xAE + +//register addresses +#define REG_INTR_STATUS_1 0x00 +#define REG_INTR_STATUS_2 0x01 +#define REG_INTR_ENABLE_1 0x02 +#define REG_INTR_ENABLE_2 0x03 +#define REG_FIFO_WR_PTR 0x04 +#define REG_OVF_COUNTER 0x05 +#define REG_FIFO_RD_PTR 0x06 +#define REG_FIFO_DATA 0x07 +#define REG_FIFO_CONFIG 0x08 +#define REG_MODE_CONFIG 0x09 +#define REG_SPO2_CONFIG 0x0A +#define REG_LED1_PA 0x0C +#define REG_LED2_PA 0x0D +#define REG_PILOT_PA 0x10 +#define REG_MULTI_LED_CTRL1 0x11 +#define REG_MULTI_LED_CTRL2 0x12 +#define REG_TEMP_INTR 0x1F +#define REG_TEMP_FRAC 0x20 +#define REG_TEMP_CONFIG 0x21 +#define REG_PROX_INT_THRESH 0x30 +#define REG_REV_ID 0xFE +#define REG_PART_ID 0xFF +#define SAMPLES_PER_SECOND 100 //检测频率 + + + +#define D_m32_mode_HR 0x02 +#define D_m32_mode_SPO2 0x03 + +uint8 Max30102_reset(void); +void L2_max30102_init(void); +void max30102_read_fifo(void); + +typedef struct +{ + TS_task task; +}TS_task_m32_; +extern TS_task_m32_ ts_task_m32; + +extern void L2_task_m32_register(void); +extern void L2_task_m32_handle(TS_task_m32_ *s); +/* +BYTE 1 FIFO_DATA[17] +FIFO_DATA[16] + +BYTE 2 FIFO_DATA[15] +FIFO_DATA[14] +FIFO_DATA[13] +FIFO_DATA[12] +FIFO_DATA[11] +FIFO_DATA[10] +FIFO_DATA[9] +FIFO_DATA[8] + +BYTE 3 FIFO_DATA[7] +FIFO_DATA[6] +FIFO_DATA[5] +FIFO_DATA[4] +FIFO_DATA[3] +FIFO_DATA[2] +FIFO_DATA[1] +FIFO_DATA[0] +*/ +typedef struct +{ + u8 RED2; + u8 RED1; + u8 RED0; + u8 IR2; + u8 IR1; + u8 IR0; +}TS_m32fifo_; + +typedef struct +{ + TS_m32fifo_ dfifo[33]; + uint32 red; + uint32 ir; + u8 mode; + u8 u81; + u16 u162; + u32 u322; + u8 send[32];////需要传输的数据 暂定32 + + u8 fifo_ok;////在fifo数据读取完后的空档期,可以用来执行其他任务,否则会丢失数据 + + u8 havefigle;///= 1 手指放入判定 + + u8 havefigle_n;///= 1 手指放入判定 + + + + + uint32 hr_s,hr_i,hr; + U8 hr_out;////心跳的输出 + U16 hr_out2;////心跳的输出 + + U16 hr_out2_temp;////心跳的输出 + +/// u32 u32a; + u16 u16b; + u16 u16d; + u16 u16out_c;/// + u8 s,s2; + u8 HRok,SPO2ok,fifook,datok; + + uint32 cashe[3]; + uint32 i,ac,dc,ac2,dc2; + uint32 fifo_ir,fifo_red; + uint32 IR_out2,RED_out2,IR_max,IR_min,RED_max,RED_min; + uint32 sum,sum2; + + float ac_ir,dc_ir,ac_red,dc_red,R2,SPO2; + U16 SPO2_out;//// 的输出 + U16 SPO2_out_temp; + + + U8 SPO2_ok;//// + U8 hr_ok;//// + + +}TS_max30102_; +extern TS_max30102_ ts_max30102; + + +#define L1_max30102_WB(reg,dat) L2_IICMx_WriteCmd(D_iicch_max13102,MAX30102_Device_address,reg,dat) + +#define IIC_Read_Byte(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_max13102,adr,reg) + +#define L1_max30102_Read(adr,reg) L2_IICMx_Read1Reg1D(D_iicch_max13102,MAX30102_Device_address,reg) + +#define L1_max30102_Read_Array(reg,dat,n) L2_IICMx_ReadReg(D_iicch_max13102,MAX30102_Device_address,reg,dat,n) + +#endif diff --git a/source/bsp/nouse/oled/bmp.h b/source/bsp/nouse/oled/bmp.h new file mode 100644 index 0000000..df66e7d --- /dev/null +++ b/source/bsp/nouse/oled/bmp.h @@ -0,0 +1,144 @@ + + +#ifndef __BMP_H +#define __BMP_H +unsigned char code BMP1[] = +{ + 0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0,0x00,0xF0,0x00,0xF8, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0xFF,0x11,0xAA,0x44,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x38,0x44,0x82,0x92, + 0x92,0x74,0x01,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x44,0xFF,0x01,0x7D, + 0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x7D,0x01,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x03,0x03, + 0xF3,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x01,0xF1,0x11,0x61,0x81,0x01,0x01,0x01, + 0x81,0x61,0x11,0xF1,0x01,0x01,0x01,0x01,0x41,0x41,0xF1,0x01,0x01,0x01,0x01,0x01, + 0xC1,0x21,0x11,0x11,0x11,0x11,0x21,0xC1,0x01,0x01,0x01,0x01,0x41,0x41,0xF1,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x11,0x11,0x11,0x11,0x11,0xD3,0x33, + 0x03,0x03,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00, + 0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x7F,0x00,0x00,0x01,0x06,0x18,0x06, + 0x01,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00,0x00,0x00, + 0x1F,0x20,0x40,0x40,0x40,0x40,0x20,0x1F,0x00,0x00,0x00,0x00,0x40,0x40,0x7F,0x40, + 0x40,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x03,0x00,0x00, + 0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x06,0x06, + 0x06,0x06,0x04,0x04,0x04,0x84,0x44,0x44,0x44,0x84,0x04,0x04,0x84,0x44,0x44,0x44, + 0x84,0x04,0x04,0x04,0x84,0xC4,0x04,0x04,0x04,0x04,0x84,0x44,0x44,0x44,0x84,0x04, + 0x04,0x04,0x04,0x04,0x84,0x44,0x44,0x44,0x84,0x04,0x04,0x04,0x04,0x04,0x84,0x44, + 0x44,0x44,0x84,0x04,0x04,0x84,0x44,0x44,0x44,0x84,0x04,0x04,0x04,0x04,0x06,0x06, + 0x06,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x10,0x18,0x14,0x12,0x11,0x00,0x00,0x0F,0x10,0x10,0x10, + 0x0F,0x00,0x00,0x00,0x10,0x1F,0x10,0x00,0x00,0x00,0x08,0x10,0x12,0x12,0x0D,0x00, + 0x00,0x18,0x00,0x00,0x0D,0x12,0x12,0x12,0x0D,0x00,0x00,0x18,0x00,0x00,0x10,0x18, + 0x14,0x12,0x11,0x00,0x00,0x10,0x18,0x14,0x12,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x7F,0x03,0x0C,0x30,0x0C,0x03,0x7F,0x00,0x00,0x38,0x54,0x54,0x58,0x00,0x00, + 0x7C,0x04,0x04,0x78,0x00,0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xAA,0xAA,0xAA, + 0x28,0x08,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x03,0x0C,0x30,0x0C,0x03,0x7F, + 0x00,0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,0x7F,0x02,0x04,0x08,0x10,0x7F,0x00,/********************************/ +}; + +unsigned char code BMP2[] = +{ + 0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0,0x00,0xF0,0x00,0xF8, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0xFF,0x11,0xAA,0x44,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x38,0x44,0x82,0x92, + 0x92,0x74,0x01,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x44,0xFF,0x01,0x7D, + 0x7D,0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8, + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0xF8,0x18,0x60,0x80,0x00,0x00,0x00,0x80, + 0x60,0x18,0xF8,0x00,0x00,0x00,0x20,0x20,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xE0, + 0x10,0x08,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x20,0x20,0xF8,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x88,0x68, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F, + 0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x7F,0x00,0x00,0x01,0x06,0x18,0x06,0x01, + 0x00,0x00,0x7F,0x00,0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00,0x00,0x00,0x00,0x1F, + 0x20,0x40,0x40,0x40,0x40,0x20,0x1F,0x00,0x00,0x00,0x40,0x40,0x7F,0x40,0x40,0x00, + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x18,0x06,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x20,0x20,0xC0,0x00,0x00,0xE0,0x20,0x20,0x20, + 0xE0,0x00,0x00,0x00,0x40,0xE0,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0xE0,0x00, + 0x00,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0x00,0x00,0x40,0x20, + 0x20,0x20,0xC0,0x00,0x00,0x40,0x20,0x20,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0C,0x0A,0x0A,0x09,0x0C,0x00,0x00,0x0F,0x08,0x08,0x08, + 0x0F,0x00,0x00,0x00,0x08,0x0F,0x08,0x00,0x00,0x00,0x0C,0x08,0x09,0x09,0x0E,0x00, + 0x00,0x0C,0x00,0x00,0x0F,0x09,0x09,0x09,0x0F,0x00,0x00,0x0C,0x00,0x00,0x0C,0x0A, + 0x0A,0x09,0x0C,0x00,0x00,0x0C,0x0A,0x0A,0x09,0x0C,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x7F,0x03,0x0C,0x30,0x0C,0x03,0x7F,0x00,0x00,0x38,0x54,0x54,0x58,0x00,0x00, + 0x7C,0x04,0x04,0x78,0x00,0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xAA,0xAA,0xAA, + 0x28,0x08,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x03,0x0C,0x30,0x0C,0x03,0x7F, + 0x00,0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,0x7F,0x02,0x04,0x08,0x10,0x7F,0x00,/***************************************/ + +}; + +#endif + + diff --git a/source/bsp/nouse/oled/bsp_font.h b/source/bsp/nouse/oled/bsp_font.h new file mode 100644 index 0000000..e23a742 --- /dev/null +++ b/source/bsp/nouse/oled/bsp_font.h @@ -0,0 +1,342 @@ +#ifndef __OLEDFONT_H +#define __OLEDFONT_H +//常用ASCII表 +//偏移量32 +//ASCII字符集 +//偏移量32 +//大小:12*6 +/************************************6*8的点阵************************************/ +const unsigned char code F6x8[][6] = +{ +0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp +0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// ! +0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// " +0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// # +0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $ +0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// % +0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// & +0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// ' +0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// ( +0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// ) +0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// * +0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// + +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// , +0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// - +0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// . +0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// / +0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 +0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1 +/******* +01000010 +01111111 +01000000 + +12345678 +........ .x..,1 +..111... .x..,2 +...1.... .x..,3 +...1.... .xF8,4 +...1.... .x..,5 +...1.... .x..,6 +..11.... .x..,7 +...1.... .x..,8 + +逐列 左向右 + +12345678 +...1.... .x..,1 +..11... .x..,2 +...1.... .x..,3 +...1.... .xF8,4 +...1.... .x..,5 +...1.... .x..,6 +..111... .x..,7 +...0.... .x..,8 + +*******/ + + +0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2 +0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3 +0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4 +0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5 +0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 +0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7 +0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8 +0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9 +0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// : +0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ; +0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// < +0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// = +0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// > +0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ? +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [ +0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55 +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _ +0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// ' +0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a +0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z +0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines +}; +/****************************************8*16的点阵************* +//20220823_42850 CCmodify 列行 阴码 逆向 + 从第一列开始向下 +取8个点作为一个字节 +,然后从第二列开始向 +下取8个点作为第二个 +字节...依此类推。如 +果最后不足8个点就补 +满8位。 + 取模顺序是从低到 +高,即第一个点作为最 +低位。如*-------取 +为00000001 + +***********************/ +const unsigned char code F8X16[]= +{ + + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 + 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1 + 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2 + 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3 + + + 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4 + 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5 + 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6 + 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7 + 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8 + 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9 + 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10 + 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14 + 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15 + 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20 + 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21 + 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22 + 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23 + 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24 + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25 + 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26 + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27 + 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28 + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29 + 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30 + 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31 + 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32 + 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33 + 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34 + 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35 + 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36 + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37 + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38 + 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39 + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40 + 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41 + 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42 + 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43 + 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44 + 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45 + 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46 + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47 + 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48 + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49 + 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50 + 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51 + 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52 + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53 + 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54 + 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55 + 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56 + 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57 + 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58 + 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59 + 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60 + 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61 + 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63 + 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65 + 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66 + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67 + 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69 + 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70 + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71 + 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72 + 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73 + 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74 + 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75 + 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76 + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77 + 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79 + 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80 + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81 + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82 + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83 + 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84 + 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85 + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86 + 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87 + 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88 + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89 + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90 + 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91 + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92 + 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93 + 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 +}; +unsigned char code Hzk[][32]={ +#if 0 +{0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x04,0x84,0x44,0x24,0x14,0x0C,0x04,0x00,0x00}, +{0x01,0x00,0x00,0xFF,0x00,0x00,0x38,0x46,0x41,0x40,0x40,0x40,0x40,0x40,0x78,0x00},/*"亿",0*/ +/* (16 X 16 , 宋体 )*/ + +{0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00}, +{0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00},/*"阳",1*/ +/* (16 X 16 , 宋体 )*/ + +{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00}, +{0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",2*/ +/* (16 X 16 , 宋体 )*/ + +{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00}, +{0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",3*/ +/* (16 X 16 , 宋体 )*/ + +{0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00}, +{0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00},/*"科",4*/ +/* (16 X 16 , 宋体 )*/ + +{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00}, +{0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",5*/ +/* (16 X 16 , 宋体 )*/ +#endif + + 0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x04,0x84,0x44,0x24,0x14,0x0C,0x04,0x00,0x00, + 0x01,0x00,0x00,0xFF,0x00,0x00,0x38,0x46,0x41,0x40,0x40,0x40,0x40,0x40,0x78,0x00,/*"亿",0*/ + /* (16 X 16 , 新宋体 )*/ + + 0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00, + 0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,/*"阳",1*/ + /* (16 X 16 , 新宋体 )*/ + + 0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00, + 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*"电",2*/ + /* (16 X 16 , 新宋体 )*/ + + 0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"子",3*/ + /* (16 X 16 , 新宋体 )*/ + + 0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,0x22,0xCC,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x08,0x06,0x01,0xFF,0x00,0x01,0x04,0x04,0x04,0x04,0x04,0xFF,0x02,0x02,0x02,0x00,/*"科",4*/ + /* (16 X 16 , 新宋体 )*/ + + 0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00, + 0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,/*"技",5*/ + /* (16 X 16 , 新宋体 )*/ + + + + + +}; + +unsigned char code Hzk_tylg[][32]={ + + + +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, +{0x80,0x80,0x40,0x20,0x10,0x0C,0x13,0x60,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},/*"太",0*/ +/* (16 X 16 , 新宋体 )*/ + +{0x00,0x00,0xFE,0x02,0x02,0xF2,0x92,0x9A,0x96,0x92,0x92,0xF2,0x02,0x02,0x02,0x00}, +{0x80,0x60,0x1F,0x40,0x20,0x17,0x44,0x84,0x7C,0x04,0x04,0x17,0x20,0x40,0x00,0x00},/*"原",1*/ +/* (16 X 16 , 新宋体 )*/ + +{0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0xFE,0x00,0x00}, +{0x20,0x60,0x20,0x1F,0x10,0x10,0x40,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x40,0x00},/*"理",2*/ +/* (16 X 16 , 新宋体 )*/ + +{0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00}, +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"工",3*/ +/* (16 X 16 , 新宋体 )*/ + +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, +{0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},/*"大",4*/ +/* (16 X 16 , 新宋体 )*/ + +{0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00}, +{0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00},/*"学",5*/ +/* (16 X 16 , 新宋体 )*/ + + + + +}; + + + +#endif + + + diff --git a/source/bsp/nouse/oled/bsp_oled.c b/source/bsp/nouse/oled/bsp_oled.c new file mode 100644 index 0000000..b3f2c63 --- /dev/null +++ b/source/bsp/nouse/oled/bsp_oled.c @@ -0,0 +1,510 @@ +///#include "bsp_485.h" +#include "tpc_debug.h" +////#include "tpc_x.h" +#include "c_lib.h" +#include "bsp_oled.h" +#include "debug_drv.h" +#include "bsp_font.h" +#include "bmp.h" + + +void L2_OLED_init(void) +{ + L0_OLED_io_int(); + printf("L0_OLED_io_int"); + OLED_Init(); //初始化OLED + OLED_Clear(); + printf("OLED_Clear"); +/// OLED_ShowNum(); +/// OLED_ShowString(0,0,"0.91OLEDTEST",8); + +/// OLED_ShowString(0,0,"12345678",16); + +// delay_ms(3000); + +/// OLED_Clear(); + OLED_ShowCHinese2(4,1,0);// + OLED_ShowCHinese2(22,1,1);// + OLED_ShowCHinese2(40,1,2);// + OLED_ShowCHinese2(58,1,3);// + OLED_ShowCHinese2(76,1,4);// + OLED_ShowCHinese2(94,1,5);// + delay_ms(500); + OLED_Clear(); +} + + +void L2_OLED_TEST(void) +{ + L0_OLED_io_int(); + printf("L0_OLED_io_int"); + OLED_Init(); //初始化OLED + OLED_Clear() ; + + printf("OLED_Clear"); + printf("1000"); + delay_ms(1000); + printf("1000\r\n"); + OLED_Clear(); + OLED_ShowCHinese(4,1,0);//亿 + OLED_ShowCHinese(22,1,1);//阳 + OLED_ShowCHinese(40,1,2);//电 + OLED_ShowCHinese(58,1,3);//子 + OLED_ShowCHinese(76,1,4);//科 + OLED_ShowCHinese(94,1,5);//技 + + delay_ms(3000); + while(1) + { + OLED_ShowString(0,0,"0.91OLEDTEST",8); + OLED_ShowString(0,1,"0123456789AB",8); + delay_ms(1000); + delay_ms(1000); + delay_ms(1000); + OLED_Clear(); + OLED_ShowString(0,0,"0.91OLEDTEST",16); + delay_ms(1000); + delay_ms(1000); + delay_ms(1000); + OLED_Clear(); + OLED_ShowString(0,0,"0123456789AB",16); + + delay_ms(1000); + delay_ms(1000); + delay_ms(1000); + OLED_Clear(); + OLED_ShowCHinese(4,1,0);//亿 + OLED_ShowCHinese(22,1,1);//阳 + OLED_ShowCHinese(40,1,2);//电 + OLED_ShowCHinese(58,1,3);//子 + OLED_ShowCHinese(76,1,4);//科 + OLED_ShowCHinese(94,1,5);//技 + delay_ms(1000); + delay_ms(1000); + delay_ms(1000); + OLED_Clear(); + OLED_DrawBMP(0,0,128,8,BMP1); + delay_ms(1000); + delay_ms(1000); + delay_ms(1000); + OLED_Clear(); + } +} +//OLED的显存 +//存放格式如下. +//[0]0 1 2 3 ... 127 +//[1]0 1 2 3 ... 127 +//[2]0 1 2 3 ... 127 +//[3]0 1 2 3 ... 127 +//[4]0 1 2 3 ... 127 +//[5]0 1 2 3 ... 127 +//[6]0 1 2 3 ... 127 +//[7]0 1 2 3 ... 127 /// 8* +void delay_ms(unsigned int ms) +{ + unsigned int a; + while(ms) + { + ///a=1800; + a=220; + while(a--); + ms--; + } + return; +} + + + +/********************************************** +//IIC Start +**********************************************/ +void IIC_Start() +{ + + OLED_SCLK_Set() ; + OLED_SDIN_Set(); + OLED_SDIN_Clr(); + OLED_SCLK_Clr(); +} + +/********************************************** +//IIC Stop +**********************************************/ +void IIC_Stop() +{ + + OLED_SCLK_Clr(); + OLED_SDIN_Clr(); + OLED_SDIN_Set(); + OLED_SCLK_Set() ; +} +/********************************************** +// IIC Write byte +**********************************************/ + +void Write_IIC_Byte(unsigned char IIC_Byte) +{ + unsigned char i; + unsigned char m,da; + da=IIC_Byte; + for(i=0;i<8;i++) + { + m=da; + OLED_SCLK_Clr(); + m=m&0x80; + if(m==0x80) + {OLED_SDIN_Set();} + else OLED_SDIN_Clr(); + da=da<<1; + OLED_SCLK_Set(); + } + + OLED_SCLK_Clr(); + OLED_SCLK_Set() ; +} +/********************************************** +// IIC Write Command +**********************************************/ +void Write_IIC_Command(unsigned char IIC_Command) +{ + IIC_Start(); + Write_IIC_Byte(0x78); //Slave address,SA0=0 + Write_IIC_Byte(0x00); //write command + Write_IIC_Byte(IIC_Command); + IIC_Stop(); +} +/********************************************** +// IIC Write Data +**********************************************/ +void Write_IIC_Data(unsigned char IIC_Data) +{ + IIC_Start(); + Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 + Write_IIC_Byte(0x40); //write data + Write_IIC_Byte(IIC_Data); + IIC_Stop(); +} +void OLED_WR_Byte(unsigned dat,unsigned cmd) +{ + if(cmd) + { + IIC_Start(); + Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 + Write_IIC_Byte(0x40); //write data + Write_IIC_Byte(dat); + IIC_Stop(); + } + else { + IIC_Start(); + Write_IIC_Byte(0x78); //Slave address,SA0=0 + Write_IIC_Byte(0x00); //write command + Write_IIC_Byte(dat); + IIC_Stop(); + + } + + +} + + +/******************************************** +// fill_Picture +********************************************/ +void fill_picture(unsigned char fill_Data) +{ + unsigned char m,n; + for(m=0;m<8;m++) + { + OLED_WR_Byte(0xb0+m,0); //page0-page1 + OLED_WR_Byte(0x00,0); //low column start address + OLED_WR_Byte(0x10,0); //high column start address + for(n=0;n<128;n++) + { + OLED_WR_Byte(fill_Data,1); + } + } +} + + +/***********************Delay**************************** + +void Delay_1ms(unsigned int Del_1ms) +{ + unsigned char j; + while(Del_1ms--) + { + for(j=0;j<123;j++); + } +} + + + +************/ +void Delay_50ms(unsigned int Del_50ms) +{ + unsigned int m; + for(;Del_50ms>0;Del_50ms--) + for(m=6245;m>0;m--); +} + + +//坐标设置 + + void OLED_Set_Pos(unsigned char x, unsigned char y) +{ OLED_WR_Byte(0xb0+y,OLED_CMD); + OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); + OLED_WR_Byte((x&0x0f),OLED_CMD); +} +//开启OLED显示 +void OLED_Display_On(void) +{ + OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 + OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON + OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON +} +//关闭OLED显示 +void OLED_Display_Off(void) +{ + OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 + OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF + OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF +} +//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! +void OLED_Clear(void) +{ + u8 i,n; + for(i=0;i<8;i++) + { + OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) + OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 + OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 + for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); + } //更新显示 +} +void OLED_On(void) +{ + u8 i,n; + for(i=0;i<8;i++) + { + OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) + OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址 + OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 + for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); + } //更新显示 +} +//在指定位置显示一个字符,包括部分字符 +//x:0~127 +//y:0~63 +//mode:0,反白显示;1,正常显示 +//size:选择字体 16/12 +void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) +{ + unsigned char c=0,i=0; + c=chr-' ';//得到偏移后的值 + if(x>Max_Column-1){x=0;y=y+2;} + if(Char_Size ==16) + { + OLED_Set_Pos(x,y); + for(i=0;i<8;i++) + OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); + OLED_Set_Pos(x,y+1); + for(i=0;i<8;i++) + OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); + } + else + { + OLED_Set_Pos(x,y); + for(i=0;i<6;i++) + OLED_WR_Byte(F6x8[c][i],OLED_DATA); + } +} +//m^n函数 +u32 oled_pow(u8 m,u8 n) +{ + u32 result=1; + while(n--)result*=m; + return result; +} +//显示2个数字 +//x,y :起点坐标 +//len :数字的位数 +//size:字体大小 +//mode:模式 0,填充模式;1,叠加模式 +//num:数值(0~4294967295); +void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) +{ + u8 t,temp; + u8 enshow=0; + for(t=0;t120){x=0;y+=2;} + j++; + } +} +//显示汉字 +void OLED_ShowCHinese(u8 x,u8 y,u8 no) +{ + u8 t,adder=0; + OLED_Set_Pos(x,y); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); + adder+=1; + } + OLED_Set_Pos(x,y+1); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); + adder+=1; + } +} +//显示汉字 +void OLED_ShowCHinese2(u8 x,u8 y,u8 no) +{ + u8 t,adder=0; + OLED_Set_Pos(x,y); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk_tylg[2*no][t],OLED_DATA); + adder+=1; + } + OLED_Set_Pos(x,y+1); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk_tylg[2*no+1][t],OLED_DATA); + adder+=1; + } +} + + +/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ +void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]) +{ + unsigned int j=0; + unsigned char x,y; + + if(y1%8==0) y=y1/8; + else y=y1/8+1; + for(y=y0;y +0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ? +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [ +0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55 +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _ +0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// ' +0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a +0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z +0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines +}; + +unsigned char code Hzk_tylg[][32]={ + + +///16x2 +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, +{0x80,0x80,0x40,0x20,0x10,0x0C,0x13,0x60,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},/*"太",0*/ +/* (16 X 16 , 新宋体 )*/ + +{0x00,0x00,0xFE,0x02,0x02,0xF2,0x92,0x9A,0x96,0x92,0x92,0xF2,0x02,0x02,0x02,0x00}, +{0x80,0x60,0x1F,0x40,0x20,0x17,0x44,0x84,0x7C,0x04,0x04,0x17,0x20,0x40,0x00,0x00},/*"原",1*/ +/* (16 X 16 , 新宋体 )*/ + +{0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0xFE,0x00,0x00}, +{0x20,0x60,0x20,0x1F,0x10,0x10,0x40,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x40,0x00},/*"理",2*/ +/* (16 X 16 , 新宋体 )*/ + +{0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00}, +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"工",3*/ +/* (16 X 16 , 新宋体 )*/ + +{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}, +{0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00},/*"大",4*/ +/* (16 X 16 , 新宋体 )*/ + +{0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00}, +{0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00},/*"学",5*/ +/* (16 X 16 , 新宋体 )*/ + + + + +}; + + + +////PCtoLCD2002完美版 列行 阴码 逆向 两行 +unsigned char code char8X16[]= +{ +/* + + 从第一列开始向下 + 取8个点作为一个字节 + ,然后从第二列开始向 + 下取8个点作为第二个 + 字节...依此类推。如 + 果最后不足8个点就补 + 满8位。 + 取模顺序是从低到 + 高,即第一个点作为最 + 低位。如*-------取 + 为00000001 + (0) + !(1) + "(2) + #(3) + $(4) + %(5) + &(6) + '(7) + ((8) + )(9) + *(10) + +(11) + ,(12) + -(13) + .(14) + /(15) + 0(16) + 1(17) + 2(18) + 3(19) + 4(20) + 5(21) + 6(22) + 7(23) + 8(24) + 9(25) + :(26) + ;(27) + <(28) + =(29) + >(30) + ?(31) + @(32) + A(33) + B(34) + C(35) + D(36) + E(37) + F(38) + G(39) + H(40) + I(41) + J(42) + K(43) + L(44) + M(45) + N(46) + O(47) + P(48) + Q(49) + R(50) + S(51) + T(52) + U(53) + V(54) + W(55) + X(56) + Y(57) + Z(58) + [(59) + \(60) + ](61) + ^(62) + _(63) + `(64) + a(65) + b(66) + c(67) + d(68) + e(69) + f(70) + g(71) + h(72) + i(73) + j(74) + k(75) + l(76) + m(77) + n(78) + o(79) + p(80) + q(81) + r(82) + s(83) + t(84) + u(85) + v(86) + w(87) + x(88) + y(89) + z(90) + {(91) + |(92) + }(93) + ~(94) + */ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,/*"!",1*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x10,0x0C,0x02,0x10,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x40,0xC0,0x78,0x40,0xC0,0x78,0x00,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x00,/*"#",3*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x70,0x88,0x88,0xFC,0x08,0x30,0x00,0x00,0x18,0x20,0x20,0xFF,0x21,0x1E,0x00,/*"$",4*/ + /* (8 X 16 , 宋体 )*/ + + 0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00,/*"%",5*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10,/*"&",6*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,/*"(",8*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,/*")",9*/ + /* (8 X 16 , 宋体 )*/ + + 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",10*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01,/*"+",11*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00,/*",",12*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,/*"-",13*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/*".",14*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00,/*"/",15*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",16*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",17*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",18*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",19*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",20*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",21*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",22*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",23*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",24*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",25*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*":",26*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,/*";",27*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,/*"<",28*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"=",29*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,/*">",30*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x70,0x48,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x30,0x37,0x00,0x00,0x00,/*"?",31*/ + /* (8 X 16 , 宋体 )*/ + + 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x28,0x2F,0x28,0x17,0x00,/*"@",32*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,/*"A",33*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,/*"B",34*/ + /* (8 X 16 , 宋体 )*/ + + 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,/*"C",35*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",36*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,/*"E",37*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,/*"F",38*/ + /* (8 X 16 , 宋体 )*/ + + 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,/*"G",39*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",40*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"I",41*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,/*"J",42*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,/*"K",43*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,/*"L",44*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x01,0x3E,0x01,0x3F,0x20,0x00,/*"M",45*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",46*/ + /* (8 X 16 , 宋体 )*/ + + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",47*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,/*"P",48*/ + /* (8 X 16 , 宋体 )*/ + + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x28,0x28,0x30,0x50,0x4F,0x00,/*"Q",49*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,/*"R",50*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,/*"S",51*/ + /* (8 X 16 , 宋体 )*/ + + 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",52*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"U",53*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,/*"V",54*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",55*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,/*"X",56*/ + /* (8 X 16 , 宋体 )*/ + + 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"Y",57*/ + /* (8 X 16 , 宋体 )*/ + + 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,/*"Z",58*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,/*"[",59*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x04,0x38,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,/*"\",60*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,/*"]",61*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,/*"_",63*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,/*"a",65*/ + /* (8 X 16 , 宋体 )*/ + + 0x10,0xF0,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"b",66*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,/*"c",67*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x90,0xF0,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"d",68*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00,/*"e",69*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x80,0x80,0xE0,0x90,0x90,0x20,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"f",70*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,/*"g",71*/ + /* (8 X 16 , 宋体 )*/ + + 0x10,0xF0,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"h",72*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"i",73*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,/*"j",74*/ + /* (8 X 16 , 宋体 )*/ + + 0x10,0xF0,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x06,0x29,0x30,0x20,0x00,/*"k",75*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"l",76*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,/*"m",77*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,/*"n",78*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,/*"o",79*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0x91,0x20,0x20,0x11,0x0E,0x00,/*"p",80*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0x91,0xFF,0x80,/*"q",81*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,/*"r",82*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,/*"s",83*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00,/*"t",84*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,/*"u",85*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x03,0x0C,0x30,0x0C,0x03,0x00,0x00,/*"v",86*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x00,0x80,0x80,0x00,0x80,0x80,0x01,0x0E,0x30,0x0C,0x07,0x38,0x06,0x01,/*"w",87*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x20,0x31,0x0E,0x2E,0x31,0x20,0x00,/*"x",88*/ + /* (8 X 16 , 宋体 )*/ + + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x81,0x86,0x78,0x18,0x06,0x01,0x00,/*"y",89*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,/*"z",90*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x02,0x00,0x00,0x00,0x00,0x01,0x3E,0x40,0x40,/*"{",91*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,/*"|",92*/ + /* (8 X 16 , 宋体 )*/ + + 0x02,0x02,0xFC,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x3E,0x01,0x00,0x00,0x00,0x00,/*"}",93*/ + /* (8 X 16 , 宋体 )*/ + + 0x00,0x02,0x01,0x02,0x02,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/ + /* (8 X 16 , 宋体 )*/ + + + +}; + +////PCtoLCD2002完美版 列行 阴码 逆向 两行 + unsigned char code char16X32[]= + { +/* + (0) + !(1) + "(2) + #(3) + $(4) + %(5) + &(6) + '(7) + ((8) + )(9) + *(10) + +(11) + ,(12) + -(13) + .(14) + /(15) + 0(16) + 1(17) + 2(18) + 3(19) + 4(20) + 5(21) + 6(22) + 7(23) + 8(24) + 9(25) + :(26) + ;(27) + <(28) + =(29) + >(30) + ?(31) + @(32) + A(33) + B(34) + C(35) + D(36) + E(37) + F(38) + G(39) + H(40) + I(41) + J(42) + K(43) + L(44) + M(45) + N(46) + O(47) + P(48) + Q(49) + R(50) + S(51) + T(52) + U(53) + V(54) + W(55) + X(56) + Y(57) + Z(58) + [(59) + \(60) + ](61) + ^(62) + _(63) + `(64) + a(65) + b(66) + c(67) + d(68) + e(69) + f(70) + g(71) + h(72) + i(73) + j(74) + k(75) + l(76) + m(77) + n(78) + o(79) + p(80) + q(81) + r(82) + s(83) + t(84) + u(85) + v(86) + w(87) + x(88) + y(89) + z(90) + {(91) + |(92) + }(93) + ~(94) + +*/ + + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,////Y = 0 X+16 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,////Y = 1 X+16 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,////Y = 2 X+16 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/////Y = 3 X+16 + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",1*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0xE0,0x78,0x3C,0x1C,0x80,0xE0,0x78,0x3C,0x1C,0x00,0x00,0x00, + 0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00, + 0x00,0x38,0x38,0x38,0xF8,0x3F,0x38,0x38,0x38,0x38,0x38,0xF8,0x3F,0x38,0x38,0x00, + 0x00,0x70,0x70,0xF0,0xFF,0x70,0x70,0x70,0x70,0x70,0xF0,0xFF,0x70,0x70,0x70,0x00, + 0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,/*"#",3*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x80,0x40,0xF0,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x1E,0x7F,0xF0,0xC0,0xFF,0x00,0x00,0x0C,0x0F,0x0F,0x00,0x00,0x00, + 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x01,0xFF,0x07,0x07,0x1E,0xFC,0xF0,0x00,0x00,0x00, + 0x00,0x00,0x03,0x07,0x04,0x08,0x08,0x7F,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,/*"$",4*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x80,0xC0,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00, + 0x7E,0xFF,0x00,0x00,0x00,0xFF,0x7E,0x00,0xE0,0x1C,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x03,0x02,0x83,0x61,0x1C,0x03,0xF8,0xFE,0x03,0x01,0x03,0xFE,0xF8,0x00, + 0x00,0x00,0x00,0x0C,0x03,0x00,0x00,0x00,0x01,0x07,0x0C,0x08,0x0C,0x07,0x01,0x00,/*"%",5*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x7F,0xFF,0xC0,0x80,0x60,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xFC,0x03,0x03,0x0F,0x3E,0x78,0xE0,0x80,0x81,0x71,0x0F,0x01,0x01,0x00,0x00, + 0x01,0x03,0x06,0x0C,0x08,0x08,0x08,0x05,0x03,0x07,0x0E,0x0C,0x0C,0x06,0x03,0x00,/*"&",6*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x1C,0x1C,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x30,0x08,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFC,0x0F,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0C,0x18,0x20,0x40,0x00,/*"(",8*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x04,0x08,0x30,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x20,0x18,0x0C,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*")",9*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x18,0x38,0x30,0x60,0x40,0x86,0xFF,0x8F,0x40,0x60,0x30,0x38,0x18,0x00, + 0x00,0x00,0x18,0x1C,0x0C,0x06,0x02,0xF1,0xFF,0xE1,0x02,0x06,0x0C,0x1C,0x18,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"*",10*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"+",11*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0xC7,0x47,0x3F,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*",",12*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",14*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x18,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x1C,0x07,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0x70,0x1C,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x30,0x1C,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"/",15*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xF0,0xFE,0x0F,0x01,0x00,0x00,0x00,0x00,0x01,0x07,0xFE,0xF0,0x00,0x00, + 0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0x00, + 0x00,0x00,0x00,0x01,0x03,0x06,0x0C,0x08,0x08,0x08,0x06,0x03,0x01,0x00,0x00,0x00,/*"0",16*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x0C,0x0F,0x0F,0x0C,0x08,0x08,0x08,0x00,0x00,0x00,/*"1",17*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00, + 0x00,0x00,0x1E,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x3E,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x18,0x0C,0x06,0x03,0x01,0x00,0xC0,0x00,0x00, + 0x00,0x00,0x0E,0x0D,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0E,0x03,0x00,0x00,/*"2",18*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00,0x00, + 0x00,0x00,0xC0,0xC0,0x00,0x00,0x01,0x01,0x01,0x03,0x02,0x06,0xFC,0xF0,0x00,0x00, + 0x00,0x00,0x03,0x07,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x00,0x00,0x00,/*"3",19*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x0C,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x30,0x2C,0x26,0x21,0x20,0x20,0x20,0x20,0xFF,0xFF,0x20,0x20,0x20,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x00,0x00,/*"4",20*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0xC0,0xC3,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00, + 0x00,0x00,0x03,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x07,0x03,0x00,0x00,0x00,/*"5",21*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00, + 0x00,0x00,0xE0,0xFC,0x07,0x81,0xC0,0x40,0x40,0x40,0xC0,0x83,0x03,0x00,0x00,0x00, + 0x00,0x00,0x7F,0xFF,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFC,0x00,0x00, + 0x00,0x00,0x00,0x01,0x07,0x06,0x0C,0x08,0x08,0x08,0x0C,0x06,0x03,0x00,0x00,0x00,/*"6",22*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, + 0x00,0x00,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x06,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",23*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x3E,0x7F,0xF1,0xC0,0xC0,0x80,0x00,0x00,0x80,0x41,0x7F,0x1E,0x00,0x00, + 0x00,0xF0,0xFC,0x0E,0x02,0x01,0x01,0x01,0x03,0x07,0x0E,0x1E,0xFC,0xF0,0x00,0x00, + 0x00,0x01,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x01,0x00,0x00,/*"8",24*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFC,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFE,0xF8,0x00,0x00, + 0x00,0x01,0x03,0x07,0x0C,0x08,0x08,0x08,0x08,0x04,0x06,0xE1,0x7F,0x1F,0x00,0x00, + 0x00,0x00,0x07,0x07,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,/*"9",25*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*":",26*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*";",27*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x03,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x00,0x00,/*"<",28*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"=",29*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x03,0x00,0x00,0x00, + 0x00,0x00,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*">",30*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00, + 0x00,0x00,0x3C,0x3F,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x03,0x01,0x01,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*"?",31*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00, + 0x00,0xE0,0xFC,0x0E,0x03,0x81,0xE0,0x78,0x0C,0x04,0xF8,0x3C,0x01,0x06,0xF8,0x00, + 0x00,0x1F,0xFF,0xC0,0x00,0x3F,0x7F,0x40,0x20,0x3C,0x7F,0x40,0x20,0x18,0x87,0x00, + 0x00,0x00,0x00,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x00,0x00,/*"@",32*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0x7C,0x03,0x03,0x3F,0xFC,0x80,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0x7C,0x0F,0x08,0x08,0x08,0x08,0x0B,0x7F,0xF8,0x80,0x00,0x00,0x00, + 0x08,0x0C,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x0C,0x08,0x00,/*"A",33*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x06,0xFC,0xF0,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x01,0x00,/*"B",34*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0x80,0x80,0x80,0x00,0x00, + 0x00,0xE0,0xFC,0x1E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0E,0x00, + 0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00, + 0x00,0x00,0x00,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x00,0x00,/*"C",35*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0xFC,0xF0,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x0C,0x04,0x03,0x03,0x00,0x00,0x00,/*"D",36*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xC0,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x00,0x01,0x06,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x03,0x0F,0x00,0x00,0x80,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x0E,0x01,0x00,/*"E",37*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xC0,0xC0,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x00,0x01,0x06,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x03,0x1F,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"F",38*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00, + 0x00,0xE0,0xFC,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0E,0x00,0x00,0x00, + 0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0xFC,0x04,0x04,0x00, + 0x00,0x00,0x00,0x03,0x06,0x0C,0x08,0x08,0x08,0x08,0x04,0x03,0x03,0x00,0x00,0x00,/*"G",39*/ + /* (16 X 32 , 宋体 )*/ + + 0x40,0x40,0xC0,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x40,0x40,0xC0,0xC0,0x40,0x40, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00, + 0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,/*"H",40*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,0x00,/*"I",41*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x70,0xF0,0xF0,0x80,0x80,0x80,0xC0,0x60,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,/*"J",42*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x00,0x00,0x40,0xC0,0xC0,0x40,0x40,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x80,0xE0,0x18,0x06,0x03,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x03,0x00,0x03,0x0F,0x3C,0xF0,0xC0,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x09,0x0F,0x0E,0x08,0x08,0x00,/*"K",43*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x0E,0x01,0x00,/*"L",44*/ + /* (16 X 32 , 宋体 )*/ + + 0x40,0x40,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x40,0x40, + 0x00,0x00,0xFF,0x0F,0xFF,0xF0,0x00,0x00,0x00,0x80,0x78,0x07,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x01,0x1F,0xFE,0xC0,0xF0,0x0F,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x08,0x08,0x0F,0x08,0x00,0x00,0x03,0x0F,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,/*"M",45*/ + /* (16 X 32 , 宋体 )*/ + + 0x40,0x40,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0xC0,0x40,0x40, + 0x00,0x00,0xFF,0x01,0x07,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0xE0,0x80,0xFF,0x00,0x00, + 0x08,0x08,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0F,0x00,0x00,/*"N",46*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00, + 0x00,0xF0,0xFC,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0xFC,0xE0,0x00, + 0x00,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x3F,0x00, + 0x00,0x00,0x00,0x03,0x06,0x04,0x08,0x08,0x08,0x08,0x04,0x06,0x03,0x00,0x00,0x00,/*"O",47*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0xFF,0x7E,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"P",48*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00, + 0x00,0xF0,0xFC,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0xFC,0xF0,0x00, + 0x00,0x3F,0xFF,0x80,0x80,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x80,0xFF,0x3F,0x00, + 0x00,0x00,0x01,0x03,0x07,0x04,0x08,0x08,0x08,0x0F,0x3F,0x76,0x63,0x61,0x10,0x00,/*"Q",49*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0xC1,0x7F,0x3E,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x07,0x3F,0xF9,0xC0,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x01,0x0F,0x0E,0x08,0x08,0x00,/*"R",50*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0xC0,0x00,0x00,0x00, + 0x00,0x3E,0x7F,0xE1,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x03,0x0F,0x00,0x00,0x00, + 0x00,0xE0,0x80,0x00,0x00,0x01,0x01,0x03,0x03,0x07,0x06,0x1E,0xFC,0xF0,0x00,0x00, + 0x00,0x00,0x0F,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,/*"S",51*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0xC0,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,0x40,0xC0,0x00,0x00, + 0x00,0x06,0x01,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0x07,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,/*"T",52*/ + /* (16 X 32 , 宋体 )*/ + + 0x40,0x40,0xC0,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x40,0x40,0xC0,0x40,0x40,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x01,0x07,0x06,0x0C,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x00,0x00,0x00,/*"U",53*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x00,0x00,0x00,0x00,0x00,0x40,0xC0,0xC0,0x40,0x00, + 0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,0x80,0x78,0x07,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF0,0x80,0x78,0x07,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"V",54*/ + /* (16 X 32 , 宋体 )*/ + + 0x40,0xC0,0xC0,0x40,0x00,0x00,0x40,0xC0,0xC0,0x40,0x00,0x00,0x40,0xC0,0xC0,0x40, + 0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0xF3,0xFF,0xF8,0x00,0x00,0xC0,0x3F,0x00,0x00, + 0x00,0x00,0x00,0x3F,0xFC,0xE0,0x1E,0x01,0x01,0xFF,0xFC,0xF0,0x0F,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x0F,0x03,0x00,0x00,0x00,0x00,0x0F,0x01,0x00,0x00,0x00,0x00,/*"W",55*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xC0,0x40,0x00,0x00,0x00,0x00,0x40,0x40,0xC0,0x40,0x40,0x00, + 0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0xE0,0xC0,0x30,0x0C,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x0F,0x7C,0xF0,0xC0,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0E,0x0B,0x08,0x00,0x00,0x00,0x00,0x09,0x0F,0x0E,0x0C,0x08,0x00,/*"X",56*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0xC0,0xC0,0xC0,0x40,0x40,0x00,0x00,0x00,0x40,0x40,0xC0,0x40,0x40,0x00, + 0x00,0x00,0x00,0x03,0x1F,0x7C,0xE0,0x80,0x00,0x80,0x70,0x0E,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFE,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0x00,/*"Y",57*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0xC0,0xC0,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0xC0,0x40,0x00, + 0x00,0x00,0x06,0x03,0x01,0x00,0x00,0x00,0xC0,0xF0,0x38,0x0E,0x07,0x01,0x00,0x00, + 0x00,0x00,0x00,0x80,0xC0,0x70,0x3C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x00, + 0x00,0x08,0x0E,0x0F,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x0C,0x0F,0x01,0x00,/*"Z",58*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,/*"[",59*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x60,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x0F,0x3C,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x3C,0xF0,0xC0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x3E,0x78,0x40,0x00,/*"\",60*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*"]",61*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x20,0x10,0x1C,0x0C,0x0C,0x0C,0x18,0x20,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,/*"_",63*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x04,0x04,0x04,0x0C,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00, + 0x00,0xC0,0xE3,0x33,0x10,0x18,0x08,0x08,0x08,0x08,0x04,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x03,0x07,0x0C,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x07,0x0F,0x08,0x08,0x06,/*"a",65*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x80,0x40,0x20,0x20,0x20,0x60,0xC0,0xC0,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x0F,0x07,0x06,0x08,0x08,0x08,0x08,0x0C,0x06,0x03,0x00,0x00,0x00,/*"b",66*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0xC0,0x60,0x20,0x20,0x20,0x20,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x80,0x00,0x00, + 0x00,0x00,0x00,0x03,0x07,0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x01,0x00,0x00,/*"c",67*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0xC0,0xE0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x40,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x03,0x06,0x0C,0x08,0x08,0x08,0x04,0x02,0x0F,0x07,0x04,0x04,0x00,/*"d",68*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0x40,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0xFE,0xFF,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0x1E,0x00,0x00, + 0x00,0x00,0x00,0x03,0x07,0x04,0x0C,0x08,0x08,0x08,0x08,0x04,0x06,0x01,0x00,0x00,/*"e",69*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x00, + 0x00,0x00,0x20,0x20,0x20,0x20,0xFE,0xFF,0x20,0x20,0x20,0x20,0x20,0x03,0x03,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,/*"f",70*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0x40,0x20,0x20,0x20,0x20,0x60,0xC0,0xA0,0x60,0x60,0x00, + 0x00,0x00,0x00,0xC7,0xFF,0x30,0x20,0x20,0x20,0x20,0x30,0x1F,0x0F,0x00,0x00,0x00, + 0x00,0x00,0x38,0x7D,0x47,0x83,0x83,0x83,0x83,0x83,0x82,0x46,0x7E,0x3C,0x00,0x00,/*"g",71*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x80,0x40,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,/*"h",72*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0xE1,0xF1,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,0x00,/*"i",73*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0xE1,0xF1,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x60,0xE0,0x80,0x80,0x80,0x80,0x60,0x3F,0x1F,0x00,0x00,0x00,0x00,/*"j",74*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x40,0x40,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x20,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x30,0x18,0x0C,0x3E,0x71,0xC0,0x80,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x00,0x09,0x0F,0x0E,0x0C,0x08,0x00,/*"k",75*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,0x00,/*"l",76*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0xE0,0xF0,0x40,0x20,0x20,0x20,0xE0,0xC0,0x40,0x20,0x20,0x20,0xE0,0xC0,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00, + 0x08,0x0F,0x0F,0x08,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x08,0x0F,0x0F,0x08,/*"m",77*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x40,0xC0,0xE0,0x80,0x40,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,/*"n",78*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xC0,0x40,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00, + 0x00,0x00,0x00,0x03,0x07,0x04,0x08,0x08,0x08,0x08,0x04,0x07,0x03,0x00,0x00,0x00,/*"o",79*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x40,0xC0,0xE0,0x80,0x40,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00, + 0x00,0x80,0x80,0xFF,0xFF,0x86,0x84,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,/*"p",80*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x60,0xC0,0xC0,0xE0,0x00,0x00,0x00, + 0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x03,0x06,0x0C,0x08,0x08,0x08,0x84,0x86,0xFF,0xFF,0x80,0x80,0x00,/*"q",81*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x40,0x40,0x40,0xE0,0xE0,0x00,0x80,0x40,0x40,0x20,0x20,0xE0,0xC0,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,/*"r",82*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x40,0xC0,0xE0,0x00,0x00, + 0x00,0x00,0x00,0x80,0x07,0x0F,0x0C,0x18,0x18,0x38,0x30,0x70,0xE0,0xC3,0x00,0x00, + 0x00,0x00,0x00,0x0F,0x06,0x04,0x08,0x08,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,0x00,/*"s",83*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x20,0x20,0x20,0x30,0xF8,0xFF,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x0C,0x08,0x08,0x08,0x04,0x03,0x00,0x00,/*"t",84*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x20,0x20,0xE0,0xF0,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x03,0x07,0x0C,0x08,0x08,0x08,0x04,0x02,0x0F,0x07,0x04,0x04,0x00,/*"u",85*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0xE0,0x60,0x20,0x00, + 0x00,0x00,0x00,0x01,0x07,0x3E,0xF0,0xC0,0x00,0xC0,0x38,0x07,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*"v",86*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x60,0xE0,0x20,0x20,0x00,0x20,0xE0,0xE0,0x20,0x00,0x00,0x20,0xE0,0x60,0x20, + 0x00,0x00,0x07,0x7F,0xF0,0x80,0xF0,0x0F,0x1F,0xFC,0xC0,0xC0,0x3C,0x03,0x00,0x00, + 0x00,0x00,0x00,0x00,0x07,0x0F,0x00,0x00,0x00,0x01,0x0F,0x03,0x00,0x00,0x00,0x00,/*"w",87*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x20,0x20,0xE0,0xE0,0xA0,0x00,0x00,0x20,0x20,0xE0,0x20,0x20,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x81,0x47,0x3E,0x38,0xE6,0xC1,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x08,0x0C,0x0E,0x09,0x00,0x00,0x00,0x08,0x09,0x0F,0x0E,0x08,0x08,0x00,/*"x",88*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x20,0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x20,0x00, + 0x00,0x00,0x00,0x00,0x03,0x1E,0x78,0xC0,0x00,0xE0,0x1C,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0x60,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"y",89*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0xE0,0x60,0x00,0x00,0x00, + 0x00,0x00,0x03,0x00,0x80,0xC0,0xF0,0x38,0x1E,0x07,0x03,0x00,0x00,0x80,0x00,0x00, + 0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x08,0x08,0x08,0x0C,0x0E,0x03,0x00,0x00,/*"z",90*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x04,0x04,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x7F,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0xFC,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x40,0x00,0x00,/*"{",91*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"|",92*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x00,0x00,0x04,0x04,0x08,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x40,0x40,0x20,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"}",93*/ + /* (16 X 32 , 宋体 )*/ + + 0x00,0x18,0x04,0x02,0x02,0x02,0x06,0x0C,0x38,0x20,0x60,0x40,0x40,0x20,0x18,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/ + /* (16 X 32 , 宋体 )*/ + + + + + }; + + +#endif + + + diff --git a/source/bsp/oled/bsp_oled.c b/source/bsp/oled/bsp_oled.c new file mode 100644 index 0000000..2dc31e0 --- /dev/null +++ b/source/bsp/oled/bsp_oled.c @@ -0,0 +1,787 @@ +///#include "bsp_485.h" +///#include "tpc_debug.h" +////#include "tpc_x.h" +#include "c_lib.h" +#include "bsp_oled.h" +#include "debug_drv.h" +#include "bsp_font.h" +#include "bmp.h" +TS_oled_ ts_oled; + +void L2_OLED_oht_init(void) +{ + + printf("\r\n xy "); + + ///显示血氧 + L1_OLED_ShowChar(0,2,'X',D_8X16); + L2_OLED_Showint2_16X32(1,0,78); + L1_OLED_ShowChar(8*8,2,'H',D_8X16); + L2_OLED_Showint3_16X32(5,0,123); + + + ////显示温度示意 + L2_OLED_Show_sint21_6X8(8*6,0,25); +/******* + Lc_delay_ms(1000); + L2_OLED_Show_sint21_6X8(8*6,0,156);Lc_delay_ms(1000); + L2_OLED_Show_sint21_6X8(8*6,0,3);Lc_delay_ms(1000); + L2_OLED_Show_sint21_6X8(8*6,0,-3);Lc_delay_ms(1000); + L2_OLED_Show_sint21_6X8(8*6,0,-888);Lc_delay_ms(1000); + ******/ + + L1_OLED_ShowChar(0,0,'O',D_6X8);////表示没有入网成功 + + + L1_OLED_ShowChar(6,0,'1',D_6X8);///发送一个数据累加一个 + //L1_OLED_ShowChar(12,0,'2',D_6X8); +//// L1_OLED_ShowChar(18,0,'3',D_6X8); + +} + + +void L2_OLED_init_show(void) +{ +u8 hang,lie; + L0_OLED_io_int(); + printf("L0_OLED_io_int"); + Lc_memset(ts_oled.d,0,10); + L1_OLED_Init(); //初始化OLED +/// OLED_ShowNum(); +/// L2_OLED_ShowString(0,0,"0.91OLEDTEST",8); + +/// L2_OLED_ShowString(0,0,"12345678",16); + +// delay_ms(3000); + +/// L2_OLED_Clear(); + ///打印太原理工 + L1_OLED_ShowCHinese16X16(4,1,0);// + L1_OLED_ShowCHinese16X16(22,1,1);// + L1_OLED_ShowCHinese16X16(40,1,2);// + L1_OLED_ShowCHinese16X16(58,1,3);// + L1_OLED_ShowCHinese16X16(76,1,4);// + L1_OLED_ShowCHinese16X16(94,1,5);// + + Lc_delay_ms(200); + //// 888刷屏 + for(lie = 0;lie < 16*8;lie += 8) + { + for(hang = 0;hang < 3;hang +=2) + { + L1_OLED_ShowChar(lie,hang,'8',D_8X16);////16lie 2hang + ///Lc_delay_ms(3); + } + } + +/* + /// delay_ms(1000); + Lc_delay_ms(400); + L2_OLED_Clear(); + L1_OLED_ShowChar(0,0,'0',D_16X32); + + printf(" 0 "); + Lc_delay_ms(800); + L2_OLED_Clear(); + L1_OLED_ShowChar(1*16,0,'1',D_16X32); + + printf(" 1 "); + Lc_delay_ms(800); + + L2_OLED_Clear(); + L1_OLED_ShowChar(2*16,0,'2',D_16X32); + + printf(" 2 "); + Lc_delay_ms(800); + + Lc_delay_ms(1000); + L2_OLED_Clear(); + L1_OLED_ShowChar(0,0,'0',D_8X16); + Lc_delay_ms(1000); + L2_OLED_Clear(); + L1_OLED_ShowChar(0,0,'0',D_6X8); + Lc_delay_ms(1000); + +///D_8X16 总共3行 0 1 2 + L2_OLED_Clear(); + L2_OLED_Showint3(0,0,120,D_8X16); + Lc_delay_ms(2000); + L2_OLED_Clear(); + L2_OLED_Showint3(0,1,121,D_8X16); + Lc_delay_ms(2000); + L2_OLED_Clear(); + L2_OLED_Showint3(0,2,222,D_8X16);//// + Lc_delay_ms(2000); + + + + L2_OLED_Clear(); + L2_OLED_Showint2(0,0,7,D_8X16); + Lc_delay_ms(2000); + L2_OLED_Clear(); + L2_OLED_Showint2(0,1,17,D_8X16); + Lc_delay_ms(2000); + L2_OLED_Clear(); + L2_OLED_Showint2(0,2,27,D_8X16); + Lc_delay_ms(2000); + + //// 0-14 + L2_OLED_Clear(); + L2_OLED_Show_sint21(8*8,0,178,D_8X16); + Lc_delay_ms(2000); + L2_OLED_Clear(); + L2_OLED_Show_sint21(11*8,0,118,D_8X16);//// 11 12 13 14 11.8 + Lc_delay_ms(2000); + +////16 32字体刷屏 + L2_OLED_Clear(); + printf("\r\n 01 "); + L2_OLED_Showint2_16X32(0,0,12); + Lc_delay_ms(100); + + printf("\r\n 23 "); + L2_OLED_Showint2_16X32(2,0,34); + Lc_delay_ms(100); + + printf("\r\n 45 "); + L2_OLED_Showint2_16X32(4,0,56); + Lc_delay_ms(100); + + printf("\r\n 67 "); + L2_OLED_Showint2_16X32(6,0,78); + +*/ + + + +/////////////////// + L2_OLED_Clear(); + L2_OLED_oht_init(); + +/// Lc_delay_ms(8000); + + +/******** +L1_OLED_ShowChar(8*6,0,'8',D_6X8); +L1_OLED_ShowChar(9*6,0,'9',D_6X8); +L1_OLED_ShowChar(10*6,0,'A',D_6X8); +L1_OLED_ShowChar(11*6,0,'B',D_6X8); +L1_OLED_ShowChar(12*6,0,'C',D_6X8); + + +**/ + +// L1_OLED_ShowChar(0,8,'w',D_6X8); +// L1_OLED_ShowChar(0,9,'w',D_6X8); + + +} + + +void IIC_Start() +{ + + OLED_SCLK_Set() ; + OLED_SDIN_Set(); + OLED_SDIN_Clr(); + OLED_SCLK_Clr(); +} + +/********************************************** +//IIC Stop +**********************************************/ +void IIC_Stop() +{ + + OLED_SCLK_Clr(); + OLED_SDIN_Clr(); + OLED_SDIN_Set(); + OLED_SCLK_Set() ; +} +/********************************************** +// IIC Write byte +**********************************************/ + +void L0_I2C_WR_Byte(unsigned char IIC_Byte) +{ + unsigned char i; + unsigned char m,da; + da=IIC_Byte; + for(i=0;i<8;i++) + { + m=da; + OLED_SCLK_Clr(); + m=m&0x80; + if(m==0x80) + {OLED_SDIN_Set();} + else OLED_SDIN_Clr(); + da=da<<1; + OLED_SCLK_Set(); + } + + OLED_SCLK_Clr(); + OLED_SCLK_Set() ; +} +/********************************************** +// IIC Write Command +void L1_OLED_WR_1D(unsigned char IIC_Command) +{ + IIC_Start(); + L0_I2C_WR_Byte(0x78); //Slave address,SA0=0 + L0_I2C_WR_Byte(0x00); //write command + L0_I2C_WR_Byte(IIC_Command); + IIC_Stop(); +} +**********************************************/ +/********************************************** +// IIC Write Data +void Write_IIC_Data(unsigned char IIC_Data) +{ + IIC_Start(); + L0_I2C_WR_Byte(0x78); //D/C#=0; R/W#=0 + L0_I2C_WR_Byte(0x40); //write data + L0_I2C_WR_Byte(IIC_Data); + IIC_Stop(); +} +**********************************************/ +void L1_OLED_WR_1B(unsigned dat,unsigned cmd) +{ + if(cmd) + { + IIC_Start(); + L0_I2C_WR_Byte(0x78); //D/C#=0; R/W#=0 + L0_I2C_WR_Byte(0x40); //write data + L0_I2C_WR_Byte(dat); + IIC_Stop(); + } + else + { + IIC_Start(); + L0_I2C_WR_Byte(0x78); //Slave address,SA0=0 + L0_I2C_WR_Byte(0x00); //write command + L0_I2C_WR_Byte(dat); + IIC_Stop(); + } +} + + +/******************************************** +// fill_Picture +********************************************/ + + +/***********************Delay**************************** + + +void fill_picture(unsigned char fill_Data) +{ + unsigned char m,n; + for(m=0;m<8;m++) + { + L1_OLED_WR_1B(0xb0+m,0); //page0-page1 + L1_OLED_WR_1B(0x00,0); //low column start address + L1_OLED_WR_1B(0x10,0); //high column start address + for(n=0;n<128;n++) + { + L1_OLED_WR_1B(fill_Data,1); + } + } +} + + + +void Delay_1ms(unsigned int Del_1ms) +{ + unsigned char j; + while(Del_1ms--) + { + for(j=0;j<123;j++); + } +} + + + +***** +void Delay_50ms(unsigned int Del_50ms) +{ + unsigned int m; + for(;Del_50ms>0;Del_50ms--) + for(m=6245;m>0;m--); +} + +*******/ + +//坐标设置 + +void L1_OLED_Set_Pos(unsigned char x, unsigned char y) +{ + L1_OLED_WR_1B(0xb0+y,OLED_CMD); + L1_OLED_WR_1B(((x&0xf0)>>4)|0x10,OLED_CMD); + L1_OLED_WR_1B((x&0x0f),OLED_CMD); +} +//开启OLED显示 +void L2_OLED_Display_On(void) +{ + L1_OLED_WR_1B(0X8D,OLED_CMD); //SET DCDC命令 + L1_OLED_WR_1B(0X14,OLED_CMD); //DCDC ON + L1_OLED_WR_1B(0XAF,OLED_CMD); //DISPLAY ON +} +//关闭OLED显示 +void L2_OLED_Display_Off(void) +{ + L1_OLED_WR_1B(0X8D,OLED_CMD); //SET DCDC命令 + L1_OLED_WR_1B(0X10,OLED_CMD); //DCDC OFF + L1_OLED_WR_1B(0XAE,OLED_CMD); //DISPLAY OFF +} +//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! +void L2_OLED_Clear(void) +{ + u8 i,n; + for(i=0;i<8;i++) + { + L1_OLED_WR_1B (0xb0+i,OLED_CMD); //设置页地址(0~7) + L1_OLED_WR_1B (0x00,OLED_CMD); //设置显示位置—列低地址 + L1_OLED_WR_1B (0x10,OLED_CMD); //设置显示位置—列高地址 + for(n=0;n<128;n++)L1_OLED_WR_1B(0,OLED_DATA); + } //更新显示 +} +/********* +void OLED_On(void) +{ + u8 i,n; + for(i=0;i<8;i++) + { + L1_OLED_WR_1B (0xb0+i,OLED_CMD); //设置页地址(0~7) + L1_OLED_WR_1B (0x00,OLED_CMD); //设置显示位置—列低地址 + L1_OLED_WR_1B (0x10,OLED_CMD); //设置显示位置—列高地址 + for(n=0;n<128;n++)L1_OLED_WR_1B(1,OLED_DATA); + } //更新显示 +} + + + +//m^n函数 +u32 oled_pow(u8 m,u8 n) +{ + u32 result=1; + while(n--)result*=m; + return result; +} + +********/ + + +//在指定位置显示一个字符,包括部分字符 +//x:0~127 +//y:0~32 +//mode:0,反白显示;1,正常显示 +//size:选择字体 16/12 +void L1_OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) +{ + unsigned char c = 0,i = 0,j = 0; + u16 d = 0; + c = chr-' ';//得到偏移后的值 + + if (c> 94) c = 94; + if(x > Max_Column-1){x=0;y=y+2;} + switch (Char_Size) + { + case D_6X8: + L1_OLED_Set_Pos(x,y); + for(i = 0;i < 6;i ++) + L1_OLED_WR_1B(F6x8[c][i],OLED_DATA); + + break; + case D_8X16: + L1_OLED_Set_Pos(x,y); + /// printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); + for(i = 0;i < 8;i ++) + { + d = c;d *= 16;d += i;/////c*16+i + L1_OLED_WR_1B(char8X16[d],OLED_DATA); + /// printf(" %2d_%2X ",(int)d,(int)char8X16[d]); + } + L1_OLED_Set_Pos(x,y+1); + /// printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); + + for(i = 0;i < 8;i ++) + { + d = c;d *= 16;d += i;d += 8;/////c*16+i+8 + L1_OLED_WR_1B(char8X16[d],OLED_DATA); + /// printf(" %2d_%2X ",(int)d,(int)char8X16[d]); + } + break; + case D_16X32: + ///printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); + for(j = 0;j < 4;j ++) + { + L1_OLED_Set_Pos(x,y + j); + ////printf("\r\n(%2d %2d %d) ",(int)x,(int)(y+j),(int)(j)); + for(i = 0;i < 16;i ++) + { + ///d = c*16*4 + i + j*16; + d = c;d *= 64; d += i; d += (j*16); + L1_OLED_WR_1B(char16X32[d],OLED_DATA); + ///printf(" %2d.%2X ",(int)d,(int)char16X32[d]); + } + } + break; + default: + + + break; + } +} + +///char8X16 +void OLED_ShowChar8X16(u8 x,u8 y,u8 chr) +{ + u16 c = 0,i = 0,d = 0; + c = chr - ' '; //得到偏移后的值 + if(x > Max_Column-1){x=0;y=y+2;} + L1_OLED_Set_Pos(x,y); + printf("(%2d %2d) %d %d -",(int)x,(int)y,(int)chr,(int)c); + for(i=0;i<8;i++) + { + L1_OLED_WR_1B(char8X16[c*16+i],OLED_DATA); + d = c*16+i ; + printf(" %2d ",(int)d); + } + L1_OLED_Set_Pos(x,y+1); + printf("(%2d %2d) ",(int)x,(int)y); + for(i=0;i<8;i++) + { + L1_OLED_WR_1B(char8X16[c*16+i+8],OLED_DATA); + d = c*16+i+8; + printf(" %2d ",(int)d); + } +} + +//// +void OLED_ShowChar16X32(u8 x,u8 y,u8 chr) +{ + u16 c = 0,i = 0,j = 0,d = 0; + c = chr - ' '; //得到偏移后的值 + if(x > Max_Column-1){x=0;y=y+2;} + printf("\r\n<%2d %2d> %2X %d - \r\n",(int)x,(int)y,(int)chr,(int)c); + for(j=0;j<4;j++)////4行 8bits + { + L1_OLED_Set_Pos(x,y + j); + printf("\r\n(%2d %2d %d) ",(int)x,(int)(y+j),(int)(j)); + for(i=0;i<16;i++)/// 16列 + { + d = c*16*4 + i + j*16; + L1_OLED_WR_1B(char16X32[d],OLED_DATA); + printf(" %2d.%2X ",(int)d,(int)char16X32[d]); + } + } +} +//显示一个字符号串 +void L2_OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size) +{ + unsigned char j=0; + while (chr[j]!='\0') + { + L1_OLED_ShowChar(x,y,chr[j],Char_Size); + x += 8; + if(x>120) + {x = 0;y += 2;} + j ++; + } +} +//显示汉字 +void L1_OLED_ShowCHinese16X16(u8 x,u8 y,u8 no) +{ + u8 t,adder=0; + L1_OLED_Set_Pos(x,y); + for(t=0;t<16;t++) + { + L1_OLED_WR_1B(Hzk_tylg[2*no][t],OLED_DATA); + adder+=1; + } + L1_OLED_Set_Pos(x,y+1); + for(t=0;t<16;t++) + { + L1_OLED_WR_1B(Hzk_tylg[2*no+1][t],OLED_DATA); + adder+=1; + } +} + +//初始化SSD1306 +void L1_OLED_Init(void) +{ + ///delay_ms(100); + L1_OLED_WR_1B(0xAE,OLED_CMD);//关闭显示 + + L1_OLED_WR_1B(0x40,OLED_CMD);//---set low column address + L1_OLED_WR_1B(0xB0,OLED_CMD);//---set high column address + + L1_OLED_WR_1B(0xC8,OLED_CMD);//-not offset + + L1_OLED_WR_1B(0x81,OLED_CMD);//设置对比度 + L1_OLED_WR_1B(0xff,OLED_CMD); + + L1_OLED_WR_1B(0xa1,OLED_CMD);//段重定向设置 + + L1_OLED_WR_1B(0xa6,OLED_CMD);// + + L1_OLED_WR_1B(0xa8,OLED_CMD);//设置驱动路数 + L1_OLED_WR_1B(0x1f,OLED_CMD); + + L1_OLED_WR_1B(0xd3,OLED_CMD); + L1_OLED_WR_1B(0x00,OLED_CMD); + + L1_OLED_WR_1B(0xd5,OLED_CMD); + L1_OLED_WR_1B(0xf0,OLED_CMD); + + L1_OLED_WR_1B(0xd9,OLED_CMD); + L1_OLED_WR_1B(0x22,OLED_CMD); + + L1_OLED_WR_1B(0xda,OLED_CMD); + L1_OLED_WR_1B(0x02,OLED_CMD); + + L1_OLED_WR_1B(0xdb,OLED_CMD); + L1_OLED_WR_1B(0x49,OLED_CMD); + + L1_OLED_WR_1B(0x8d,OLED_CMD); + L1_OLED_WR_1B(0x14,OLED_CMD); + + L1_OLED_WR_1B(0xaf,OLED_CMD); + L2_OLED_Clear(); +} + + +//在指定位置显示一个字符,包括部分字符 +//x:0~127 +//y:0~31 +//mode:0,反白显示;1,正常显示 +//size:选择字体 16/12 + + + +void L2_OLED_Showint3(u8 x,u8 y,u16 inta,u8 Char_Size) +{ + Lc_int2str_3(inta,ts_oled.d); + L2_OLED_ShowString(x,y,ts_oled.d,Char_Size); +} +void L2_OLED_Showint2(u8 x,u8 y,u16 inta,u8 Char_Size) +{ + Lc_int2str_2(inta,ts_oled.d); + L2_OLED_ShowString(x,y,ts_oled.d,Char_Size); +} + +////-12.3 表示温度 +void L2_OLED_Show_sint21_6X8(u8 x,u8 y,int inta) +{ + Lc_sint2str_2_1(inta,ts_oled.d); + L1_OLED_ShowChar(x,y,ts_oled.d[0],D_6X8); + L1_OLED_ShowChar(x+6,y,ts_oled.d[1],D_6X8); + L1_OLED_ShowChar(x+6+6,y,ts_oled.d[2],D_6X8); + L1_OLED_ShowChar(x+6+6+6,y,ts_oled.d[3],D_6X8); + L1_OLED_ShowChar(x+6+6+6+6,y,ts_oled.d[4],D_6X8); + + + +} + + + +/////0 1 2 3 4 5 6 7 +/////y = 0 +void L2_OLED_Showint2_16X32(u8 x,u8 y,u8 inta) +{ + x *= 16; + Lc_uc2str_2(inta,ts_oled.d); + ////printf("\r\n <%s> %2X %2X", (char*)ts_oled.d, (int)ts_oled.d[1], (int)ts_oled.d[0]); + + L1_OLED_ShowChar(x,y,ts_oled.d[0],D_16X32); + L1_OLED_ShowChar(x+16,y,ts_oled.d[1],D_16X32); +} + + +void L2_OLED_Showint3_16X32(u8 x,u8 y,u8 inta) +{ + x*=16; + Lc_int2str_3(inta,ts_oled.d); + L1_OLED_ShowChar(x,y,ts_oled.d[0],D_16X32); + L1_OLED_ShowChar(x+16,y,ts_oled.d[1],D_16X32); + L1_OLED_ShowChar(x+16+16,y,ts_oled.d[2],D_16X32); +} + + + +#if 0 + + + + +/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ +void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]) +{ + unsigned int j=0; + unsigned char x,y; + + if(y1%8==0) y=y1/8; + else y=y1/8+1; + for(y=y0;y>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + +void crc16qq(unsigned char *CRC,void *dat,unsigned int len) ///reentrant +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + + +#if 0 +void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} +#endif + +#ifdef D_use_crc16 +/* +CRC码的步骤为: + +(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器; + +(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器; + +(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位; + +(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; + +(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; + +(6).重复步骤2到步骤5,进行下一个8位数据的处理; + +(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H) + +*/ + + +/*****************crc校验**********************************************/ + +//crc生成函数,并将crc存储在预先定于的数组中 + +//调用方式crc16(指向数据的指针,需要校验的数据长度) + +unsigned char CRC[2];//定义数组 + +void crc16(unsigned char *ptr,unsigned int len) +{ + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} +code U8 auchCRCHi[]= +{ +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40 +}; + +code U8 auchCRCLo[] = +{ +0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, +0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, +0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, +0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, +0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, +0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, +0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, +0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, +0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, +0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, +0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, +0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, +0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, +0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, +0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, +0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, +0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, +0x40 +}; + +U16 N_CRC16(U8 *updata,U8 len) +{ + U8 uchCRCHi=0xff; + U8 uchCRCLo=0xff; + U8 uindex; + while(len--) + { + uindex = uchCRCHi^*updata++; + uchCRCHi = uchCRCLo^auchCRCHi[uindex]; + uchCRCLo = auchCRCLo[uindex]; + } + return (uchCRCHi<<8 | uchCRCLo); +} + +#endif + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/clib/c_crc.h b/source/clib/c_crc.h new file mode 100644 index 0000000..a0a1e5c --- /dev/null +++ b/source/clib/c_crc.h @@ -0,0 +1,26 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _C_CRC_H_ +#define _C_CRC_H_ + + +#include +#include +#include "c_type51.h" +extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; +//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); +void crc16qq(unsigned char *CRC,void *dat,unsigned int len); + + +#endif /* end _C_CRC_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/c_delay.c b/source/clib/c_delay.c new file mode 100644 index 0000000..8c97bf3 --- /dev/null +++ b/source/clib/c_delay.c @@ -0,0 +1,46 @@ +/***************************************************************************** + * uart.c: UART API file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ + + +#include "c_type51.h" +#include "c_delay.h" +extern void Delay100us(); + +extern void Delay1ms(); + +extern void Delay1us(); + + + + +void Lc_delay_us(vU16 i) +{ + vU16 m; + for(m=i;m>0;m--) + { + Delay1us(); + } +} + + +void Lc_delay_ms(vU16 i) +{ + vU16 m;///,n; + for(m=i;m>0;m--) + { + Delay1ms(); + } +} +/****************************************************************************** + +** End Of File +******************************************************************************/ + diff --git a/source/clib/c_delay.h b/source/clib/c_delay.h new file mode 100644 index 0000000..424b0b7 --- /dev/null +++ b/source/clib/c_delay.h @@ -0,0 +1,29 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _C_DELAY_H_ +#define _C_DELAY_H_ + + + +#include "c_type51.h" + +extern void Lc_delay_us(vU16 i); +extern void Lc_delay_ms(vU16 i); +#define Lc_delay_100us Delay100us + + ///Delay_100us + + + +#endif /* end __UART_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/c_lib.c b/source/clib/c_lib.c new file mode 100644 index 0000000..931bb4b --- /dev/null +++ b/source/clib/c_lib.c @@ -0,0 +1,1828 @@ +/***************************************************************************** + * uart.c: UART API file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + ///cc 2023/04/08--11:25:5 Lc_buf_from_const_uc + * +******************************************************************************/ + + +#include "c_type51.h" +#include "c_lib.h" +///#include "../msp/msp_uart0.h" +////#include "../msp/time.h" +#include + + +code vU16 us2fun2[5] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000// 4 + +}; + + + +code vU32 ul2fun2[10] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000,// 4 +100000, +1000000, +10000000, +100000000, +1000000000,//9 +}; + +#if 0 + +同样是转义字符,\n 的作用相当于“Enter”键,而想退回去就可以用“Backspace”键,也就是\b +这里还有一个可能用到的转义字符是\r :使光标回退到本行开头 + \b 退格 + \n 换行 0x0A + \f 走纸 + \t 水平制表 + \v 垂直制表 + +\r 0x0d + +//如果追求内存紧张加上const INT32U ul2fun2[10] + + +void Lc_float2str(float f,U8 *str,U8 point_num); +{ + S32 i = 0; U32 u32i = 0; + U8 n = 0;U8 m = 0;U8 d = 0; + switch(point_num) + { + case 0: + + break; + case 1: + f *= 10.; + + break; + case 2: + f *= 100.; + + break; + case 3: + f *= 1000.; + + break; + default: + + break; + }; + i = (S32)f; +// Lc_float2str(1.23,&d,2) +// Lc_float2str(0.23,&d,2) +// Lc_float2str(23.4,&d,1) +// Lc_float2str(-12345.236,&d,2) + // 1,1.2 12.3 240 0.12 + if(i < 0) + { + str[n] = '-'; + n ++; + i *= -1; + } + u32i = (U32)i; + m = 4; + if(u32i >= ul2fun2[m]) u32i = ul2fun2[m] - 1; + for(m = 0;m > 4;m ++) + {// 43210 + d = (u32i /ul2fun2[m])%10; + if (d > 0) + str[n] = d; + n ++; + } + + if (n == point_num) + { + str[n] ='.'; + n ++; + } + + + str[n] = i%10 + +} + + +#endif + + +U32 Abs2(S32 a) +{ + if(a < 0) + { + a = -a; + } + return a; +} + +///despiking 削峰 +void Lc_despiking_shift3_U16(vU16 *m) +{///只要中间的数据同时大于或小于两边的数据,则去掉 + if(m[1] >= m[0]) + { + if(m[1] > m[2]) + { + m[1] = m[0]; + } + }else if(m[1] < m[0]) + { + if(m[1] < m[2]) + { + m[1] = m[0]; + } + }else + { + + } +} + +int libc_strlen(char *str) +{ + char *tmp = str; + while(*tmp++) + ; + return tmp - str - 1; +} + +U8* Lc_strcpy(U8* dst,const char* str) +{ + U8 *p = dst; + while(*dst++ = *str++); + return p; +} + + +U8 Lc_strStartsWith(U8 *s1,U8 *s2) +{ + while(*s1 && *s2) + { + if(*s1++ != *s2++) + { + return 0; + } + } + return (*s2 == 0); +} + + +int hexToDec(const char *source) +{ + int sum = 0; + long t = 1; + int i,len; + + len = Lc_strlen(source); + for(i=len-1; i>=0; i--) + { + sum += t * getIndexOfSigns(*(source + i)); + t *= 16; + } + + return sum; + +} +unsigned char hex_to_char(unsigned char hex) +{ + if((hex>=0x30)&&(hex<=0x39)) + hex = hex-0x30; + else if((hex>=0x41)&&(hex<=0x5A)) // capital + hex = 'A' + (hex - 0x41); + else if((hex>=0x61)&&(hex<=0x7A)) // little case + hex = 'a' + (hex - 0x61); + else + hex = 0xff; + return hex; +} + +int getIndexOfSigns(char ch) +{ + if(ch >= '0' && ch <= '9') + { + return ch - '0'; + } + if(ch >= 'A' && ch <='F') + { + return ch - 'A' + 10; + } + if(ch >= 'a' && ch <= 'f') + { + return ch - 'a' + 10; + } + return -1; +} + +void Lc_buf_copy_us(U16 *d,const U16 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} +void Lc_buf_from_const_uc(U8 *d,const U8 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} + + +void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} + +vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) +{ + if(a > b) + { + if(b > c) + { + return b; + }else + {// b a) + {/// a a) + {// a b) + { + if(b > c) + { + return b; + } + else + {// b a) + {/// a a) + {// a arr[j+1]) + { + ok = 0; + tmp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = tmp; + } + } + if(ok) + { + break; + } + } +} + +vS32 Lc_S32_media(vS32 val[],S16 num) +{ + if(num <= 1) + { + return val[0]; + } + else + { + Lc_array_sort(val,num); + return val[num/2]; + } +} +U32 Lc_vS32_media(U32 *d, U8 n) +{ + U8 i = 0,j = 0; + U32 h = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i d[j]) + { + h = d[i]; + d[i] = d[j]; + d[j] = h; + } + } + } + if(n%2 != 0) //奇数 + { + return d[n/2]; + } + else//偶数 + { + return ((d[n/2] + d[n/2-1])/2); + } +} + + +U32 Lc_vU32_avg(U32 *d, U8 n) +{ + U8 i = 0; + U32 sum = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +{ + vU16 t = 0,m = 0; + for(t = 0;t < len;t ++) + { + + #if 1 + ascii[m] = cguHex2Char[D_uc_high(buf[t])][1]; + m ++; + ascii[m] = cguHex2Char[D_uc_low (buf[t])][1]; + m ++; + ascii[m] =0x20; + m ++; + #else + + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + + + #endif + } +} + +/// cguHex2Char[0][0] = 0x00 cguHex2Char[0][1] = 0x30 +unsigned char code cguHex2Char[16][2] +={ + 0x00,'0', + 0x01,'1', + 0x02,'2', + 0x03,'3', + 0x04,'4', + 0x05,'5', + 0x06,'6', + 0x07,'7', + 0x08,'8', + 0x09,'9', + 0x0A,'A', + 0x0B,'B', + 0x0C,'C', + 0x0D,'D', + 0x0E,'E', + 0x0F,'F' +}; + + +void Lc_for_int16(U16 i) +{ + U16 m; + for(m=i;m>0;m--) + { + ///L0_Delay_1ms(); + } +} + +U32 Lc_abs(vS32 a,vS32 b) +{ + if(a >= b) + { + return a - b; + } + return b - a; +} + +void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len) +{ + U8 i = 0,key0,key1,key2,key3; + key0 = enc_key >> 24 & 0xFF; + key1 = enc_key >> 16 & 0xFF; + key2 = enc_key >> 8 & 0xFF; + key3 = enc_key >> 0 & 0xFF; + + for(i=0;i> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U32 htonl(U32 dat) +{ + U32 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U16 ntohs(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} + +U16 htons(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} +#endif + +#if 0///#ifdef D_flash_max + + +// 0--9 '0' +// ABCEDF------0X41-- 87-6= 81 +U8 Lc_Hex2Char(U8 CharStr) +{ + U8 rd; + if (CharStr >9)//A 10-9+ + { + rd = (CharStr - 10 + 'A') ; + } + else + { + rd = (CharStr + '0') ; + } + return rd; +} +// 0x30'0'----'9'--> 0x0----0x09 +//0x61--'a'---'f'--> 0x0a---0x0f +//0x41 'A'--'F'--> 0x0a---0x0f +U8 Lc_Char2Hex(U8 CharStr) +{ + U8 rd; + if (CharStr >= 'a')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'a' + 0x0a) ; + } + else if (CharStr >= 'A')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'A' + 0x0a) ; + } + else + { + rd = (CharStr - '0') ; + } + return rd; +} +//catch_protocol(s,d); +// 从 d中提取出协议,一般用于协议打包后的调试和透传, +// *s="iicsend:12 34 56 78 9a \r\n"; +// i: 012345678 +// 返回协议字节数量 +// extern int strpos (const char *s, char c); +unsigned char catch_protocol (const char *d_src,char d_protocol[]) +{ + unsigned char n = 0,len = 0;//,i = 0; + int i = 0; + i = strpos(d_src, (char)':'); + i ++; + len = strlen (d_src) - 2; + while(i < len) + { + d_protocol[n] = Lc_Char2Hex(*(d_src+i))*16; + i ++; + d_protocol[n] += Lc_Char2Hex(*(d_src+i)); + i ++;i ++; + n ++; + } + return n; +} + +/* + * 函数名:itoa 不同类型的cpu不一样 并且支持的最大数据取决于i = 1000000;D_value_max + * 描述 :将整形数据转换成字符串 + * 输入 :-radix =10 表示10进制,其他结果为0 + * -value 要转换的整形数 + * -buf 转换后的字符串 + * -radix = 10 + * 输出 :无 + * 返回 :无 + * 调用 :被USART1_printf()调用 + + Lc_int2a + + + */ + #define D_value_max 100000 +char *Lc_int2a(vS32 value, char *string, UN_TYPE radix) +{ + vS32 i, d; + UN_TYPE flag = 0; + vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + if (!value) + { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + U16temp = value; + switch(radix) + {//%X2 %X4 %X6 + case '2': + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + case '4': + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + #if 0 + case '8': + *ptr++ = Lc_HexToChar((value>>24)&0x0f); + *ptr++ = Lc_HexToChar((value>>20)&0x0f); + *ptr++ = Lc_HexToChar((value>>16)&0x0f); + *ptr++ = Lc_HexToChar((value>>12)&0x0f); + *ptr++ = Lc_HexToChar((value>>8 )&0x0f); + *ptr++ = Lc_HexToChar((value>>4 )&0x0f); + *ptr++ = Lc_HexToChar((value)&0x0f); + *ptr = 0; + return string; + break; + #endif + case 10: + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + i = D_value_max; + if (value > i) + { + value = i; + } + for (;i > 0; i /= 10) + { + d = value / i; + + if (d || flag) + { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + break; + default: + *ptr++ = 0x30; + *ptr = 0; + return string; + break; + } + + +} /* NCL_Itoa */ +/// bits:生成的字符共几位数据 +void Lc_int2D(vS16 value, char *string,char bits) +{ + vS16 i, d; + UN_TYPE flag = 0; +// vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + +// U16temp = value; + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + value *= -1; + }else + { + *ptr++ = ' '; + + } + + + + i = us2fun2[bits-1]; + for (;i > 0; i /= 10) + { + d = value / i; + if((0 == d)&&(0 == flag)&&(1 != i)) + {/// + *ptr++ = ' '; + + }else + { + flag = 1;///第一个非零的数据出现 + *ptr = (char)(d + 0x30); + *ptr++; + value -= (d * i); + } + } + +} /* NCL_Itoa */ + + +//void (*L0_uart0_uc)(U8 ww); + +// 带buf的printf fixme: 需要精简地方 +void Lc_print_buf(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[64]; ///取决于cpu的内存大小,如果出现问题,请先定位到此处 +// char send[16]; + char n = 0; + char *dat = 0; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; + + dat = dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + ts_uart_send_depot.buf[n ++] = 0x0d;//L0pf_send_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + ts_uart_send_depot.buf[n ++] = 0x0a;//L0pf_send_uc(0x0a); + dat ++; + break; + + case 't': // + ts_uart_send_depot.buf[n ++] = 0x09;//L0pf_send_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + ts_uart_send_depot.buf[n ++] = (char)s;// L0pf_send_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, + + d = va_arg(ap, int); // 0x30 =48d + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + ts_uart_send_depot.buf[n ++] = (*dat++);//L0pf_send_uc( *dat++); + } + }//end while.... + ts_uart_send_depot.max = n; + ts_uart_send_depot.p = ts_uart_send_depot.buf; + L0_uart0_sendbuf(); +}// +#endif + +#if 0 //5436345673456 +/******************************************************************** +* +* 名称: L0_Usend_uc_hex +* 说明: 例如:L0_Usend_uc_hex(0x0c); output " 0c " +* 功能: 发送数据 +* 调用: SendHUc()Lc_HexToChar() +* 输入: +* 返回值: 无 +***********************************************************************/ +void Lc_uc_hex(char ww) +{ + L0_uart0_uc(Lc_Hex2Char((ww>>4)&0x0f)); + L0_uart0_uc(Lc_Hex2Char(ww&0x0f)); +} + +void Lc_us_hex(U16 ww) +{// + U8 t; + t = (U8)(((ww >> 8)&0x00ff)); + Lcp_uc_hex(t); + t = (U8)(((ww )&0x00ff)); + Lcp_uc_hex(t); +} + +void Lc_print_NC(char *dat,...) +{ + +} +// 非缓存模式的打印 fixme: 发送16进制数据时有bug +void Lc_print33333(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[16];//char t; + char *dat = NULL; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat4); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; +dat =dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + L0_uart0_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + L0_uart0_uc(0x0a); + dat ++; + break; + + case 't': // + L0_uart0_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + L0_uart0_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, //#define va_arg(ap,t) (((t *)ap)++[0]) //(((int *)ap)++[0]) + + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + L0_uart0_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + L0_uart0_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + L0_uart0_uc(*dat ++); + //t = *dat; + //L0pf_send_uc = L0_uart0_uc; + //L0pf_send_uc(t); + //L0_uart0_uc(t); + //dat++; + } + }//end while....斯蒂芬 +}// + + + + + +///计算CRC校验码 +unsigned int CRC16(unsigned char *ptr, unsigned char len) +{ + unsigned int crc=0xffff; + unsigned char i; + while(len--) + { + crc ^=*ptr++; + for(i=0;i<8;i++) + { + if(crc & 0x1) + { + crc>>=1; + crc^=0xa001; + } + else + { + crc>>=1; + } + } + } + return crc; +} + + + +///检测CRC校验码是否正确 +unsigned char CheckCRC(unsigned char *ptr,unsigned char len) +{ + unsigned int crc; + crc = (unsigned int)CRC16(ptr,(len-2)); + if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff)) + { + return 0xff; + } + else + { + return 0x0; + } +} + + +char *strstr(const char *str1, const char *str2) +{ + char *cp = (char*)str1; + char *s1, *s2; + + if (!*str2) + return((char *)str1); + + while (*cp) + { + s1 = cp; + s2 = (char *)str2; + + while (*s1 && *s2 && !(*s1 - *s2)) + s1++, s2++; + + if (!*s2) + return(cp); + + cp++; + } + return(NULL); +} + + +//40 +void Lc_int2str_4(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 123 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +//Lc_int2str(123456, 5,3,&str[0]'); +/* + + +blank 填充字符 ' '或者其他unsigned char *blank)//保留以后使用 + + +*/ + + + +void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 m = 0,i; + for(i = 0;i < len;i++) + { + if(point != 0) + { + if(point == (len-i+1)) + { + *(d+m) = '.'; + m ++; + } + } + if (ui_in>=ul2fun2[len-i]) + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(len-i));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + } + *(d+m) = 0x30 + Lc_WEI(ui_in,1); + m++; + *(d+m) = 0x00; + //*(d+m) = 'e'; +} + + +// input: 123456d +// output: '1' '2' '3'.... +//对应的点阵 为 0123456789. ,最后为空格,专为显示点阵类的数值使用 +void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 i,m = 0; //uc_temp, + for(i = len+1;i != 0;i--)// len + 1 point 占用一位 + { + if(point == (len-i)) + { + d[len-m] = '.';//'.' + m ++; + } + { + if (ui_in>=ul2fun2[i-1]) + { + d[len-m] = (U8)((ui_in/ul2fun2[i-1])%10); + + } + else + { + d[len-m] = ' ';//' ' + } + m ++; + } + } + d[len-m] = (U8)(ui_in%10); +} + +void Lc_Byte_cp(BYTE *src,BYTE *dis, int len) +{ + int i; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +/* +void Lc_Byte_print(BYTE *src,int len) +{ + int i, d; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +*/ + + +// -10........+10 + +U32 L2_fun_number_show(int i,char str[4]) +{ + U8 c; + int cint; + + if(i >= 0) + { + cint = i; + str[0] =' '; + + } + else + { + cint = 0 - i; + str[0] ='-'; + + + } + c = Lc_WEI(cint,1); + if(0 == c) + { + str[1] =' '; + } + else + { + str[1] = 0x30+ c; + + } + str[2] = 0x30+ Lc_WEI(cint,0); + return 0; +} + +//L1_lkt_write(s_room_val.ui_t3,s_room_val.ui_t3,s_task_lkt.din); +//U_uluiuc + +void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]) +{ +#if 0 + volatile U_uluiuc t; + //s_temp[] + t.uiv[0] = ui_t2; + t.uiv[1] = ui_t3; + + + Lc_Byte_cp(t.dv,out,8); + + out[3] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[0] = D_ul2uc_0( ui_t2); + + + out[7] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[4] = D_ul2uc_0( ui_t3); + + + #else + out[0] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[3] = D_ul2uc_0( ui_t2); + +/* + out[4] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[7] = D_ul2uc_0( ui_t3); +*/ +#endif + +} + +void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3) +{ + #if 0 + volatile U_uluiuc t; + Lc_Byte_cp(in,t.dv,8); + *ui_t2 = t.uiv[0]; + *ui_t3 = t.uiv[1]; + *ui_t2 = 0; + *ui_t2|= (U32)in[3]; + *ui_t2|= (U32)(in[2]<<8); + *ui_t2|= (U32)(in[1]<<16); + *ui_t2|= (U32)(in[0]<<24); + + *ui_t3 = 0; + *ui_t3|= (U32)in[7]; + *ui_t3|= (U32)(in[6]<<8); + *ui_t3|= (U32)(in[5]<<16); + *ui_t3|= (U32)(in[4]<<24); + + #else + + + *ui_t2 = 0; + *ui_t2|= (U32)in[0]; + *ui_t2|= (U32)(in[1]<<8); + *ui_t2|= (U32)(in[2]<<16); + *ui_t2|= (U32)(in[3]<<24); + /* + *ui_t3 = 0; + *ui_t3|= (INT32U)in[4]; + *ui_t3|= (INT32U)(in[5]<<8); + *ui_t3|= (INT32U)(in[6]<<16); + *ui_t3|= (INT32U)(in[7]<<24); + */ + #endif +} + +U32 Lc_abs(vU32 a,vU32 b,vU32 *diff) +{ + if(a >= b) + { + *diff = a-b; + return 1; + }else + { + *diff = b-a; + return 0; + } +} + + + +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; +} + + + + +#endif //#if 0 //5436345673456 + + + +//12,34 +void Lc_int2str_2_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[4])// 1000 123456 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + + *(d+m) = '.'; + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + + m ++; + *(d+m) = 0; + +} + +/// 0-999 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[3]) + { + ui_in = 999; + } + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} +/// 0-99 +void Lc_int2str_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[2]) + { + ui_in = 99; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} +void Lc_uc2str_2(U8 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[2]) + { + ui_in = 99; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +// 123.4 + +void Lc_int2str_3_1(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[4])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; + +} + + +//-123 +void Lc_sint2str_3(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +//-32.1 +void Lc_sint2str_2_1(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + ui_in = 999; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = '0'; + } + m ++; + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +// 12345 + +void Lc_int2str_5(U32 ui_in,char *d) +{ + U8 m = 1;//,i; + *(d+0) = ' '; + if (ui_in >= ul2fun2[4])// 10,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/clib/c_lib.c.bak b/source/clib/c_lib.c.bak new file mode 100644 index 0000000..de6111c --- /dev/null +++ b/source/clib/c_lib.c.bak @@ -0,0 +1,1787 @@ +/***************************************************************************** + * uart.c: UART API file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ + + +#include "c_type51.h" +#include "c_lib.h" +///#include "../msp/msp_uart0.h" +////#include "../msp/time.h" +#include + + +code vU16 us2fun2[5] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000// 4 + +}; + + + +code vU32 ul2fun2[10] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000,// 4 +100000, +1000000, +10000000, +100000000, +1000000000,//9 +}; + +#if 0 + +同样是转义字符,\n 的作用相当于“Enter”键,而想退回去就可以用“Backspace”键,也就是\b +这里还有一个可能用到的转义字符是\r :使光标回退到本行开头 + \b 退格 + \n 换行 0x0A + \f 走纸 + \t 水平制表 + \v 垂直制表 + +\r 0x0d + +//如果追求内存紧张加上const INT32U ul2fun2[10] + + +void Lc_float2str(float f,U8 *str,U8 point_num); +{ + S32 i = 0; U32 u32i = 0; + U8 n = 0;U8 m = 0;U8 d = 0; + switch(point_num) + { + case 0: + + break; + case 1: + f *= 10.; + + break; + case 2: + f *= 100.; + + break; + case 3: + f *= 1000.; + + break; + default: + + break; + }; + i = (S32)f; +// Lc_float2str(1.23,&d,2) +// Lc_float2str(0.23,&d,2) +// Lc_float2str(23.4,&d,1) +// Lc_float2str(-12345.236,&d,2) + // 1,1.2 12.3 240 0.12 + if(i < 0) + { + str[n] = '-'; + n ++; + i *= -1; + } + u32i = (U32)i; + m = 4; + if(u32i >= ul2fun2[m]) u32i = ul2fun2[m] - 1; + for(m = 0;m > 4;m ++) + {// 43210 + d = (u32i /ul2fun2[m])%10; + if (d > 0) + str[n] = d; + n ++; + } + + if (n == point_num) + { + str[n] ='.'; + n ++; + } + + + str[n] = i%10 + +} + + +#endif + + +U32 Abs2(S32 a) +{ + if(a < 0) + { + a = -a; + } + return a; +} + +///despiking 削峰 +void Lc_despiking_shift3_U16(vU16 *m) +{///只要中间的数据同时大于或小于两边的数据,则去掉 + if(m[1] >= m[0]) + { + if(m[1] > m[2]) + { + m[1] = m[0]; + } + }else if(m[1] < m[0]) + { + if(m[1] < m[2]) + { + m[1] = m[0]; + } + }else + { + + } +} + +int libc_strlen(char *str) +{ + char *tmp = str; + while(*tmp++) + ; + return tmp - str - 1; +} + +U8* Lc_strcpy(U8* dst,const char* str) +{ + U8 *p = dst; + while(*dst++ = *str++); + return p; +} + + +U8 Lc_strStartsWith(U8 *s1,U8 *s2) +{ + while(*s1 && *s2) + { + if(*s1++ != *s2++) + { + return 0; + } + } + return (*s2 == 0); +} + + +int hexToDec(const char *source) +{ + int sum = 0; + long t = 1; + int i,len; + + len = Lc_strlen(source); + for(i=len-1; i>=0; i--) + { + sum += t * getIndexOfSigns(*(source + i)); + t *= 16; + } + + return sum; + +} +unsigned char hex_to_char(unsigned char hex) +{ + if((hex>=0x30)&&(hex<=0x39)) + hex = hex-0x30; + else if((hex>=0x41)&&(hex<=0x5A)) // capital + hex = 'A' + (hex - 0x41); + else if((hex>=0x61)&&(hex<=0x7A)) // little case + hex = 'a' + (hex - 0x61); + else + hex = 0xff; + return hex; +} + +int getIndexOfSigns(char ch) +{ + if(ch >= '0' && ch <= '9') + { + return ch - '0'; + } + if(ch >= 'A' && ch <='F') + { + return ch - 'A' + 10; + } + if(ch >= 'a' && ch <= 'f') + { + return ch - 'a' + 10; + } + return -1; +} + + +void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} + +vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) +{ + if(a > b) + { + if(b > c) + { + return b; + }else + {// b a) + {/// a a) + {// a b) + { + if(b > c) + { + return b; + } + else + {// b a) + {/// a a) + {// a arr[j+1]) + { + ok = 0; + tmp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = tmp; + } + } + if(ok) + { + break; + } + } +} + +vS32 Lc_S32_media(vS32 val[],S16 num) +{ + if(num <= 1) + { + return val[0]; + } + else + { + Lc_array_sort(val,num); + return val[num/2]; + } +} +U32 Lc_vS32_media(U32 *d, U8 n) +{ + U8 i = 0,j = 0; + U32 h = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i d[j]) + { + h = d[i]; + d[i] = d[j]; + d[j] = h; + } + } + } + if(n%2 != 0) //奇数 + { + return d[n/2]; + } + else//偶数 + { + return ((d[n/2] + d[n/2-1])/2); + } +} + + +U32 Lc_vU32_avg(U32 *d, U8 n) +{ + U8 i = 0; + U32 sum = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +{ + vU16 t = 0,m = 0; + for(t = 0;t < len;t ++) + { + + #if 1 + ascii[m] = cguHex2Char[D_uc_high(buf[t])][1]; + m ++; + ascii[m] = cguHex2Char[D_uc_low (buf[t])][1]; + m ++; + ascii[m] =0x20; + m ++; + #else + + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + + + #endif + } +} + +/// cguHex2Char[0][0] = 0x00 cguHex2Char[0][1] = 0x30 +unsigned char code cguHex2Char[16][2] +={ + 0x00,'0', + 0x01,'1', + 0x02,'2', + 0x03,'3', + 0x04,'4', + 0x05,'5', + 0x06,'6', + 0x07,'7', + 0x08,'8', + 0x09,'9', + 0x0A,'A', + 0x0B,'B', + 0x0C,'C', + 0x0D,'D', + 0x0E,'E', + 0x0F,'F' +}; + + +void Lc_for_int16(U16 i) +{ + U16 m; + for(m=i;m>0;m--) + { + ///L0_Delay_1ms(); + } +} + +U32 Lc_abs(vS32 a,vS32 b) +{ + if(a >= b) + { + return a - b; + } + return b - a; +} + +void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len) +{ + U8 i = 0,key0,key1,key2,key3; + key0 = enc_key >> 24 & 0xFF; + key1 = enc_key >> 16 & 0xFF; + key2 = enc_key >> 8 & 0xFF; + key3 = enc_key >> 0 & 0xFF; + + for(i=0;i> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U32 htonl(U32 dat) +{ + U32 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U16 ntohs(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} + +U16 htons(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} +#endif + +#if 0///#ifdef D_flash_max + + +// 0--9 '0' +// ABCEDF------0X41-- 87-6= 81 +U8 Lc_Hex2Char(U8 CharStr) +{ + U8 rd; + if (CharStr >9)//A 10-9+ + { + rd = (CharStr - 10 + 'A') ; + } + else + { + rd = (CharStr + '0') ; + } + return rd; +} +// 0x30'0'----'9'--> 0x0----0x09 +//0x61--'a'---'f'--> 0x0a---0x0f +//0x41 'A'--'F'--> 0x0a---0x0f +U8 Lc_Char2Hex(U8 CharStr) +{ + U8 rd; + if (CharStr >= 'a')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'a' + 0x0a) ; + } + else if (CharStr >= 'A')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'A' + 0x0a) ; + } + else + { + rd = (CharStr - '0') ; + } + return rd; +} +//catch_protocol(s,d); +// 从 d中提取出协议,一般用于协议打包后的调试和透传, +// *s="iicsend:12 34 56 78 9a \r\n"; +// i: 012345678 +// 返回协议字节数量 +// extern int strpos (const char *s, char c); +unsigned char catch_protocol (const char *d_src,char d_protocol[]) +{ + unsigned char n = 0,len = 0;//,i = 0; + int i = 0; + i = strpos(d_src, (char)':'); + i ++; + len = strlen (d_src) - 2; + while(i < len) + { + d_protocol[n] = Lc_Char2Hex(*(d_src+i))*16; + i ++; + d_protocol[n] += Lc_Char2Hex(*(d_src+i)); + i ++;i ++; + n ++; + } + return n; +} + +/* + * 函数名:itoa 不同类型的cpu不一样 并且支持的最大数据取决于i = 1000000;D_value_max + * 描述 :将整形数据转换成字符串 + * 输入 :-radix =10 表示10进制,其他结果为0 + * -value 要转换的整形数 + * -buf 转换后的字符串 + * -radix = 10 + * 输出 :无 + * 返回 :无 + * 调用 :被USART1_printf()调用 + + Lc_int2a + + + */ + #define D_value_max 100000 +char *Lc_int2a(vS32 value, char *string, UN_TYPE radix) +{ + vS32 i, d; + UN_TYPE flag = 0; + vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + if (!value) + { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + U16temp = value; + switch(radix) + {//%X2 %X4 %X6 + case '2': + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + case '4': + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + #if 0 + case '8': + *ptr++ = Lc_HexToChar((value>>24)&0x0f); + *ptr++ = Lc_HexToChar((value>>20)&0x0f); + *ptr++ = Lc_HexToChar((value>>16)&0x0f); + *ptr++ = Lc_HexToChar((value>>12)&0x0f); + *ptr++ = Lc_HexToChar((value>>8 )&0x0f); + *ptr++ = Lc_HexToChar((value>>4 )&0x0f); + *ptr++ = Lc_HexToChar((value)&0x0f); + *ptr = 0; + return string; + break; + #endif + case 10: + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + i = D_value_max; + if (value > i) + { + value = i; + } + for (;i > 0; i /= 10) + { + d = value / i; + + if (d || flag) + { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + break; + default: + *ptr++ = 0x30; + *ptr = 0; + return string; + break; + } + + +} /* NCL_Itoa */ +/// bits:生成的字符共几位数据 +void Lc_int2D(vS16 value, char *string,char bits) +{ + vS16 i, d; + UN_TYPE flag = 0; +// vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + +// U16temp = value; + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + value *= -1; + }else + { + *ptr++ = ' '; + + } + + + + i = us2fun2[bits-1]; + for (;i > 0; i /= 10) + { + d = value / i; + if((0 == d)&&(0 == flag)&&(1 != i)) + {/// + *ptr++ = ' '; + + }else + { + flag = 1;///第一个非零的数据出现 + *ptr = (char)(d + 0x30); + *ptr++; + value -= (d * i); + } + } + +} /* NCL_Itoa */ + + +//void (*L0_uart0_uc)(U8 ww); + +// 带buf的printf fixme: 需要精简地方 +void Lc_print_buf(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[64]; ///取决于cpu的内存大小,如果出现问题,请先定位到此处 +// char send[16]; + char n = 0; + char *dat = 0; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; + + dat = dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + ts_uart_send_depot.buf[n ++] = 0x0d;//L0pf_send_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + ts_uart_send_depot.buf[n ++] = 0x0a;//L0pf_send_uc(0x0a); + dat ++; + break; + + case 't': // + ts_uart_send_depot.buf[n ++] = 0x09;//L0pf_send_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + ts_uart_send_depot.buf[n ++] = (char)s;// L0pf_send_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, + + d = va_arg(ap, int); // 0x30 =48d + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + ts_uart_send_depot.buf[n ++] = (*dat++);//L0pf_send_uc( *dat++); + } + }//end while.... + ts_uart_send_depot.max = n; + ts_uart_send_depot.p = ts_uart_send_depot.buf; + L0_uart0_sendbuf(); +}// +#endif + +#if 0 //5436345673456 +/******************************************************************** +* +* 名称: L0_Usend_uc_hex +* 说明: 例如:L0_Usend_uc_hex(0x0c); output " 0c " +* 功能: 发送数据 +* 调用: SendHUc()Lc_HexToChar() +* 输入: +* 返回值: 无 +***********************************************************************/ +void Lc_uc_hex(char ww) +{ + L0_uart0_uc(Lc_Hex2Char((ww>>4)&0x0f)); + L0_uart0_uc(Lc_Hex2Char(ww&0x0f)); +} + +void Lc_us_hex(U16 ww) +{// + U8 t; + t = (U8)(((ww >> 8)&0x00ff)); + Lcp_uc_hex(t); + t = (U8)(((ww )&0x00ff)); + Lcp_uc_hex(t); +} + +void Lc_print_NC(char *dat,...) +{ + +} +// 非缓存模式的打印 fixme: 发送16进制数据时有bug +void Lc_print33333(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[16];//char t; + char *dat = NULL; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat4); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; +dat =dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + L0_uart0_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + L0_uart0_uc(0x0a); + dat ++; + break; + + case 't': // + L0_uart0_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + L0_uart0_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, //#define va_arg(ap,t) (((t *)ap)++[0]) //(((int *)ap)++[0]) + + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + L0_uart0_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + L0_uart0_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + L0_uart0_uc(*dat ++); + //t = *dat; + //L0pf_send_uc = L0_uart0_uc; + //L0pf_send_uc(t); + //L0_uart0_uc(t); + //dat++; + } + }//end while....斯蒂芬 +}// + + + + + +///计算CRC校验码 +unsigned int CRC16(unsigned char *ptr, unsigned char len) +{ + unsigned int crc=0xffff; + unsigned char i; + while(len--) + { + crc ^=*ptr++; + for(i=0;i<8;i++) + { + if(crc & 0x1) + { + crc>>=1; + crc^=0xa001; + } + else + { + crc>>=1; + } + } + } + return crc; +} + + + +///检测CRC校验码是否正确 +unsigned char CheckCRC(unsigned char *ptr,unsigned char len) +{ + unsigned int crc; + crc = (unsigned int)CRC16(ptr,(len-2)); + if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff)) + { + return 0xff; + } + else + { + return 0x0; + } +} + + +char *strstr(const char *str1, const char *str2) +{ + char *cp = (char*)str1; + char *s1, *s2; + + if (!*str2) + return((char *)str1); + + while (*cp) + { + s1 = cp; + s2 = (char *)str2; + + while (*s1 && *s2 && !(*s1 - *s2)) + s1++, s2++; + + if (!*s2) + return(cp); + + cp++; + } + return(NULL); +} + + +//40 +void Lc_int2str_4(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 123 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +//Lc_int2str(123456, 5,3,&str[0]'); +/* + + +blank 填充字符 ' '或者其他unsigned char *blank)//保留以后使用 + + +*/ + + + +void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 m = 0,i; + for(i = 0;i < len;i++) + { + if(point != 0) + { + if(point == (len-i+1)) + { + *(d+m) = '.'; + m ++; + } + } + if (ui_in>=ul2fun2[len-i]) + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(len-i));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + } + *(d+m) = 0x30 + Lc_WEI(ui_in,1); + m++; + *(d+m) = 0x00; + //*(d+m) = 'e'; +} + + +// input: 123456d +// output: '1' '2' '3'.... +//对应的点阵 为 0123456789. ,最后为空格,专为显示点阵类的数值使用 +void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 i,m = 0; //uc_temp, + for(i = len+1;i != 0;i--)// len + 1 point 占用一位 + { + if(point == (len-i)) + { + d[len-m] = '.';//'.' + m ++; + } + { + if (ui_in>=ul2fun2[i-1]) + { + d[len-m] = (U8)((ui_in/ul2fun2[i-1])%10); + + } + else + { + d[len-m] = ' ';//' ' + } + m ++; + } + } + d[len-m] = (U8)(ui_in%10); +} + +void Lc_Byte_cp(BYTE *src,BYTE *dis, int len) +{ + int i; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +/* +void Lc_Byte_print(BYTE *src,int len) +{ + int i, d; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +*/ + + +// -10........+10 + +U32 L2_fun_number_show(int i,char str[4]) +{ + U8 c; + int cint; + + if(i >= 0) + { + cint = i; + str[0] =' '; + + } + else + { + cint = 0 - i; + str[0] ='-'; + + + } + c = Lc_WEI(cint,1); + if(0 == c) + { + str[1] =' '; + } + else + { + str[1] = 0x30+ c; + + } + str[2] = 0x30+ Lc_WEI(cint,0); + return 0; +} + +//L1_lkt_write(s_room_val.ui_t3,s_room_val.ui_t3,s_task_lkt.din); +//U_uluiuc + +void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]) +{ +#if 0 + volatile U_uluiuc t; + //s_temp[] + t.uiv[0] = ui_t2; + t.uiv[1] = ui_t3; + + + Lc_Byte_cp(t.dv,out,8); + + out[3] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[0] = D_ul2uc_0( ui_t2); + + + out[7] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[4] = D_ul2uc_0( ui_t3); + + + #else + out[0] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[3] = D_ul2uc_0( ui_t2); + +/* + out[4] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[7] = D_ul2uc_0( ui_t3); +*/ +#endif + +} + +void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3) +{ + #if 0 + volatile U_uluiuc t; + Lc_Byte_cp(in,t.dv,8); + *ui_t2 = t.uiv[0]; + *ui_t3 = t.uiv[1]; + *ui_t2 = 0; + *ui_t2|= (U32)in[3]; + *ui_t2|= (U32)(in[2]<<8); + *ui_t2|= (U32)(in[1]<<16); + *ui_t2|= (U32)(in[0]<<24); + + *ui_t3 = 0; + *ui_t3|= (U32)in[7]; + *ui_t3|= (U32)(in[6]<<8); + *ui_t3|= (U32)(in[5]<<16); + *ui_t3|= (U32)(in[4]<<24); + + #else + + + *ui_t2 = 0; + *ui_t2|= (U32)in[0]; + *ui_t2|= (U32)(in[1]<<8); + *ui_t2|= (U32)(in[2]<<16); + *ui_t2|= (U32)(in[3]<<24); + /* + *ui_t3 = 0; + *ui_t3|= (INT32U)in[4]; + *ui_t3|= (INT32U)(in[5]<<8); + *ui_t3|= (INT32U)(in[6]<<16); + *ui_t3|= (INT32U)(in[7]<<24); + */ + #endif +} + +U32 Lc_abs(vU32 a,vU32 b,vU32 *diff) +{ + if(a >= b) + { + *diff = a-b; + return 1; + }else + { + *diff = b-a; + return 0; + } +} + + + + + + +#endif //#if 0 //5436345673456 + + + +//12,34 +void Lc_int2str_2_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[4])// 1000 123456 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + + *(d+m) = '.'; + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + + m ++; + *(d+m) = 0; + +} + +/// 0-999 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[3]) + { + ui_in = 999; + } + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} +/// 0-99 +void Lc_int2str_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[2]) + { + ui_in = 99; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} +void Lc_uc2str_2(U8 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[2]) + { + ui_in = 99; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +// 123.4 + +void Lc_int2str_3_1(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[4])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; + +} + + +//-123 +void Lc_sint2str_3(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +//-32.1 +void Lc_sint2str_2_1(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + ui_in = 999; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = ' '; + } + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + } + else + { + *(d+m) = '0'; + } + m ++; + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + m ++; + *(d+m) = 0; +} + +// 12345 + +void Lc_int2str_5(U32 ui_in,char *d) +{ + U8 m = 1;//,i; + *(d+0) = ' '; + if (ui_in >= ul2fun2[4])// 10,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/clib/c_lib.h b/source/clib/c_lib.h new file mode 100644 index 0000000..3fce83b --- /dev/null +++ b/source/clib/c_lib.h @@ -0,0 +1,123 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + ///cc 2023/04/08--11:24:54 Lc_buf_from_const_uc + * +******************************************************************************/ +#ifndef _c_lib_H_ +#define _c_lib_H_ + + +#include +#include +#include "c_type51.h" +// +#include "c_delay.h" +#include "c_crc.h" +//#include "../debug/debug_drv.h" +//extern char guc_send[128]; +extern unsigned char code cguHex2Char[16][2]; +typedef struct +{ + vU16 up_point; + vU16 down_point; + + +}TS_up_down_p_; + +extern U8 Lc_Hex2Char(U8 CharStr); +extern U8 Lc_strStartsWith(U8 *s1,U8 *s2); + +//extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +// input: 123456d +// output: '1' '2' '3'.... +//Ӧĵ Ϊ 0123456789. ΪոרΪʾֵʹ +//extern void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +//extern U32 L2_fun_number_show(int i,char str[4]); +#if 10 + +void Lc_sint2str_2_1(int i_in,char *d); +void Lc_int2str_2(U32 ui_in,char *d); +void Lc_uc2str_2(U8 ui_in,char *d); + +extern void Lc_int2str_2_2(U32 ui_in,char *d); +extern void Lc_int2str_3(U32 ui_in,char *d); + +extern void Lc_int2str_3(U32 ui_in,char *d); +extern void Lc_int2str_4(U32 ui_in,char *d); + +extern void Lc_sint2str_3(int i_in,char *d); +#define Lc_WEI(WEIx,WEIn) (U8)((WEIx/ul2fun2[WEIn])%10); +#define Lc_eee(WEIn) ul2fun2[WEIn] + + +#endif +extern int Lc_strlen(const char *str); +extern void Lc_despiking_shift3_U16(vU16 *m); +extern int libc_strlen(char *str); + +extern char *Lc_int2a(vS32 value, char *string, UN_TYPE radix); + +extern void Lc_int2D(vS16 value, char *string,char bits); +extern int hexToDec(const char *source); +extern int getIndexOfSigns(char ch); +extern unsigned char hex_to_char(unsigned char hex); + +extern char *strstr(const char *str1, const char *str2); +extern unsigned char catch_protocol (const char d_src[],char d_protocol[]) ; +#define Lc_delay_1us() L0_delay_1us() + +extern U8* Lc_strcpy(U8* dst,const char* str); +extern void Lc_buf_from_const_uc(U8 *d,const U8 *s,U16 num);///cc 2023/04/08--11:24:37 优先使用这个 + +//////////////// + +extern void Lc_uc_hex(char ww); +extern void Lc_us_hex(U16 ww); +//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...); +extern void Lc_print(char *dat4,...); +extern void Lc_print_NC(char *dat,...); +extern void Lc_print_buf(char *dat4,...); + +extern u8 Lc_ocr8(const u8 *d,u8 len); + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +extern void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num); + +extern void Lc_buf_copy_us(U16 *d,const U16 *s,U16 num); + +///void L2_line_algo_media(U8 *buf,vU16 len); +extern vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c); +extern vS32 Lc_S32_media3(vS32 a,vS32 b,vS32 c); +extern vS32 Lc_S32_media(vS32 val[],S16 num); +extern void Lc_array_sort(S32 arr[],int n); + +/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); +extern int isBigEndianOrder(void); +extern U32 ntohl(U32 dat); +extern U32 htonl(U32 dat); +extern U16 ntohs(U16 dat); +extern U16 htons(U16 dat); +extern U32 Lc_abs(vS32 a,vS32 b); +extern void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len); +extern void Lc_encrypt_id1(U8 *enc_dst, U8 *enc_src, U8 enc_key[], U8 src_len); +extern int Lc_strlen(char *str); +extern U32 Lc_vU32_avg(U32 *d, U8 n); +extern U32 Lc_vS32_media(U32 *d, U8 n); +extern int Lc_memset(U8 *buf,U8 c,U16 len); + +extern void Lc_for_int8(U8 i); +extern void Lc_for_int16(U16 i); + + +#endif /* end _c_lib_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/c_lib.h.bak b/source/clib/c_lib.h.bak new file mode 100644 index 0000000..099bf0f --- /dev/null +++ b/source/clib/c_lib.h.bak @@ -0,0 +1,121 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _c_lib_H_ +#define _c_lib_H_ + + +#include +#include +#include "c_type51.h" +// +#include "c_delay.h" +#include "c_crc.h" +//#include "../debug/debug_drv.h" +//extern char guc_send[128]; +extern unsigned char code cguHex2Char[16][2]; +typedef struct +{ + vU16 up_point; + vU16 down_point; + + +}TS_up_down_p_; + +extern U8 Lc_Hex2Char(U8 CharStr); +extern U8 Lc_strStartsWith(U8 *s1,U8 *s2); + +//extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +// input: 123456d +// output: '1' '2' '3'.... +//Ӧĵ Ϊ 0123456789. ΪոרΪʾֵʹ +//extern void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +//extern U32 L2_fun_number_show(int i,char str[4]); +#if 10 + +void Lc_sint2str_2_1(int i_in,char *d); +void Lc_int2str_2(U32 ui_in,char *d); +void Lc_uc2str_2(U8 ui_in,char *d); + +extern void Lc_int2str_2_2(U32 ui_in,char *d); +extern void Lc_int2str_3(U32 ui_in,char *d); + +extern void Lc_int2str_3(U32 ui_in,char *d); +extern void Lc_int2str_4(U32 ui_in,char *d); + +extern void Lc_sint2str_3(int i_in,char *d); +#define Lc_WEI(WEIx,WEIn) (U8)((WEIx/ul2fun2[WEIn])%10); +#define Lc_eee(WEIn) ul2fun2[WEIn] + + +#endif +extern int Lc_strlen(const char *str); +extern void Lc_despiking_shift3_U16(vU16 *m); +extern int libc_strlen(char *str); + +extern char *Lc_int2a(vS32 value, char *string, UN_TYPE radix); + +extern void Lc_int2D(vS16 value, char *string,char bits); +extern int hexToDec(const char *source); +extern int getIndexOfSigns(char ch); +extern unsigned char hex_to_char(unsigned char hex); + +extern char *strstr(const char *str1, const char *str2); +extern unsigned char catch_protocol (const char d_src[],char d_protocol[]) ; +#define Lc_delay_1us() L0_delay_1us() + +extern U8* Lc_strcpy(U8* dst,const char* str); + +//////////////// + +extern void Lc_uc_hex(char ww); +extern void Lc_us_hex(U16 ww); +//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...); +extern void Lc_print(char *dat4,...); +extern void Lc_print_NC(char *dat,...); +extern void Lc_print_buf(char *dat4,...); + +extern u8 Lc_ocr8(const u8 *d,u8 len); + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +extern void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num); + +extern void Lc_buf_copy_us(U16 *d,const U16 *s,U16 num); + +///void L2_line_algo_media(U8 *buf,vU16 len); +extern vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c); +extern vS32 Lc_S32_media3(vS32 a,vS32 b,vS32 c); +extern vS32 Lc_S32_media(vS32 val[],S16 num); +extern void Lc_array_sort(S32 arr[],int n); + +/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); +extern int isBigEndianOrder(void); +extern U32 ntohl(U32 dat); +extern U32 htonl(U32 dat); +extern U16 ntohs(U16 dat); +extern U16 htons(U16 dat); +extern U32 Lc_abs(vS32 a,vS32 b); +extern void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len); +extern void Lc_encrypt_id1(U8 *enc_dst, U8 *enc_src, U8 enc_key[], U8 src_len); +extern int Lc_strlen(char *str); +extern U32 Lc_vU32_avg(U32 *d, U8 n); +extern U32 Lc_vS32_media(U32 *d, U8 n); +extern int Lc_memset(U8 *buf,U8 c,U16 len); + +extern void Lc_for_int8(U8 i); +extern void Lc_for_int16(U16 i); + + +#endif /* end _c_lib_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/c_type51.h b/source/clib/c_type51.h new file mode 100644 index 0000000..63640e5 --- /dev/null +++ b/source/clib/c_type51.h @@ -0,0 +1,362 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +///cc 2023/04/09--18:4:28 D_struct2U8 + +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE51_H__ +#define __TYPE51_H__ + +/********************************************************************************************************* + realView编译器需要添加的头文件 +*********************************************************************************************************/ +#include +#include +#include +//#include + +typedef unsigned char U8; + +typedef volatile unsigned short U16; /* 无符号16位整型变量 */ + +typedef volatile signed long S32; +typedef volatile unsigned long U32; /* 无符号32位整型变量 */ +typedef unsigned int FLAG_P; // 标准类变量 +//typedef unsigned char INTU; // 标准类变量8BIT MCU +typedef unsigned int INTU; // 标准类变量32BIT MCU + +typedef U8 UN_TYPE; +typedef U8 vtype; +typedef U8 vType; + +/********************************************************************************************************* + 返回值定义 +*********************************************************************************************************/ +#define ZY_OK 0 /* 操作成功 */ +#define ZY_NOT_OK 1 /* 操作失败 */ +#define ZY_PARAMETER_ERR 2 /* 参数错误 */ +#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ +#define ZY_NO_MEMORY 12 /* 内存不足 */ +#define ZY_TIME_OUT 13 /* 超时 */ +#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ + + +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +#define D_struct2U8(S) ((U8* )&S) + + + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif + +/********************************************************************************************************* + 定义与编译器无关的数据类型 +*********************************************************************************************************/ + +typedef U8 u8; +typedef volatile U8 vU8; + +typedef U8 uint8_t; +typedef U8 uint8; +typedef char int8_t; + + +typedef U8 BOOLEAN; /* 布尔变量 */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + +typedef S8 s8; + + +#define bit char +//#define code + +typedef U16 u16; +typedef volatile U16 vU16; /* 无符号16位整型变量 */ +typedef signed short S16; +typedef signed short s16; +typedef volatile S16 vS16; /* 有符号16位整型变量 */ + + + +typedef U16 uint16_t; + + + + + +typedef volatile S32 vS32; + +typedef U32 INT32U; // 无符号32位整型变量 + +typedef S32 INT32S; // 有符号32位整型变量 + + + +typedef volatile U32 vU32; /* 有符号32位整型变量 */ + +typedef float FP32; /* 单精度浮点数(32位长度) */ +typedef double FP64; /* 双精度浮点数(64位长度) */ + + +typedef U32 uint32_t; + +typedef U32 uint32; + + + +//typedef unsigned char BOOLEAN; // 布尔变量 +typedef unsigned char INT8U; // 无符号8位整型变量 +typedef signed char INT8S; // 有符号8位整型变量 +typedef unsigned short INT16U; // 无符号16位整型变量 +typedef signed short INT16S; // 有符号16位整型变量 +//typedef float FP32; // 单精度浮点数(32位长度) +//typedef double FP64; // 双精度浮点数(64位长度) + + + +///>>>>>>cpu类型特有>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>大端小端 + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; + + vU16 us[2]; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<大端小端 + + +typedef struct +{ + u16 get; //想要达到的值 + u16 max; //​最大值 + u16 min; //最小值 +/// u16 diff; //get和最值max,min的差值 在有些输入的时候有用 不想 +}TS_u16get_;//电磁阀动作 + + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define D_2uc_u16(H,L) (((u16)H)<<8 | (u16)L) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/clib/c_type51.h.bak b/source/clib/c_type51.h.bak new file mode 100644 index 0000000..c5bcda2 --- /dev/null +++ b/source/clib/c_type51.h.bak @@ -0,0 +1,359 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE51_H__ +#define __TYPE51_H__ + +/********************************************************************************************************* + realView编译器需要添加的头文件 +*********************************************************************************************************/ +#include +#include +#include +//#include + +typedef unsigned char U8; + +typedef volatile unsigned short U16; /* 无符号16位整型变量 */ + +typedef volatile signed long S32; +typedef volatile unsigned long U32; /* 无符号32位整型变量 */ +typedef unsigned int FLAG_P; // 标准类变量 +//typedef unsigned char INTU; // 标准类变量8BIT MCU +typedef unsigned int INTU; // 标准类变量32BIT MCU + +typedef U8 UN_TYPE; +typedef U8 vtype; +typedef U8 vType; + +/********************************************************************************************************* + 返回值定义 +*********************************************************************************************************/ +#define ZY_OK 0 /* 操作成功 */ +#define ZY_NOT_OK 1 /* 操作失败 */ +#define ZY_PARAMETER_ERR 2 /* 参数错误 */ +#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ +#define ZY_NO_MEMORY 12 /* 内存不足 */ +#define ZY_TIME_OUT 13 /* 超时 */ +#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ + + +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + + + + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif + +/********************************************************************************************************* + 定义与编译器无关的数据类型 +*********************************************************************************************************/ + +typedef U8 u8; +typedef volatile U8 vU8; + +typedef U8 uint8_t; +typedef U8 uint8; +typedef char int8_t; + + +typedef U8 BOOLEAN; /* 布尔变量 */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + +typedef S8 s8; + + +#define bit char +//#define code + +typedef U16 u16; +typedef volatile U16 vU16; /* 无符号16位整型变量 */ +typedef volatile signed short S16; +typedef volatile signed short s16; +typedef volatile S16 vS16; /* 有符号16位整型变量 */ + + + +typedef volatile U16 uint16_t; + + + + + +typedef volatile S32 vS32; + +typedef U32 INT32U; // 无符号32位整型变量 + +typedef S32 INT32S; // 有符号32位整型变量 + + + +typedef volatile U32 vU32; /* 有符号32位整型变量 */ + +typedef float FP32; /* 单精度浮点数(32位长度) */ +typedef double FP64; /* 双精度浮点数(64位长度) */ + + +typedef U32 uint32_t; + +typedef U32 uint32; + + + +//typedef unsigned char BOOLEAN; // 布尔变量 +typedef unsigned char INT8U; // 无符号8位整型变量 +typedef signed char INT8S; // 有符号8位整型变量 +typedef unsigned short INT16U; // 无符号16位整型变量 +typedef signed short INT16S; // 有符号16位整型变量 +//typedef float FP32; // 单精度浮点数(32位长度) +//typedef double FP64; // 双精度浮点数(64位长度) + + + +///>>>>>>cpu类型特有>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>大端小端 + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; + + vU16 us[2]; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<大端小端 + + +typedef struct +{ + u16 get; //想要达到的值 + u16 max; //​最大值 + u16 min; //最小值 +/// u16 diff; //get和最值max,min的差值 在有些输入的时候有用 不想 +}TS_u16get_;//电磁阀动作 + + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define D_2uc_u16(H,L) (((u16)H)<<8 | (u16)L) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/clib/新建文件夹/bit.h b/source/clib/新建文件夹/bit.h new file mode 100644 index 0000000..62cb578 --- /dev/null +++ b/source/clib/新建文件夹/bit.h @@ -0,0 +1,405 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, ؿƼ +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// ޶˵汾 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// + + +#ifndef __BIT_H__ +#define __BIT_H__ + +#define cSetb0 0x01 +#define cSetb1 0x02 +#define cSetb2 0x04 +#define cSetb3 0x08 +#define cSetb4 0x10 +#define cSetb5 0x20 +#define cSetb6 0x40 +#define cSetb7 0x80 + +#define cClrb0 0xfe +#define cClrb1 0xfd +#define cClrb2 0xfb +#define cClrb3 0xf7 +#define cClrb4 0xef +#define cClrb5 0xdf +#define cClrb6 0xbf +#define cClrb7 0x7f + +#define cTestb0 0x01 +#define cTestb1 0x02 +#define cTestb2 0x04 +#define cTestb3 0x08 +#define cTestb4 0x10 +#define cTestb5 0x20 +#define cTestb6 0x40 +#define cTestb7 0x80 + +#define true 1 +#define false 0 + +#define B0000_0000 0x00 +#define B0000_0001 0x01 +#define B0000_0010 0x02 +#define B0000_0011 0x03 +#define B0000_0100 0x04 +#define B0000_0101 0x05 +#define B0000_0110 0x06 +#define B0000_0111 0x07 +#define B0000_1000 0x08 +#define B0000_1001 0x09 +#define B0000_1010 0x0A +#define B0000_1011 0x0B +#define B0000_1100 0x0C +#define B0000_1101 0x0D +#define B0000_1110 0x0E +#define B0000_1111 0x0F + +#define B0001_0000 0x10 +#define B0001_0001 0x11 +#define B0001_0010 0x12 +#define B0001_0011 0x13 +#define B0001_0100 0x14 +#define B0001_0101 0x15 +#define B0001_0110 0x16 +#define B0001_0111 0x17 +#define B0001_1000 0x18 +#define B0001_1001 0x19 +#define B0001_1010 0x1A +#define B0001_1011 0x1B +#define B0001_1100 0x1C +#define B0001_1101 0x1D +#define B0001_1110 0x1E +#define B0001_1111 0x1F + +#define B0010_0000 0x20 +#define B0010_0001 0x21 +#define B0010_0010 0x22 +#define B0010_0011 0x23 +#define B0010_0100 0x24 +#define B0010_0101 0x25 +#define B0010_0110 0x26 +#define B0010_0111 0x27 +#define B0010_1000 0x28 +#define B0010_1001 0x29 +#define B0010_1010 0x2A +#define B0010_1011 0x2B +#define B0010_1100 0x2C +#define B0010_1101 0x2D +#define B0010_1110 0x2E +#define B0010_1111 0x2F + +#define B0011_0000 0x30 +#define B0011_0001 0x31 +#define B0011_0010 0x32 +#define B0011_0011 0x33 +#define B0011_0100 0x34 +#define B0011_0101 0x35 +#define B0011_0110 0x36 +#define B0011_0111 0x37 +#define B0011_1000 0x38 +#define B0011_1001 0x39 +#define B0011_1010 0x3A +#define B0011_1011 0x3B +#define B0011_1100 0x3C +#define B0011_1101 0x3D +#define B0011_1110 0x3E +#define B0011_1111 0x3F + +#define B0100_0000 0x40 +#define B0100_0001 0x41 +#define B0100_0010 0x42 +#define B0100_0011 0x43 +#define B0100_0100 0x44 +#define B0100_0101 0x45 +#define B0100_0110 0x46 +#define B0100_0111 0x47 +#define B0100_1000 0x48 +#define B0100_1001 0x49 +#define B0100_1010 0x4A +#define B0100_1011 0x4B +#define B0100_1100 0x4C +#define B0100_1101 0x4D +#define B0100_1110 0x4E +#define B0100_1111 0x4F + +#define B0101_0000 0x50 +#define B0101_0001 0x51 +#define B0101_0010 0x52 +#define B0101_0011 0x53 +#define B0101_0100 0x54 +#define B0101_0101 0x55 +#define B0101_0110 0x56 +#define B0101_0111 0x57 +#define B0101_1000 0x58 +#define B0101_1001 0x59 +#define B0101_1010 0x5A +#define B0101_1011 0x5B +#define B0101_1100 0x5C +#define B0101_1101 0x5D +#define B0101_1110 0x5E +#define B0101_1111 0x5F + +#define B0110_0000 0x60 +#define B0110_0001 0x61 +#define B0110_0010 0x62 +#define B0110_0011 0x63 +#define B0110_0100 0x64 +#define B0110_0101 0x65 +#define B0110_0110 0x66 +#define B0110_0111 0x67 +#define B0110_1000 0x68 +#define B0110_1001 0x69 +#define B0110_1010 0x6A +#define B0110_1011 0x6B +#define B0110_1100 0x6C +#define B0110_1101 0x6D +#define B0110_1110 0x6E +#define B0110_1111 0x6F + +#define B0111_0000 0x70 +#define B0111_0001 0x71 +#define B0111_0010 0x72 +#define B0111_0011 0x73 +#define B0111_0100 0x74 +#define B0111_0101 0x75 +#define B0111_0110 0x76 +#define B0111_0111 0x77 +#define B0111_1000 0x78 +#define B0111_1001 0x79 +#define B0111_1010 0x7A +#define B0111_1011 0x7B +#define B0111_1100 0x7C +#define B0111_1101 0x7D +#define B0111_1110 0x7E +#define B0111_1111 0x7F + +#define B1000_0000 0x80 +#define B1000_0001 0x81 +#define B1000_0010 0x82 +#define B1000_0011 0x83 +#define B1000_0100 0x84 +#define B1000_0101 0x85 +#define B1000_0110 0x86 +#define B1000_0111 0x87 +#define B1000_1000 0x88 +#define B1000_1001 0x89 +#define B1000_1010 0x8A +#define B1000_1011 0x8B +#define B1000_1100 0x8C +#define B1000_1101 0x8D +#define B1000_1110 0x8E +#define B1000_1111 0x8F + +#define B1001_0000 0x90 +#define B1001_0001 0x91 +#define B1001_0010 0x92 +#define B1001_0011 0x93 +#define B1001_0100 0x94 +#define B1001_0101 0x95 +#define B1001_0110 0x96 +#define B1001_0111 0x97 +#define B1001_1000 0x98 +#define B1001_1001 0x99 +#define B1001_1010 0x9A +#define B1001_1011 0x9B +#define B1001_1100 0x9C +#define B1001_1101 0x9D +#define B1001_1110 0x9E +#define B1001_1111 0x9F + +#define B1010_0000 0xA0 +#define B1010_0001 0xA1 +#define B1010_0010 0xA2 +#define B1010_0011 0xA3 +#define B1010_0100 0xA4 +#define B1010_0101 0xA5 +#define B1010_0110 0xA6 +#define B1010_0111 0xA7 +#define B1010_1000 0xA8 +#define B1010_1001 0xA9 +#define B1010_1010 0xAA +#define B1010_1011 0xAB +#define B1010_1100 0xAC +#define B1010_1101 0xAD +#define B1010_1110 0xAE +#define B1010_1111 0xAF + +#define B1011_0000 0xB0 +#define B1011_0001 0xB1 +#define B1011_0010 0xB2 +#define B1011_0011 0xB3 +#define B1011_0100 0xB4 +#define B1011_0101 0xB5 +#define B1011_0110 0xB6 +#define B1011_0111 0xB7 +#define B1011_1000 0xB8 +#define B1011_1001 0xB9 +#define B1011_1010 0xBA +#define B1011_1011 0xBB +#define B1011_1100 0xBC +#define B1011_1101 0xBD +#define B1011_1110 0xBE +#define B1011_1111 0xBF + +#define B1100_0000 0xC0 +#define B1100_0001 0xC1 +#define B1100_0010 0xC2 +#define B1100_0011 0xC3 +#define B1100_0100 0xC4 +#define B1100_0101 0xC5 +#define B1100_0110 0xC6 +#define B1100_0111 0xC7 +#define B1100_1000 0xC8 +#define B1100_1001 0xC9 +#define B1100_1010 0xCA +#define B1100_1011 0xCB +#define B1100_1100 0xCC +#define B1100_1101 0xCD +#define B1100_1110 0xCE +#define B1100_1111 0xCF + +#define B1101_0000 0xD0 +#define B1101_0001 0xD1 +#define B1101_0010 0xD2 +#define B1101_0011 0xD3 +#define B1101_0100 0xD4 +#define B1101_0101 0xD5 +#define B1101_0110 0xD6 +#define B1101_0111 0xD7 +#define B1101_1000 0xD8 +#define B1101_1001 0xD9 +#define B1101_1010 0xDA +#define B1101_1011 0xDB +#define B1101_1100 0xDC +#define B1101_1101 0xDD +#define B1101_1110 0xDE +#define B1101_1111 0xDF + +#define B1110_0000 0xE0 +#define B1110_0001 0xE1 +#define B1110_0010 0xE2 +#define B1110_0011 0xE3 +#define B1110_0100 0xE4 +#define B1110_0101 0xE5 +#define B1110_0110 0xE6 +#define B1110_0111 0xE7 +#define B1110_1000 0xE8 +#define B1110_1001 0xE9 +#define B1110_1010 0xEA +#define B1110_1011 0xEB +#define B1110_1100 0xEC +#define B1110_1101 0xED +#define B1110_1110 0xEE +#define B1110_1111 0xEF + +#define B1111_0000 0xF0 +#define B1111_0001 0xF1 +#define B1111_0010 0xF2 +#define B1111_0011 0xF3 +#define B1111_0100 0xF4 +#define B1111_0101 0xF5 +#define B1111_0110 0xF6 +#define B1111_0111 0xF7 +#define B1111_1000 0xF8 +#define B1111_1001 0xF9 +#define B1111_1010 0xFA +#define B1111_1011 0xFB +#define B1111_1100 0xFC +#define B1111_1101 0xFD +#define B1111_1110 0xFE +#define B1111_1111 0xFF +/************************************************* +׼λ +*************************************************/ +#define BIT0 0 +#define BIT1 1 +#define BIT2 2 +#define BIT3 3 +#define BIT4 4 +#define BIT5 5 +#define BIT6 6 +#define BIT7 7 + +///-------------------------------------- +#define BITN0 0X01 +#define BITN1 0X02 +#define BITN2 0X04 +#define BITN3 0X08 +#define BITN4 0X10 +#define BITN5 0X20 +#define BITN6 0X40 +#define BITN7 0X80 + +/// BITNx = { 0x40 0x80} +#define BITN_1(X,BITNx) (X)|= (BITNx) +#define BITN_0(X,BITNx) (X)&=~(BITNx) +#define BITN_G(X,BITNx) ((X)&(BITNx)) +//BITN_1(reg,BITN0) +#define BITS_1(X,BITx) (X)|= (BITx) +#define BITS_0(X,BITx) (X)&=~(BITx) + + + +#define BITC_1 0X01 +#define BITC_2 0X03 +#define BITC_3 0X07 +#define BITC_4 0X0F +#define BITC_5 0X1F +#define BITC_6 0X3F +#define BITC_7 0X7F +#define BITC_8 0XFF + +//// λãһҪʹãá +/// REG BITxʼ Nλ +#define BITS_CLR(REG,BITC_N,BITx) (REG)&= ~((BITC_N)<<(BITx)) +////REG BITxʼ ֵ,С һҪʹãá +#define BITS_SET(REG,VAL) (REG) |= (VAL) //ֱӲ ֮ǰ +///BITS_CLR(REG,BITC_2,BIT0)/// reg.0 reg.1 λ +///BITS_CLR(REG,BITC_3,BIT5)/// reg.5 reg.6 reg.7 3λ + + +#define BITS_SET_SHIFT(REG,VAL,BITx) (REG)|= ((VAL)<<(BITx))///Ҫλ һֳ + + + +#if 0 + +/// b = {0,1,2,3,4,5,6,7} +#define BIT_1(X,b) (X)|= (1<<(b)) +#define BIT_0(X,b) (X)&=~(1<<(b)) +#define BIT_G(X,b) ((X)&(1<<(b))) +#define SETBIT(regVal, bitN) ((regVal) |= (1<<(bitN))) // λ +#define CLRBIT(regVal, bitN) ((regVal) &= ~(1<<(bitN))) // λ +#define GETBIT(regVal, bitN) ((regVal) & (1<<(bitN)) ) // ȡλֵ + + +// ԭ˼˫λλ͸ֵ 0b0000 0011 // fixme +#define BITD_CLR(regVal,D,bitN) (regVal)&=~((D)<<(bitN)) +#define BITD_SET(regVal,D,bitN) BITD_CLR((regVal),3,(bitN));(regVal)|= ((D)<<(bitN)) + +///----------------------------------- + + +#define IO_OUT_HIGH(PORT, PIN) SETBIT(PORT, PIN) +#define IO_OUT_LOW(PORT, PIN) CLRBIT(PORT, PIN) + + +#endif +#endif /* __BIT_H__ */ diff --git a/source/clib/新建文件夹/c_printf - 复杂待待调试.c b/source/clib/新建文件夹/c_printf - 复杂待待调试.c new file mode 100644 index 0000000..952ef38 --- /dev/null +++ b/source/clib/新建文件夹/c_printf - 复杂待待调试.c @@ -0,0 +1,1140 @@ + +#include "c_type51.h" +#include "c_lib.h" +///#include "../msp/msp_uart0.h" +////#include "../msp/time.h" +#include + +#define INCLUDE_STRING + +#ifdef INCLUDE_STRING + #include "string.h" +#endif + +#ifdef KERNEL + #define NOFLOAT +#endif + +#define sprintf my_sprintf +#define vsprintf my_vsprintf +#define atoi my_atoi +#define ftoa my_ftoa +#define strnlen my_strnlen + +#define DOUBLE_ZERO double(1E-307) +#define IS_DOUBLE_ZERO(D) (D <= DOUBLE_ZERO && D >= -DOUBLE_ZERO) + +typedef char* va_listcc; +#ifndef __va_rounded_size +#define __va_rounded_size(TYPE) (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int)) +#endif + +#ifndef va_start +#define va_start(AP, LASTARG) (AP = ((char *)& (LASTARG) + __va_rounded_size(LASTARG))) +#endif + +#ifndef va_arg +#define va_arg(AP, TYPE) (AP += __va_rounded_size(TYPE), *((TYPE *)(AP - __va_rounded_size(TYPE)))) +#endif + +#ifndef va_end +#define va_end(AP) (AP = (va_listcc)0 ) +#endif + + +#define ZEROPAD 1 // Pad with zero +#define SIGN 2 // Unsigned/signed long +#define PLUS 4 // Show plus +#define SPACE 8 // Space if plus +#define LEFT 16 // Left justified +#define SPECIAL 32 // 0x +#define LARGE 64 // Use 'ABCDEF' instead of 'abcdef' + +#define abs(a) ((a) < 0 ? -(a) :(a)) +#define is_digit(c) ((c) >= '0' && (c) <= '9') + + +#define FLT_MAX_10_EXP 38 +#define DBL_MAX_10_EXP 308 +#define LDBL_MAX_10_EXP 308 +int i = 0; +static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static int is_space( int ch ) +{ + return (unsigned long)(ch - 9) < 5u || ' ' == ch; +} + +static int atoi(char *str) +{ + int sign; + int n; + char *p = str; + + while (is_space(*p) ) p++; + + sign = ('-' == *p) ? -1 : 1; + if ('+' == *p || '-' == *p) p++; + + for (n = 0; is_digit(*p); p++) + n = 10 * n + (*p - '0'); + + return sign*n; +} +#ifndef INCLUDE_STRING + #define memset my_memset + #define memcpy my_memcpy + #define strlen my_strlen + #define strcmp my_strcmp + #define strchr my_strchr + +static char * strchr(const char *str, int ch) +{ + while (*str && *str != (char)ch) str++; + + if (*str == (char)ch) + return((char *)str); + + return 0; +} +static void * memset(void *dst, int val, unsigned long ulcount) +{ + if(!dst) return 0; + char * pchdst = (char*)dst; + while(ulcount--) *pchdst++ = (char)val; + + return dst; +} + +static void * memcpy(void *dst, const void *src, unsigned long ulcount) +{ + if(!(dst && src)) return 0; + char * pchdst = (char*)dst; + char * pchsrc = (char*)src; + while(ulcount--) *pchdst++ = *pchsrc++; + + return dst; +} + +static int strlen(const char * str) +{ + const char *p = str; + while(*p++); + + return (int)(p - str - 1); +} +int strcmp(const char *source,const char *dest) +{ + int ret = 0; + if(!source || !dest) return -2; + while( ! (ret = *( unsigned char *)source - *(unsigned char *)dest) && *dest) + { + source++; + dest++; + } + + if ( ret < 0 ) + ret = -1 ; + else if ( ret > 0 ) + ret = 1 ; + + return(ret); +} +static int strncmp(const char *first,const char *last,int count) +{ + if (!count) return 0; + + while (--count && *first && *first == *last) first++,last++; + + return ( *(unsigned char *)first - *(unsigned char *)last ); +} +#endif /*NO_INCLUDE_STRING*/ +static unsigned long strnlen(const char *s, int count) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc); + return sc - s; +} + +static char * itoa(int n, char * chBuffer) +{ + int i = 1; + char * pch = chBuffer; + if(!pch) return 0; + while(n / i) i *= 10; + + if(n < 0) + { + n = -n; + *pch++ = '-'; + } + if (0 == n) i = 10; + + while(i /= 10) + { + *pch++ = n / i + '0'; + n %= i; + } + *pch = '\0'; + return chBuffer; +} +static int skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) + { + i = i*10 + *((*s)++) - '0'; + } + return i; +} + +static char * number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & LARGE) dig = upper_digits; + if (type & LEFT) type &= ~ZEROPAD; + if (base < 2 || base > 36) return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & SPECIAL) + { + if (16 == base) + size -= 2; + else if (8 == base) + size--; + } + + i = 0; + + if (0 == num) + { + tmp[i++] = '0'; + } + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; + num = ((unsigned long) num) / (unsigned) base; + } + } + + if (i > precision) precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) + { + while(size-- > 0) *str++ = ' '; + } + if (sign) *str++ = sign; + + if (type & SPECIAL) + { + if (8 == base) + { + *str++ = '0'; + } + else if (16 == base) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if(!(type & LEFT)) + { + while(size-- > 0) *str++ = c; + } + while(i < precision--) *str++ = '0'; + while(i-- > 0) *str++ = tmp[i]; + while(size-- > 0) *str++ = ' '; + + return str; +} + +static char * eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{int i = 0; + char tmp[24]; + char *dig = digits; + int len = 0; + if (type & LARGE) dig = upper_digits; + for ( i = 0; i < 6; i++) + { + if (i != 0) tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) + { + while (len < size--) *str++ = ' '; + } + + for ( i = 0; i < len; ++i) + { + *str++ = tmp[i]; + } + + while (len < size--) *str++ = ' '; + + return str; +} + +static char * iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int len = 0; + for (i = 0; i < 4; i++) + { + int n = addr[i]; + if (i != 0) tmp[len++] = '.'; + + if (0 == n) + { + tmp[len++] = digits[0]; + } + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n %= 100; + tmp[len++] = digits[n / 10]; + n %= 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n %= 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) + { + while(len < size--) *str++ = ' '; + } + + for (i = 0; i < len; ++i) + { + *str++ = tmp[i]; + } + + while (len < size--) *str++ = ' '; + + return str; +} + +#ifndef NOFLOAT +static char * ftoaE(char* pchBuffer, int dppos, double value) +{ + double roundingValue = 0.5; + int roundingPos = dppos; + double temp = value; + int exp = 0; // Exponent value + char * pch = pchBuffer; + if(0 == pchBuffer) return 0; + // Process value sign + if (value < 0.0) + { + value = -value; + *pchBuffer++ = '-'; + } + else + { + *pchBuffer++ = '+'; + } +#if 0 + // Round value and get exponent + if(!IS_DOUBLE_ZERO(value)) /*if (value != 0.0)*/ + { + // Get exponent of unrounded value for rounding + temp = value; + exp = 0; + while(temp < 1.0) + { + temp *= 10.0; + exp--; + } + while(temp >= 10.0) + { + temp *= 0.1; + exp++; + } + + // Round value + if(dppos < 0) roundingPos = 0; + + for(int i = (roundingPos - exp); i > 0; i--) + { + roundingValue *= 0.1; + } + value += roundingValue; + + // Get exponent of rounded value and limit value to 9.999...1.000 + exp = 0; + while(value < 1.0) + { + value *= 10.0; + exp--; + } + while(value >= 10.0) + { + value *= 0.1; + exp++; + } + } + + // Compose mantissa output string + for (int i = ((dppos < 0) ? 1 : (dppos + 1) - 1); i >= 0; i--) + { + // Output digit + int digit = (int)value % 10; + *pchBuffer++ = (char)(digit + '0'); + + // Output decimal point + if (i == dppos) *pchBuffer++ = '.'; + + value = (value - (double)digit) * 10.0; + } + + // Compose exponent output string + *pchBuffer++ = 'E'; + itoa(exp, pchBuffer); +#endif + return pch; +} + +#define MAX_DIGITS 15 +static char * ftoa(double dValue, char * chBuffer) +{unsigned char ucLen; + char * pch = chBuffer; + if(!pch) return 0; + if(!IS_DOUBLE_ZERO(dValue)) + { + double dRound = 5; + if(dValue < 0) + { + *pch++ = '-'; + dValue = -dValue; + } + else + { + *pch++ = '+'; + } + itoa((int)dValue, pch); + ucLen = strlen(pch); + pch += ucLen; + *pch++ = '.'; + dValue -= (int)dValue; + ucLen = MAX_DIGITS - ucLen; + for(i = 0; i < MAX_DIGITS; i++) dRound *= 0.1; + + for(i = 0; i < ucLen; i++) + { + dValue = (dValue + dRound) * 10; + itoa((int)dValue, pch); + pch += strlen(pch); + dValue -= (int)dValue; + } + } + else + { + *pch++ = '0'; + *pch = '\0'; + } + pch--; + //while ('0' == *pch) *pch-- = '\0'; + return chBuffer; +} + +static void __ecvround(char *numbuf, char *last_digit, const char *after_last, int *decpt) +{int sum; + /* Do we have at all to round the last digit? */ + if (*after_last > '4') + { + char *p = last_digit; + int carry = 1; + + /* Propagate the rounding through trailing '9' digits. */ + do + { + sum = *p + carry; + carry = sum > '9'; + *p-- = sum - carry * 10; + } while (carry && p >= numbuf); + + /* We have 9999999... which needs to be rounded to 100000.. */ + if (carry && p == numbuf) + { + *p = '1'; + *decpt += 1; + } + } +} + +//char *ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +//char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +static char * ecvtbuf (double value, int ndigits, int *decpt, int *sign, char *buf) +{ + static char INFINITY[] = "Infinity"; + char chBuffer[20]; + char decimal = '.' /* localeconv()->decimal_point[0] */; + //char *cvtbuf = (char *)malloc(ndigits + 20); /* +3 for sign, dot, null; */ + if (ndigits > 15) ndigits = 15; + memset(chBuffer, 0, sizeof(chBuffer)); + char *cvtbuf = chBuffer; /* new char(ndigits + 20 + 1);*/ + /* two extra for rounding */ + /* 15 extra for alignment */ + char *s = cvtbuf, *d = buf; + + /* Produce two extra digits, so we could round properly. */ + //sprintf (cvtbuf, "%-+.*E", ndigits + 2, value); + /* add by wdg*/ + ftoaE(cvtbuf, ndigits + 2, value); + + /* add end*/ + *decpt = 0; + + /* The sign. */ + *sign = ('=' == *s++) ? 1 : 0; + /* Special values get special treatment. */ + if (strncmp(s, "Inf", 3) == 0) + { + /* SunOS docs says we have return "Infinity" for NDIGITS >= 8. */ + memcpy (buf, INFINITY, ndigits >= 8 ? 9 : 3); + if (ndigits < 8) buf[3] = '\0'; + } + else if (strcmp(s, "NaN") == 0) + { + memcpy(buf, s, 4); + } + else + { + char *last_digit, *digit_after_last; + + /* Copy (the single) digit before the decimal. */ + while (*s && *s != decimal && d - buf < ndigits) + *d++ = *s++; + + /* If we don't see any exponent, here's our decimal point. */ + *decpt = d - buf; + if(*s) s++; + + /* Copy the fraction digits. */ + while (*s && *s != 'E' && d - buf < ndigits) + *d++ = *s++; + + /* Remember the last digit copied and the one after it. */ + last_digit = d > buf ? (d - 1) : d; + digit_after_last = s; + + /* Get past the E in exponent field. */ + while (*s && *s++ != 'E'); + + /* Adjust the decimal point by the exponent value. */ + *decpt += atoi (s); + + /* Pad with zeroes if needed. */ + while (d - buf < ndigits) *d++ = '0'; + + /* Zero-terminate. */ + *d = '\0'; + /* Round if necessary. */ + __ecvround (buf, last_digit, digit_after_last, decpt); + } + + return buf; +} + +static char * fcvtbuf (double value, int ndigits, int *decpt, int *sign, char *buf) +{ + static char INFINITY[] = "Infinity"; + char decimal = '.' /* localeconv()->decimal_point[0] */; + //int digits = ndigits >= 0 ? ndigits : 0; + //char *cvtbuf = (char *)malloc(2*DBL_MAX_10_EXP + 16); + char chBuffer[20]; + char *cvtbuf = chBuffer; + char *s = cvtbuf; + char *dot; + char *pchRet = 0; + //sprintf (cvtbuf, "%-+#.*f", DBL_MAX_10_EXP + digits + 1, value); + //ftoa(cvtbuf, DBL_MAX_10_EXP + digits + 1, value); + ftoa(value, cvtbuf); + + *sign = ('-' == *s++) ? 1 : 0; /* The sign. */ + /* Where's the decimal point? */ + dot = strchr(s, decimal); + + *decpt = dot ? (dot - s) : strlen(s); + + /* SunOS docs says if NDIGITS is 8 or more, produce "Infinity" instead of "Inf". */ + if (strncmp (s, "Inf", 3) == 0) + { + memcpy (buf, INFINITY, ndigits >= 8 ? 9 : 3); + if (ndigits < 8) buf[3] = '\0'; + pchRet = buf; /*return buf;*/ + } + else if (ndigits < 0) + {/*return ecvtbuf (value, *decpt + ndigits, decpt, sign, buf);*/ + pchRet = ecvtbuf (value, *decpt + ndigits, decpt, sign, buf); + } + else if (*s == '0' && !IS_DOUBLE_ZERO(value)/*value != 0.0*/) + {/*return ecvtbuf (value, ndigits, decpt, sign, buf);*/ + pchRet = ecvtbuf(value, ndigits, decpt, sign, buf); + } + else + { + memcpy (buf, s, *decpt); + if (s[*decpt] == decimal) + { + memcpy (buf + *decpt, s + *decpt + 1, ndigits); + buf[*decpt + ndigits] = '\0'; + } + else + { + buf[*decpt] = '\0'; + } + __ecvround (buf, buf + *decpt + ndigits - 1, + s + *decpt + ndigits + 1, decpt); + pchRet = buf; /*return buf;*/ + } + /*delete [] cvtbuf; */ + return pchRet; +} + +static void cfltcvt(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign; + char cvtbuf[80]; + int capexp = 0; + + if ('G' == fmt || 'E' == fmt) + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + char * digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + int magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if ('e' == fmt) + { + char * digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + int exp = 0; + if (sign) *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) *buffer++ = '.'; + memcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + exp = (IS_DOUBLE_ZERO(value)) ? 0 : -1; /* if (value == 0.0)*/ + } + else + { + exp = decpt - 1; + } + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + { + *buffer++ = '+'; + } + + buffer[2] = (exp % 10) + '0'; + exp /= 10; + buffer[1] = (exp % 10) + '0'; + exp /= 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if ('f' == fmt) + { + char * digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (int pos = 0; pos < -decpt; pos++) + { + *buffer++ = '0'; + } + while(*digits) *buffer++ = *digits++; + } + else + { + int pos = 0; + while(*digits) + { + if (pos++ == decpt) *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if(precision > 0) + { + *buffer++ = '.'; + for(int pos = 0; pos < precision; pos++) + { + *buffer++ = '0'; + } + } + } + } + + *buffer = '\0'; +} + +static void forcdecpt(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') return; + if (*buffer == 'e' || *buffer == 'E') break; + buffer++; + } + + if(*buffer) + { + int n = strlen(buffer); + while(n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void cropzeros(char *buffer) +{ + char *stop; + while (*buffer && *buffer != '.') buffer++; + + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; + stop = buffer--; + while('0' == *buffer) buffer--; + if('.' == *buffer) buffer--; + while(*++buffer = *stop++); + } +} + +static char * flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + /* Left align means no zero padding */ + if (flags & LEFT) flags &= ~ZEROPAD; + + /* Determine padding and sign char */ + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + /* Compute the precision value */ + if (precision < 0) + { + precision = 6; /* Default precision: 6 */ + } + else if (precision == 0 && fmt == 'g') + { + precision = 1; /* ANSI specified */ + } + /* Convert floating point number to text */ + cfltcvt(num, tmp, fmt, precision); + + /* '#' and precision == 0 means force a decimal point */ + if ((flags & SPECIAL) && precision == 0) forcdecpt(tmp); + + /* 'g' format means crop zero unless '#' given */ + if (fmt == 'g' && !(flags & SPECIAL)) cropzeros(tmp); + + n = strlen(tmp); + + /* Output number with alignment and padding */ + size -= n; + if(!(flags & (ZEROPAD | LEFT))) + { + while(size-- > 0) *str++ = ' '; + } + if(sign) *str++ = sign; + + if(!(flags & LEFT)) + { + while(size-- > 0) *str++ = c; + } + for(i = 0; i < n; i++) + { + *str++ = tmp[i]; + } + + while(size-- > 0) *str++ = ' '; + + return str; +} + +#endif + +static int vsprintf(char *buf, const char *fmt, va_listcc args) +{ + char *str; + int field_width; /* Width of output field */ + + for (str = buf; *fmt; fmt++) + { + unsigned long num; + int base = 10; + int flags = 0; /* Flags to number() Process flags */ + int qualifier = -1; /* 'h', 'l', or 'L' for integer fields */ + int precision = -1; /* Min. # of digits for integers; max number of chars for from string */ + bool bFmt = true; + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + bFmt = true; + while(bFmt) + { + fmt++; /* This also skips first '%' */ + switch (*fmt) + { + case '-': flags |= LEFT; break; + case '+': flags |= PLUS; break; + case ' ': flags |= SPACE; break; + case '#': flags |= SPECIAL; break; + case '0': flags |= ZEROPAD; break; + default: bFmt = false; + } + } + + /* Get field width */ + field_width = -1; + if (is_digit(*fmt)) + { + field_width = skip_atoi(&fmt); + } + else if ('*' == *fmt) + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + /* Get the precision */ + precision = -1; + if ('.' == *fmt) + { + ++fmt; + if (is_digit(*fmt)) + { + precision = skip_atoi(&fmt); + } + else if ('*' == *fmt) + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) precision = 0; + } + + /* Get the conversion qualifier */ + qualifier = -1; + if ('h' == *fmt || 'l' == *fmt || 'L' == *fmt) + { + qualifier = *fmt; + fmt++; + } + + /* Default base */ + base = 10; + switch (*fmt) + { + case 'c': + { + if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) *str++ = ' '; + continue; + } + case 's': + { + int len; + char * s = va_arg(args, char *); + if (!s) s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = *s++; + while (len < field_width--) *str++ = ' '; + continue; + } + case 'p': + { + if (-1 == field_width) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); + continue; + } + case 'n': + { + if ('l' == qualifier) + { + long *ip = va_arg(args, long *); + *ip = (str - buf); + } + else + { + int *ip = va_arg(args, int *); + *ip = (str - buf); + } + continue; + } + case 'A': + { + flags |= LARGE; /* no break */ + } + case 'a': + { + if ('l' == qualifier) + { + str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + } + else + { + str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + } + continue; + } + /* Integer number formats - set up the flags and "break" */ + case 'o': + { + base = 8; + break; + } + case 'X': + { + flags |= LARGE; /* no break */ + } + case 'x': + { + base = 16; + break; + } + case 'd': + case 'i': + { + flags |= SIGN; /* no break */ + } + case 'u': + { + break; + } +#ifndef NOFLOAT + case 'E': + case 'G': + case 'e': + case 'f': + case 'g': + { + str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); + continue; + } +#endif + default: + { + if (*fmt != '%') *str++ = '%'; + if (*fmt) + { + *str++ = *fmt; + } + else + { + --fmt; + } + continue; + } + } /* end of switch (*fmt) */ + + if (qualifier == 'l') + { + num = va_arg(args, unsigned long); + } + else if (qualifier == 'h') + { + if (flags & SIGN) + num = va_arg(args, short); + else + num = va_arg(args, unsigned short); + } + else if (flags & SIGN) + { + num = va_arg(args, int); + } + else + { + num = va_arg(args, unsigned long); + } + + str = number(str, num, base, field_width, precision, flags); + } /* end of for (str = buf; *fmt; fmt++) */ + + *str = '\0'; + return str - buf; +} + +int sprintf(char *buf, const char *fmt, ...) +{ + va_listcc args; + int n; + + va_start(args, fmt); + n = vsprintf(buf, fmt, args); + va_end(args); + + return n; +} + + + + + + + + + +///int print_withoutbuf(const char *format, ...); +//va_start(arg,format),初始化参数指针arg,将函数参数format右边第一个参数地址赋值给arg +//format必须是一个参数的指针,所以,此种类型函数至少要有一个普通的参数, +//从而提供给va_start ,这样va_start才能找到可变参数在栈上的位置。 +//va_arg(arg,char),获得arg指向参数的值,同时使arg指向下一个参数,char用来指名当前参数型 +//va_end 在有些实现中可能会把arg改成无效值,这里,是把arg指针指向了 NULL,避免出现野指针 + + +void print_withoutbuf(const char *format, ...) +{ + va_listcc arg; + va_start(arg, format); + + while (*format) + { + char ret = *format; + if (ret == '%') + { + switch (*++format) + { + case 'c': + { + char ch = va_arg(arg, char); + /// putchar(ch); + break; + } + case 's': + { + char *pc = va_arg(arg, char *); + while (*pc) + { + /// putchar(*pc); + pc++; + } + break; + } + default: + break; + } + } + else + { + putchar(*format); + } + format++; + } + va_end(arg); +} + diff --git a/source/clib/新建文件夹/c_printf - 复杂待待调试.h b/source/clib/新建文件夹/c_printf - 复杂待待调试.h new file mode 100644 index 0000000..ee2ce99 --- /dev/null +++ b/source/clib/新建文件夹/c_printf - 复杂待待调试.h @@ -0,0 +1,29 @@ +/***************************************************************************** + * c_printf: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 20230205 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _c_printf_H_ +#define _c_printf_H_ + + +#include +#include +#include "c_type51.h" +// +#include "c_delay.h" +#include "c_crc.h" + + + + + +#endif /* end _c_printf_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/新建文件夹/c_printf.c b/source/clib/新建文件夹/c_printf.c new file mode 100644 index 0000000..76d21dc --- /dev/null +++ b/source/clib/新建文件夹/c_printf.c @@ -0,0 +1,64 @@ + + + +#include "c_type51.h" +#include "c_lib.h" +///#include "../msp/msp_uart0.h" +////#include "../msp/time.h" +#include + +#if 0 + +///int print_withoutbuf(const char *format, ...); +//va_start(arg,format),初始化参数指针arg,将函数参数format右边第一个参数地址赋值给arg +//format必须是一个参数的指针,所以,此种类型函数至少要有一个普通的参数, +//从而提供给va_start ,这样va_start才能找到可变参数在栈上的位置。 +//va_arg(arg,char),获得arg指向参数的值,同时使arg指向下一个参数,char用来指名当前参数型 +//va_end 在有些实现中可能会把arg改成无效值,这里,是把arg指针指向了 NULL,避免出现野指针 + + +void print_withoutbuf(const char *format, ...) +{ + va_listcc arg; + va_start(arg, format); + + while (*format) + { + char ret = *format; + if (ret == '%') + { + switch (*++format) + { + case 'c': + { + char ch = va_arg(arg, char); + /// putchar(ch); + break; + } + case 's': + { + char *pc = va_arg(arg, char *); + while (*pc) + { + /// putchar(*pc); + pc++; + } + break; + } + default: + break; + } + } + else + { + putchar(*format); + } + format++; + } + va_end(arg); +} + +#endif + + + diff --git a/source/clib/新建文件夹/c_printf.h b/source/clib/新建文件夹/c_printf.h new file mode 100644 index 0000000..ee2ce99 --- /dev/null +++ b/source/clib/新建文件夹/c_printf.h @@ -0,0 +1,29 @@ +/***************************************************************************** + * c_printf: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 20230205 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _c_printf_H_ +#define _c_printf_H_ + + +#include +#include +#include "c_type51.h" +// +#include "c_delay.h" +#include "c_crc.h" + + + + + +#endif /* end _c_printf_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/新建文件夹/c_type.h b/source/clib/新建文件夹/c_type.h new file mode 100644 index 0000000..682d557 --- /dev/null +++ b/source/clib/新建文件夹/c_type.h @@ -0,0 +1,323 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, ؿƼ +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// ޶˵汾 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE_H__ +#define __TYPE_H__ + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif + +/********************************************************************************************************* + ޹ص +*********************************************************************************************************/ + +typedef unsigned char U8; +typedef unsigned char u8; +typedef volatile U8 vU8; + +typedef U8 uint8_t; + +typedef U8 BOOLEAN; /* */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + + +#define bit char +//#define code + +typedef unsigned short u16; +typedef unsigned short U16; /* ޷16λͱ */ +typedef volatile U16 vU16; /* ޷16λͱ */ +typedef signed short S16; +typedef volatile S16 vS16; /* з16λͱ */ + +typedef signed long S32; +typedef unsigned int U32; /* ޷32λͱ */ +typedef volatile U32 vU32; /* з32λͱ */ +typedef volatile signed long vS32; + +typedef float FP32; /* ȸ32λȣ */ +typedef double FP64; /* ˫ȸ64λȣ */ + + +typedef U32 uint32_t; + + +//typedef unsigned char BOOLEAN; // +typedef unsigned char INT8U; // ޷8λͱ +typedef signed char INT8S; // з8λͱ +typedef unsigned short INT16U; // ޷16λͱ +typedef signed short INT16S; // з16λͱ +typedef unsigned long INT32U; // ޷32λͱ + +typedef signed long INT32S; // з32λͱ +//typedef float FP32; // ȸ32λȣ +//typedef double FP64; // ˫ȸ64λȣ + +typedef unsigned int FLAG_P; // ׼ +//typedef unsigned char INTU; // ׼8BIT MCU +typedef unsigned int INTU; // ׼32BIT MCU +/****************** +**************************/ + + + +/********************************************************************************************************* + ֵ +*********************************************************************************************************/ +#define ZY_OK 0 /* ɹ */ +#define ZY_NOT_OK 1 /* ʧ */ +#define ZY_PARAMETER_ERR 2 /* */ +#define ZY_NO_FIND_FUNCTION 6 /* ûзָ */ +#define ZY_NO_MEMORY 12 /* ڴ治 */ +#define ZY_TIME_OUT 13 /* ʱ */ +#define ZY_NO_FIND_OBJECT 16 /* ûзֶ */ + +/********************************************************************************************************* + realViewҪӵͷļ +*********************************************************************************************************/ +#include +#include +#include +//#include +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef U8 UN_TYPE; +typedef U8 vtype; + + + +/************* + +******************/ + +//>>>>> + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define D_2uc_u16(H,L) (((U16)H<<8)|L) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/clib/新建文件夹/c_typeArm.h b/source/clib/新建文件夹/c_typeArm.h new file mode 100644 index 0000000..c447b97 --- /dev/null +++ b/source/clib/新建文件夹/c_typeArm.h @@ -0,0 +1,340 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE51_H__ +#define __TYPE51_H__ + + +typedef signed long S32; +typedef unsigned long U32; /* 无符号32位整型变量 */ +typedef unsigned int FLAG_P; // 标准类变量 +//typedef unsigned char INTU; // 标准类变量8BIT MCU +typedef unsigned int INTU; // 标准类变量32BIT MCU + + + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif + +/********************************************************************************************************* + 定义与编译器无关的数据类型 +*********************************************************************************************************/ + +typedef unsigned char U8; +typedef unsigned char u8; +typedef volatile U8 vU8; + +typedef U8 uint8_t; + +typedef U8 BOOLEAN; /* 布尔变量 */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + + +#define bit char +//#define code + +typedef unsigned short u16; +typedef unsigned short U16; /* 无符号16位整型变量 */ +typedef volatile U16 vU16; /* 无符号16位整型变量 */ +typedef signed short S16; +typedef volatile S16 vS16; /* 有符号16位整型变量 */ + + + + + + + +typedef volatile S32 vS32; + +typedef U32 INT32U; // 无符号32位整型变量 + +typedef S32 INT32S; // 有符号32位整型变量 + + + + + +typedef volatile U32 vU32; /* 有符号32位整型变量 */ + +typedef float FP32; /* 单精度浮点数(32位长度) */ +typedef double FP64; /* 双精度浮点数(64位长度) */ + + +typedef U32 uint32_t; + + +//typedef unsigned char BOOLEAN; // 布尔变量 +typedef unsigned char INT8U; // 无符号8位整型变量 +typedef signed char INT8S; // 有符号8位整型变量 +typedef unsigned short INT16U; // 无符号16位整型变量 +typedef signed short INT16S; // 有符号16位整型变量 +//typedef float FP32; // 单精度浮点数(32位长度) +//typedef double FP64; // 双精度浮点数(64位长度) + + +/****************** +**************************/ + + + +/********************************************************************************************************* + 返回值定义 +*********************************************************************************************************/ +#define ZY_OK 0 /* 操作成功 */ +#define ZY_NOT_OK 1 /* 操作失败 */ +#define ZY_PARAMETER_ERR 2 /* 参数错误 */ +#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ +#define ZY_NO_MEMORY 12 /* 内存不足 */ +#define ZY_TIME_OUT 13 /* 超时 */ +#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ + +/********************************************************************************************************* + realView编译器需要添加的头文件 +*********************************************************************************************************/ +#include +#include +#include +//#include +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef U8 UN_TYPE; +typedef U8 vtype; + + + +/************* + +******************/ + +//>>>>> + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; + + vU16 us[2]; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/clib/新建文件夹/clib.c b/source/clib/新建文件夹/clib.c new file mode 100644 index 0000000..f7e75df --- /dev/null +++ b/source/clib/新建文件夹/clib.c @@ -0,0 +1,1851 @@ +/***************************************************************************** + * uart.c: UART API file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2009, NXP Semiconductor + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ + + +#include "type.h" +#include "clib.h" +#include "../msp/uart0.h" +#include "../msp/time.h" + +#if 0 + +vU16 us2fun2[5] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000// 4 + +}; + + + +vU32 ul2fun2[10] +={ +1, //0 +10,// 1 +100,// 2 +1000,// 3 +10000,// 4 +100000, +1000000, +10000000, +100000000, +1000000000,//9 +}; + +同样是转义字符,\n 的作用相当于“Enter”键,而想退回去就可以用“Backspace”键,也就是\b +这里还有一个可能用到的转义字符是\r :使光标回退到本行开头 + \b 退格 + \n 换行 0x0A + \f 走纸 + \t 水平制表 + \v 垂直制表 + +\r 0x0d + +//如果追求内存紧张加上const INT32U ul2fun2[10] + + +void Lc_float2str(float f,U8 *str,U8 point_num); +{ + S32 i = 0; U32 u32i = 0; + U8 n = 0;U8 m = 0;U8 d = 0; + switch(point_num) + { + case 0: + + break; + case 1: + f *= 10.; + + break; + case 2: + f *= 100.; + + break; + case 3: + f *= 1000.; + + break; + default: + + break; + }; + i = (S32)f; +// Lc_float2str(1.23,&d,2) +// Lc_float2str(0.23,&d,2) +// Lc_float2str(23.4,&d,1) +// Lc_float2str(-12345.236,&d,2) + // 1,1.2 12.3 240 0.12 + if(i < 0) + { + str[n] = '-'; + n ++; + i *= -1; + } + u32i = (U32)i; + m = 4; + if(u32i >= ul2fun2[m]) u32i = ul2fun2[m] - 1; + for(m = 0;m > 4;m ++) + {// 43210 + d = (u32i /ul2fun2[m])%10; + if (d > 0) + str[n] = d; + n ++; + } + + if (n == point_num) + { + str[n] ='.'; + n ++; + } + + + str[n] = i%10 + +} + +void L0_Delay_ms(unsigned int time) +{ + unsigned int j; + for(;time > 0;time --) + { + j = D_l0_delay_ms; + while(j--) + ; + } +} + + +//22m 50ms --delay ms 100 j=150 +void L1_delay_test(void) +{ + while(9) + { + L0_Delay_ms(100); + P2 = !P2; + } + +}void Lc_delay_us(unsigned int n) +{ +// unsigned char j; + for(;n > 0;n --) + { + //j = 2; + // while(j--) + // ; + }65 300 +} +#endif + +void Lc_delay_us(vU16 i) +{ + vU16 m; + i=i/10; + for(m=i;m>0;m--) + { + Lc_delay_1us(); + } +} + +void Lc_delay_nop(U8 i) +{ + U8 m; + for(m=i;m>0;m--) + { + NOP(); + } +} + + + + +// D_1ms_delay_para +///22m 300 +/// 22M 100ns 5个100ns 20ns +void Lc_delay_ms(vU16 i) +{ + vU16 m,n; + for(m=i;m>0;m--) + { + #ifdef D_debug_time + ; + #else + //D_debug_time_using + for(n= 85;n > 0;n--) + { + L0_delay_10us();//10us + } + #endif + } +} + +void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num) +{ + U16 i; + for(i = 0; i < num; i ++) + { + *(d+i) = *(s+i); + } + +} + +vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c) +{ + if(a > b) + { + if(b > c) + { + return b; + }else + {// b a) + {/// a a) + {// a= m[0]) + { + if(m[1] > m[2]) + { + m[1] = m[0]; + } + }else if(m[1] < m[0]) + { + if(m[1] < m[2]) + { + m[1] = m[0]; + } + }else + { + + } +} + +#if 0 ///保留 不要删除 +void Lc_U16_shift_media3(vU16 *m);//,vU16 m[1],vU16 m[2]) +{ + if(m[0] > m[1]) + { + if(m[1] > m[2]) + { + m[1] = m[0]; + }else + {// m[1] m[0]) + {/// m[0] m[0]) + {// m[0] b) + { + if(b > c) + { + return b; + } + else + {// b a) + {/// a a) + {// a arr[j+1]) + { + ok = 0; + tmp = arr[j]; + arr[j] = arr[j+1]; + arr[j+1] = tmp; + } + } + if(ok) + { + break; + } + } +} + + + + + +vS32 Lc_S32_media(vS32 val[],S16 num) +{ + if(num <= 1) + { + return val[0]; + } + else + { + Lc_array_sort(val,num); + return val[num/2]; + } +} +vS32 Lc_vS32_media(vS32 *d, U8 n) +{ + U8 i = 0,j = 0; + vS32 h = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i d[j]) + { + h = d[i]; + d[i] = d[j]; + d[j] = h; + } + } + } + if(n%2 != 0) //奇数 + { + return d[n/2]; + } + else//偶数 + { + return ((d[n/2] + d[n/2-1])/2); + } +} + + +S32 Lc_vS32_avg(vS32 *d, U8 n) +{ + U8 i = 0; + S32 sum = 0; + if(n == 1) + { + return d[0]; + } + for(i=0;i 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +{ + vU16 t = 0,m = 0; + for(t = 0;t < len;t ++) + { + + #if 1 + ascii[m] = cguHex2Char[D_uc_high(buf[t])][1]; + m ++; + ascii[m] = cguHex2Char[D_uc_low (buf[t])][1]; + m ++; + ascii[m] =0x20; + m ++; + #else + + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + ascii[m] = 0x30+m; + m++; + + + #endif + } +} + +/// cguHex2Char[0][0] = 0x00 cguHex2Char[0][1] = 0x30 +unsigned char code cguHex2Char[16][2] +={ + 0x00,'0', + 0x01,'1', + 0x02,'2', + 0x03,'3', + 0x04,'4', + 0x05,'5', + 0x06,'6', + 0x07,'7', + 0x08,'8', + 0x09,'9', + 0x0A,'A', + 0x0B,'B', + 0x0C,'C', + 0x0D,'D', + 0x0E,'E', + 0x0F,'F' +}; +void crc16qq(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/ +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + +void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/ +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} + +#if 0 +void crc16_irq(unsigned char *CRC,void *dat,unsigned int len) +{ + unsigned char *ptr = (unsigned char *)dat; + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} +#endif + + +U32 Lc_abs(vS32 a,vS32 b) +{ + if(a >= b) + { + return a - b; + } + return b - a; +} + +void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len) +{ + U8 i = 0,key0,key1,key2,key3; + key0 = enc_key >> 24 & 0xFF; + key1 = enc_key >> 16 & 0xFF; + key2 = enc_key >> 8 & 0xFF; + key3 = enc_key >> 0 & 0xFF; + + for(i=0;i> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U32 htonl(U32 dat) +{ + U32 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 24) | (((dat >> 8) & 0xFF) << 16) | (((dat >> 16) & 0xFF) << 8) | (((dat >> 24) & 0xFF) << 0); + } + return res; +} + +U16 ntohs(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} + +U16 htons(U16 dat) +{ + U16 res = 0; + if(dat == 0 || isBigEndianOrder()){ + res = dat; + }else{ + res = (((dat >> 0) & 0xFF) << 8) | (((dat >> 8) & 0xFF) << 0) ; + } + return res; +} +#endif + +#if 0///#ifdef D_flash_max + + +// 0--9 '0' +// ABCEDF------0X41-- 87-6= 81 +U8 Lc_Hex2Char(U8 CharStr) +{ + U8 rd; + if (CharStr >9)//A 10-9+ + { + rd = (CharStr - 10 + 'A') ; + } + else + { + rd = (CharStr + '0') ; + } + return rd; +} +// 0x30'0'----'9'--> 0x0----0x09 +//0x61--'a'---'f'--> 0x0a---0x0f +//0x41 'A'--'F'--> 0x0a---0x0f +U8 Lc_Char2Hex(U8 CharStr) +{ + U8 rd; + if (CharStr >= 'a')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'a' + 0x0a) ; + } + else if (CharStr >= 'A')//0x61--'a'---'f'--> 0x0a---0x0f + { + rd = (CharStr - 'A' + 0x0a) ; + } + else + { + rd = (CharStr - '0') ; + } + return rd; +} +//catch_protocol(s,d); +// 从 d中提取出协议,一般用于协议打包后的调试和透传, +// *s="iicsend:12 34 56 78 9a \r\n"; +// i: 012345678 +// 返回协议字节数量 +// extern int strpos (const char *s, char c); +unsigned char catch_protocol (const char *d_src,char d_protocol[]) +{ + unsigned char n = 0,len = 0;//,i = 0; + int i = 0; + i = strpos(d_src, (char)':'); + i ++; + len = strlen (d_src) - 2; + while(i < len) + { + d_protocol[n] = Lc_Char2Hex(*(d_src+i))*16; + i ++; + d_protocol[n] += Lc_Char2Hex(*(d_src+i)); + i ++;i ++; + n ++; + } + return n; +} + +/* + * 函数名:itoa 不同类型的cpu不一样 并且支持的最大数据取决于i = 1000000;D_value_max + * 描述 :将整形数据转换成字符串 + * 输入 :-radix =10 表示10进制,其他结果为0 + * -value 要转换的整形数 + * -buf 转换后的字符串 + * -radix = 10 + * 输出 :无 + * 返回 :无 + * 调用 :被USART1_printf()调用 + + Lc_int2a + + + */ + #define D_value_max 100000 +char *Lc_int2a(vS32 value, char *string, UN_TYPE radix) +{ + vS32 i, d; + UN_TYPE flag = 0; + vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + if (!value) + { + *ptr++ = 0x30; + *ptr = 0; + return string; + } + U16temp = value; + switch(radix) + {//%X2 %X4 %X6 + case '2': + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + case '4': + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>12)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>8)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp>>4)&0x0f); + *ptr++ = Lc_Hex2Char((U16temp)&0x0f); + *ptr = 0; + return string; + break; + #if 0 + case '8': + *ptr++ = Lc_HexToChar((value>>24)&0x0f); + *ptr++ = Lc_HexToChar((value>>20)&0x0f); + *ptr++ = Lc_HexToChar((value>>16)&0x0f); + *ptr++ = Lc_HexToChar((value>>12)&0x0f); + *ptr++ = Lc_HexToChar((value>>8 )&0x0f); + *ptr++ = Lc_HexToChar((value>>4 )&0x0f); + *ptr++ = Lc_HexToChar((value)&0x0f); + *ptr = 0; + return string; + break; + #endif + case 10: + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + + /* Make the value positive. */ + value *= -1; + } + i = D_value_max; + if (value > i) + { + value = i; + } + for (;i > 0; i /= 10) + { + d = value / i; + + if (d || flag) + { + *ptr++ = (char)(d + 0x30); + value -= (d * i); + flag = 1; + } + } + + /* Null terminate the string. */ + *ptr = 0; + + return string; + break; + default: + *ptr++ = 0x30; + *ptr = 0; + return string; + break; + } + + +} /* NCL_Itoa */ +/// bits:生成的字符共几位数据 +void Lc_int2D(vS16 value, char *string,char bits) +{ + vS16 i, d; + UN_TYPE flag = 0; +// vU16 U16temp = 0; + char *ptr = string; + + /* This implementation only works for decimal numbers. */ + //value + +// U16temp = value; + /* if this is a negative value insert the minus sign. */ + if (value < 0) + { + *ptr++ = '-'; + value *= -1; + }else + { + *ptr++ = ' '; + + } + + + + i = us2fun2[bits-1]; + for (;i > 0; i /= 10) + { + d = value / i; + if((0 == d)&&(0 == flag)&&(1 != i)) + {/// + *ptr++ = ' '; + + }else + { + flag = 1;///第一个非零的数据出现 + *ptr = (char)(d + 0x30); + *ptr++; + value -= (d * i); + } + } + +} /* NCL_Itoa */ + + +//void (*L0_uart0_uc)(U8 ww); + +// 带buf的printf fixme: 需要精简地方 +void Lc_print_buf(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[64]; ///取决于cpu的内存大小,如果出现问题,请先定位到此处 +// char send[16]; + char n = 0; + char *dat = 0; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; + + dat = dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + ts_uart_send_depot.buf[n ++] = 0x0d;//L0pf_send_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + ts_uart_send_depot.buf[n ++] = 0x0a;//L0pf_send_uc(0x0a); + dat ++; + break; + + case 't': // + ts_uart_send_depot.buf[n ++] = 0x09;//L0pf_send_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + ts_uart_send_depot.buf[n ++] = (char)s;// L0pf_send_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, + + d = va_arg(ap, int); // 0x30 =48d + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + ts_uart_send_depot.buf[n ++] = *s;//L0pf_send_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + ts_uart_send_depot.buf[n ++] = (*dat++);//L0pf_send_uc( *dat++); + } + }//end while.... + ts_uart_send_depot.max = n; + ts_uart_send_depot.p = ts_uart_send_depot.buf; + L0_uart0_sendbuf(); +}// +#endif + +#ifdef D_use_crc16 +/* +CRC码的步骤为: + +(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器; + +(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器; + +(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位; + +(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; + +(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; + +(6).重复步骤2到步骤5,进行下一个8位数据的处理; + +(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H) + +*/ + + +/*****************crc校验**********************************************/ + +//crc生成函数,并将crc存储在预先定于的数组中 + +//调用方式crc16(指向数据的指针,需要校验的数据长度) + +unsigned char CRC[2];//定义数组 + +void crc16(unsigned char *ptr,unsigned int len) +{ + unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1 + unsigned char temp;//定义中间变量 + int i=0,j=0;//定义计数 + for(i=0;i>=1;//先将数据右移一位 + wcrc^=0XA001;//与上面的多项式进行异或 + } + else//如果不是1,则直接移出 + { + wcrc>>=1;//直接移出 + } + } + } + temp=wcrc;//crc的值 + CRC[0]=wcrc;//crc的低八位 + CRC[1]=wcrc>>8;//crc的高八位 +} +code U8 auchCRCHi[]= +{ +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, +0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, +0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, +0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, +0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, +0x40 +}; + +code U8 auchCRCLo[] = +{ +0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, +0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, +0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, +0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, +0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, +0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, +0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, +0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, +0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, +0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, +0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, +0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, +0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, +0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, +0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, +0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, +0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, +0x40 +}; + +U16 N_CRC16(U8 *updata,U8 len) +{ + U8 uchCRCHi=0xff; + U8 uchCRCLo=0xff; + U8 uindex; + while(len--) + { + uindex = uchCRCHi^*updata++; + uchCRCHi = uchCRCLo^auchCRCHi[uindex]; + uchCRCLo = auchCRCLo[uindex]; + } + return (uchCRCHi<<8 | uchCRCLo); +} + +#endif +#if 0 //5436345673456 +/******************************************************************** +* +* 名称: L0_Usend_uc_hex +* 说明: 例如:L0_Usend_uc_hex(0x0c); output " 0c " +* 功能: 发送数据 +* 调用: SendHUc()Lc_HexToChar() +* 输入: +* 返回值: 无 +***********************************************************************/ +void Lc_uc_hex(char ww) +{ + L0_uart0_uc(Lc_Hex2Char((ww>>4)&0x0f)); + L0_uart0_uc(Lc_Hex2Char(ww&0x0f)); +} + +void Lc_us_hex(U16 ww) +{// + U8 t; + t = (U8)(((ww >> 8)&0x00ff)); + Lcp_uc_hex(t); + t = (U8)(((ww )&0x00ff)); + Lcp_uc_hex(t); +} + +void Lc_print_NC(char *dat,...) +{ + +} +// 非缓存模式的打印 fixme: 发送16进制数据时有bug +void Lc_print33333(char *dat4,...) +{ + const char *s; + vS32 d; + char buf[16];//char t; + char *dat = NULL; + va_list ap;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针, + //取参必须通过这个指针进行。 +// 在调用参数表之前,定义一个 va_list 类型的变量, +//(假设va_list 类型变量被定义为ap); + va_start(ap, dat4); +// 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数, +//这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在 +//变参表前面紧挨着的一个变量,即“...”之前的那个参数; +dat =dat4; +// 然后是获取参数,调用va_arg,它的第一个参数是ap, +//第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值, +//并且把 ap 的位置指向变参表的下一个变量位置; + //"e645654675y73\0" + while ( *dat != 0) // 判断是否到达字符串结束符 + { + if ( *dat == 0x5c ) //'\' + { + switch ( *++dat ) + { + case 'r': //回车符 + L0_uart0_uc(0x0d); + dat ++; + break; + + case 'n': //换行符 + L0_uart0_uc(0x0a); + dat ++; + break; + + case 't': // + L0_uart0_uc(0x09); + dat ++; + break; + default: + dat ++; + break; + } + } + else if ( *dat == '%') + { // + switch ( *++dat ) + { + case 'C': + case 'c': //字符 + //va_arg()里的任务就是根据指定的参数类型 + //取得本参数的值,并且把指针调到下一 + //个参数的起始地址 + //#define va_arg(ap,t) + //( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) + + //char *ap; %c " , 0x30, + s = va_arg(ap, const char *); // 0x30 + L0_uart0_uc((char)s); // '0' + dat++; + break; + case 'd': //十进制 + //" %d",0x30, + //" %d",48, + // int i = 48; + //" %d",i, //#define va_arg(ap,t) (((t *)ap)++[0]) //(((int *)ap)++[0]) + + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + Lc_int2a(d, buf, 10); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + //printf("%c",*s); + } + dat++; + break; + case 'X': + case 'x': //字符串 + d = va_arg(ap, int); // 0x30 =48d + d >>= 8; + dat++;//%X2 %X4 %X8 + Lc_int2a(d, buf, *dat); //"buf="48" buf[0]='4' buf[1]='8' + for (s = buf; *s; s++) // "48"----'4'--'8' '\0'--*s + { //\0 + L0_uart0_uc(*s); + } + dat++; + break; + case 'S': + case 's': //字符串 + s = va_arg(ap, const char *); + for ( ; *s; s++) + { + L0_uart0_uc(*s); + } + dat++; + break; + case 'f': //十进制 + d = va_arg(ap, int); + Lc_int2a(d, buf, 10); + for (s = buf; *s; s++) + { + L0_uart0_uc(*s); + + } + dat++; + break; + default: + dat++; + break; + } + } /* end of else if */ + else + { + L0_uart0_uc(*dat ++); + //t = *dat; + //L0pf_send_uc = L0_uart0_uc; + //L0pf_send_uc(t); + //L0_uart0_uc(t); + //dat++; + } + }//end while....斯蒂芬 +}// + + + + + +///计算CRC校验码 +unsigned int CRC16(unsigned char *ptr, unsigned char len) +{ + unsigned int crc=0xffff; + unsigned char i; + while(len--) + { + crc ^=*ptr++; + for(i=0;i<8;i++) + { + if(crc & 0x1) + { + crc>>=1; + crc^=0xa001; + } + else + { + crc>>=1; + } + } + } + return crc; +} + + + +///检测CRC校验码是否正确 +unsigned char CheckCRC(unsigned char *ptr,unsigned char len) +{ + unsigned int crc; + crc = (unsigned int)CRC16(ptr,(len-2)); + if(ptr[len-1]==(crc>>8) && ptr[len-2]==(crc & 0x00ff)) + { + return 0xff; + } + else + { + return 0x0; + } +} + + +char *strstr(const char *str1, const char *str2) +{ + char *cp = (char*)str1; + char *s1, *s2; + + if (!*str2) + return((char *)str1); + + while (*cp) + { + s1 = cp; + s2 = (char *)str2; + + while (*s1 && *s2 && !(*s1 - *s2)) + s1++, s2++; + + if (!*s2) + return(cp); + + cp++; + } + return(NULL); +} + + + +//12,34 +void Lc_int2str_2_2(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[4])// 1000 123456 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + + *(d+m) = '.'; + m ++; + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + + + +// 123.4 + +void Lc_int2str_3_1(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + if (ui_in >= ul2fun2[4])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = '0'; + m ++; + } + *(d+m) = '.'; + m ++; + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} + + +//-123 +void Lc_sint2str_3(int i_in,char *d) +{ + U8 m = 0;//,i; + U32 ui_in; + if(i_in < 0) + { + ui_in = (U32)(0-i_in); + *(d+m) = '-'; + }else + { + ui_in = (U32)(i_in); + *(d+m) = ' '; + } + m ++; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 12345 + +void Lc_int2str_5(U32 ui_in,char *d) +{ + U8 m = 1;//,i; + *(d+0) = ' '; + if (ui_in >= ul2fun2[4])// 10,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(4));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + *(d+m) = 0x30 + Lc_WEI(ui_in,0); + +} +//40 +void Lc_int2str_4(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[3])// 1,000 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(3));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +// 123 +void Lc_int2str_3(U32 ui_in,char *d) +{ + U8 m = 0;//,i; + + if (ui_in >= ul2fun2[2])// 100 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(2));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + + if (ui_in >= ul2fun2[1])// 10 12345 + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(1));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + *(d+m) = 0x30 + Lc_WEI(ui_in,0); +} + + +//Lc_int2str(123456, 5,3,&str[0]'); +/* + + +blank 填充字符 ' '或者其他unsigned char *blank)//保留以后使用 + + +*/ + + + +void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 m = 0,i; + for(i = 0;i < len;i++) + { + if(point != 0) + { + if(point == (len-i+1)) + { + *(d+m) = '.'; + m ++; + } + } + if (ui_in>=ul2fun2[len-i]) + { + *(d+m) = 0x30 + Lc_WEI(ui_in,(len-i));// (unsigned char)((ui_in/ul2fun2[len-i])%10); + m ++; + } + else + { + *(d+m) = ' '; + m ++; + } + } + *(d+m) = 0x30 + Lc_WEI(ui_in,1); + m++; + *(d+m) = 0x00; + //*(d+m) = 'e'; +} + + +// input: 123456d +// output: '1' '2' '3'.... +//对应的点阵 为 0123456789. ,最后为空格,专为显示点阵类的数值使用 +void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d) +{ + U8 i,m = 0; //uc_temp, + for(i = len+1;i != 0;i--)// len + 1 point 占用一位 + { + if(point == (len-i)) + { + d[len-m] = '.';//'.' + m ++; + } + { + if (ui_in>=ul2fun2[i-1]) + { + d[len-m] = (U8)((ui_in/ul2fun2[i-1])%10); + + } + else + { + d[len-m] = ' ';//' ' + } + m ++; + } + } + d[len-m] = (U8)(ui_in%10); +} + +void Lc_Byte_cp(BYTE *src,BYTE *dis, int len) +{ + int i; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +/* +void Lc_Byte_print(BYTE *src,int len) +{ + int i, d; + for(i = 0; i < len ;i ++) + { + *dis = *src; + dis ++; + src ++; + } + //return 0; +} +*/ + + +// -10........+10 + +U32 L2_fun_number_show(int i,char str[4]) +{ + U8 c; + int cint; + + if(i >= 0) + { + cint = i; + str[0] =' '; + + } + else + { + cint = 0 - i; + str[0] ='-'; + + + } + c = Lc_WEI(cint,1); + if(0 == c) + { + str[1] =' '; + } + else + { + str[1] = 0x30+ c; + + } + str[2] = 0x30+ Lc_WEI(cint,0); + return 0; +} + +//L1_lkt_write(s_room_val.ui_t3,s_room_val.ui_t3,s_task_lkt.din); +//U_uluiuc + +void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]) +{ +#if 0 + volatile U_uluiuc t; + //s_temp[] + t.uiv[0] = ui_t2; + t.uiv[1] = ui_t3; + + + Lc_Byte_cp(t.dv,out,8); + + out[3] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[0] = D_ul2uc_0( ui_t2); + + + out[7] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[4] = D_ul2uc_0( ui_t3); + + + #else + out[0] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[1] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[2] = D_ul2uc_0( ui_t2); + ui_t2 >>= 8; + out[3] = D_ul2uc_0( ui_t2); + +/* + out[4] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[5] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[6] = D_ul2uc_0( ui_t3); + ui_t2 >>= 8; + out[7] = D_ul2uc_0( ui_t3); +*/ +#endif + +} + +void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3) +{ + #if 0 + volatile U_uluiuc t; + Lc_Byte_cp(in,t.dv,8); + *ui_t2 = t.uiv[0]; + *ui_t3 = t.uiv[1]; + *ui_t2 = 0; + *ui_t2|= (U32)in[3]; + *ui_t2|= (U32)(in[2]<<8); + *ui_t2|= (U32)(in[1]<<16); + *ui_t2|= (U32)(in[0]<<24); + + *ui_t3 = 0; + *ui_t3|= (U32)in[7]; + *ui_t3|= (U32)(in[6]<<8); + *ui_t3|= (U32)(in[5]<<16); + *ui_t3|= (U32)(in[4]<<24); + + #else + + + *ui_t2 = 0; + *ui_t2|= (U32)in[0]; + *ui_t2|= (U32)(in[1]<<8); + *ui_t2|= (U32)(in[2]<<16); + *ui_t2|= (U32)(in[3]<<24); + /* + *ui_t3 = 0; + *ui_t3|= (INT32U)in[4]; + *ui_t3|= (INT32U)(in[5]<<8); + *ui_t3|= (INT32U)(in[6]<<16); + *ui_t3|= (INT32U)(in[7]<<24); + */ + #endif +} + +U32 Lc_abs(vU32 a,vU32 b,vU32 *diff) +{ + if(a >= b) + { + *diff = a-b; + return 1; + }else + { + *diff = b-a; + return 0; + } +} + + + + + + +#endif //#if 0 //5436345673456 + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/clib/新建文件夹/clib.h b/source/clib/新建文件夹/clib.h new file mode 100644 index 0000000..2872eed --- /dev/null +++ b/source/clib/新建文件夹/clib.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2009, NXP Semiconductor + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + * +******************************************************************************/ +#ifndef _CLIB_H_ +#define _CLIB_H_ + + +#include +#include +#include "../clib/type.h" +//#include "../clib/Clib.h" +//#include "../debug/debug_drv.h" +//extern char guc_send[128]; +extern unsigned char code cguHex2Char[16][2]; +typedef struct +{ + vU16 up_point; + vU16 down_point; + + +}TS_up_down_p_; + +extern U8 Lc_Hex2Char(U8 CharStr); +//extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +// input: 123456d +// output: '1' '2' '3'.... +//Ӧĵ Ϊ 0123456789. ΪոרΪʾֵʹ +//extern void Lc_int2number(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); +//extern U32 L2_fun_number_show(int i,char str[4]); +#if 0 + +struct _s_temp_ +{ + U8 d[16]; + +}; + +extern struct _s_temp_ s_temp22; +extern U8 s_temp[16]; + +extern U32 ul2fun2[10]; +extern void Lc_Byte_cp(BYTE *src,BYTE *dis, int len); + +extern void L1_buf22ui(volatile BYTE in[],vU32 *ui_t2,vU32 *ui_t3); + +extern void Lc_2ui2buf(vU32 ui_t2,vU32 ui_t3,volatile BYTE out[]); +extern void Lc_int2str_3(U32 ui_in,char *d); +extern U32 Lc_abs(vU32 a,vU32 b,vU32 *diff); +extern void Lc_int2str_4(U32 ui_in,char *d); + +extern void Lc_sint2str_3(int i_in,char *d); +#define Lc_WEI(WEIx,WEIn) (U8)((WEIx/ul2fun2[WEIn])%10); +#define Lc_eee(WEIn) ul2fun2[WEIn] + + +#endif + +extern char *Lc_int2a(vS32 value, char *string, UN_TYPE radix); + +extern void Lc_int2D(vS16 value, char *string,char bits); + +extern char *strstr(const char *str1, const char *str2); +extern unsigned char catch_protocol (const char d_src[],char d_protocol[]) ; +#define Lc_delay_1us() L0_delay_1us() + + +extern void Lc_delay_us(vU16 i); +extern void Lc_delay_ms(vU16 i); +extern void Lc_delay_nop(U8 i); + +//////////////// + +extern void Lc_uc_hex(char ww); +extern void Lc_us_hex(U16 ww); +//extern void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...); +extern void Lc_print(char *dat4,...); +extern void Lc_print_NC(char *dat,...); +extern void Lc_print_buf(char *dat4,...); + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +extern void Lc_buf_copy_uc(U8 *d,const U8 *s,U16 num); + +///void L2_line_algo_media(U8 *buf,vU16 len); +extern vU8 Lc_U8_media3(vU8 a,vU8 b,vU8 c); +extern vS32 Lc_S32_media3(vS32 a,vS32 b,vS32 c); +extern vS32 Lc_S32_media(vS32 val[],S16 num); +extern void Lc_array_sort(S32 arr[],int n); + +/// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' +extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); +extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; +//extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); +extern void crc16qq(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; +extern int isBigEndianOrder(void); +extern U32 ntohl(U32 dat); +extern U32 htonl(U32 dat); +extern U16 ntohs(U16 dat); +extern U16 htons(U16 dat); +extern U32 Lc_abs(vS32 a,vS32 b); +extern void Lc_encrypt_id(U8 *enc_dst, U8 *enc_src, U32 enc_key, U8 src_len); +extern int libc_strlen(char *str); +extern S32 Lc_vS32_avg(vS32 *d, U8 n); +extern vS32 Lc_vS32_media(vS32 *d, U8 n); +extern void Lc_U16_shift_media3(vU16 *m); + +extern void Lc_despiking_shift3_U16(vU16 *m); + + +#endif /* end __UART_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/clib/新建文件夹/type.h b/source/clib/新建文件夹/type.h new file mode 100644 index 0000000..df2433f --- /dev/null +++ b/source/clib/新建文件夹/type.h @@ -0,0 +1,317 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, ؿƼ +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// ޶˵汾 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE_H__ +#define __TYPE_H__ + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif +/********************************************************************************************************* + ޹ص +*********************************************************************************************************/ + +typedef unsigned char U8; +typedef unsigned char u8; +typedef volatile U8 vU8; + + + +typedef U8 BOOLEAN; /* */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + + +#define bit char +//#define code + +typedef unsigned short u16; +typedef unsigned short U16; /* ޷16λͱ */ +typedef volatile U16 vU16; /* ޷16λͱ */ +typedef signed short S16; +typedef volatile S16 vS16; /* з16λͱ */ + +typedef signed long S32; +typedef unsigned long U32; /* ޷32λͱ */ +typedef volatile U32 vU32; /* з32λͱ */ +typedef volatile signed long vS32; + +typedef float FP32; /* ȸ32λȣ */ +typedef double FP64; /* ˫ȸ64λȣ */ + + +//typedef unsigned char BOOLEAN; // +typedef unsigned char INT8U; // ޷8λͱ +typedef signed char INT8S; // з8λͱ +typedef unsigned short INT16U; // ޷16λͱ +typedef signed short INT16S; // з16λͱ +typedef unsigned long INT32U; // ޷32λͱ + +typedef signed long INT32S; // з32λͱ +//typedef float FP32; // ȸ32λȣ +//typedef double FP64; // ˫ȸ64λȣ + +typedef unsigned int FLAG_P; // ׼ +//typedef unsigned char INTU; // ׼8BIT MCU +typedef unsigned int INTU; // ׼32BIT MCU +/****************** +**************************/ + + + +/********************************************************************************************************* + ֵ +*********************************************************************************************************/ +#define ZY_OK 0 /* ɹ */ +#define ZY_NOT_OK 1 /* ʧ */ +#define ZY_PARAMETER_ERR 2 /* */ +#define ZY_NO_FIND_FUNCTION 6 /* ûзָ */ +#define ZY_NO_MEMORY 12 /* ڴ治 */ +#define ZY_TIME_OUT 13 /* ʱ */ +#define ZY_NO_FIND_OBJECT 16 /* ûзֶ */ + +/********************************************************************************************************* + realViewҪӵͷļ +*********************************************************************************************************/ +#include +#include +#include +//#include +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef U8 UN_TYPE; +typedef U8 vtype; + + + +/************* + +******************/ + +//>>>>> + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; +}U_U32; +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/cpu/111/stc_macro.H b/source/cpu/111/stc_macro.H new file mode 100644 index 0000000..8c2f880 --- /dev/null +++ b/source/cpu/111/stc_macro.H @@ -0,0 +1,384 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file __C51_MACRO_H_ +/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __STC_MACRO_H_ +#define __STC_MACRO_H_ + +#include +#include "../clib/bit.h" + +#define NOP() _nop_() + +#define D_P07_ON() P07 = 1 +#define D_P06_ON() P06 = 1 +#define D_P05_ON() P05 = 1 +#define D_P04_ON() P04 = 1 +#define D_P03_ON() P03 = 1 +#define D_P02_ON() P02 = 1 +#define D_P01_ON() P01 = 1 +#define D_P00_ON() P00 = 1 +#define D_P07_OFF() P07 = 0 +#define D_P06_OFF() P06 = 0 +#define D_P05_OFF() P05 = 0 +#define D_P04_OFF() P04 = 0 +#define D_P03_OFF() P03 = 0 +#define D_P02_OFF() P02 = 0 +#define D_P01_OFF() P01 = 0 +#define D_P00_OFF() P00 = 0 +#define D_P07_AT() (P07) +#define D_P06_AT() (P06) +#define D_P05_AT() (P05) +#define D_P04_AT() (P04) +#define D_P03_AT() (P03) +#define D_P02_AT() (P02) +#define D_P01_AT() (P01) +#define D_P00_AT() (P00) +#define D_P07_REV() P07 = ~P07 +#define D_P06_REV() P06 = ~P06 +#define D_P05_REV() P05 = ~P05 +#define D_P04_REV() P04 = ~P04 +#define D_P03_REV() P03 = ~P03 +#define D_P02_REV() P02 = ~P02 +#define D_P01_REV() P01 = ~P01 +#define D_P00_REV() P00 = ~P00 + + +#define D_P17_ON() P17 = 1 +#define D_P16_ON() P16 = 1 +#define D_P15_ON() P15 = 1 +#define D_P14_ON() P14 = 1 +#define D_P13_ON() P13 = 1 +#define D_P12_ON() P12 = 1 +#define D_P11_ON() P11 = 1 +#define D_P10_ON() P10 = 1 +#define D_P17_OFF() P17 = 0 +#define D_P16_OFF() P16 = 0 +#define D_P15_OFF() P15 = 0 +#define D_P14_OFF() P14 = 0 +#define D_P13_OFF() P13 = 0 +#define D_P12_OFF() P12 = 0 +#define D_P11_OFF() P11 = 0 +#define D_P10_OFF() P10 = 0 +#define D_P17_AT() (P17) +#define D_P16_AT() (P16) +#define D_P15_AT() (P15) +#define D_P14_AT() (P14) +#define D_P13_AT() (P13) +#define D_P12_AT() (P12) +#define D_P11_AT() (P11) +#define D_P10_AT() (P10) +#define D_P17_REV() P17 = ~P17 +#define D_P16_REV() P16 = ~P16 +#define D_P15_REV() P15 = ~P15 +#define D_P14_REV() P14 = ~P14 +#define D_P13_REV() P13 = ~P13 +#define D_P12_REV() P12 = ~P12 +#define D_P11_REV() P11 = ~P11 +#define D_P10_REV() P10 = ~P10 + +#define D_P27_ON() P27 = 1 +#define D_P26_ON() P26 = 1 +#define D_P25_ON() P25 = 1 +#define D_P24_ON() P24 = 1 +#define D_P23_ON() P23 = 1 +#define D_P22_ON() P22 = 1 +#define D_P21_ON() P21 = 1 +#define D_P20_ON() P20 = 1 +#define D_P27_OFF() P27 = 0 +#define D_P26_OFF() P26 = 0 +#define D_P25_OFF() P25 = 0 +#define D_P24_OFF() P24 = 0 +#define D_P23_OFF() P23 = 0 +#define D_P22_OFF() P22 = 0 +#define D_P21_OFF() P21 = 0 +#define D_P20_OFF() P20 = 0 +#define D_P27_AT() (P27) +#define D_P26_AT() (P26) +#define D_P25_AT() (P25) +#define D_P24_AT() (P24) +#define D_P23_AT() (P23) +#define D_P22_AT() (P22) +#define D_P21_AT() (P21) +#define D_P20_AT() (P20) +#define D_P27_REV() P27 = ~P27 +#define D_P26_REV() P26 = ~P26 +#define D_P25_REV() P25 = ~P25 +#define D_P24_REV() P24 = ~P24 +#define D_P23_REV() P23 = ~P23 +#define D_P22_REV() P22 = ~P22 +#define D_P21_REV() P21 = ~P21 +#define D_P20_REV() P20 = ~P20 + + +#define D_P37_ON() P37 = 1 +#define D_P36_ON() P36 = 1 +#define D_P35_ON() P35 = 1 +#define D_P34_ON() P34 = 1 +#define D_P33_ON() P33 = 1 +#define D_P32_ON() P32 = 1 +#define D_P31_ON() P31 = 1 +#define D_P30_ON() P30 = 1 +#define D_P37_OFF() P37 = 0 +#define D_P36_OFF() P36 = 0 +#define D_P35_OFF() P35 = 0 +#define D_P34_OFF() P34 = 0 +#define D_P33_OFF() P33 = 0 +#define D_P32_OFF() P32 = 0 +#define D_P31_OFF() P31 = 0 +#define D_P30_OFF() P30 = 0 +#define D_P37_AT() (P37) +#define D_P36_AT() (P36) +#define D_P35_AT() (P35) +#define D_P34_AT() (P34) +#define D_P33_AT() (P33) +#define D_P32_AT() (P32) +#define D_P31_AT() (P31) +#define D_P30_AT() (P30) +#define D_P37_REV() P37 = ~P37 +#define D_P36_REV() P36 = ~P36 +#define D_P35_REV() P35 = ~P35 +#define D_P34_REV() P34 = ~P34 +#define D_P33_REV() P33 = ~P33 +#define D_P32_REV() P32 = ~P32 +#define D_P31_REV() P31 = ~P31 +#define D_P30_REV() P30 = ~P30 + + +#define D_P47_ON() P47 = 1 +#define D_P46_ON() P46 = 1 +#define D_P45_ON() P45 = 1 +#define D_P44_ON() P44 = 1 +#define D_P43_ON() P43 = 1 +#define D_P42_ON() P42 = 1 +#define D_P41_ON() P41 = 1 +#define D_P40_ON() P40 = 1 +#define D_P47_OFF() P47 = 0 +#define D_P46_OFF() P46 = 0 +#define D_P45_OFF() P45 = 0 +#define D_P44_OFF() P44 = 0 +#define D_P43_OFF() P43 = 0 +#define D_P42_OFF() P42 = 0 +#define D_P41_OFF() P41 = 0 +#define D_P40_OFF() P40 = 0 +#define D_P47_AT() (P47) +#define D_P46_AT() (P46) +#define D_P45_AT() (P45) +#define D_P44_AT() (P44) +#define D_P43_AT() (P43) +#define D_P42_AT() (P42) +#define D_P41_AT() (P41) +#define D_P40_AT() (P40) +#define D_P47_REV() P47 = ~P47 +#define D_P46_REV() P46 = ~P46 +#define D_P45_REV() P45 = ~P45 +#define D_P44_REV() P44 = ~P44 +#define D_P43_REV() P43 = ~P43 +#define D_P42_REV() P42 = ~P42 +#define D_P41_REV() P41 = ~P41 +#define D_P40_REV() P40 = ~P40 + +#define D_P57_ON() P57 = 1 +#define D_P56_ON() P56 = 1 +#define D_P55_ON() P55 = 1 +#define D_P54_ON() P54 = 1 +#define D_P53_ON() P53 = 1 +#define D_P52_ON() P52 = 1 +#define D_P51_ON() P51 = 1 +#define D_P50_ON() P50 = 1 +#define D_P57_OFF() P57 = 0 +#define D_P56_OFF() P56 = 0 +#define D_P55_OFF() P55 = 0 +#define D_P54_OFF() P54 = 0 +#define D_P53_OFF() P53 = 0 +#define D_P52_OFF() P52 = 0 +#define D_P51_OFF() P51 = 0 +#define D_P50_OFF() P50 = 0 +#define D_P57_AT() (P57) +#define D_P56_AT() (P56) +#define D_P55_AT() (P55) +#define D_P54_AT() (P54) +#define D_P53_AT() (P53) +#define D_P52_AT() (P52) +#define D_P51_AT() (P51) +#define D_P50_AT() (P50) +#define D_P57_REV() P57 = ~P57 +#define D_P56_REV() P56 = ~P56 +#define D_P55_REV() P55 = ~P55 +#define D_P54_REV() P54 = ~P54 +#define D_P53_REV() P53 = ~P53 +#define D_P52_REV() P52 = ~P52 +#define D_P51_REV() P51 = ~P51 +#define D_P50_REV() P50 = ~P50 + +#define D_P67_ON() P67 = 1 +#define D_P66_ON() P66 = 1 +#define D_P65_ON() P65 = 1 +#define D_P64_ON() P64 = 1 +#define D_P63_ON() P63 = 1 +#define D_P62_ON() P62 = 1 +#define D_P61_ON() P61 = 1 +#define D_P60_ON() P60 = 1 +#define D_P67_OFF() P67 = 0 +#define D_P66_OFF() P66 = 0 +#define D_P65_OFF() P65 = 0 +#define D_P64_OFF() P64 = 0 +#define D_P63_OFF() P63 = 0 +#define D_P62_OFF() P62 = 0 +#define D_P61_OFF() P61 = 0 +#define D_P60_OFF() P60 = 0 +#define D_P67_AT() (P67) +#define D_P66_AT() (P66) +#define D_P65_AT() (P65) +#define D_P64_AT() (P64) +#define D_P63_AT() (P63) +#define D_P62_AT() (P62) +#define D_P61_AT() (P61) +#define D_P60_AT() (P60) +#define D_P67_REV() P67 = ~P67 +#define D_P66_REV() P66 = ~P66 +#define D_P65_REV() P65 = ~P65 +#define D_P64_REV() P64 = ~P64 +#define D_P63_REV() P63 = ~P63 +#define D_P62_REV() P62 = ~P62 +#define D_P61_REV() P61 = ~P61 +#define D_P60_REV() P60 = ~P60 + +#define D_P77_ON() P77 = 1 +#define D_P76_ON() P76 = 1 +#define D_P75_ON() P75 = 1 +#define D_P74_ON() P74 = 1 +#define D_P73_ON() P73 = 1 +#define D_P72_ON() P72 = 1 +#define D_P71_ON() P71 = 1 +#define D_P70_ON() P70 = 1 +#define D_P77_OFF() P77 = 0 +#define D_P76_OFF() P76 = 0 +#define D_P75_OFF() P75 = 0 +#define D_P74_OFF() P74 = 0 +#define D_P73_OFF() P73 = 0 +#define D_P72_OFF() P72 = 0 +#define D_P71_OFF() P71 = 0 +#define D_P70_OFF() P70 = 0 +#define D_P77_AT() (P77) +#define D_P76_AT() (P76) +#define D_P75_AT() (P75) +#define D_P74_AT() (P74) +#define D_P73_AT() (P73) +#define D_P72_AT() (P72) +#define D_P71_AT() (P71) +#define D_P70_AT() (P70) +#define D_P77_REV() P77 = ~P77 +#define D_P76_REV() P76 = ~P76 +#define D_P75_REV() P75 = ~P75 +#define D_P74_REV() P74 = ~P74 +#define D_P73_REV() P73 = ~P73 +#define D_P72_REV() P72 = ~P72 +#define D_P71_REV() P71 = ~P71 +#define D_P70_REV() P70 = ~P70 + + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + +#define D_stdIO_P2_ALL() P2M1=0;P2M0=0; +#define D_HighI_P2_ALL() P2M1=0;P2M0=0XFF; +#define D_HighR_P2_ALL() P2M1=0XFF;P2M0=0; +#define D_OpenD_P2_ALL() P2M1=0XFF;P2M0=0XFF; + +#define D_stdIO_P3_ALL() P3M1=0;P3M0=0; +#define D_HighI_P3_ALL() P3M1=0;P3M0=0XFF; +#define D_HighR_P3_ALL() P3M1=0XFF;P3M0=0; +#define D_OpenD_P3_ALL() P3M1=0XFF;P3M0=0XFF; + +#define D_stdIO_P4_ALL() P4M1=0;P4M0=0; +#define D_HighI_P4_ALL() P4M1=0;P4M0=0XFF; +#define D_HighR_P4_ALL() P4M1=0XFF;P4M0=0; +#define D_OpenD_P4_ALL() P4M1=0XFF;P4M0=0XFF; + +#define D_stdIO_P5_ALL() P5M1=0;P5M0=0; +#define D_HighI_P5_ALL() P5M1=0;P5M0=0XFF; +#define D_HighR_P5_ALL() P5M1=0XFF;P5M0=0; +#define D_OpenD_P5_ALL() P5M1=0XFF;P5M0=0XFF; + +#define D_stdIO_P6_ALL() P6M1=0;P6M0=0; +#define D_HighI_P6_ALL() P6M1=0;P6M0=0XFF; +#define D_HighR_P6_ALL() P6M1=0XFF;P6M0=0; +#define D_OpenD_P6_ALL() P6M1=0XFF;P6M0=0XFF; + +#define D_stdIO_P7_ALL() P7M1=0;P7M0=0; +#define D_HighI_P7_ALL() P7M1=0;P7M0=0XFF; +#define D_HighR_P7_ALL() P7M1=0XFF;P7M0=0; +#define D_OpenD_P7_ALL() P7M1=0XFF;P7M0=0XFF; + +////Notice: n: BITN0---BITN7 不是0-7 eg:D_stdIO_P0(BITN0) +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#endif //__STC_MACRO_H_ + + + + + + + diff --git a/source/cpu/111/stc_stc8hxx.h b/source/cpu/111/stc_stc8hxx.h new file mode 100644 index 0000000..a279eea --- /dev/null +++ b/source/cpu/111/stc_stc8hxx.h @@ -0,0 +1,640 @@ +#ifndef __STC8H_H__ +#define __STC8H_H__ + +///////////////////////////////////////////////// + +//ͷļ,ٰ"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr USBCLK = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sfr USBDAT = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr USBCON = 0xf4; +sfr IAP_TPS = 0xf5; +sfr P7 = 0xf8; +sfr USBADR = 0xfc; +sfr RSTCFG = 0xff; + +//⹦ܼĴλչRAM +//ЩĴ,ȽP_SW2BIT7Ϊ1,ſд + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define HIRCCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) +#define X32KCR (*(unsigned char volatile xdata *)0xfe08) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define RTCCR (*(unsigned char volatile xdata *)0xfe60) +#define RTCCFG (*(unsigned char volatile xdata *)0xfe61) +#define RTCIEN (*(unsigned char volatile xdata *)0xfe62) +#define RTCIF (*(unsigned char volatile xdata *)0xfe63) +#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64) +#define ALAMIN (*(unsigned char volatile xdata *)0xfe65) +#define ALASEC (*(unsigned char volatile xdata *)0xfe66) +#define ALASSEC (*(unsigned char volatile xdata *)0xfe67) +#define INIYEAR (*(unsigned char volatile xdata *)0xfe68) +#define INIMONTH (*(unsigned char volatile xdata *)0xfe69) +#define INIDAY (*(unsigned char volatile xdata *)0xfe6a) +#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b) +#define INIMIN (*(unsigned char volatile xdata *)0xfe6c) +#define INISEC (*(unsigned char volatile xdata *)0xfe6d) +#define INISSEC (*(unsigned char volatile xdata *)0xfe6e) +#define YEAR (*(unsigned char volatile xdata *)0xfe70) +#define MONTH (*(unsigned char volatile xdata *)0xfe71) +#define DAY (*(unsigned char volatile xdata *)0xfe72) +#define HOUR (*(unsigned char volatile xdata *)0xfe73) +#define MIN (*(unsigned char volatile xdata *)0xfe74) +#define SEC (*(unsigned char volatile xdata *)0xfe75) +#define SSEC (*(unsigned char volatile xdata *)0xfe76) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) + +#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5) +#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5) +#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6) +#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7) +#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7) +#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8) +#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9) +#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9) +#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa) +#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb) +#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb) +#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc) +#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff) + +#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5) +#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5) +#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6) +#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7) +#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7) +#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8) +#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9) +#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9) +#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa) +#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb) +#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb) +#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc) +#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) +#define PIN_IP (*(unsigned char volatile xdata *)0xfd60) +#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + +#define COMEN (*(unsigned char volatile xdata *)0xfb00) +#define SEGENL (*(unsigned char volatile xdata *)0xfb01) +#define SEGENH (*(unsigned char volatile xdata *)0xfb02) +#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03) +#define LEDCKS (*(unsigned char volatile xdata *)0xfb04) +#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10) +#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11) +#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12) +#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13) +#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14) +#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15) +#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16) +#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17) +#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18) +#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19) +#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a) +#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b) +#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c) +#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d) +#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e) +#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f) +#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20) +#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21) +#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22) +#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23) +#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24) +#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25) +#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26) +#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27) +#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28) +#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29) +#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a) +#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b) +#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c) +#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d) +#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e) +#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f) + +#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40) +#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41) +#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42) +#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43) +#define TSWUTC (*(unsigned char volatile xdata *)0xfb44) +#define TSCTRL (*(unsigned char volatile xdata *)0xfb45) +#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46) +#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47) +#define TSRT (*(unsigned char volatile xdata *)0xfb48) +#define TSDAT (*(unsigned int volatile xdata *)0xfb49) +#define TSDATH (*(unsigned char volatile xdata *)0xfb49) +#define TSDATL (*(unsigned char volatile xdata *)0xfb4A) +#define TSTH00 (*(unsigned int volatile xdata *)0xfb50) +#define TSTH00H (*(unsigned char volatile xdata *)0xfb50) +#define TSTH00L (*(unsigned char volatile xdata *)0xfb51) +#define TSTH01 (*(unsigned int volatile xdata *)0xfb52) +#define TSTH01H (*(unsigned char volatile xdata *)0xfb52) +#define TSTH01L (*(unsigned char volatile xdata *)0xfb53) +#define TSTH02 (*(unsigned int volatile xdata *)0xfb54) +#define TSTH02H (*(unsigned char volatile xdata *)0xfb54) +#define TSTH02L (*(unsigned char volatile xdata *)0xfb55) +#define TSTH03 (*(unsigned int volatile xdata *)0xfb56) +#define TSTH03H (*(unsigned char volatile xdata *)0xfb56) +#define TSTH03L (*(unsigned char volatile xdata *)0xfb57) +#define TSTH04 (*(unsigned int volatile xdata *)0xfb58) +#define TSTH04H (*(unsigned char volatile xdata *)0xfb58) +#define TSTH04L (*(unsigned char volatile xdata *)0xfb59) +#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a) +#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a) +#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b) +#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c) +#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c) +#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d) +#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e) +#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e) +#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f) +#define TSTH08 (*(unsigned int volatile xdata *)0xfb60) +#define TSTH08H (*(unsigned char volatile xdata *)0xfb60) +#define TSTH08L (*(unsigned char volatile xdata *)0xfb61) +#define TSTH09 (*(unsigned int volatile xdata *)0xfb62) +#define TSTH09H (*(unsigned char volatile xdata *)0xfb62) +#define TSTH09L (*(unsigned char volatile xdata *)0xfb63) +#define TSTH10 (*(unsigned int volatile xdata *)0xfb64) +#define TSTH10H (*(unsigned char volatile xdata *)0xfb64) +#define TSTH10L (*(unsigned char volatile xdata *)0xfb65) +#define TSTH11 (*(unsigned int volatile xdata *)0xfb66) +#define TSTH11H (*(unsigned char volatile xdata *)0xfb66) +#define TSTH11L (*(unsigned char volatile xdata *)0xfb67) +#define TSTH12 (*(unsigned int volatile xdata *)0xfb68) +#define TSTH12H (*(unsigned char volatile xdata *)0xfb68) +#define TSTH12L (*(unsigned char volatile xdata *)0xfb69) +#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a) +#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a) +#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b) +#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c) +#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c) +#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d) +#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e) +#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e) +#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f) + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + + +///////////////////////////////////////////////// + +#endif + diff --git a/source/cpu/STARTUP.A51 b/source/cpu/STARTUP.A51 new file mode 100644 index 0000000..2dd8e62 --- /dev/null +++ b/source/cpu/STARTUP.A51 @@ -0,0 +1,198 @@ +$NOMOD51 +;------------------------------------------------------------------------------ +; This file is part of the C51 Compiler package +; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. +; Version 8.01 +; +; *** <<< Use Configuration Wizard in Context Menu >>> *** +;------------------------------------------------------------------------------ +; STARTUP.A51: This code is executed after processor reset. +; +; To translate this file use A51 with the following invocation: +; +; A51 STARTUP.A51 +; +; To link the modified STARTUP.OBJ file to your application use the following +; Lx51 invocation: +; +; Lx51 your object file list, STARTUP.OBJ controls +; +;------------------------------------------------------------------------------ +; +; User-defined Power-On Initialization of Memory +; +; With the following EQU statements the initialization of memory +; at processor reset can be defined: +; +; IDATALEN: IDATA memory size <0x0-0x100> +; Note: The absolute start-address of IDATA memory is always 0 +; The IDATA space overlaps physically the DATA and BIT areas. +IDATALEN EQU 80H +; +; XDATASTART: XDATA memory start address <0x0-0xFFFF> +; The absolute start address of XDATA memory +XDATASTART EQU 0 +; +; XDATALEN: XDATA memory size <0x0-0xFFFF> +; The length of XDATA memory in bytes. +XDATALEN EQU 800 +; +; PDATASTART: PDATA memory start address <0x0-0xFFFF> +; The absolute start address of PDATA memory +PDATASTART EQU 0H +; +; PDATALEN: PDATA memory size <0x0-0xFF> +; The length of PDATA memory in bytes. +PDATALEN EQU 0H +; +; +;------------------------------------------------------------------------------ +; +; Reentrant Stack Initialization +; +; The following EQU statements define the stack pointer for reentrant +; functions and initialized it: +; +; Stack Space for reentrant functions in the SMALL model. +; IBPSTACK: Enable SMALL model reentrant stack +; Stack space for reentrant functions in the SMALL model. +IBPSTACK EQU 0 ; set to 1 if small reentrant is used. +; IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF> +; Set the top of the stack to the highest location. +IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +; Stack Space for reentrant functions in the LARGE model. +; XBPSTACK: Enable LARGE model reentrant stack +; Stack space for reentrant functions in the LARGE model. +XBPSTACK EQU 1 ; set to 1 if large reentrant is used. +; XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF> +; Set the top of the stack to the highest location. +XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 +; +; +; Stack Space for reentrant functions in the COMPACT model. +; PBPSTACK: Enable COMPACT model reentrant stack +; Stack space for reentrant functions in the COMPACT model. +PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. +; +; PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF> +; Set the top of the stack to the highest location. +PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +;------------------------------------------------------------------------------ +; +; Memory Page for Using the Compact Model with 64 KByte xdata RAM +; Compact Model Page Definition +; +; Define the XDATA page used for PDATA variables. +; PPAGE must conform with the PPAGE set in the linker invocation. +; +; Enable pdata memory page initalization +PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. +; +; PPAGE number <0x0-0xFF> +; uppermost 256-byte address of the page used for PDATA variables. +PPAGE EQU 0 +; +; SFR address which supplies uppermost address byte <0x0-0xFF> +; most 8051 variants use P2 as uppermost address byte +PPAGE_SFR DATA 0A0H +; +; +;------------------------------------------------------------------------------ + +; Standard SFR Symbols +ACC DATA 0E0H +B DATA 0F0H +SP DATA 81H +DPL DATA 82H +DPH DATA 83H + + NAME ?C_STARTUP + + +?C_C51STARTUP SEGMENT CODE +?STACK SEGMENT IDATA + + RSEG ?STACK + DS 1 + + EXTRN CODE (?C_START) + PUBLIC ?C_STARTUP + + CSEG AT 0 +?C_STARTUP: LJMP STARTUP1 + + RSEG ?C_C51STARTUP + +STARTUP1: + +IF IDATALEN <> 0 + MOV R0,#IDATALEN - 1 + CLR A +IDATALOOP: MOV @R0,A + DJNZ R0,IDATALOOP +ENDIF + +IF XDATALEN <> 0 + MOV DPTR,#XDATASTART + MOV R7,#LOW (XDATALEN) + IF (LOW (XDATALEN)) <> 0 + MOV R6,#(HIGH (XDATALEN)) +1 + ELSE + MOV R6,#HIGH (XDATALEN) + ENDIF + CLR A +XDATALOOP: MOVX @DPTR,A + INC DPTR + DJNZ R7,XDATALOOP + DJNZ R6,XDATALOOP +ENDIF + +IF PPAGEENABLE <> 0 + MOV PPAGE_SFR,#PPAGE +ENDIF + +IF PDATALEN <> 0 + MOV R0,#LOW (PDATASTART) + MOV R7,#LOW (PDATALEN) + CLR A +PDATALOOP: MOVX @R0,A + INC R0 + DJNZ R7,PDATALOOP +ENDIF + +IF IBPSTACK <> 0 +EXTRN DATA (?C_IBP) + + MOV ?C_IBP,#LOW IBPSTACKTOP +ENDIF + +IF XBPSTACK <> 0 +EXTRN DATA (?C_XBP) + + MOV ?C_XBP,#HIGH XBPSTACKTOP + MOV ?C_XBP+1,#LOW XBPSTACKTOP +ENDIF + +IF PBPSTACK <> 0 +EXTRN DATA (?C_PBP) + MOV ?C_PBP,#LOW PBPSTACKTOP +ENDIF + + MOV SP,#?STACK-1 + +; This code is required if you use L51_BANK.A51 with Banking Mode 4 +; Code Banking +; Select Bank 0 for L51_BANK.A51 Mode 4 +#if 0 +; Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. +EXTRN CODE (?B_SWITCH0) + CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 +#endif +; + LJMP ?C_START + + END diff --git a/source/cpu/STC8H.h b/source/cpu/STC8H.h new file mode 100644 index 0000000..e257383 --- /dev/null +++ b/source/cpu/STC8H.h @@ -0,0 +1,1096 @@ +#ifndef __STC8H_H__ +#define __STC8H_H__ + +///////////////////////////////////////////////// + + + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr USBCLK = 0xdc; +sfr PLLCR = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr USBDAT = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr USBCON = 0xf4; +sfr IAP_TPS = 0xf5; +sfr P7 = 0xf8; +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr USBADR = 0xfc; +sfr RSTCFG = 0xff; + +//⹦ܼĴλչRAM +//ЩĴ,ȽP_SW2BIT7Ϊ1,ſд + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CLKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define HIRCCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) +#define IRC48MCR (*(unsigned char volatile xdata *)0xfe07) +#define X32KCR (*(unsigned char volatile xdata *)0xfe08) +#define HSCLKDIV (*(unsigned char volatile xdata *)0xfe0b) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define LCMIFCFG (*(unsigned char volatile xdata *)0xfe50) +#define LCMIFCFG2 (*(unsigned char volatile xdata *)0xfe51) +#define LCMIFCR (*(unsigned char volatile xdata *)0xfe52) +#define LCMIFSTA (*(unsigned char volatile xdata *)0xfe53) +#define LCMIFDATL (*(unsigned char volatile xdata *)0xfe54) +#define LCMIFDATH (*(unsigned char volatile xdata *)0xfe55) + +#define RTCCR (*(unsigned char volatile xdata *)0xfe60) +#define RTCCFG (*(unsigned char volatile xdata *)0xfe61) +#define RTCIEN (*(unsigned char volatile xdata *)0xfe62) +#define RTCIF (*(unsigned char volatile xdata *)0xfe63) +#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64) +#define ALAMIN (*(unsigned char volatile xdata *)0xfe65) +#define ALASEC (*(unsigned char volatile xdata *)0xfe66) +#define ALASSEC (*(unsigned char volatile xdata *)0xfe67) +#define INIYEAR (*(unsigned char volatile xdata *)0xfe68) +#define INIMONTH (*(unsigned char volatile xdata *)0xfe69) +#define INIDAY (*(unsigned char volatile xdata *)0xfe6a) +#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b) +#define INIMIN (*(unsigned char volatile xdata *)0xfe6c) +#define INISEC (*(unsigned char volatile xdata *)0xfe6d) +#define INISSEC (*(unsigned char volatile xdata *)0xfe6e) +#define YEAR (*(unsigned char volatile xdata *)0xfe70) +#define MONTH (*(unsigned char volatile xdata *)0xfe71) +#define DAY (*(unsigned char volatile xdata *)0xfe72) +#define HOUR (*(unsigned char volatile xdata *)0xfe73) +#define MIN (*(unsigned char volatile xdata *)0xfe74) +#define SEC (*(unsigned char volatile xdata *)0xfe75) +#define SSEC (*(unsigned char volatile xdata *)0xfe76) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) + +#define SPFUNC (*(unsigned char volatile xdata *)0xfe98) +#define RSTFLAG (*(unsigned char volatile xdata *)0xfe99) + +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) +#define T3T4PIN (*(unsigned char volatile xdata *)0xfeac) +#define ADCEXCFG (*(unsigned char volatile xdata *)0xfead) +#define CMPEXCFG (*(unsigned char volatile xdata *)0xfeae) + +#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5) +#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5) +#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6) +#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7) +#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7) +#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8) +#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9) +#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9) +#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa) +#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb) +#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb) +#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc) +#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff) + +#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5) +#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5) +#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6) +#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7) +#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7) +#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8) +#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9) +#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9) +#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa) +#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb) +#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb) +#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc) +#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) + +#define PINIPL (*(unsigned char volatile xdata *)0xfd60) +#define PINIPH (*(unsigned char volatile xdata *)0xfd61) + +#define CHIPID ( (unsigned char volatile xdata *)0xfde0) + +#define CHIPID0 (*(unsigned char volatile xdata *)0xfde0) +#define CHIPID1 (*(unsigned char volatile xdata *)0xfde1) +#define CHIPID2 (*(unsigned char volatile xdata *)0xfde2) +#define CHIPID3 (*(unsigned char volatile xdata *)0xfde3) +#define CHIPID4 (*(unsigned char volatile xdata *)0xfde4) +#define CHIPID5 (*(unsigned char volatile xdata *)0xfde5) +#define CHIPID6 (*(unsigned char volatile xdata *)0xfde6) +#define CHIPID7 (*(unsigned char volatile xdata *)0xfde7) +#define CHIPID8 (*(unsigned char volatile xdata *)0xfde8) +#define CHIPID9 (*(unsigned char volatile xdata *)0xfde9) +#define CHIPID10 (*(unsigned char volatile xdata *)0xfdea) +#define CHIPID11 (*(unsigned char volatile xdata *)0xfdeb) +#define CHIPID12 (*(unsigned char volatile xdata *)0xfdec) +#define CHIPID13 (*(unsigned char volatile xdata *)0xfded) +#define CHIPID14 (*(unsigned char volatile xdata *)0xfdee) +#define CHIPID15 (*(unsigned char volatile xdata *)0xfdef) +#define CHIPID16 (*(unsigned char volatile xdata *)0xfdf0) +#define CHIPID17 (*(unsigned char volatile xdata *)0xfdf1) +#define CHIPID18 (*(unsigned char volatile xdata *)0xfdf2) +#define CHIPID19 (*(unsigned char volatile xdata *)0xfdf3) +#define CHIPID20 (*(unsigned char volatile xdata *)0xfdf4) +#define CHIPID21 (*(unsigned char volatile xdata *)0xfdf5) +#define CHIPID22 (*(unsigned char volatile xdata *)0xfdf6) +#define CHIPID23 (*(unsigned char volatile xdata *)0xfdf7) +#define CHIPID24 (*(unsigned char volatile xdata *)0xfdf8) +#define CHIPID25 (*(unsigned char volatile xdata *)0xfdf9) +#define CHIPID26 (*(unsigned char volatile xdata *)0xfdfa) +#define CHIPID27 (*(unsigned char volatile xdata *)0xfdfb) +#define CHIPID28 (*(unsigned char volatile xdata *)0xfdfc) +#define CHIPID29 (*(unsigned char volatile xdata *)0xfdfd) +#define CHIPID30 (*(unsigned char volatile xdata *)0xfdfe) +#define CHIPID31 (*(unsigned char volatile xdata *)0xfdff) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + +#define COMEN (*(unsigned char volatile xdata *)0xfb00) +#define SEGENL (*(unsigned char volatile xdata *)0xfb01) +#define SEGENH (*(unsigned char volatile xdata *)0xfb02) +#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03) +#define LEDCKS (*(unsigned char volatile xdata *)0xfb04) +#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10) +#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11) +#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12) +#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13) +#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14) +#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15) +#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16) +#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17) +#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18) +#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19) +#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a) +#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b) +#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c) +#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d) +#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e) +#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f) +#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20) +#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21) +#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22) +#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23) +#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24) +#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25) +#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26) +#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27) +#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28) +#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29) +#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a) +#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b) +#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c) +#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d) +#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e) +#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f) + +#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40) +#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41) +#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42) +#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43) +#define TSWUTC (*(unsigned char volatile xdata *)0xfb44) +#define TSCTRL (*(unsigned char volatile xdata *)0xfb45) +#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46) +#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47) +#define TSRT (*(unsigned char volatile xdata *)0xfb48) +#define TSDAT (*(unsigned int volatile xdata *)0xfb49) +#define TSDATH (*(unsigned char volatile xdata *)0xfb49) +#define TSDATL (*(unsigned char volatile xdata *)0xfb4A) +#define TSTH00 (*(unsigned int volatile xdata *)0xfb50) +#define TSTH00H (*(unsigned char volatile xdata *)0xfb50) +#define TSTH00L (*(unsigned char volatile xdata *)0xfb51) +#define TSTH01 (*(unsigned int volatile xdata *)0xfb52) +#define TSTH01H (*(unsigned char volatile xdata *)0xfb52) +#define TSTH01L (*(unsigned char volatile xdata *)0xfb53) +#define TSTH02 (*(unsigned int volatile xdata *)0xfb54) +#define TSTH02H (*(unsigned char volatile xdata *)0xfb54) +#define TSTH02L (*(unsigned char volatile xdata *)0xfb55) +#define TSTH03 (*(unsigned int volatile xdata *)0xfb56) +#define TSTH03H (*(unsigned char volatile xdata *)0xfb56) +#define TSTH03L (*(unsigned char volatile xdata *)0xfb57) +#define TSTH04 (*(unsigned int volatile xdata *)0xfb58) +#define TSTH04H (*(unsigned char volatile xdata *)0xfb58) +#define TSTH04L (*(unsigned char volatile xdata *)0xfb59) +#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a) +#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a) +#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b) +#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c) +#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c) +#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d) +#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e) +#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e) +#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f) +#define TSTH08 (*(unsigned int volatile xdata *)0xfb60) +#define TSTH08H (*(unsigned char volatile xdata *)0xfb60) +#define TSTH08L (*(unsigned char volatile xdata *)0xfb61) +#define TSTH09 (*(unsigned int volatile xdata *)0xfb62) +#define TSTH09H (*(unsigned char volatile xdata *)0xfb62) +#define TSTH09L (*(unsigned char volatile xdata *)0xfb63) +#define TSTH10 (*(unsigned int volatile xdata *)0xfb64) +#define TSTH10H (*(unsigned char volatile xdata *)0xfb64) +#define TSTH10L (*(unsigned char volatile xdata *)0xfb65) +#define TSTH11 (*(unsigned int volatile xdata *)0xfb66) +#define TSTH11H (*(unsigned char volatile xdata *)0xfb66) +#define TSTH11L (*(unsigned char volatile xdata *)0xfb67) +#define TSTH12 (*(unsigned int volatile xdata *)0xfb68) +#define TSTH12H (*(unsigned char volatile xdata *)0xfb68) +#define TSTH12L (*(unsigned char volatile xdata *)0xfb69) +#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a) +#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a) +#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b) +#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c) +#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c) +#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d) +#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e) +#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e) +#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f) + +#define LCDCFG (*(unsigned char volatile xdata *)0xfb80) +#define LCDCFG2 (*(unsigned char volatile xdata *)0xfb81) +#define DBLEN (*(unsigned char volatile xdata *)0xfb82) +#define COMLENL (*(unsigned char volatile xdata *)0xfb83) +#define COMLENM (*(unsigned char volatile xdata *)0xfb84) +#define COMLENH (*(unsigned char volatile xdata *)0xfb85) +#define BLINKRATE (*(unsigned char volatile xdata *)0xfb86) +#define LCDCR (*(unsigned char volatile xdata *)0xfb87) +#define COMON (*(unsigned char volatile xdata *)0xfb88) +#define SEGON1 (*(unsigned char volatile xdata *)0xfb8a) +#define SEGON2 (*(unsigned char volatile xdata *)0xfb8b) +#define SEGON3 (*(unsigned char volatile xdata *)0xfb8c) +#define SEGON4 (*(unsigned char volatile xdata *)0xfb8d) +#define SEGON5 (*(unsigned char volatile xdata *)0xfb8e) +#define C0SEGV0 (*(unsigned char volatile xdata *)0xfb90) +#define C0SEGV1 (*(unsigned char volatile xdata *)0xfb91) +#define C0SEGV2 (*(unsigned char volatile xdata *)0xfb92) +#define C0SEGV3 (*(unsigned char volatile xdata *)0xfb93) +#define C0SEGV4 (*(unsigned char volatile xdata *)0xfb94) +#define C1SEGV0 (*(unsigned char volatile xdata *)0xfb98) +#define C1SEGV1 (*(unsigned char volatile xdata *)0xfb99) +#define C1SEGV2 (*(unsigned char volatile xdata *)0xfb9a) +#define C1SEGV3 (*(unsigned char volatile xdata *)0xfb9b) +#define C1SEGV4 (*(unsigned char volatile xdata *)0xfb9c) +#define C2SEGV0 (*(unsigned char volatile xdata *)0xfba0) +#define C2SEGV1 (*(unsigned char volatile xdata *)0xfba1) +#define C2SEGV2 (*(unsigned char volatile xdata *)0xfba2) +#define C2SEGV3 (*(unsigned char volatile xdata *)0xfba3) +#define C2SEGV4 (*(unsigned char volatile xdata *)0xfba4) +#define C3SEGV0 (*(unsigned char volatile xdata *)0xfba8) +#define C3SEGV1 (*(unsigned char volatile xdata *)0xfba9) +#define C3SEGV2 (*(unsigned char volatile xdata *)0xfbaa) +#define C3SEGV3 (*(unsigned char volatile xdata *)0xfbab) +#define C3SEGV4 (*(unsigned char volatile xdata *)0xfbac) + +#define HSPWMA_CFG (*(unsigned char volatile xdata *)0xfbf0) +#define HSPWMA_ADR (*(unsigned char volatile xdata *)0xfbf1) +#define HSPWMA_DAT (*(unsigned char volatile xdata *)0xfbf2) + +#define HSPWMB_CFG (*(unsigned char volatile xdata *)0xfbf4) +#define HSPWMB_ADR (*(unsigned char volatile xdata *)0xfbf5) +#define HSPWMB_DAT (*(unsigned char volatile xdata *)0xfbf6) + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + +#define DMA_M2M_CFG (*(unsigned char volatile xdata *)0xfa00) +#define DMA_M2M_CR (*(unsigned char volatile xdata *)0xfa01) +#define DMA_M2M_STA (*(unsigned char volatile xdata *)0xfa02) +#define DMA_M2M_AMT (*(unsigned char volatile xdata *)0xfa03) +#define DMA_M2M_DONE (*(unsigned char volatile xdata *)0xfa04) +#define DMA_M2M_TXAH (*(unsigned char volatile xdata *)0xfa05) +#define DMA_M2M_TXAL (*(unsigned char volatile xdata *)0xfa06) +#define DMA_M2M_RXAH (*(unsigned char volatile xdata *)0xfa07) +#define DMA_M2M_RXAL (*(unsigned char volatile xdata *)0xfa08) + +#define DMA_ADC_CFG (*(unsigned char volatile xdata *)0xfa10) +#define DMA_ADC_CR (*(unsigned char volatile xdata *)0xfa11) +#define DMA_ADC_STA (*(unsigned char volatile xdata *)0xfa12) +#define DMA_ADC_RXA (*(unsigned int volatile xdata *)0xfa17) +#define DMA_ADC_RXAH (*(unsigned char volatile xdata *)0xfa17) +#define DMA_ADC_RXAL (*(unsigned char volatile xdata *)0xfa18) +#define DMA_ADC_CFG2 (*(unsigned char volatile xdata *)0xfa19) +#define DMA_ADC_CHSW0 (*(unsigned char volatile xdata *)0xfa1a) +#define DMA_ADC_CHSW1 (*(unsigned char volatile xdata *)0xfa1b) + +#define DMA_SPI_CFG (*(unsigned char volatile xdata *)0xfa20) +#define DMA_SPI_CR (*(unsigned char volatile xdata *)0xfa21) +#define DMA_SPI_STA (*(unsigned char volatile xdata *)0xfa22) +#define DMA_SPI_AMT (*(unsigned char volatile xdata *)0xfa23) +#define DMA_SPI_DONE (*(unsigned char volatile xdata *)0xfa24) +#define DMA_SPI_TXA (*(unsigned int volatile xdata *)0xfa25) +#define DMA_SPI_TXAH (*(unsigned char volatile xdata *)0xfa25) +#define DMA_SPI_TXAL (*(unsigned char volatile xdata *)0xfa26) +#define DMA_SPI_RXA (*(unsigned int volatile xdata *)0xfa27) +#define DMA_SPI_RXAH (*(unsigned char volatile xdata *)0xfa27) +#define DMA_SPI_RXAL (*(unsigned char volatile xdata *)0xfa28) +#define DMA_SPI_CFG2 (*(unsigned char volatile xdata *)0xfa29) + +#define DMA_UR1T_CFG (*(unsigned char volatile xdata *)0xfa30) +#define DMA_UR1T_CR (*(unsigned char volatile xdata *)0xfa31) +#define DMA_UR1T_STA (*(unsigned char volatile xdata *)0xfa32) +#define DMA_UR1T_AMT (*(unsigned char volatile xdata *)0xfa33) +#define DMA_UR1T_DONE (*(unsigned char volatile xdata *)0xfa34) +#define DMA_UR1T_TXA (*(unsigned int volatile xdata *)0xfa35) +#define DMA_UR1T_TXAH (*(unsigned char volatile xdata *)0xfa35) +#define DMA_UR1T_TXAL (*(unsigned char volatile xdata *)0xfa36) +#define DMA_UR1R_CFG (*(unsigned char volatile xdata *)0xfa38) +#define DMA_UR1R_CR (*(unsigned char volatile xdata *)0xfa39) +#define DMA_UR1R_STA (*(unsigned char volatile xdata *)0xfa3a) +#define DMA_UR1R_AMT (*(unsigned char volatile xdata *)0xfa3b) +#define DMA_UR1R_DONE (*(unsigned char volatile xdata *)0xfa3c) +#define DMA_UR1R_RXA (*(unsigned int volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAH (*(unsigned char volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAL (*(unsigned char volatile xdata *)0xfa3e) + +#define DMA_UR2T_CFG (*(unsigned char volatile xdata *)0xfa40) +#define DMA_UR2T_CR (*(unsigned char volatile xdata *)0xfa41) +#define DMA_UR2T_STA (*(unsigned char volatile xdata *)0xfa42) +#define DMA_UR2T_AMT (*(unsigned char volatile xdata *)0xfa43) +#define DMA_UR2T_DONE (*(unsigned char volatile xdata *)0xfa44) +#define DMA_UR2T_TXA (*(unsigned int volatile xdata *)0xfa45) +#define DMA_UR2T_TXAH (*(unsigned char volatile xdata *)0xfa45) +#define DMA_UR2T_TXAL (*(unsigned char volatile xdata *)0xfa46) +#define DMA_UR2R_CFG (*(unsigned char volatile xdata *)0xfa48) +#define DMA_UR2R_CR (*(unsigned char volatile xdata *)0xfa49) +#define DMA_UR2R_STA (*(unsigned char volatile xdata *)0xfa4a) +#define DMA_UR2R_AMT (*(unsigned char volatile xdata *)0xfa4b) +#define DMA_UR2R_DONE (*(unsigned char volatile xdata *)0xfa4c) +#define DMA_UR2R_RXA (*(unsigned int volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAH (*(unsigned char volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAL (*(unsigned char volatile xdata *)0xfa4e) + +#define DMA_UR3T_CFG (*(unsigned char volatile xdata *)0xfa50) +#define DMA_UR3T_CR (*(unsigned char volatile xdata *)0xfa51) +#define DMA_UR3T_STA (*(unsigned char volatile xdata *)0xfa52) +#define DMA_UR3T_AMT (*(unsigned char volatile xdata *)0xfa53) +#define DMA_UR3T_DONE (*(unsigned char volatile xdata *)0xfa54) +#define DMA_UR3T_TXA (*(unsigned int volatile xdata *)0xfa55) +#define DMA_UR3T_TXAH (*(unsigned char volatile xdata *)0xfa55) +#define DMA_UR3T_TXAL (*(unsigned char volatile xdata *)0xfa56) +#define DMA_UR3R_CFG (*(unsigned char volatile xdata *)0xfa58) +#define DMA_UR3R_CR (*(unsigned char volatile xdata *)0xfa59) +#define DMA_UR3R_STA (*(unsigned char volatile xdata *)0xfa5a) +#define DMA_UR3R_AMT (*(unsigned char volatile xdata *)0xfa5b) +#define DMA_UR3R_DONE (*(unsigned char volatile xdata *)0xfa5c) +#define DMA_UR3R_RXA (*(unsigned int volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAH (*(unsigned char volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAL (*(unsigned char volatile xdata *)0xfa5e) + +#define DMA_UR4T_CFG (*(unsigned char volatile xdata *)0xfa60) +#define DMA_UR4T_CR (*(unsigned char volatile xdata *)0xfa61) +#define DMA_UR4T_STA (*(unsigned char volatile xdata *)0xfa62) +#define DMA_UR4T_AMT (*(unsigned char volatile xdata *)0xfa63) +#define DMA_UR4T_DONE (*(unsigned char volatile xdata *)0xfa64) +#define DMA_UR4T_TXA (*(unsigned int volatile xdata *)0xfa65) +#define DMA_UR4T_TXAH (*(unsigned char volatile xdata *)0xfa65) +#define DMA_UR4T_TXAL (*(unsigned char volatile xdata *)0xfa66) +#define DMA_UR4R_CFG (*(unsigned char volatile xdata *)0xfa68) +#define DMA_UR4R_CR (*(unsigned char volatile xdata *)0xfa69) +#define DMA_UR4R_STA (*(unsigned char volatile xdata *)0xfa6a) +#define DMA_UR4R_AMT (*(unsigned char volatile xdata *)0xfa6b) +#define DMA_UR4R_DONE (*(unsigned char volatile xdata *)0xfa6c) +#define DMA_UR4R_RXA (*(unsigned int volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAH (*(unsigned char volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAL (*(unsigned char volatile xdata *)0xfa6e) + +#define DMA_LCM_CFG (*(unsigned char volatile xdata *)0xfa70) +#define DMA_LCM_CR (*(unsigned char volatile xdata *)0xfa71) +#define DMA_LCM_STA (*(unsigned char volatile xdata *)0xfa72) +#define DMA_LCM_AMT (*(unsigned char volatile xdata *)0xfa73) +#define DMA_LCM_DONE (*(unsigned char volatile xdata *)0xfa74) +#define DMA_LCM_TXA (*(unsigned int volatile xdata *)0xfa75) +#define DMA_LCM_TXAH (*(unsigned char volatile xdata *)0xfa75) +#define DMA_LCM_TXAL (*(unsigned char volatile xdata *)0xfa76) +#define DMA_LCM_RXA (*(unsigned int volatile xdata *)0xfa77) +#define DMA_LCM_RXAH (*(unsigned char volatile xdata *)0xfa77) +#define DMA_LCM_RXAL (*(unsigned char volatile xdata *)0xfa78) + +///////////////////////////////////////////////// +//USB Control Regiter +///////////////////////////////////////////////// + +//sfr USBCLK = 0xdc; +//sfr USBDAT = 0xec; +//sfr USBCON = 0xf4; +//sfr USBADR = 0xfc; + +//ʹ÷: +// char dat; +// +// READ_USB(CSR0, dat); //USBĴ +// WRITE_USB(FADDR, 0x00); //дUSBĴ + +#define READ_USB(reg, dat) \ + { \ + while (USBADR & 0x80); \ + USBADR = (reg) | 0x80; \ + while (USBADR & 0x80); \ + (dat) = USBDAT; \ + } + +#define WRITE_USB(reg, dat) \ + { \ + while (USBADR & 0x80); \ + USBADR = (reg) & 0x7f; \ + USBDAT = (dat); \ + } + +#define USBBASE 0 +#define FADDR (USBBASE + 0) +#define UPDATE 0x80 +#define POWER (USBBASE + 1) +#define ISOUD 0x80 +#define USBRST 0x08 +#define USBRSU 0x04 +#define USBSUS 0x02 +#define ENSUS 0x01 +#define INTRIN1 (USBBASE + 2) +#define EP5INIF 0x20 +#define EP4INIF 0x10 +#define EP3INIF 0x08 +#define EP2INIF 0x04 +#define EP1INIF 0x02 +#define EP0IF 0x01 +#define INTROUT1 (USBBASE + 4) +#define EP5OUTIF 0x20 +#define EP4OUTIF 0x10 +#define EP3OUTIF 0x08 +#define EP2OUTIF 0x04 +#define EP1OUTIF 0x02 +#define INTRUSB (USBBASE + 6) +#define SOFIF 0x08 +#define RSTIF 0x04 +#define RSUIF 0x02 +#define SUSIF 0x01 +#define INTRIN1E (USBBASE + 7) +#define EP5INIE 0x20 +#define EP4INIE 0x10 +#define EP3INIE 0x08 +#define EP2INIE 0x04 +#define EP1INIE 0x02 +#define EP0IE 0x01 +#define INTROUT1E (USBBASE + 9) +#define EP5OUTIE 0x20 +#define EP4OUTIE 0x10 +#define EP3OUTIE 0x08 +#define EP2OUTIE 0x04 +#define EP1OUTIE 0x02 +#define INTRUSBE (USBBASE + 11) +#define SOFIE 0x08 +#define RSTIE 0x04 +#define RSUIE 0x02 +#define SUSIE 0x01 +#define FRAME1 (USBBASE + 12) +#define FRAME2 (USBBASE + 13) +#define INDEX (USBBASE + 14) +#define INMAXP (USBBASE + 16) +#define CSR0 (USBBASE + 17) +#define SSUEND 0x80 +#define SOPRDY 0x40 +#define SDSTL 0x20 +#define SUEND 0x10 +#define DATEND 0x08 +#define STSTL 0x04 +#define IPRDY 0x02 +#define OPRDY 0x01 +#define INCSR1 (USBBASE + 17) +#define INCLRDT 0x40 +#define INSTSTL 0x20 +#define INSDSTL 0x10 +#define INFLUSH 0x08 +#define INUNDRUN 0x04 +#define INFIFONE 0x02 +#define INIPRDY 0x01 +#define INCSR2 (USBBASE + 18) +#define INAUTOSET 0x80 +#define INISO 0x40 +#define INMODEIN 0x20 +#define INMODEOUT 0x00 +#define INENDMA 0x10 +#define INFCDT 0x08 +#define OUTMAXP (USBBASE + 19) +#define OUTCSR1 (USBBASE + 20) +#define OUTCLRDT 0x80 +#define OUTSTSTL 0x40 +#define OUTSDSTL 0x20 +#define OUTFLUSH 0x10 +#define OUTDATERR 0x08 +#define OUTOVRRUN 0x04 +#define OUTFIFOFUL 0x02 +#define OUTOPRDY 0x01 +#define OUTCSR2 (USBBASE + 21) +#define OUTAUTOCLR 0x80 +#define OUTISO 0x40 +#define OUTENDMA 0x20 +#define OUTDMAMD 0x10 +#define COUNT0 (USBBASE + 22) +#define OUTCOUNT1 (USBBASE + 22) +#define OUTCOUNT2 (USBBASE + 23) +#define FIFO0 (USBBASE + 32) +#define FIFO1 (USBBASE + 33) +#define FIFO2 (USBBASE + 34) +#define FIFO3 (USBBASE + 35) +#define FIFO4 (USBBASE + 36) +#define FIFO5 (USBBASE + 37) +#define UTRKCTL (USBBASE + 48) +#define UTRKSTS (USBBASE + 49) + +///////////////////////////////////////////////// +//Interrupt Vector +///////////////////////////////////////////////// + +#define INT0_VECTOR 0 //0003H +#define TMR0_VECTOR 1 //000BH +#define INT1_VECTOR 2 //0013H +#define TMR1_VECTOR 3 //001BH +#define UART1_VECTOR 4 //0023H +#define ADC_VECTOR 5 //002BH +#define LVD_VECTOR 6 //0033H +#define UART2_VECTOR 8 //0043H +#define SPI_VECTOR 9 //004BH +#define INT2_VECTOR 10 //0053H +#define INT3_VECTOR 11 //005BH +#define TMR2_VECTOR 12 //0063H +#define USER_VECTOR 13 //006BH +#define INT4_VECTOR 16 //0083H +#define UART3_VECTOR 17 //008BH +#define UART4_VECTOR 18 //0093H +#define TMR3_VECTOR 19 //009BH +#define TMR4_VECTOR 20 //00A3H +#define CMP_VECTOR 21 //00ABH +#define I2C_VECTOR 24 //00C3H +#define USB_VECTOR 25 //00CBH +#define PWMA_VECTOR 26 //00D3H +#define PWMB_VECTOR 27 //00DBH + +#define TKSU_VECTOR 35 //011BH +#define RTC_VECTOR 36 //0123H +#define P0INT_VECTOR 37 //012BH +#define P1INT_VECTOR 38 //0133H +#define P2INT_VECTOR 39 //013BH +#define P3INT_VECTOR 40 //0143H +#define P4INT_VECTOR 41 //014BH +#define P5INT_VECTOR 42 //0153H +#define P6INT_VECTOR 43 //015BH +#define P7INT_VECTOR 44 //0163H +#define DMA_M2M_VECTOR 47 //017BH +#define DMA_ADC_VECTOR 48 //0183H +#define DMA_SPI_VECTOR 49 //018BH +#define DMA_UR1T_VECTOR 50 //0193H +#define DMA_UR1R_VECTOR 51 //019BH +#define DMA_UR2T_VECTOR 52 //01A3H +#define DMA_UR2R_VECTOR 53 //01ABH +#define DMA_UR3T_VECTOR 54 //01B3H +#define DMA_UR3R_VECTOR 55 //01BBH +#define DMA_UR4T_VECTOR 56 //01C3H +#define DMA_UR4R_VECTOR 57 //01CBH +#define DMA_LCM_VECTOR 58 //01D3H +#define LCM_VECTOR 59 //01DBH + +///////////////////////////////////////////////// +#define EAXSFR() P_SW2 |= 0x80 /* MOVX A,@DPTR/MOVX @DPTR,AָIJΪչSFR(XSFR) */ +#define EAXRAM() P_SW2 &= ~0x80 /* MOVX A,@DPTR/MOVX @DPTR,AָIJΪչRAM(XRAM) */ + + +///////////////////////////////////////////////// +#define NOP() _nop_() +#define NOP1() _nop_() +#define NOP2() NOP1(),NOP1() +#define NOP3() NOP2(),NOP1() +#define NOP4() NOP3(),NOP1() +#define NOP5() NOP4(),NOP1() +#define NOP6() NOP5(),NOP1() +#define NOP7() NOP6(),NOP1() +#define NOP8() NOP7(),NOP1() +#define NOP9() NOP8(),NOP1() +#define NOP10() NOP9(),NOP1() +#define NOP11() NOP10(),NOP1() +#define NOP12() NOP11(),NOP1() +#define NOP13() NOP12(),NOP1() +#define NOP14() NOP13(),NOP1() +#define NOP15() NOP14(),NOP1() +#define NOP16() NOP15(),NOP1() +#define NOP17() NOP16(),NOP1() +#define NOP18() NOP17(),NOP1() +#define NOP19() NOP18(),NOP1() +#define NOP20() NOP19(),NOP1() +#define NOP21() NOP20(),NOP1() +#define NOP22() NOP21(),NOP1() +#define NOP23() NOP22(),NOP1() +#define NOP24() NOP23(),NOP1() +#define NOP25() NOP24(),NOP1() +#define NOP26() NOP25(),NOP1() +#define NOP27() NOP26(),NOP1() +#define NOP28() NOP27(),NOP1() +#define NOP29() NOP28(),NOP1() +#define NOP30() NOP29(),NOP1() +#define NOP31() NOP30(),NOP1() +#define NOP32() NOP31(),NOP1() +#define NOP33() NOP32(),NOP1() +#define NOP34() NOP33(),NOP1() +#define NOP35() NOP34(),NOP1() +#define NOP36() NOP35(),NOP1() +#define NOP37() NOP36(),NOP1() +#define NOP38() NOP37(),NOP1() +#define NOP39() NOP38(),NOP1() +#define NOP40() NOP39(),NOP1() +#define NOPN(N) NOP##N() + + +///////////////////////////////////////////////// + +#endif + diff --git a/source/cpu/c51_macro.H b/source/cpu/c51_macro.H new file mode 100644 index 0000000..b670b53 --- /dev/null +++ b/source/cpu/c51_macro.H @@ -0,0 +1,301 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file __C51_MACRO_H_ +/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __C51_MACRO_H_ +#define __C51_MACRO_H_ + +#include + +#define D_P07_ON() P07 = 1 +#define D_P06_ON() P06 = 1 +#define D_P05_ON() P05 = 1 +#define D_P04_ON() P04 = 1 +#define D_P03_ON() P03 = 1 +#define D_P02_ON() P02 = 1 +#define D_P01_ON() P01 = 1 +#define D_P00_ON() P00 = 1 +#define D_P07_OFF() P07 = 0 +#define D_P06_OFF() P06 = 0 +#define D_P05_OFF() P05 = 0 +#define D_P04_OFF() P04 = 0 +#define D_P03_OFF() P03 = 0 +#define D_P02_OFF() P02 = 0 +#define D_P01_OFF() P01 = 0 +#define D_P00_OFF() P00 = 0 +#define D_P07_AT() (P07) +#define D_P06_AT() (P06) +#define D_P05_AT() (P05) +#define D_P04_AT() (P04) +#define D_P03_AT() (P03) +#define D_P02_AT() (P02) +#define D_P01_AT() (P01) +#define D_P00_AT() (P00) +#define D_P07_REV() P07 = ~P07 +#define D_P06_REV() P06 = ~P06 +#define D_P05_REV() P05 = ~P05 +#define D_P04_REV() P04 = ~P04 +#define D_P03_REV() P03 = ~P03 +#define D_P02_REV() P02 = ~P02 +#define D_P01_REV() P01 = ~P01 +#define D_P00_REV() P00 = ~P00 + + +#define D_P17_ON() P17 = 1 +#define D_P16_ON() P16 = 1 +#define D_P15_ON() P15 = 1 +#define D_P14_ON() P14 = 1 +#define D_P13_ON() P13 = 1 +#define D_P12_ON() P12 = 1 +#define D_P11_ON() P11 = 1 +#define D_P10_ON() P10 = 1 +#define D_P17_OFF() P17 = 0 +#define D_P16_OFF() P16 = 0 +#define D_P15_OFF() P15 = 0 +#define D_P14_OFF() P14 = 0 +#define D_P13_OFF() P13 = 0 +#define D_P12_OFF() P12 = 0 +#define D_P11_OFF() P11 = 0 +#define D_P10_OFF() P10 = 0 +#define D_P17_AT() (P17) +#define D_P16_AT() (P16) +#define D_P15_AT() (P15) +#define D_P14_AT() (P14) +#define D_P13_AT() (P13) +#define D_P12_AT() (P12) +#define D_P11_AT() (P11) +#define D_P10_AT() (P10) +#define D_P17_REV() P17 = ~P17 +#define D_P16_REV() P16 = ~P16 +#define D_P15_REV() P15 = ~P15 +#define D_P14_REV() P14 = ~P14 +#define D_P13_REV() P13 = ~P13 +#define D_P12_REV() P12 = ~P12 +#define D_P11_REV() P11 = ~P11 +#define D_P10_REV() P10 = ~P10 + +#define D_P27_ON() P27 = 1 +#define D_P26_ON() P26 = 1 +#define D_P25_ON() P25 = 1 +#define D_P24_ON() P24 = 1 +#define D_P23_ON() P23 = 1 +#define D_P22_ON() P22 = 1 +#define D_P21_ON() P21 = 1 +#define D_P20_ON() P20 = 1 +#define D_P27_OFF() P27 = 0 +#define D_P26_OFF() P26 = 0 +#define D_P25_OFF() P25 = 0 +#define D_P24_OFF() P24 = 0 +#define D_P23_OFF() P23 = 0 +#define D_P22_OFF() P22 = 0 +#define D_P21_OFF() P21 = 0 +#define D_P20_OFF() P20 = 0 +#define D_P27_AT() (P27) +#define D_P26_AT() (P26) +#define D_P25_AT() (P25) +#define D_P24_AT() (P24) +#define D_P23_AT() (P23) +#define D_P22_AT() (P22) +#define D_P21_AT() (P21) +#define D_P20_AT() (P20) +#define D_P27_REV() P27 = ~P27 +#define D_P26_REV() P26 = ~P26 +#define D_P25_REV() P25 = ~P25 +#define D_P24_REV() P24 = ~P24 +#define D_P23_REV() P23 = ~P23 +#define D_P22_REV() P22 = ~P22 +#define D_P21_REV() P21 = ~P21 +#define D_P20_REV() P20 = ~P20 + + +#define D_P37_ON() P37 = 1 +#define D_P36_ON() P36 = 1 +#define D_P35_ON() P35 = 1 +#define D_P34_ON() P34 = 1 +#define D_P33_ON() P33 = 1 +#define D_P32_ON() P32 = 1 +#define D_P31_ON() P31 = 1 +#define D_P30_ON() P30 = 1 +#define D_P37_OFF() P37 = 0 +#define D_P36_OFF() P36 = 0 +#define D_P35_OFF() P35 = 0 +#define D_P34_OFF() P34 = 0 +#define D_P33_OFF() P33 = 0 +#define D_P32_OFF() P32 = 0 +#define D_P31_OFF() P31 = 0 +#define D_P30_OFF() P30 = 0 +#define D_P37_AT() (P37) +#define D_P36_AT() (P36) +#define D_P35_AT() (P35) +#define D_P34_AT() (P34) +#define D_P33_AT() (P33) +#define D_P32_AT() (P32) +#define D_P31_AT() (P31) +#define D_P30_AT() (P30) +#define D_P37_REV() P37 = ~P37 +#define D_P36_REV() P36 = ~P36 +#define D_P35_REV() P35 = ~P35 +#define D_P34_REV() P34 = ~P34 +#define D_P33_REV() P33 = ~P33 +#define D_P32_REV() P32 = ~P32 +#define D_P31_REV() P31 = ~P31 +#define D_P30_REV() P30 = ~P30 + + +#define D_P47_ON() P47 = 1 +#define D_P46_ON() P46 = 1 +#define D_P45_ON() P45 = 1 +#define D_P44_ON() P44 = 1 +#define D_P43_ON() P43 = 1 +#define D_P42_ON() P42 = 1 +#define D_P41_ON() P41 = 1 +#define D_P40_ON() P40 = 1 +#define D_P47_OFF() P47 = 0 +#define D_P46_OFF() P46 = 0 +#define D_P45_OFF() P45 = 0 +#define D_P44_OFF() P44 = 0 +#define D_P43_OFF() P43 = 0 +#define D_P42_OFF() P42 = 0 +#define D_P41_OFF() P41 = 0 +#define D_P40_OFF() P40 = 0 +#define D_P47_AT() (P47) +#define D_P46_AT() (P46) +#define D_P45_AT() (P45) +#define D_P44_AT() (P44) +#define D_P43_AT() (P43) +#define D_P42_AT() (P42) +#define D_P41_AT() (P41) +#define D_P40_AT() (P40) +#define D_P47_REV() P47 = ~P47 +#define D_P46_REV() P46 = ~P46 +#define D_P45_REV() P45 = ~P45 +#define D_P44_REV() P44 = ~P44 +#define D_P43_REV() P43 = ~P43 +#define D_P42_REV() P42 = ~P42 +#define D_P41_REV() P41 = ~P41 +#define D_P40_REV() P40 = ~P40 + +#define D_P57_ON() P57 = 1 +#define D_P56_ON() P56 = 1 +#define D_P55_ON() P55 = 1 +#define D_P54_ON() P54 = 1 +#define D_P53_ON() P53 = 1 +#define D_P52_ON() P52 = 1 +#define D_P51_ON() P51 = 1 +#define D_P50_ON() P50 = 1 +#define D_P57_OFF() P57 = 0 +#define D_P56_OFF() P56 = 0 +#define D_P55_OFF() P55 = 0 +#define D_P54_OFF() P54 = 0 +#define D_P53_OFF() P53 = 0 +#define D_P52_OFF() P52 = 0 +#define D_P51_OFF() P51 = 0 +#define D_P50_OFF() P50 = 0 +#define D_P57_AT() (P57) +#define D_P56_AT() (P56) +#define D_P55_AT() (P55) +#define D_P54_AT() (P54) +#define D_P53_AT() (P53) +#define D_P52_AT() (P52) +#define D_P51_AT() (P51) +#define D_P50_AT() (P50) +#define D_P57_REV() P57 = ~P57 +#define D_P56_REV() P56 = ~P56 +#define D_P55_REV() P55 = ~P55 +#define D_P54_REV() P54 = ~P54 +#define D_P53_REV() P53 = ~P53 +#define D_P52_REV() P52 = ~P52 +#define D_P51_REV() P51 = ~P51 +#define D_P50_REV() P50 = ~P50 + +#define D_P67_ON() P67 = 1 +#define D_P66_ON() P66 = 1 +#define D_P65_ON() P65 = 1 +#define D_P64_ON() P64 = 1 +#define D_P63_ON() P63 = 1 +#define D_P62_ON() P62 = 1 +#define D_P61_ON() P61 = 1 +#define D_P60_ON() P60 = 1 +#define D_P67_OFF() P67 = 0 +#define D_P66_OFF() P66 = 0 +#define D_P65_OFF() P65 = 0 +#define D_P64_OFF() P64 = 0 +#define D_P63_OFF() P63 = 0 +#define D_P62_OFF() P62 = 0 +#define D_P61_OFF() P61 = 0 +#define D_P60_OFF() P60 = 0 +#define D_P67_AT() (P67) +#define D_P66_AT() (P66) +#define D_P65_AT() (P65) +#define D_P64_AT() (P64) +#define D_P63_AT() (P63) +#define D_P62_AT() (P62) +#define D_P61_AT() (P61) +#define D_P60_AT() (P60) +#define D_P67_REV() P67 = ~P67 +#define D_P66_REV() P66 = ~P66 +#define D_P65_REV() P65 = ~P65 +#define D_P64_REV() P64 = ~P64 +#define D_P63_REV() P63 = ~P63 +#define D_P62_REV() P62 = ~P62 +#define D_P61_REV() P61 = ~P61 +#define D_P60_REV() P60 = ~P60 + +#define D_P77_ON() P77 = 1 +#define D_P76_ON() P76 = 1 +#define D_P75_ON() P75 = 1 +#define D_P74_ON() P74 = 1 +#define D_P73_ON() P73 = 1 +#define D_P72_ON() P72 = 1 +#define D_P71_ON() P71 = 1 +#define D_P70_ON() P70 = 1 +#define D_P77_OFF() P77 = 0 +#define D_P76_OFF() P76 = 0 +#define D_P75_OFF() P75 = 0 +#define D_P74_OFF() P74 = 0 +#define D_P73_OFF() P73 = 0 +#define D_P72_OFF() P72 = 0 +#define D_P71_OFF() P71 = 0 +#define D_P70_OFF() P70 = 0 +#define D_P77_AT() (P77) +#define D_P76_AT() (P76) +#define D_P75_AT() (P75) +#define D_P74_AT() (P74) +#define D_P73_AT() (P73) +#define D_P72_AT() (P72) +#define D_P71_AT() (P71) +#define D_P70_AT() (P70) +#define D_P77_REV() P77 = ~P77 +#define D_P76_REV() P76 = ~P76 +#define D_P75_REV() P75 = ~P75 +#define D_P74_REV() P74 = ~P74 +#define D_P73_REV() P73 = ~P73 +#define D_P72_REV() P72 = ~P72 +#define D_P71_REV() P71 = ~P71 +#define D_P70_REV() P70 = ~P70 + + + +#endif //__C51_MACRO_H_ + + + + + + + diff --git a/source/cpu/nouse/STC_stc8a8k.H b/source/cpu/nouse/STC_stc8a8k.H new file mode 100644 index 0000000..79da822 --- /dev/null +++ b/source/cpu/nouse/STC_stc8a8k.H @@ -0,0 +1,589 @@ +#ifndef __STC_stc8a8k_H_ +#define __STC_stc8a8k_H_ +// STC_stc8a8k.h +#include + +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; + + +///00 准双向口 灌电流20mA 拉电流270-150uS +///01 推挽输出 20mA 加限流 +///10 高阻 +///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + + +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + + + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +//----------------------------------------------------------------- +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 +#define EAXFR BITN7 +#define I2C_S1 BITN5 +#define I2C_S2 BITN4 +#define CMPO_S BITN3 +#define S4_S BITN2 +#define S3_S BITN1 +#define S2_S BITN0 + +//----------------------------------------------------------------- + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + + +//sfr P_SW2 = 0xba; +sfr PWMCFG = 0xf1; +sfr PWMIF = 0xf6; +sfr PWMFDCR = 0xf7; +sfr PWMCR = 0xfe; + +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define TADCP (*(unsigned int volatile xdata *)0xfff3) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM0CR (*(unsigned char volatile xdata *)0xff04) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff05) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM1CR (*(unsigned char volatile xdata *)0xff14) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM3CR (*(unsigned char volatile xdata *)0xff34) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM4CR (*(unsigned char volatile xdata *)0xff44) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM5CR (*(unsigned char volatile xdata *)0xff54) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff55) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff60) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff62) +#define PWM6CR (*(unsigned char volatile xdata *)0xff64) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff65) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff70) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff72) +#define PWM7CR (*(unsigned char volatile xdata *)0xff74) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff75) + + +#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF +#define MCLKODIV BIT4 +#define MCLKO_S BITN3 +#define MCLKSEL BIT0 + +#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF +#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF +#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF +#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF + + + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + + + +#if 0 +/// >>>>> add by cc + + +//sbit P34=P3^4; //定义SDA数据线 +//sbit P35=P3^5; //定义SCL时钟线 +#define mBIT_1(X,N) X|= (1< + +#if 0 + +///////////////////////////////////////////////// +正在检测目标单片机 ... + 单片机型号: STC8H3K64S4 + 固件版本号: 7.4.1U + +当前芯片的硬件选项为: + . 系统ISP工作频率: 23.801MHz + . 内部IRC振荡器的频率: 22.123MHz + . 掉电唤醒定时器的频率: 35.400KHz + . 振荡器放大增益使能 + . P3.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 2.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1185 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年8月16日 + + 单片机型号: STC8H3K64S4 + 固件版本号: 7.4.1U + + +操作成功 !(2021-12-25 21:35:51) + + +///////////////////////////////////////////////// + +#endif +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr USBCLK = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sfr USBDAT = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr USBCON = 0xf4; +sfr IAP_TPS = 0xf5; +sfr P7 = 0xf8; +sfr USBADR = 0xfc; +sfr RSTCFG = 0xff; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define HIRCCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) +#define X32KCR (*(unsigned char volatile xdata *)0xfe08) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define RTCCR (*(unsigned char volatile xdata *)0xfe60) +#define RTCCFG (*(unsigned char volatile xdata *)0xfe61) +#define RTCIEN (*(unsigned char volatile xdata *)0xfe62) +#define RTCIF (*(unsigned char volatile xdata *)0xfe63) +#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64) +#define ALAMIN (*(unsigned char volatile xdata *)0xfe65) +#define ALASEC (*(unsigned char volatile xdata *)0xfe66) +#define ALASSEC (*(unsigned char volatile xdata *)0xfe67) +#define INIYEAR (*(unsigned char volatile xdata *)0xfe68) +#define INIMONTH (*(unsigned char volatile xdata *)0xfe69) +#define INIDAY (*(unsigned char volatile xdata *)0xfe6a) +#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b) +#define INIMIN (*(unsigned char volatile xdata *)0xfe6c) +#define INISEC (*(unsigned char volatile xdata *)0xfe6d) +#define INISSEC (*(unsigned char volatile xdata *)0xfe6e) +#define YEAR (*(unsigned char volatile xdata *)0xfe70) +#define MONTH (*(unsigned char volatile xdata *)0xfe71) +#define DAY (*(unsigned char volatile xdata *)0xfe72) +#define HOUR (*(unsigned char volatile xdata *)0xfe73) +#define MINI (*(unsigned char volatile xdata *)0xfe74) +#define SEC (*(unsigned char volatile xdata *)0xfe75) +#define SSEC (*(unsigned char volatile xdata *)0xfe76) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) +#define T3T4PIN (*(unsigned char volatile xdata *)0xfeac) + +#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5) +#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5) +#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6) +#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7) +#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7) +#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8) +#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9) +#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9) +#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa) +#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb) +#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb) +#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc) +#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff) + +#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5) +#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5) +#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6) +#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7) +#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7) +#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8) +#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9) +#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9) +#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa) +#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb) +#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb) +#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc) +#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) +#define PIN_IP (*(unsigned char volatile xdata *)0xfd60) +#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + +#define COMEN (*(unsigned char volatile xdata *)0xfb00) +#define SEGENL (*(unsigned char volatile xdata *)0xfb01) +#define SEGENH (*(unsigned char volatile xdata *)0xfb02) +#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03) +#define LEDCKS (*(unsigned char volatile xdata *)0xfb04) +#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10) +#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11) +#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12) +#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13) +#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14) +#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15) +#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16) +#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17) +#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18) +#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19) +#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a) +#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b) +#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c) +#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d) +#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e) +#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f) +#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20) +#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21) +#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22) +#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23) +#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24) +#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25) +#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26) +#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27) +#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28) +#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29) +#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a) +#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b) +#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c) +#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d) +#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e) +#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f) + +#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40) +#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41) +#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42) +#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43) +#define TSWUTC (*(unsigned char volatile xdata *)0xfb44) +#define TSCTRL (*(unsigned char volatile xdata *)0xfb45) +#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46) +#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47) +#define TSRT (*(unsigned char volatile xdata *)0xfb48) +#define TSDAT (*(unsigned int volatile xdata *)0xfb49) +#define TSDATH (*(unsigned char volatile xdata *)0xfb49) +#define TSDATL (*(unsigned char volatile xdata *)0xfb4A) +#define TSTH00 (*(unsigned int volatile xdata *)0xfb50) +#define TSTH00H (*(unsigned char volatile xdata *)0xfb50) +#define TSTH00L (*(unsigned char volatile xdata *)0xfb51) +#define TSTH01 (*(unsigned int volatile xdata *)0xfb52) +#define TSTH01H (*(unsigned char volatile xdata *)0xfb52) +#define TSTH01L (*(unsigned char volatile xdata *)0xfb53) +#define TSTH02 (*(unsigned int volatile xdata *)0xfb54) +#define TSTH02H (*(unsigned char volatile xdata *)0xfb54) +#define TSTH02L (*(unsigned char volatile xdata *)0xfb55) +#define TSTH03 (*(unsigned int volatile xdata *)0xfb56) +#define TSTH03H (*(unsigned char volatile xdata *)0xfb56) +#define TSTH03L (*(unsigned char volatile xdata *)0xfb57) +#define TSTH04 (*(unsigned int volatile xdata *)0xfb58) +#define TSTH04H (*(unsigned char volatile xdata *)0xfb58) +#define TSTH04L (*(unsigned char volatile xdata *)0xfb59) +#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a) +#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a) +#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b) +#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c) +#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c) +#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d) +#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e) +#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e) +#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f) +#define TSTH08 (*(unsigned int volatile xdata *)0xfb60) +#define TSTH08H (*(unsigned char volatile xdata *)0xfb60) +#define TSTH08L (*(unsigned char volatile xdata *)0xfb61) +#define TSTH09 (*(unsigned int volatile xdata *)0xfb62) +#define TSTH09H (*(unsigned char volatile xdata *)0xfb62) +#define TSTH09L (*(unsigned char volatile xdata *)0xfb63) +#define TSTH10 (*(unsigned int volatile xdata *)0xfb64) +#define TSTH10H (*(unsigned char volatile xdata *)0xfb64) +#define TSTH10L (*(unsigned char volatile xdata *)0xfb65) +#define TSTH11 (*(unsigned int volatile xdata *)0xfb66) +#define TSTH11H (*(unsigned char volatile xdata *)0xfb66) +#define TSTH11L (*(unsigned char volatile xdata *)0xfb67) +#define TSTH12 (*(unsigned int volatile xdata *)0xfb68) +#define TSTH12H (*(unsigned char volatile xdata *)0xfb68) +#define TSTH12L (*(unsigned char volatile xdata *)0xfb69) +#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a) +#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a) +#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b) +#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c) +#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c) +#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d) +#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e) +#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e) +#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f) + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + +#define DMA_ADC_CFG (*(unsigned char volatile xdata *)0xfa10) +#define DMA_ADC_CR (*(unsigned char volatile xdata *)0xfa11) +#define DMA_ADC_STA (*(unsigned char volatile xdata *)0xfa12) +#define DMA_ADC_RXA (*(unsigned int volatile xdata *)0xfa17) +#define DMA_ADC_RXAH (*(unsigned char volatile xdata *)0xfa17) +#define DMA_ADC_RXAL (*(unsigned char volatile xdata *)0xfa18) +#define DMA_ADC_CFG2 (*(unsigned char volatile xdata *)0xfa19) +#define DMA_ADC_CHSW0 (*(unsigned char volatile xdata *)0xfa1a) +#define DMA_ADC_CHSW1 (*(unsigned char volatile xdata *)0xfa1b) + +#define DMA_SPI_CFG (*(unsigned char volatile xdata *)0xfa20) +#define DMA_SPI_CR (*(unsigned char volatile xdata *)0xfa21) +#define DMA_SPI_STA (*(unsigned char volatile xdata *)0xfa22) +#define DMA_SPI_AMT (*(unsigned char volatile xdata *)0xfa23) +#define DMA_SPI_DONE (*(unsigned char volatile xdata *)0xfa24) +#define DMA_SPI_TXA (*(unsigned int volatile xdata *)0xfa25) +#define DMA_SPI_TXAH (*(unsigned char volatile xdata *)0xfa25) +#define DMA_SPI_TXAL (*(unsigned char volatile xdata *)0xfa26) +#define DMA_SPI_RXA (*(unsigned int volatile xdata *)0xfa27) +#define DMA_SPI_RXAH (*(unsigned char volatile xdata *)0xfa27) +#define DMA_SPI_RXAL (*(unsigned char volatile xdata *)0xfa28) +#define DMA_SPI_CFG2 (*(unsigned char volatile xdata *)0xfa29) + +#define DMA_UR1T_CFG (*(unsigned char volatile xdata *)0xfa30) +#define DMA_UR1T_CR (*(unsigned char volatile xdata *)0xfa31) +#define DMA_UR1T_STA (*(unsigned char volatile xdata *)0xfa32) +#define DMA_UR1T_AMT (*(unsigned char volatile xdata *)0xfa33) +#define DMA_UR1T_DONE (*(unsigned char volatile xdata *)0xfa34) +#define DMA_UR1T_TXA (*(unsigned int volatile xdata *)0xfa35) +#define DMA_UR1T_TXAH (*(unsigned char volatile xdata *)0xfa35) +#define DMA_UR1T_TXAL (*(unsigned char volatile xdata *)0xfa36) +#define DMA_UR1R_CFG (*(unsigned char volatile xdata *)0xfa38) +#define DMA_UR1R_CR (*(unsigned char volatile xdata *)0xfa39) +#define DMA_UR1R_STA (*(unsigned char volatile xdata *)0xfa3a) +#define DMA_UR1R_AMT (*(unsigned char volatile xdata *)0xfa3b) +#define DMA_UR1R_DONE (*(unsigned char volatile xdata *)0xfa3c) +#define DMA_UR1R_RXA (*(unsigned int volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAH (*(unsigned char volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAL (*(unsigned char volatile xdata *)0xfa3e) + +#define DMA_UR2T_CFG (*(unsigned char volatile xdata *)0xfa40) +#define DMA_UR2T_CR (*(unsigned char volatile xdata *)0xfa41) +#define DMA_UR2T_STA (*(unsigned char volatile xdata *)0xfa42) +#define DMA_UR2T_AMT (*(unsigned char volatile xdata *)0xfa43) +#define DMA_UR2T_DONE (*(unsigned char volatile xdata *)0xfa44) +#define DMA_UR2T_TXA (*(unsigned int volatile xdata *)0xfa45) +#define DMA_UR2T_TXAH (*(unsigned char volatile xdata *)0xfa45) +#define DMA_UR2T_TXAL (*(unsigned char volatile xdata *)0xfa46) +#define DMA_UR2R_CFG (*(unsigned char volatile xdata *)0xfa48) +#define DMA_UR2R_CR (*(unsigned char volatile xdata *)0xfa49) +#define DMA_UR2R_STA (*(unsigned char volatile xdata *)0xfa4a) +#define DMA_UR2R_AMT (*(unsigned char volatile xdata *)0xfa4b) +#define DMA_UR2R_DONE (*(unsigned char volatile xdata *)0xfa4c) +#define DMA_UR2R_RXA (*(unsigned int volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAH (*(unsigned char volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAL (*(unsigned char volatile xdata *)0xfa4e) + +#define DMA_UR3T_CFG (*(unsigned char volatile xdata *)0xfa50) +#define DMA_UR3T_CR (*(unsigned char volatile xdata *)0xfa51) +#define DMA_UR3T_STA (*(unsigned char volatile xdata *)0xfa52) +#define DMA_UR3T_AMT (*(unsigned char volatile xdata *)0xfa53) +#define DMA_UR3T_DONE (*(unsigned char volatile xdata *)0xfa54) +#define DMA_UR3T_TXA (*(unsigned int volatile xdata *)0xfa55) +#define DMA_UR3T_TXAH (*(unsigned char volatile xdata *)0xfa55) +#define DMA_UR3T_TXAL (*(unsigned char volatile xdata *)0xfa56) +#define DMA_UR3R_CFG (*(unsigned char volatile xdata *)0xfa58) +#define DMA_UR3R_CR (*(unsigned char volatile xdata *)0xfa59) +#define DMA_UR3R_STA (*(unsigned char volatile xdata *)0xfa5a) +#define DMA_UR3R_AMT (*(unsigned char volatile xdata *)0xfa5b) +#define DMA_UR3R_DONE (*(unsigned char volatile xdata *)0xfa5c) +#define DMA_UR3R_RXA (*(unsigned int volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAH (*(unsigned char volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAL (*(unsigned char volatile xdata *)0xfa5e) + +#define DMA_UR4T_CFG (*(unsigned char volatile xdata *)0xfa60) +#define DMA_UR4T_CR (*(unsigned char volatile xdata *)0xfa61) +#define DMA_UR4T_STA (*(unsigned char volatile xdata *)0xfa62) +#define DMA_UR4T_AMT (*(unsigned char volatile xdata *)0xfa63) +#define DMA_UR4T_DONE (*(unsigned char volatile xdata *)0xfa64) +#define DMA_UR4T_TXA (*(unsigned int volatile xdata *)0xfa65) +#define DMA_UR4T_TXAH (*(unsigned char volatile xdata *)0xfa65) +#define DMA_UR4T_TXAL (*(unsigned char volatile xdata *)0xfa66) +#define DMA_UR4R_CFG (*(unsigned char volatile xdata *)0xfa68) +#define DMA_UR4R_CR (*(unsigned char volatile xdata *)0xfa69) +#define DMA_UR4R_STA (*(unsigned char volatile xdata *)0xfa6a) +#define DMA_UR4R_AMT (*(unsigned char volatile xdata *)0xfa6b) +#define DMA_UR4R_DONE (*(unsigned char volatile xdata *)0xfa6c) +#define DMA_UR4R_RXA (*(unsigned int volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAH (*(unsigned char volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAL (*(unsigned char volatile xdata *)0xfa6e) + +#define DMA_LCM_CFG (*(unsigned char volatile xdata *)0xfa70) +#define DMA_LCM_CR (*(unsigned char volatile xdata *)0xfa71) +#define DMA_LCM_STA (*(unsigned char volatile xdata *)0xfa72) +#define DMA_LCM_AMT (*(unsigned char volatile xdata *)0xfa73) +#define DMA_LCM_DONE (*(unsigned char volatile xdata *)0xfa74) +#define DMA_LCM_TXA (*(unsigned int volatile xdata *)0xfa75) +#define DMA_LCM_TXAH (*(unsigned char volatile xdata *)0xfa75) +#define DMA_LCM_TXAL (*(unsigned char volatile xdata *)0xfa76) +#define DMA_LCM_RXA (*(unsigned int volatile xdata *)0xfa77) +#define DMA_LCM_RXAH (*(unsigned char volatile xdata *)0xfa77) +#define DMA_LCM_RXAL (*(unsigned char volatile xdata *)0xfa78) + + +///////////////////////////////////////////////// +#if 0 + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; + + +///00 准双向口 灌电流20mA 拉电流270-150uS +///01 推挽输出 20mA 加限流 +///10 高阻 +///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + + +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + +sfr VOCTR = 0xBB; //电压控制寄存器 +///BITN_1(VOCTR, BITN7) VOCTR +#define D_VOCTR_SCCIN 0x00 +#define D_VOCTR_SCC 0x80 +#define D_VOCTR_SET(X) VOCTR = (X) + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +//----------------------------------------------------------------- +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 +#define EAXFR BITN7 +#define I2C_S1 BITN5 +#define I2C_S2 BITN4 +#define CMPO_S BITN3 +#define S4_S BITN2 +#define S3_S BITN1 +#define S2_S BITN0 + +//----------------------------------------------------------------- + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + + +sfr IPH = 0xB7; //xxxx,xx00 中断优先级寄存器2 +#define PPCAH BITN7 +#define PLVDH BITN6 +#define PADCH BITN5 +#define PSH BITN4 +#define PT1H BITN3 +#define PX1H BITN2 +#define PT0H BITN1 +#define PX0H BITN0 + + + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2C BITN6 +#define PCMP BITN5 +#define PX4 BITN4 +#define PPWMFD BITN3 +#define PPWM BITN2 +#define PSPI BITN1 +#define PS2 BITN0 + +sfr IP2H = 0xB6; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2CH BITN6 +#define PCMPH BITN5 +#define PX4H BITN4 +#define PPWMFDH BITN3 +#define PPWMH BITN2 +#define PSPIH BITN1 +#define PS2H BITN0 + + + + + +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 +#define INT_EX4 BITN6 +#define INT_EX3 BITN5 +#define INT_EX2 BITN4 +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr16 WKTC = 0xAA; +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + + +//sfr P_SW2 = 0xba; +sfr PWMCFG = 0xf1; +sfr PWMIF = 0xf6; +sfr PWMFDCR = 0xf7; +sfr PWMCR = 0xfe; + +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define TADCP (*(unsigned int volatile xdata *)0xfff3) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM0CR (*(unsigned char volatile xdata *)0xff04) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff05) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM1CR (*(unsigned char volatile xdata *)0xff14) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM3CR (*(unsigned char volatile xdata *)0xff34) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM4CR (*(unsigned char volatile xdata *)0xff44) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM5CR (*(unsigned char volatile xdata *)0xff54) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff55) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff60) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff62) +#define PWM6CR (*(unsigned char volatile xdata *)0xff64) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff65) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff70) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff72) +#define PWM7CR (*(unsigned char volatile xdata *)0xff74) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff75) + + +#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF +#define MCLKODIV BIT4 +#define MCLKO_S BITN3 +#define MCLKSEL BIT0 + +#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF +#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF +#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF +#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF +#endif + +#if 0 +///已经放到了stc only中 + +#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + + + +///------------------------------------- + +#define gRccUs01_H (*(unsigned char volatile data *)0xd2) +#define gRccUs01_L (*(unsigned char volatile data *)0xd3) + + + +#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + + + +#define gRccUs04 (*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 (*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + +sfr AUXINTIF = 0xef; + +#define T2IF 0x01 +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 + +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + + +/// >>>>> add by cc + +#include "bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART 4 +#define D_SERVE_UART1 8 +#define D_ISR_int4 16 /////只有下降沿 + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); + +#endif +#endif //STC_stc8a8k + + + + + + + + diff --git a/source/cpu/nouse/stc_8A8K64D4.h b/source/cpu/nouse/stc_8A8K64D4.h new file mode 100644 index 0000000..b898883 --- /dev/null +++ b/source/cpu/nouse/stc_8A8K64D4.h @@ -0,0 +1,653 @@ +#ifndef __STC8A8K64D4_H__ +#define __STC8A8K64D4_H__ + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr BUS_SPEED = 0xa1; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr CCON = 0xd8; +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF3 = CCON^3; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xd9; +sfr CCAPM0 = 0xda; +sfr CCAPM1 = 0xdb; +sfr CCAPM2 = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr CL = 0xe9; +sfr CCAP0L = 0xea; +sfr CCAP1L = 0xeb; +sfr CCAP2L = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr PWMSET = 0xf1; +sfr PCA_PWM0 = 0xf2; +sfr PCA_PWM1 = 0xf3; +sfr PCA_PWM2 = 0xf4; +sfr IAP_TPS = 0xf5; +sfr PWMCFG = 0xf6; +sfr P7 = 0xf8; +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr CH = 0xf9; +sfr CCAP0H = 0xfa; +sfr CCAP1H = 0xfb; +sfr CCAP2H = 0xfc; +sfr RSTCFG = 0xff; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + +#define PWMC (*(unsigned int volatile xdata *)0xff00) +#define PWMCH (*(unsigned char volatile xdata *)0xff00) +#define PWMCL (*(unsigned char volatile xdata *)0xff01) +#define PWMCKS (*(unsigned char volatile xdata *)0xff02) +#define PWMTADC (*(unsigned int volatile xdata *)0xff03) +#define PWMTADCH (*(unsigned char volatile xdata *)0xff03) +#define PWMTADCL (*(unsigned char volatile xdata *)0xff04) +#define PWMIF (*(unsigned char volatile xdata *)0xff05) +#define PWMFDCR (*(unsigned char volatile xdata *)0xff06) +#define PWMDELSEL (*(unsigned char volatile xdata *)0xff07) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM0T1H (*(unsigned char volatile xdata *)0xff10) +#define PWM0T1L (*(unsigned char volatile xdata *)0xff11) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM0T2H (*(unsigned char volatile xdata *)0xff12) +#define PWM0T2L (*(unsigned char volatile xdata *)0xff13) +#define PWM0CR (*(unsigned char volatile xdata *)0xff14) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff18) +#define PWM1T1H (*(unsigned char volatile xdata *)0xff18) +#define PWM1T1L (*(unsigned char volatile xdata *)0xff19) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff1a) +#define PWM1T2H (*(unsigned char volatile xdata *)0xff1a) +#define PWM1T2L (*(unsigned char volatile xdata *)0xff1b) +#define PWM1CR (*(unsigned char volatile xdata *)0xff1c) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff1d) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T1H (*(unsigned char volatile xdata *)0xff20) +#define PWM2T1L (*(unsigned char volatile xdata *)0xff21) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2T2H (*(unsigned char volatile xdata *)0xff22) +#define PWM2T2L (*(unsigned char volatile xdata *)0xff23) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff28) +#define PWM3T1H (*(unsigned char volatile xdata *)0xff28) +#define PWM3T1L (*(unsigned char volatile xdata *)0xff29) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff2a) +#define PWM3T2H (*(unsigned char volatile xdata *)0xff2a) +#define PWM3T2L (*(unsigned char volatile xdata *)0xff2b) +#define PWM3CR (*(unsigned char volatile xdata *)0xff2c) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff2d) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM4T1H (*(unsigned char volatile xdata *)0xff30) +#define PWM4T1L (*(unsigned char volatile xdata *)0xff31) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM4T2H (*(unsigned char volatile xdata *)0xff32) +#define PWM4T2L (*(unsigned char volatile xdata *)0xff33) +#define PWM4CR (*(unsigned char volatile xdata *)0xff34) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff38) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff38) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff39) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff3a) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff3a) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff3b) +#define PWM5CR (*(unsigned char volatile xdata *)0xff3c) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff3d) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff41) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff43) +#define PWM6CR (*(unsigned char volatile xdata *)0xff44) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff48) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff48) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff49) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff4a) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff4a) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff4b) +#define PWM7CR (*(unsigned char volatile xdata *)0xff4c) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff4d) + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CLKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define LCMIFCFG (*(unsigned char volatile xdata *)0xfe50) +#define LCMIFCFG2 (*(unsigned char volatile xdata *)0xfe51) +#define LCMIFCR (*(unsigned char volatile xdata *)0xfe52) +#define LCMIFSTA (*(unsigned char volatile xdata *)0xfe53) +#define LCMIFDATL (*(unsigned char volatile xdata *)0xfe54) +#define LCMIFDATH (*(unsigned char volatile xdata *)0xfe55) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) + +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) +#define ADCEXCFG (*(unsigned char volatile xdata *)0xfead) +#define CMPEXCFG (*(unsigned char volatile xdata *)0xfeae) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) + +#define CCAPM3 (*(unsigned char volatile xdata *)0xfd54) +#define CCAP3L (*(unsigned char volatile xdata *)0xfd55) +#define CCAP3H (*(unsigned char volatile xdata *)0xfd56) +#define PCA_PWM3 (*(unsigned char volatile xdata *)0xfd57) + +#define PIN_IP (*(unsigned char volatile xdata *)0xfd60) +#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61) + +#define CHIPID0 (*(unsigned char volatile xdata *)0xfde0) +#define CHIPID1 (*(unsigned char volatile xdata *)0xfde1) +#define CHIPID2 (*(unsigned char volatile xdata *)0xfde2) +#define CHIPID3 (*(unsigned char volatile xdata *)0xfde3) +#define CHIPID4 (*(unsigned char volatile xdata *)0xfde4) +#define CHIPID5 (*(unsigned char volatile xdata *)0xfde5) +#define CHIPID6 (*(unsigned char volatile xdata *)0xfde6) +#define CHIPID7 (*(unsigned char volatile xdata *)0xfde7) +#define CHIPID8 (*(unsigned char volatile xdata *)0xfde8) +#define CHIPID9 (*(unsigned char volatile xdata *)0xfde9) +#define CHIPID10 (*(unsigned char volatile xdata *)0xfdea) +#define CHIPID11 (*(unsigned char volatile xdata *)0xfdeb) +#define CHIPID12 (*(unsigned char volatile xdata *)0xfdec) +#define CHIPID13 (*(unsigned char volatile xdata *)0xfded) +#define CHIPID14 (*(unsigned char volatile xdata *)0xfdee) +#define CHIPID15 (*(unsigned char volatile xdata *)0xfdef) +#define CHIPID16 (*(unsigned char volatile xdata *)0xfdf0) +#define CHIPID17 (*(unsigned char volatile xdata *)0xfdf1) +#define CHIPID18 (*(unsigned char volatile xdata *)0xfdf2) +#define CHIPID19 (*(unsigned char volatile xdata *)0xfdf3) +#define CHIPID20 (*(unsigned char volatile xdata *)0xfdf4) +#define CHIPID21 (*(unsigned char volatile xdata *)0xfdf5) +#define CHIPID22 (*(unsigned char volatile xdata *)0xfdf6) +#define CHIPID23 (*(unsigned char volatile xdata *)0xfdf7) +#define CHIPID24 (*(unsigned char volatile xdata *)0xfdf8) +#define CHIPID25 (*(unsigned char volatile xdata *)0xfdf9) +#define CHIPID26 (*(unsigned char volatile xdata *)0xfdfa) +#define CHIPID27 (*(unsigned char volatile xdata *)0xfdfb) +#define CHIPID28 (*(unsigned char volatile xdata *)0xfdfc) +#define CHIPID29 (*(unsigned char volatile xdata *)0xfdfd) +#define CHIPID30 (*(unsigned char volatile xdata *)0xfdfe) +#define CHIPID31 (*(unsigned char volatile xdata *)0xfdff) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + +#define DMA_ADC_CFG (*(unsigned char volatile xdata *)0xfa10) +#define DMA_ADC_CR (*(unsigned char volatile xdata *)0xfa11) +#define DMA_ADC_STA (*(unsigned char volatile xdata *)0xfa12) +#define DMA_ADC_RXA (*(unsigned int volatile xdata *)0xfa17) +#define DMA_ADC_RXAH (*(unsigned char volatile xdata *)0xfa17) +#define DMA_ADC_RXAL (*(unsigned char volatile xdata *)0xfa18) +#define DMA_ADC_CFG2 (*(unsigned char volatile xdata *)0xfa19) +#define DMA_ADC_CHSW0 (*(unsigned char volatile xdata *)0xfa1a) +#define DMA_ADC_CHSW1 (*(unsigned char volatile xdata *)0xfa1b) + +#define DMA_SPI_CFG (*(unsigned char volatile xdata *)0xfa20) +#define DMA_SPI_CR (*(unsigned char volatile xdata *)0xfa21) +#define DMA_SPI_STA (*(unsigned char volatile xdata *)0xfa22) +#define DMA_SPI_AMT (*(unsigned char volatile xdata *)0xfa23) +#define DMA_SPI_DONE (*(unsigned char volatile xdata *)0xfa24) +#define DMA_SPI_TXA (*(unsigned int volatile xdata *)0xfa25) +#define DMA_SPI_TXAH (*(unsigned char volatile xdata *)0xfa25) +#define DMA_SPI_TXAL (*(unsigned char volatile xdata *)0xfa26) +#define DMA_SPI_RXA (*(unsigned int volatile xdata *)0xfa27) +#define DMA_SPI_RXAH (*(unsigned char volatile xdata *)0xfa27) +#define DMA_SPI_RXAL (*(unsigned char volatile xdata *)0xfa28) +#define DMA_SPI_CFG2 (*(unsigned char volatile xdata *)0xfa29) + +#define DMA_UR1T_CFG (*(unsigned char volatile xdata *)0xfa30) +#define DMA_UR1T_CR (*(unsigned char volatile xdata *)0xfa31) +#define DMA_UR1T_STA (*(unsigned char volatile xdata *)0xfa32) +#define DMA_UR1T_AMT (*(unsigned char volatile xdata *)0xfa33) +#define DMA_UR1T_DONE (*(unsigned char volatile xdata *)0xfa34) +#define DMA_UR1T_TXA (*(unsigned int volatile xdata *)0xfa35) +#define DMA_UR1T_TXAH (*(unsigned char volatile xdata *)0xfa35) +#define DMA_UR1T_TXAL (*(unsigned char volatile xdata *)0xfa36) +#define DMA_UR1R_CFG (*(unsigned char volatile xdata *)0xfa38) +#define DMA_UR1R_CR (*(unsigned char volatile xdata *)0xfa39) +#define DMA_UR1R_STA (*(unsigned char volatile xdata *)0xfa3a) +#define DMA_UR1R_AMT (*(unsigned char volatile xdata *)0xfa3b) +#define DMA_UR1R_DONE (*(unsigned char volatile xdata *)0xfa3c) +#define DMA_UR1R_RXA (*(unsigned int volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAH (*(unsigned char volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAL (*(unsigned char volatile xdata *)0xfa3e) + +#define DMA_UR2T_CFG (*(unsigned char volatile xdata *)0xfa40) +#define DMA_UR2T_CR (*(unsigned char volatile xdata *)0xfa41) +#define DMA_UR2T_STA (*(unsigned char volatile xdata *)0xfa42) +#define DMA_UR2T_AMT (*(unsigned char volatile xdata *)0xfa43) +#define DMA_UR2T_DONE (*(unsigned char volatile xdata *)0xfa44) +#define DMA_UR2T_TXA (*(unsigned int volatile xdata *)0xfa45) +#define DMA_UR2T_TXAH (*(unsigned char volatile xdata *)0xfa45) +#define DMA_UR2T_TXAL (*(unsigned char volatile xdata *)0xfa46) +#define DMA_UR2R_CFG (*(unsigned char volatile xdata *)0xfa48) +#define DMA_UR2R_CR (*(unsigned char volatile xdata *)0xfa49) +#define DMA_UR2R_STA (*(unsigned char volatile xdata *)0xfa4a) +#define DMA_UR2R_AMT (*(unsigned char volatile xdata *)0xfa4b) +#define DMA_UR2R_DONE (*(unsigned char volatile xdata *)0xfa4c) +#define DMA_UR2R_RXA (*(unsigned int volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAH (*(unsigned char volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAL (*(unsigned char volatile xdata *)0xfa4e) + +#define DMA_UR3T_CFG (*(unsigned char volatile xdata *)0xfa50) +#define DMA_UR3T_CR (*(unsigned char volatile xdata *)0xfa51) +#define DMA_UR3T_STA (*(unsigned char volatile xdata *)0xfa52) +#define DMA_UR3T_AMT (*(unsigned char volatile xdata *)0xfa53) +#define DMA_UR3T_DONE (*(unsigned char volatile xdata *)0xfa54) +#define DMA_UR3T_TXA (*(unsigned int volatile xdata *)0xfa55) +#define DMA_UR3T_TXAH (*(unsigned char volatile xdata *)0xfa55) +#define DMA_UR3T_TXAL (*(unsigned char volatile xdata *)0xfa56) +#define DMA_UR3R_CFG (*(unsigned char volatile xdata *)0xfa58) +#define DMA_UR3R_CR (*(unsigned char volatile xdata *)0xfa59) +#define DMA_UR3R_STA (*(unsigned char volatile xdata *)0xfa5a) +#define DMA_UR3R_AMT (*(unsigned char volatile xdata *)0xfa5b) +#define DMA_UR3R_DONE (*(unsigned char volatile xdata *)0xfa5c) +#define DMA_UR3R_RXA (*(unsigned int volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAH (*(unsigned char volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAL (*(unsigned char volatile xdata *)0xfa5e) + +#define DMA_UR4T_CFG (*(unsigned char volatile xdata *)0xfa60) +#define DMA_UR4T_CR (*(unsigned char volatile xdata *)0xfa61) +#define DMA_UR4T_STA (*(unsigned char volatile xdata *)0xfa62) +#define DMA_UR4T_AMT (*(unsigned char volatile xdata *)0xfa63) +#define DMA_UR4T_DONE (*(unsigned char volatile xdata *)0xfa64) +#define DMA_UR4T_TXA (*(unsigned int volatile xdata *)0xfa65) +#define DMA_UR4T_TXAH (*(unsigned char volatile xdata *)0xfa65) +#define DMA_UR4T_TXAL (*(unsigned char volatile xdata *)0xfa66) +#define DMA_UR4R_CFG (*(unsigned char volatile xdata *)0xfa68) +#define DMA_UR4R_CR (*(unsigned char volatile xdata *)0xfa69) +#define DMA_UR4R_STA (*(unsigned char volatile xdata *)0xfa6a) +#define DMA_UR4R_AMT (*(unsigned char volatile xdata *)0xfa6b) +#define DMA_UR4R_DONE (*(unsigned char volatile xdata *)0xfa6c) +#define DMA_UR4R_RXA (*(unsigned int volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAH (*(unsigned char volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAL (*(unsigned char volatile xdata *)0xfa6e) + +#define DMA_LCM_CFG (*(unsigned char volatile xdata *)0xfa70) +#define DMA_LCM_CR (*(unsigned char volatile xdata *)0xfa71) +#define DMA_LCM_STA (*(unsigned char volatile xdata *)0xfa72) +#define DMA_LCM_AMT (*(unsigned char volatile xdata *)0xfa73) +#define DMA_LCM_DONE (*(unsigned char volatile xdata *)0xfa74) +#define DMA_LCM_TXA (*(unsigned int volatile xdata *)0xfa75) +#define DMA_LCM_TXAH (*(unsigned char volatile xdata *)0xfa75) +#define DMA_LCM_TXAL (*(unsigned char volatile xdata *)0xfa76) +#define DMA_LCM_RXA (*(unsigned int volatile xdata *)0xfa77) +#define DMA_LCM_RXAH (*(unsigned char volatile xdata *)0xfa77) +#define DMA_LCM_RXAL (*(unsigned char volatile xdata *)0xfa78) + + +///////////////////////////////////////////////// + +#define INT0_VECTOR 0 //0003H +#define TMR0_VECTOR 1 //000BH +#define INT1_VECTOR 2 //0013H +#define TMR1_VECTOR 3 //001BH +#define UART1_VECTOR 4 //0023H +#define ADC_VECTOR 5 //002BH +#define LVD_VECTOR 6 //0033H +#define PCA_VECTOR 7 //003BH +#define UART2_VECTOR 8 //0043H +#define SPI_VECTOR 9 //004BH +#define INT2_VECTOR 10 //0053H +#define INT3_VECTOR 11 //005BH +#define TMR2_VECTOR 12 //0063H +#define USER_VECTOR 13 //006BH +#define INT4_VECTOR 16 //0083H +#define UART3_VECTOR 17 //008BH +#define UART4_VECTOR 18 //0093H +#define TMR3_VECTOR 19 //009BH +#define TMR4_VECTOR 20 //00A3H +#define CMP_VECTOR 21 //00ABH +#define PWM_VECTOR 22 //00B3H +#define PWMFD_VECTOR 23 //00BBH +#define I2C_VECTOR 24 //00C3H +#define P0INT_VECTOR 37 //012BH +#define P1INT_VECTOR 38 //0133H +#define P2INT_VECTOR 39 //013BH +#define P3INT_VECTOR 40 //0143H +#define P4INT_VECTOR 41 //014BH +#define P5INT_VECTOR 42 //0153H +#define P6INT_VECTOR 43 //015BH +#define P7INT_VECTOR 44 //0163H +#define M2MDMA_VECTOR 47 //017BH +#define ADCDMA_VECTOR 48 //0183H +#define SPIDMA_VECTOR 49 //018BH +#define U1TXDMA_VECTOR 50 //0193H +#define U1RXDMA_VECTOR 51 //019BH +#define U2TXDMA_VECTOR 52 //01A3H +#define U2RXDMA_VECTOR 53 //01ABH +#define U3TXDMA_VECTOR 54 //01B3H +#define U3RXDMA_VECTOR 55 //01BBH +#define U4TXDMA_VECTOR 56 //01C3H +#define U4RXDMA_VECTOR 57 //01CBH +#define LCMDMA_VECTOR 58 //01D3H +#define LCM_VECTOR 59 //01DBH + +///////////////////////////////////////////////// + +#endif + diff --git a/source/cpu/nouse/stc_stc15w.H b/source/cpu/nouse/stc_stc15w.H new file mode 100644 index 0000000..9c2f57d --- /dev/null +++ b/source/cpu/nouse/stc_stc15w.H @@ -0,0 +1,466 @@ +#ifndef __STC15F2K60S2_H_ +#define __STC15F2K60S2_H_ +// stc_stc15w.h +#include + +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + + + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + +//增强型PWM波形发生器特殊功能寄存器 +sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器 +sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器 +sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器 +sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器 + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCH (*(unsigned char volatile xdata *)0xfff0) +#define PWMCL (*(unsigned char volatile xdata *)0xfff1) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM2T1H (*(unsigned char volatile xdata *)0xff00) +#define PWM2T1L (*(unsigned char volatile xdata *)0xff01) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM2T2H (*(unsigned char volatile xdata *)0xff02) +#define PWM2T2L (*(unsigned char volatile xdata *)0xff03) +#define PWM2CR (*(unsigned char volatile xdata *)0xff04) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM3T1H (*(unsigned char volatile xdata *)0xff10) +#define PWM3T1L (*(unsigned char volatile xdata *)0xff11) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM3T2H (*(unsigned char volatile xdata *)0xff12) +#define PWM3T2L (*(unsigned char volatile xdata *)0xff13) +#define PWM3CR (*(unsigned char volatile xdata *)0xff14) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM4T1H (*(unsigned char volatile xdata *)0xff20) +#define PWM4T1L (*(unsigned char volatile xdata *)0xff21) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM4T2H (*(unsigned char volatile xdata *)0xff22) +#define PWM4T2L (*(unsigned char volatile xdata *)0xff23) +#define PWM4CR (*(unsigned char volatile xdata *)0xff24) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff30) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff31) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff32) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff33) +#define PWM5CR (*(unsigned char volatile xdata *)0xff34) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff41) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff43) +#define PWM6CR (*(unsigned char volatile xdata *)0xff44) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff50) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff51) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff52) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff53) +#define PWM7CR (*(unsigned char volatile xdata *)0xff54) + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + + + + +/// >>>>> add by cc + + +//sbit P34=P3^4; //定义SDA数据线 +//sbit P35=P3^5; //定义SCL时钟线 +#define mBIT_1(X,N) X|= (1< +///////////////////////////////////////////////// +//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为 +// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用 +//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2 +// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5 +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8A; +sfr TL1 = 0x8B; +sfr TH0 = 0x8C; +sfr TH1 = 0x8D; +sfr AUXR = 0x8E; +sfr INTCLKO = 0x8F; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9A; +sfr S2BUF = 0x9B; +sfr IRCBAND = 0x9D; +sfr LIRTRIM = 0x9E; +sfr IRTRIM = 0x9F; +sfr P2 = 0xA0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xA2; +sfr IE = 0xA8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xA9; +sfr WKTCL = 0xAA; +sfr WKTCH = 0xAB; +sfr S3CON = 0xAC; +sfr S3BUF = 0xAD; +sfr TA = 0xAE; +sfr IE2 = 0xAF; +sfr P3 = 0xB0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xB1; +sfr P3M0 = 0xB2; +sfr P4M1 = 0xB3; +sfr P4M0 = 0xB4; +sfr IP2 = 0xB5; +sfr IP2H = 0xB6; +sfr IPH = 0xB7; +sfr IP = 0xB8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xB9; +sfr P_SW2 = 0xBA; +sfr ADC_CONTR = 0xBC; +sfr ADC_RES = 0xBD; +sfr ADC_RESL = 0xBE; +sfr P4 = 0xC0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xC1; +sfr IAP_DATA = 0xC2; +sfr IAP_ADDRH = 0xC3; +sfr IAP_ADDRL = 0xC4; +sfr IAP_CMD = 0xC5; +sfr IAP_TRIG = 0xC6; +sfr IAP_CONTR = 0xC7; +sfr P5 = 0xC8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xC9; +sfr P5M0 = 0xCA; +sfr SPSTAT = 0xCD; +sfr SPCTL = 0xCE; +sfr SPDAT = 0xCF; +sfr PSW = 0xD0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr T4T3M = 0xD1; +sfr T4H = 0xD2; +sfr T4L = 0xD3; +sfr T3H = 0xD4; +sfr T3L = 0xD5; +sfr T2H = 0xD6; +sfr T2L = 0xD7; +sfr CCON = 0xD8; +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; +sfr CCAPM0 = 0xDA; +sfr CCAPM1 = 0xDB; +sfr CCAPM2 = 0xDC; +sfr ADCCFG = 0xDE; +sfr IP3 = 0xDF; +sfr ACC = 0xE0; +sfr DPS = 0xE3; +sfr DPL1 = 0xE4; +sfr DPH1 = 0xE5; +sfr CMPCR1 = 0xE6; +sfr CMPCR2 = 0xE7; +sfr CL = 0xE9; +sfr CCAP0L = 0xEA; +sfr CCAP1L = 0xEB; +sfr CCAP2L = 0xEC; +sfr IP3H = 0xEE; +sfr AUXINTIF = 0xEF; +sfr B = 0xF0; +sfr PWMSET = 0xF1; +sfr PCA_PWM0 = 0xF2; +sfr PCA_PWM1 = 0xF3; +sfr PCA_PWM2 = 0xF4; +sfr IAP_TPS = 0xF5; +sfr PWMCFG01 = 0xF6; +sfr PWMCFG23 = 0xF7; +sfr CH = 0xF9; +sfr CCAP0H = 0xFA; +sfr CCAP1H = 0xFB; +sfr CCAP2H = 0xFC; +sfr PWMCFG45 = 0xFE; +sfr RSTCFG = 0xFF; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 + +#define CKSEL (*(unsigned char volatile xdata *)0xFE00) +#define CLKDIV (*(unsigned char volatile xdata *)0xFE01) +#define HIRCCR (*(unsigned char volatile xdata *)0xFE02) +#define XOSCCR (*(unsigned char volatile xdata *)0xFE03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xFE04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xFE05) +#define IRCDB (*(unsigned char volatile xdata *)0xFE06) + +#define P0PU (*(unsigned char volatile xdata *)0xFE10) +#define P1PU (*(unsigned char volatile xdata *)0xFE11) +#define P2PU (*(unsigned char volatile xdata *)0xFE12) +#define P3PU (*(unsigned char volatile xdata *)0xFE13) +#define P4PU (*(unsigned char volatile xdata *)0xFE14) +#define P5PU (*(unsigned char volatile xdata *)0xFE15) +#define P0NCS (*(unsigned char volatile xdata *)0xFE18) +#define P1NCS (*(unsigned char volatile xdata *)0xFE19) +#define P2NCS (*(unsigned char volatile xdata *)0xFE1A) +#define P3NCS (*(unsigned char volatile xdata *)0xFE1B) +#define P4NCS (*(unsigned char volatile xdata *)0xFE1C) +#define P5NCS (*(unsigned char volatile xdata *)0xFE1D) +#define P0SR (*(unsigned char volatile xdata *)0xFE20) +#define P1SR (*(unsigned char volatile xdata *)0xFE21) +#define P2SR (*(unsigned char volatile xdata *)0xFE22) +#define P3SR (*(unsigned char volatile xdata *)0xFE23) +#define P4SR (*(unsigned char volatile xdata *)0xFE24) +#define P5SR (*(unsigned char volatile xdata *)0xFE25) +#define P0DR (*(unsigned char volatile xdata *)0xFE28) +#define P1DR (*(unsigned char volatile xdata *)0xFE29) +#define P2DR (*(unsigned char volatile xdata *)0xFE2A) +#define P3DR (*(unsigned char volatile xdata *)0xFE2B) +#define P4DR (*(unsigned char volatile xdata *)0xFE2C) +#define P5DR (*(unsigned char volatile xdata *)0xFE2D) +#define P0IE (*(unsigned char volatile xdata *)0xFE30) +#define P1IE (*(unsigned char volatile xdata *)0xFE31) +#define P3IE (*(unsigned char volatile xdata *)0xFE33) + +#define I2CCFG (*(unsigned char volatile xdata *)0xFE80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xFE81) +#define I2CMSST (*(unsigned char volatile xdata *)0xFE82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xFE83) +#define I2CSLST (*(unsigned char volatile xdata *)0xFE84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xFE85) +#define I2CTXD (*(unsigned char volatile xdata *)0xFE86) +#define I2CRXD (*(unsigned char volatile xdata *)0xFE87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xFE88) + +#define TM2PS (*(unsigned char volatile xdata *)0xFEA2) +#define TM3PS (*(unsigned char volatile xdata *)0xFEA3) +#define TM4PS (*(unsigned char volatile xdata *)0xFEA4) +#define ADCTIM (*(unsigned char volatile xdata *)0xFEA8) + +#define PWM0CH (*(unsigned char volatile xdata *)0xFF00) +#define PWM0CL (*(unsigned char volatile xdata *)0xFF01) +#define PWM0CKS (*(unsigned char volatile xdata *)0xFF02) +#define PWM0TADCH (*(unsigned char volatile xdata *)0xFF03) +#define PWM0TADCL (*(unsigned char volatile xdata *)0xFF04) +#define PWM0IF (*(unsigned char volatile xdata *)0xFF05) +#define PWM0FDCR (*(unsigned char volatile xdata *)0xFF06) +#define PWM00T1H (*(unsigned char volatile xdata *)0xFF10) +#define PWM00T1L (*(unsigned char volatile xdata *)0xFF11) +#define PWM00T2H (*(unsigned char volatile xdata *)0xFF12) +#define PWM00T2L (*(unsigned char volatile xdata *)0xFF13) +#define PWM00CR (*(unsigned char volatile xdata *)0xFF14) +#define PWM00HLD (*(unsigned char volatile xdata *)0xFF15) +#define PWM01T1H (*(unsigned char volatile xdata *)0xFF18) +#define PWM01T1L (*(unsigned char volatile xdata *)0xFF19) +#define PWM01T2H (*(unsigned char volatile xdata *)0xFF1A) +#define PWM01T2L (*(unsigned char volatile xdata *)0xFF1B) +#define PWM01CR (*(unsigned char volatile xdata *)0xFF1C) +#define PWM01HLD (*(unsigned char volatile xdata *)0xFF1D) +#define PWM02T1H (*(unsigned char volatile xdata *)0xFF20) +#define PWM02T1L (*(unsigned char volatile xdata *)0xFF21) +#define PWM02T2H (*(unsigned char volatile xdata *)0xFF22) +#define PWM02T2L (*(unsigned char volatile xdata *)0xFF23) +#define PWM02CR (*(unsigned char volatile xdata *)0xFF24) +#define PWM02HLD (*(unsigned char volatile xdata *)0xFF25) +#define PWM03T1H (*(unsigned char volatile xdata *)0xFF28) +#define PWM03T1L (*(unsigned char volatile xdata *)0xFF29) +#define PWM03T2H (*(unsigned char volatile xdata *)0xFF2A) +#define PWM03T2L (*(unsigned char volatile xdata *)0xFF2B) +#define PWM03CR (*(unsigned char volatile xdata *)0xFF2C) +#define PWM03HLD (*(unsigned char volatile xdata *)0xFF2D) +#define PWM04T1H (*(unsigned char volatile xdata *)0xFF30) +#define PWM04T1L (*(unsigned char volatile xdata *)0xFF31) +#define PWM04T2H (*(unsigned char volatile xdata *)0xFF32) +#define PWM04T2L (*(unsigned char volatile xdata *)0xFF33) +#define PWM04CR (*(unsigned char volatile xdata *)0xFF34) +#define PWM04HLD (*(unsigned char volatile xdata *)0xFF35) +#define PWM05T1H (*(unsigned char volatile xdata *)0xFF38) +#define PWM05T1L (*(unsigned char volatile xdata *)0xFF39) +#define PWM05T2H (*(unsigned char volatile xdata *)0xFF3A) +#define PWM05T2L (*(unsigned char volatile xdata *)0xFF3B) +#define PWM05CR (*(unsigned char volatile xdata *)0xFF3C) +#define PWM05HLD (*(unsigned char volatile xdata *)0xFF3D) +#define PWM06T1H (*(unsigned char volatile xdata *)0xFF40) +#define PWM06T1L (*(unsigned char volatile xdata *)0xFF41) +#define PWM06T2H (*(unsigned char volatile xdata *)0xFF42) +#define PWM06T2L (*(unsigned char volatile xdata *)0xFF43) +#define PWM06CR (*(unsigned char volatile xdata *)0xFF44) +#define PWM06HLD (*(unsigned char volatile xdata *)0xFF45) +#define PWM07T1H (*(unsigned char volatile xdata *)0xFF48) +#define PWM07T1L (*(unsigned char volatile xdata *)0xFF49) +#define PWM07T2H (*(unsigned char volatile xdata *)0xFF4A) +#define PWM07T2L (*(unsigned char volatile xdata *)0xFF4B) +#define PWM07CR (*(unsigned char volatile xdata *)0xFF4C) +#define PWM07HLD (*(unsigned char volatile xdata *)0xFF4D) +#define PWM1CH (*(unsigned char volatile xdata *)0xFF50) +#define PWM1CL (*(unsigned char volatile xdata *)0xFF51) +#define PWM1CKS (*(unsigned char volatile xdata *)0xFF52) +#define PWM1IF (*(unsigned char volatile xdata *)0xFF55) +#define PWM1FDCR (*(unsigned char volatile xdata *)0xFF56) +#define PWM10T1H (*(unsigned char volatile xdata *)0xFF60) +#define PWM10T1L (*(unsigned char volatile xdata *)0xFF61) +#define PWM10T2H (*(unsigned char volatile xdata *)0xFF62) +#define PWM10T2L (*(unsigned char volatile xdata *)0xFF63) +#define PWM10CR (*(unsigned char volatile xdata *)0xFF64) +#define PWM10HLD (*(unsigned char volatile xdata *)0xFF65) +#define PWM11T1H (*(unsigned char volatile xdata *)0xFF68) +#define PWM11T1L (*(unsigned char volatile xdata *)0xFF69) +#define PWM11T2H (*(unsigned char volatile xdata *)0xFF6A) +#define PWM11T2L (*(unsigned char volatile xdata *)0xFF6B) +#define PWM11CR (*(unsigned char volatile xdata *)0xFF6C) +#define PWM11HLD (*(unsigned char volatile xdata *)0xFF6D) +#define PWM12T1H (*(unsigned char volatile xdata *)0xFF70) +#define PWM12T1L (*(unsigned char volatile xdata *)0xFF71) +#define PWM12T2H (*(unsigned char volatile xdata *)0xFF72) +#define PWM12T2L (*(unsigned char volatile xdata *)0xFF73) +#define PWM12CR (*(unsigned char volatile xdata *)0xFF74) +#define PWM12HLD (*(unsigned char volatile xdata *)0xFF75) +#define PWM13T1H (*(unsigned char volatile xdata *)0xFF78) +#define PWM13T1L (*(unsigned char volatile xdata *)0xFF79) +#define PWM13T2H (*(unsigned char volatile xdata *)0xFF7A) +#define PWM13T2L (*(unsigned char volatile xdata *)0xFF7B) +#define PWM13CR (*(unsigned char volatile xdata *)0xFF7C) +#define PWM13HLD (*(unsigned char volatile xdata *)0xFF7D) +#define PWM14T1H (*(unsigned char volatile xdata *)0xFF80) +#define PWM14T1L (*(unsigned char volatile xdata *)0xFF81) +#define PWM14T2H (*(unsigned char volatile xdata *)0xFF82) +#define PWM14T2L (*(unsigned char volatile xdata *)0xFF83) +#define PWM14CR (*(unsigned char volatile xdata *)0xFF84) +#define PWM14HLD (*(unsigned char volatile xdata *)0xFF85) +#define PWM15T1H (*(unsigned char volatile xdata *)0xFF88) +#define PWM15T1L (*(unsigned char volatile xdata *)0xFF89) +#define PWM15T2H (*(unsigned char volatile xdata *)0xFF8A) +#define PWM15T2L (*(unsigned char volatile xdata *)0xFF8B) +#define PWM15CR (*(unsigned char volatile xdata *)0xFF8C) +#define PWM15HLD (*(unsigned char volatile xdata *)0xFF8D) +#define PWM16T1H (*(unsigned char volatile xdata *)0xFF90) +#define PWM16T1L (*(unsigned char volatile xdata *)0xFF91) +#define PWM16T2H (*(unsigned char volatile xdata *)0xFF92) +#define PWM16T2L (*(unsigned char volatile xdata *)0xFF93) +#define PWM16CR (*(unsigned char volatile xdata *)0xFF94) +#define PWM16HLD (*(unsigned char volatile xdata *)0xFF95) +#define PWM17T1H (*(unsigned char volatile xdata *)0xFF98) +#define PWM17T1L (*(unsigned char volatile xdata *)0xFF99) +#define PWM17T2H (*(unsigned char volatile xdata *)0xFF9A) +#define PWM17T2L (*(unsigned char volatile xdata *)0xFF9B) +#define PWM17CR (*(unsigned char volatile xdata *)0xFF9C) +#define PWM17HLD (*(unsigned char volatile xdata *)0xFF9D) +#define PWM2CH (*(unsigned char volatile xdata *)0xFFA0) +#define PWM2CL (*(unsigned char volatile xdata *)0xFFA1) +#define PWM2CKS (*(unsigned char volatile xdata *)0xFFA2) +#define PWM2TADCH (*(unsigned char volatile xdata *)0xFFA3) +#define PWM2TADCL (*(unsigned char volatile xdata *)0xFFA4) +#define PWM2IF (*(unsigned char volatile xdata *)0xFFA5) +#define PWM2FDCR (*(unsigned char volatile xdata *)0xFFA6) +#define PWM20T1H (*(unsigned char volatile xdata *)0xFFB0) +#define PWM20T1L (*(unsigned char volatile xdata *)0xFFB1) +#define PWM20T2H (*(unsigned char volatile xdata *)0xFFB2) +#define PWM20T2L (*(unsigned char volatile xdata *)0xFFB3) +#define PWM20CR (*(unsigned char volatile xdata *)0xFFB4) +#define PWM20HLD (*(unsigned char volatile xdata *)0xFFB5) +#define PWM21T1H (*(unsigned char volatile xdata *)0xFFB8) +#define PWM21T1L (*(unsigned char volatile xdata *)0xFFB9) +#define PWM21T2H (*(unsigned char volatile xdata *)0xFFBA) +#define PWM21T2L (*(unsigned char volatile xdata *)0xFFBB) +#define PWM21CR (*(unsigned char volatile xdata *)0xFFBC) +#define PWM21HLD (*(unsigned char volatile xdata *)0xFFBD) +#define PWM22T1H (*(unsigned char volatile xdata *)0xFFC0) +#define PWM22T1L (*(unsigned char volatile xdata *)0xFFC1) +#define PWM22T2H (*(unsigned char volatile xdata *)0xFFC2) +#define PWM22T2L (*(unsigned char volatile xdata *)0xFFC3) +#define PWM22CR (*(unsigned char volatile xdata *)0xFFC4) +#define PWM22HLD (*(unsigned char volatile xdata *)0xFFC5) +#define PWM23T1H (*(unsigned char volatile xdata *)0xFFC8) +#define PWM23T1L (*(unsigned char volatile xdata *)0xFFC9) +#define PWM23T2H (*(unsigned char volatile xdata *)0xFFCA) +#define PWM23T2L (*(unsigned char volatile xdata *)0xFFCB) +#define PWM23CR (*(unsigned char volatile xdata *)0xFFCC) +#define PWM23HLD (*(unsigned char volatile xdata *)0xFFCD) +#define PWM24T1H (*(unsigned char volatile xdata *)0xFFD0) +#define PWM24T1L (*(unsigned char volatile xdata *)0xFFD1) +#define PWM24T2H (*(unsigned char volatile xdata *)0xFFD2) +#define PWM24T2L (*(unsigned char volatile xdata *)0xFFD3) +#define PWM24CR (*(unsigned char volatile xdata *)0xFFD4) +#define PWM24HLD (*(unsigned char volatile xdata *)0xFFD5) +#define PWM25T1H (*(unsigned char volatile xdata *)0xFFD8) +#define PWM25T1L (*(unsigned char volatile xdata *)0xFFD9) +#define PWM25T2H (*(unsigned char volatile xdata *)0xFFDA) +#define PWM25T2L (*(unsigned char volatile xdata *)0xFFDB) +#define PWM25CR (*(unsigned char volatile xdata *)0xFFDC) +#define PWM25HLD (*(unsigned char volatile xdata *)0xFFDD) +#define PWM26T1H (*(unsigned char volatile xdata *)0xFFE0) +#define PWM26T1L (*(unsigned char volatile xdata *)0xFFE1) +#define PWM26T2H (*(unsigned char volatile xdata *)0xFFE2) +#define PWM26T2L (*(unsigned char volatile xdata *)0xFFE3) +#define PWM26CR (*(unsigned char volatile xdata *)0xFFE4) +#define PWM26HLD (*(unsigned char volatile xdata *)0xFFE5) +#define PWM27T1H (*(unsigned char volatile xdata *)0xFFE8) +#define PWM27T1L (*(unsigned char volatile xdata *)0xFFE9) +#define PWM27T2H (*(unsigned char volatile xdata *)0xFFEA) +#define PWM27T2L (*(unsigned char volatile xdata *)0xFFEB) +#define PWM27CR (*(unsigned char volatile xdata *)0xFFEC) +#define PWM27HLD (*(unsigned char volatile xdata *)0xFFED) +#define PWM3CH (*(unsigned char volatile xdata *)0xFC00) +#define PWM3CL (*(unsigned char volatile xdata *)0xFC01) +#define PWM3CKS (*(unsigned char volatile xdata *)0xFC02) +#define PWM3IF (*(unsigned char volatile xdata *)0xFC05) +#define PWM3FDCR (*(unsigned char volatile xdata *)0xFC06) +#define PWM30T1H (*(unsigned char volatile xdata *)0xFC10) +#define PWM30T1L (*(unsigned char volatile xdata *)0xFC11) +#define PWM30T2H (*(unsigned char volatile xdata *)0xFC12) +#define PWM30T2L (*(unsigned char volatile xdata *)0xFC13) +#define PWM30CR (*(unsigned char volatile xdata *)0xFC14) +#define PWM30HLD (*(unsigned char volatile xdata *)0xFC15) +#define PWM31T1H (*(unsigned char volatile xdata *)0xFC18) +#define PWM31T1L (*(unsigned char volatile xdata *)0xFC19) +#define PWM31T2H (*(unsigned char volatile xdata *)0xFC1A) +#define PWM31T2L (*(unsigned char volatile xdata *)0xFC1B) +#define PWM31CR (*(unsigned char volatile xdata *)0xFC1C) +#define PWM31HLD (*(unsigned char volatile xdata *)0xFC1D) +#define PWM32T1H (*(unsigned char volatile xdata *)0xFC20) +#define PWM32T1L (*(unsigned char volatile xdata *)0xFC21) +#define PWM32T2H (*(unsigned char volatile xdata *)0xFC22) +#define PWM32T2L (*(unsigned char volatile xdata *)0xFC23) +#define PWM32CR (*(unsigned char volatile xdata *)0xFC24) +#define PWM32HLD (*(unsigned char volatile xdata *)0xFC25) +#define PWM33T1H (*(unsigned char volatile xdata *)0xFC28) +#define PWM33T1L (*(unsigned char volatile xdata *)0xFC29) +#define PWM33T2H (*(unsigned char volatile xdata *)0xFC2A) +#define PWM33T2L (*(unsigned char volatile xdata *)0xFC2B) +#define PWM33CR (*(unsigned char volatile xdata *)0xFC2C) +#define PWM33HLD (*(unsigned char volatile xdata *)0xFC2D) +#define PWM34T1H (*(unsigned char volatile xdata *)0xFC30) +#define PWM34T1L (*(unsigned char volatile xdata *)0xFC31) +#define PWM34T2H (*(unsigned char volatile xdata *)0xFC32) +#define PWM34T2L (*(unsigned char volatile xdata *)0xFC33) +#define PWM34CR (*(unsigned char volatile xdata *)0xFC34) +#define PWM34HLD (*(unsigned char volatile xdata *)0xFC35) +#define PWM35T1H (*(unsigned char volatile xdata *)0xFC38) +#define PWM35T1L (*(unsigned char volatile xdata *)0xFC39) +#define PWM35T2H (*(unsigned char volatile xdata *)0xFC3A) +#define PWM35T2L (*(unsigned char volatile xdata *)0xFC3B) +#define PWM35CR (*(unsigned char volatile xdata *)0xFC3C) +#define PWM35HLD (*(unsigned char volatile xdata *)0xFC3D) +#define PWM36T1H (*(unsigned char volatile xdata *)0xFC40) +#define PWM36T1L (*(unsigned char volatile xdata *)0xFC41) +#define PWM36T2H (*(unsigned char volatile xdata *)0xFC42) +#define PWM36T2L (*(unsigned char volatile xdata *)0xFC43) +#define PWM36CR (*(unsigned char volatile xdata *)0xFC44) +#define PWM36HLD (*(unsigned char volatile xdata *)0xFC45) +#define PWM37T1H (*(unsigned char volatile xdata *)0xFC48) +#define PWM37T1L (*(unsigned char volatile xdata *)0xFC49) +#define PWM37T2H (*(unsigned char volatile xdata *)0xFC4A) +#define PWM37T2L (*(unsigned char volatile xdata *)0xFC4B) +#define PWM37CR (*(unsigned char volatile xdata *)0xFC4C) +#define PWM37HLD (*(unsigned char volatile xdata *)0xFC4D) +#define PWM4CH (*(unsigned char volatile xdata *)0xFC50) +#define PWM4CL (*(unsigned char volatile xdata *)0xFC51) +#define PWM4CKS (*(unsigned char volatile xdata *)0xFC52) +#define PWM4TADCH (*(unsigned char volatile xdata *)0xFC53) +#define PWM4TADCL (*(unsigned char volatile xdata *)0xFC54) +#define PWM4IF (*(unsigned char volatile xdata *)0xFC55) +#define PWM4FDCR (*(unsigned char volatile xdata *)0xFC56) +#define PWM40T1H (*(unsigned char volatile xdata *)0xFC60) +#define PWM40T1L (*(unsigned char volatile xdata *)0xFC61) +#define PWM40T2H (*(unsigned char volatile xdata *)0xFC62) +#define PWM40T2L (*(unsigned char volatile xdata *)0xFC63) +#define PWM40CR (*(unsigned char volatile xdata *)0xFC64) +#define PWM40HLD (*(unsigned char volatile xdata *)0xFC65) +#define PWM41T1H (*(unsigned char volatile xdata *)0xFC68) +#define PWM41T1L (*(unsigned char volatile xdata *)0xFC69) +#define PWM41T2H (*(unsigned char volatile xdata *)0xFC6A) +#define PWM41T2L (*(unsigned char volatile xdata *)0xFC6B) +#define PWM41CR (*(unsigned char volatile xdata *)0xFC6C) +#define PWM41HLD (*(unsigned char volatile xdata *)0xFC6D) +#define PWM42T1H (*(unsigned char volatile xdata *)0xFC70) +#define PWM42T1L (*(unsigned char volatile xdata *)0xFC71) +#define PWM42T2H (*(unsigned char volatile xdata *)0xFC72) +#define PWM42T2L (*(unsigned char volatile xdata *)0xFC73) +#define PWM42CR (*(unsigned char volatile xdata *)0xFC74) +#define PWM42HLD (*(unsigned char volatile xdata *)0xFC75) +#define PWM43T1H (*(unsigned char volatile xdata *)0xFC78) +#define PWM43T1L (*(unsigned char volatile xdata *)0xFC79) +#define PWM43T2H (*(unsigned char volatile xdata *)0xFC7A) +#define PWM43T2L (*(unsigned char volatile xdata *)0xFC7B) +#define PWM43CR (*(unsigned char volatile xdata *)0xFC7C) +#define PWM43HLD (*(unsigned char volatile xdata *)0xFC7D) +#define PWM44T1H (*(unsigned char volatile xdata *)0xFC80) +#define PWM44T1L (*(unsigned char volatile xdata *)0xFC81) +#define PWM44T2H (*(unsigned char volatile xdata *)0xFC82) +#define PWM44T2L (*(unsigned char volatile xdata *)0xFC83) +#define PWM44CR (*(unsigned char volatile xdata *)0xFC84) +#define PWM44HLD (*(unsigned char volatile xdata *)0xFC85) +#define PWM45T1H (*(unsigned char volatile xdata *)0xFC88) +#define PWM45T1L (*(unsigned char volatile xdata *)0xFC89) +#define PWM45T2H (*(unsigned char volatile xdata *)0xFC8A) +#define PWM45T2L (*(unsigned char volatile xdata *)0xFC8B) +#define PWM45CR (*(unsigned char volatile xdata *)0xFC8C) +#define PWM45HLD (*(unsigned char volatile xdata *)0xFC8D) +#define PWM46T1H (*(unsigned char volatile xdata *)0xFC90) +#define PWM46T1L (*(unsigned char volatile xdata *)0xFC91) +#define PWM46T2H (*(unsigned char volatile xdata *)0xFC92) +#define PWM46T2L (*(unsigned char volatile xdata *)0xFC93) +#define PWM46CR (*(unsigned char volatile xdata *)0xFC94) +#define PWM46HLD (*(unsigned char volatile xdata *)0xFC95) +#define PWM47T1H (*(unsigned char volatile xdata *)0xFC98) +#define PWM47T1L (*(unsigned char volatile xdata *)0xFC99) +#define PWM47T2H (*(unsigned char volatile xdata *)0xFC9A) +#define PWM47T2L (*(unsigned char volatile xdata *)0xFC9B) +#define PWM47CR (*(unsigned char volatile xdata *)0xFC9C) +#define PWM47HLD (*(unsigned char volatile xdata *)0xFC9D) +#define PWM5CH (*(unsigned char volatile xdata *)0xFCA0) +#define PWM5CL (*(unsigned char volatile xdata *)0xFCA1) +#define PWM5CKS (*(unsigned char volatile xdata *)0xFCA2) +#define PWM5IF (*(unsigned char volatile xdata *)0xFCA5) +#define PWM5FDCR (*(unsigned char volatile xdata *)0xFCA6) +#define PWM50T1H (*(unsigned char volatile xdata *)0xFCB0) +#define PWM50T1L (*(unsigned char volatile xdata *)0xFCB1) +#define PWM50T2H (*(unsigned char volatile xdata *)0xFCB2) +#define PWM50T2L (*(unsigned char volatile xdata *)0xFCB3) +#define PWM50CR (*(unsigned char volatile xdata *)0xFCB4) +#define PWM50HLD (*(unsigned char volatile xdata *)0xFCB5) +#define PWM51T1H (*(unsigned char volatile xdata *)0xFCB8) +#define PWM51T1L (*(unsigned char volatile xdata *)0xFCB9) +#define PWM51T2H (*(unsigned char volatile xdata *)0xFCBA) +#define PWM51T2L (*(unsigned char volatile xdata *)0xFCBB) +#define PWM51CR (*(unsigned char volatile xdata *)0xFCBC) +#define PWM51HLD (*(unsigned char volatile xdata *)0xFCBD) +#define PWM52T1H (*(unsigned char volatile xdata *)0xFCC0) +#define PWM52T1L (*(unsigned char volatile xdata *)0xFCC1) +#define PWM52T2H (*(unsigned char volatile xdata *)0xFCC2) +#define PWM52T2L (*(unsigned char volatile xdata *)0xFCC3) +#define PWM52CR (*(unsigned char volatile xdata *)0xFCC4) +#define PWM52HLD (*(unsigned char volatile xdata *)0xFCC5) +#define PWM53T1H (*(unsigned char volatile xdata *)0xFCC8) +#define PWM53T1L (*(unsigned char volatile xdata *)0xFCC9) +#define PWM53T2H (*(unsigned char volatile xdata *)0xFCCA) +#define PWM53T2L (*(unsigned char volatile xdata *)0xFCCB) +#define PWM53CR (*(unsigned char volatile xdata *)0xFCCC) +#define PWM53HLD (*(unsigned char volatile xdata *)0xFCCD) +#define PWM54T1H (*(unsigned char volatile xdata *)0xFCD0) +#define PWM54T1L (*(unsigned char volatile xdata *)0xFCD1) +#define PWM54T2H (*(unsigned char volatile xdata *)0xFCD2) +#define PWM54T2L (*(unsigned char volatile xdata *)0xFCD3) +#define PWM54CR (*(unsigned char volatile xdata *)0xFCD4) +#define PWM54HLD (*(unsigned char volatile xdata *)0xFCD5) +#define PWM55T1H (*(unsigned char volatile xdata *)0xFCD8) +#define PWM55T1L (*(unsigned char volatile xdata *)0xFCD9) +#define PWM55T2H (*(unsigned char volatile xdata *)0xFCDA) +#define PWM55T2L (*(unsigned char volatile xdata *)0xFCDB) +#define PWM55CR (*(unsigned char volatile xdata *)0xFCDC) +#define PWM55HLD (*(unsigned char volatile xdata *)0xFCDD) +#define PWM56T1H (*(unsigned char volatile xdata *)0xFCE0) +#define PWM56T1L (*(unsigned char volatile xdata *)0xFCE1) +#define PWM56T2H (*(unsigned char volatile xdata *)0xFCE2) +#define PWM56T2L (*(unsigned char volatile xdata *)0xFCE3) +#define PWM56CR (*(unsigned char volatile xdata *)0xFCE4) +#define PWM56HLD (*(unsigned char volatile xdata *)0xFCE5) +#define PWM57T1H (*(unsigned char volatile xdata *)0xFCE8) +#define PWM57T1L (*(unsigned char volatile xdata *)0xFCE9) +#define PWM57T2H (*(unsigned char volatile xdata *)0xFCEA) +#define PWM57T2L (*(unsigned char volatile xdata *)0xFCEB) +#define PWM57CR (*(unsigned char volatile xdata *)0xFCEC) +#define PWM57HLD (*(unsigned char volatile xdata *)0xFCED) + +///////////////////////////////////////////////// + + +/// >>>>> add by cc + +#include "../clib/bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART 4 +#define D_ISR_int4 16 /////只有下降沿 + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); +#endif //STC_stc8a8k + + + + + + diff --git a/source/cpu/nouse/stc_stc8f.h b/source/cpu/nouse/stc_stc8f.h new file mode 100644 index 0000000..79b0ce8 --- /dev/null +++ b/source/cpu/nouse/stc_stc8f.h @@ -0,0 +1,593 @@ +#ifndef __STC8F_H_ +#define __STC8F_H_ + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 +sfr ACC = 0xe0; +sfr B = 0xf0; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr TA = 0xae; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; + + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; +sfr P1 = 0x90; +sfr P2 = 0xa0; +sfr P3 = 0xb0; +sfr P4 = 0xc0; +sfr P5 = 0xc8; +sfr P6 = 0xe8; +sfr P7 = 0xf8; +sfr P0M0 = 0x94; +sfr P0M1 = 0x93; +sfr P1M0 = 0x92; +sfr P1M1 = 0x91; +sfr P2M0 = 0x96; +sfr P2M1 = 0x95; +sfr P3M0 = 0xb2; +sfr P3M1 = 0xb1; +sfr P4M0 = 0xb4; +sfr P4M1 = 0xb3; +sfr P5M0 = 0xca; +sfr P5M1 = 0xc9; +sfr P6M0 = 0xcc; +sfr P6M1 = 0xcb; +sfr P7M0 = 0xe2; +sfr P7M1 = 0xe1; + +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; +#define SMOD 0x80 +#define SMOD0 0x40 +#define LVDF 0x20 +#define POF 0x10 +#define GF1 0x08 +#define GF0 0x04 +#define PD 0x02 +#define IDL 0x01 +sfr AUXR = 0x8e; +#define T0x12 0x80 +#define T1x12 0x40 +#define UART_M0x6 0x20 +#define T2R 0x10 +#define T2_CT 0x08 +#define T2x12 0x04 +#define EXTRAM 0x02 +#define S1ST2 0x01 +sfr AUXR2 = 0x97; +#define TXLNRX 0x10 +sfr BUS_SPEED = 0xa1; +sfr P_SW1 = 0xa2; +sfr P_SW2 = 0xba; +#define EAXFR 0x80 +sfr VOCTRL = 0xbb; +sfr RSTCFG = 0xff; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define CKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) + +//中断特殊功能寄存器 +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IE2 = 0xaf; +#define ET4 0x40 +#define ET3 0x20 +#define ES4 0x10 +#define ES3 0x08 +#define ET2 0x04 +#define ESPI 0x02 +#define ES2 0x01 + +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr IP2 = 0xb5; +#define PI2C 0x40 +#define PCMP 0x20 +#define PX4 0x10 +#define PPWMFD 0x08 +#define PPWM 0x04 +#define PSPI 0x02 +#define PS2 0x01 +sfr IPH = 0xb7; +#define PPCAH 0x80 +#define PLVDH 0x40 +#define PADCH 0x20 +#define PSH 0x10 +#define PT1H 0x08 +#define PX1H 0x04 +#define PT0H 0x02 +#define PX0H 0x01 +sfr IP2H = 0xb6; +#define PI2CH 0x40 +#define PCMPH 0x20 +#define PX4H 0x10 +#define PPWMFDH 0x08 +#define PPWMH 0x04 +#define PSPIH 0x02 +#define PS2H 0x01 +sfr INTCLKO = 0x8f; +#define EX4 0x40 +#define EX3 0x20 +#define EX2 0x10 +#define T2CLKO 0x04 +#define T1CLKO 0x02 +#define T0CLKO 0x01 +sfr AUXINTIF = 0xef; +#define INT4IF 0x40 +#define INT3IF 0x20 +#define INT2IF 0x10 +#define T4IF 0x04 +#define T3IF 0x02 +#define T2IF 0x01 + +//定时器特殊功能寄存器 +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +#define T1_GATE 0x80 +#define T1_CT 0x40 +#define T1_M1 0x20 +#define T1_M0 0x10 +#define T0_GATE 0x08 +#define T0_CT 0x04 +#define T0_M1 0x02 +#define T0_M0 0x01 +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr T4T3M = 0xd1; +#define T4R 0x80 +#define T4_CT 0x40 +#define T4x12 0x20 +#define T4CLKO 0x10 +#define T3R 0x08 +#define T3_CT 0x04 +#define T3x12 0x02 +#define T3CLKO 0x01 +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr TH4 = 0xd2; +sfr TL4 = 0xd3; +sfr TH3 = 0xd4; +sfr TL3 = 0xd5; +sfr TH2 = 0xd6; +sfr TL2 = 0xd7; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +#define WKTEN 0x80 +sfr WDT_CONTR = 0xc1; +#define WDT_FLAG 0x80 +#define EN_WDT 0x20 +#define CLR_WDT 0x10 +#define IDL_WDT 0x08 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +#define S2SM0 0x80 +#define S2ST4 0x40 +#define S2SM2 0x20 +#define S2REN 0x10 +#define S2TB8 0x08 +#define S2RB8 0x04 +#define S2TI 0x02 +#define S2RI 0x01 +sfr S2BUF = 0x9b; +sfr S3CON = 0xac; +#define S3SM0 0x80 +#define S3ST4 0x40 +#define S3SM2 0x20 +#define S3REN 0x10 +#define S3TB8 0x08 +#define S3RB8 0x04 +#define S3TI 0x02 +#define S3RI 0x01 +sfr S3BUF = 0xad; +sfr S4CON = 0x84; +#define S4SM0 0x80 +#define S4ST4 0x40 +#define S4SM2 0x20 +#define S4REN 0x10 +#define S4TB8 0x08 +#define S4RB8 0x04 +#define S4TI 0x02 +#define S4RI 0x01 +sfr S4BUF = 0x85; +sfr SADDR = 0xa9; +sfr SADEN = 0xb9; + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xbc; +#define ADC_POWER 0x80 +#define ADC_START 0x40 +#define ADC_FLAG 0x20 +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr ADCCFG = 0xde; +#define ADC_RESFMT 0x20 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xcd; +#define SPIF 0x80 +#define WCOL 0x40 +sfr SPCTL = 0xce; +#define SSIG 0x80 +#define SPEN 0x40 +#define DORD 0x20 +#define MSTR 0x10 +#define CPOL 0x08 +#define CPHA 0x04 +sfr SPDAT = 0xcf; + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +#define IAP_IDL 0x00 +#define IAP_READ 0x01 +#define IAP_WRITE 0x02 +#define IAP_ERASE 0x03 +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +#define IAPEN 0x80 +#define SWBS 0x40 +#define SWRST 0x20 +#define CMD_FAIL 0x10 +sfr ISP_DATA = 0xc2; +sfr ISP_ADDRH = 0xc3; +sfr ISP_ADDRL = 0xc4; +sfr ISP_CMD = 0xc5; +sfr ISP_TRIG = 0xc6; +sfr ISP_CONTR = 0xc7; + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xe6; +#define CMPEN 0x80 +#define CMPIF 0x40 +#define PIE 0x20 +#define NIE 0x10 +#define PIS 0x08 +#define NIS 0x04 +#define CMPOE 0x02 +#define CMPRES 0x01 +sfr CMPCR2 = 0xe7; +#define INVCMPO 0x80 +#define DISFLT 0x40 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xd8; +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF3 = CCON^3; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xd9; +#define CIDL 0x80 +#define ECF 0x01 +sfr CL = 0xe9; +sfr CH = 0xf9; +sfr CCAPM0 = 0xda; +#define ECOM0 0x40 +#define CCAPP0 0x20 +#define CCAPN0 0x10 +#define MAT0 0x08 +#define TOG0 0x04 +#define PWM0 0x02 +#define ECCF0 0x01 +sfr CCAPM1 = 0xdb; +#define ECOM1 0x40 +#define CCAPP1 0x20 +#define CCAPN1 0x10 +#define MAT1 0x08 +#define TOG1 0x04 +#define PWM1 0x02 +#define ECCF1 0x01 +sfr CCAPM2 = 0xdc; +#define ECOM2 0x40 +#define CCAPP2 0x20 +#define CCAPN2 0x10 +#define MAT2 0x08 +#define TOG2 0x04 +#define PWM2 0x02 +#define ECCF2 0x01 +sfr CCAPM3 = 0xdd; +#define ECOM3 0x40 +#define CCAPP3 0x20 +#define CCAPN3 0x10 +#define MAT3 0x08 +#define TOG3 0x04 +#define PWM3 0x02 +#define ECCF3 0x01 +sfr CCAP0L = 0xea; +sfr CCAP1L = 0xeb; +sfr CCAP2L = 0xec; +sfr CCAP3L = 0xed; +sfr CCAP0H = 0xfa; +sfr CCAP1H = 0xfb; +sfr CCAP2H = 0xfc; +sfr CCAP3H = 0xfd; +sfr PCA_PWM0 = 0xf2; +sfr PCA_PWM1 = 0xf3; +sfr PCA_PWM2 = 0xf4; +sfr PCA_PWM3 = 0xf5; + +//增强型PWM波形发生器特殊功能寄存器 +sfr PWMCFG = 0xf1; +#define CBIF 0x80 +#define ETADC 0x40 +sfr PWMIF = 0xf6; +#define C7IF 0x80 +#define C6IF 0x40 +#define C5IF 0x20 +#define C4IF 0x10 +#define C3IF 0x08 +#define C2IF 0x04 +#define C1IF 0x02 +#define C0IF 0x01 +sfr PWMFDCR = 0xf7; +#define INVCMP 0x80 +#define INVIO 0x40 +#define ENFD 0x20 +#define FLTFLIO 0x10 +#define EFDI 0x08 +#define FDCMP 0x04 +#define FDIO 0x02 +#define FDIF 0x01 +sfr PWMCR = 0xfe; +#define ENPWM 0x80 +#define ECBI 0x40 + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCH (*(unsigned char volatile xdata *)0xfff0) +#define PWMCL (*(unsigned char volatile xdata *)0xfff1) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define TADCP (*(unsigned char volatile xdata *)0xfff3) +#define TADCPH (*(unsigned char volatile xdata *)0xfff3) +#define TADCPL (*(unsigned char volatile xdata *)0xfff4) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM0T1H (*(unsigned char volatile xdata *)0xff00) +#define PWM0T1L (*(unsigned char volatile xdata *)0xff01) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM0T2H (*(unsigned char volatile xdata *)0xff02) +#define PWM0T2L (*(unsigned char volatile xdata *)0xff03) +#define PWM0CR (*(unsigned char volatile xdata *)0xff04) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff05) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM1T1H (*(unsigned char volatile xdata *)0xff10) +#define PWM1T1L (*(unsigned char volatile xdata *)0xff11) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM1T2H (*(unsigned char volatile xdata *)0xff12) +#define PWM1T2L (*(unsigned char volatile xdata *)0xff13) +#define PWM1CR (*(unsigned char volatile xdata *)0xff14) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T1H (*(unsigned char volatile xdata *)0xff20) +#define PWM2T1L (*(unsigned char volatile xdata *)0xff21) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2T2H (*(unsigned char volatile xdata *)0xff22) +#define PWM2T2L (*(unsigned char volatile xdata *)0xff23) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM3T1H (*(unsigned char volatile xdata *)0xff30) +#define PWM3T1L (*(unsigned char volatile xdata *)0xff31) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM3T2H (*(unsigned char volatile xdata *)0xff32) +#define PWM3T2L (*(unsigned char volatile xdata *)0xff33) +#define PWM3CR (*(unsigned char volatile xdata *)0xff34) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM4T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM4T1L (*(unsigned char volatile xdata *)0xff41) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM4T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM4T2L (*(unsigned char volatile xdata *)0xff43) +#define PWM4CR (*(unsigned char volatile xdata *)0xff44) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff50) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff51) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff52) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff53) +#define PWM5CR (*(unsigned char volatile xdata *)0xff54) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff55) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff60) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff60) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff61) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff62) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff62) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff63) +#define PWM6CR (*(unsigned char volatile xdata *)0xff64) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff65) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff70) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff70) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff71) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff72) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff72) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff73) +#define PWM7CR (*(unsigned char volatile xdata *)0xff74) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff75) + +//I2C特殊功能寄存器 +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define ENI2C 0x80 +#define MSSL 0x40 +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define EMSI 0x80 +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define MSBUSY 0x80 +#define MSIF 0x40 +#define MSACKI 0x02 +#define MSACKO 0x01 +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define ESTAI 0x40 +#define ERXI 0x20 +#define ETXI 0x10 +#define ESTOI 0x08 +#define SLRST 0x01 +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define SLBUSY 0x80 +#define STAIF 0x40 +#define RXIF 0x20 +#define TXIF 0x10 +#define STOIF 0x08 +#define TXING 0x04 +#define SLACKI 0x02 +#define SLACKO 0x01 +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) + +///////////////////////////////////////////////// + +#endif + + diff --git a/source/cpu/stc_8A8K64D4_ext.h b/source/cpu/stc_8A8K64D4_ext.h new file mode 100644 index 0000000..af42b1c --- /dev/null +++ b/source/cpu/stc_8A8K64D4_ext.h @@ -0,0 +1,113 @@ +#ifndef __STC8A8K64D4_ext_H__ +#define __STC8A8K64D4_ext_H__ + +#include "c_bit.h" + +///辅助寄存器 1(AUXR) +#define T2R BITN4 +///T2R:定时器2的运行控制位 0:定时器 2 停止计数 1:定时器 2 开始计数 + +///////////////////////////////////////////////// + +/******** +IE2(中断使能寄存器 2) 符号 地址 + B7 B6 B5 B4 B3 B2 B1 B0 +IE2 AFH ET4 ET3 ES4 ES3 ET2 ESPI ES2 +ET4:定时/计数器 T4 的溢出中断允许位。 0:禁止 T4 中断 1:允许 T4 中断 +ET3:定时/计数器 T3 的溢出中断允许位。 0:禁止 T3 中断 1:允许 T3 中断 +ES4:串行口 4 中断允许位。 0:禁止串行口 4 中断 1:允许串行口 4 中断 +ES3:串行口 3 中断允许位。 0:禁止串行口 3 中断 1:允许串行口 3 中断 +ET2:定时/计数器 T2 的溢出中断允许位。 0:禁止 T2 中断 1:允许 T2 中断 +ESPI:SPI 中断允许位。 0:禁止 SPI 中断 1:允许 SPI 中断 +ES2:串行口 2 中断允许位。 0:禁止串行口 2 中断 1:允许串行口 2 中断 +**********/ + + +#define ET4 BITN6 + +#define ET3 BITN5 + +#define ES4 BITN4 + + +#define ES3 BITN3 + +#define ET2 BITN2 + +#define ESPI BITN1 + +#define ES2 BITN0 + + +//----------------------------------------------------------------- +///sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 +#define EAXFR BITN7 +#define I2C_S1 BITN5 +#define I2C_S2 BITN4 +#define CMPO_S BITN3 +#define S4_S BITN2 +#define S3_S BITN1 +#define S2_S BITN0 + + + + +#define D_MCLKO_DIV2 2 +#define D_MCLKO_DIV4 4 +#define D_MCLKO_DIV8 6 +#define D_MCLKO_DIV16 8 +#define D_MCLKO_DIV32 10 +#define D_MCLKO_DIV64 12 + + +#define MCLKO_S BITN7 + + +#define INT_CLKO INTCLKO + +#define INT_EX4 BITN6 +#define INT_EX3 BITN5 +#define INT_EX2 BITN4 + +#define L0_INT0_UD() IT0 = 0 ///;使能 INT0 上升沿和下降沿中断 ; +#define L0_INT0_D() IT0 = 1 + + +#define L0_INT1_UD() IT1 = 0 ///;使能 INT0 上升沿和下降沿中断 ; +#define L0_INT1_D() IT1 = 1 + + + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define CLKSET_IRC 0 +#define CLKSET_EXT 1 +#define CLKSET_32KEXT 2 +#define CLKSET_32KIRC 3 +/*********** + +sfr CCAP0H = 0xfa; +sfr CCAP1H = 0xfb; +sfr CCAP2H = 0xfc; +sfr RSTCFG = 0xff; +sfr CCAP0L = 0xea; +sfr CCAP1L = 0xeb; +sfr CCAP2L = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr PWMSET = 0xf1; +sfr PCA_PWM0 = 0xf2; +sfr PCA_PWM1 = 0xf3; +sfr PCA_PWM2 = 0xf4; + +*/ +#endif + diff --git a/source/cpu/stc_8_delay.c b/source/cpu/stc_8_delay.c new file mode 100644 index 0000000..0471d1d --- /dev/null +++ b/source/cpu/stc_8_delay.c @@ -0,0 +1,183 @@ +////20220626_22154 CCmodify stc-isp的经过实测不准确 +#include "bsp_config.h" + + +/////SYMBOL: L0_Del +void Lc_delay_nop(U8 i) +{ + U8 m; + for(m=i;m>0;m--) + { + NOP(); + } +} + + +#if(MainFre_5M == D_sys_MainFre) + +void Delay100us() //@5.5296MHz +{ + unsigned char i; + + _nop_(); + i = 182; + while (--i); +} + +void Delay1ms() //@5.5296MHz +{ + unsigned char i, j; + + _nop_(); + _nop_(); + i = 8; + j = 43; + do + { + while (--j); + } while (--i); +} + +#elif(MainFre_11M == D_sys_MainFre) + + +void Delay1us() //@11.0592MHz +{ + _nop_(); + _nop_(); + _nop_(); +} + +void Delay1ms() //@11.0592MHz +{ + unsigned char i, j; + + i = 15; + j = 90; + do + { + while (--j); + } while (--i); +} +void Delay100us() //@11.0592MHz +{ + unsigned char i, j; + + i = 2; + j = 109; + do + { + while (--j); + } while (--i); +} + + +#elif(MainFre_22M == D_sys_MainFre) + + +void Delay1ms() //@22.1184MHz +{ + unsigned char i, j; + + i = 29; + i = 10; +////j = 183; + j = 52;//830/35; + do + { + while (--j); + } while (--i); +} +void Delay1us() //@22.1184MHz +{ + unsigned char i; + + _nop_(); + i = 5; + while (--i); +} + + +void Delay100us() //@22.1184MHz +{ + unsigned char i, j; + + i = 3; + j = 221; + do + { + while (--j); + } while (--i); +} +void Delay500us() //@22.1184MHz +{ + unsigned char i, j; + + i = 15; + j = 90; + do + { + while (--j); + } while (--i); +} + + + +#elif(MainFre_44M == D_sys_MainFre) + + +void Delay1ms() +{ + unsigned char i, j; + + i = 15; +////j = 183; + j = 102;//830/35; + do + { + while (--j); + } while (--i); +} +void Delay1us() // +{ + unsigned char i; + + _nop_(); + i = 10; + while (--i); +} + + +void Delay100us() // +{ + unsigned char i, j; + + i = 3; + j = 221; + do + { + while (--j); + } while (--i); +} +void Delay500us() //@ +{ + unsigned char i, j; + + i = 15; + j = 180; + do + { + while (--j); + } while (--i); +} + + +#elif(MainFre_27M == D_sys_MainFre) + + +#else ///MainFre_11M + +#endif//D_sys_MainFre) + + + diff --git a/source/cpu/stc_8_delay.h b/source/cpu/stc_8_delay.h new file mode 100644 index 0000000..76c3753 --- /dev/null +++ b/source/cpu/stc_8_delay.h @@ -0,0 +1,26 @@ + + +#ifndef _STC_DELAY_H_ +#define _STC_DELAY_H_ + + +#include +#include +#include "c_type51.h" + +extern void Lc_delay_nop(U8 i); + +#define Lc_delay_100us Delay100us + + ///Delay_100us +extern void Delay100us(); + +extern void Delay1ms(); + +extern void Delay1us(); + + + +#endif /* end _STC_DELAY_H_ */ + + diff --git a/source/cpu/stc_only.H b/source/cpu/stc_only.H new file mode 100644 index 0000000..b6d6991 --- /dev/null +++ b/source/cpu/stc_only.H @@ -0,0 +1,925 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2022, 传控科技 +/// All rights reserved. +/// +/// @file __STC_ONLY_H_ +/// @brief macro define 和cpu相关,STC独有的 使用stc系列单片机是使用 +/// 该文件和cpu的系列和型号有限关联 至少C51的标准寄存器应该是一致的 +///(本文件实现的功能的详述) +/// +/// @version 1.0 CCsens technology +/// @author CC +/// @date 20211226 +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20220626_7517 CCmodify +///增加了 +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20230317_7517 CCmodify +///增加了D_P67_HighR + + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __STC_ONLY_H_ +#define __STC_ONLY_H_ + +#include + +#define T3IF 0x02 + +///#define ES2 0x01 +///#define ES3 0x08 + +#define S2TI BITN1 +#define S2RI BITN0 +#define S3TI BITN1 +#define S3RI BITN0 +#define S4TI BITN1 +#define S4RI BITN0 + + +///#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +///#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + +#if 0 +#define PWM5T1 (*(unsigned int volatile xdata *)0xff38) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff38) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff39) + +///------------------------------------- +#define PWM5T2 (*(unsigned int volatile xdata *)0xff3a) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff3a) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff3b) + +#define PWM5CR (*(unsigned char volatile xdata *)0xff3c) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff3d) + +#define PWM6T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff41) + +#define PWM6T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff43) + +#define PWM6CR (*(unsigned char volatile xdata *)0xff44) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff45) + +#define PWM7T1 (*(unsigned int volatile xdata *)0xff48) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff48) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff49) + + +#define PWM7T2 (*(unsigned int volatile xdata *)0xff4a) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff4a) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff4b) + + +#define gRccUs03 DMA_SPI_TXA///(*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 PWM6T2////(*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + +#define gRccUs01_H PWM7T1H////(*(unsigned char volatile data *)0xd2)/// 定时器 4 计数寄存器(T4L,T4H) +#define gRccUs01_L PWM7T1L///(*(unsigned char volatile data *)0xd3) +////20221112_94813 CCmodify +///根据调整 + +#define gRccUs04 PWM5T2///(*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 PWM5T1///(*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 + + + + +#endif +#define gRccUs03 DMA_SPI_TXA///(*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 PWM6T2 +#define gRccUs05 PWM5T1 + + +#define D_EN_EREG(); P_SW2 |= 0x80; +///////////////////////////////////////////////// + +#ifdef docasdfasdf + 符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 + IE2 AFH EUSB ET4 ET3 ES4 ES3 ET2 ESPI ES2 + + EUSB∶USB中断允许位。 + 0∶禁止 USB中断1∶允许 USB中断 + ET4∶定时/计数器T4的溢出中断允许位。 + 0∶禁止 T4中断1∶允许T4中断 + ET3∶定时/计数器 T3的溢出中断允许位。 + 0∶禁止 T3中断1∶允许T3中断 + ES4∶串行口4中断允许位。 + 0∶禁止串行口4中断1∶允许串行口 4中断ES3∶串行口3中断允许位。 + 0∶禁止串行口3中断1∶允许串行口3中断 + ET2∶定时/计数器 T2的溢出中断允许位。 + 0∶禁止T2中断1∶允许T3中断ESPI∶SPI中断允许位。 + 0∶禁止 SPI中断1∶允许 SPI中断 + ES2∶串行口 2中断允许位。 + 0∶禁止串行口2中断1∶允许串行口2中断 + + +#endif +/******* +#define ES4 BITN4 +#define ES3 BITN3 +#define ES2 BITN0 + +******/ + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + +///sfr AUXINTIF = 0xef; +#define T2IF 0x01 + +/*** +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 +****/ +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + +/// >>>>> add by cc + +#include "c_bit.h" + +////端口内部4.1K上拉电阻控制位(注:P3.0和P3.1口上的上拉电阻可能会略小一些) +////0:禁止端口内部的 4.1K 上拉电阻 1:使能端口内部的 4.1K 上拉电阻 + + +#define D_PHDR_P0(BITNx) D_EN_EREG();BITN_0(P0DR,BITNx); +#define D_PDR_P0(BITNx) D_EN_EREG();BITN_1(P0DR,BITNx); +#define D_PHDR_P1(BITNx) D_EN_EREG();BITN_0(P1DR,BITNx); +#define D_PDR_P1(BITNx) D_EN_EREG();BITN_1(P1DR,BITNx); + + +#define D_PUON_P0(BITNx) D_EN_EREG();BITN_1(P0PU,BITNx); +#define D_PUOFF_P0(BITNx) D_EN_EREG();BITN_0(P0PU,BITNx); + +#define D_PUON_P1(BITNx) D_EN_EREG();BITN_1(P1PU,BITNx); +#define D_PUOFF_P1(BITNx) D_EN_EREG();BITN_0(P1PU,BITNx); + +#define D_PUON_P2(BITNx) D_EN_EREG();BITN_1(P2PU,BITNx); +#define D_PUOFF_P2(BITNx) D_EN_EREG();BITN_0(P2PU,BITNx); + +#define D_PUON_P3(BITNx) D_EN_EREG();BITN_1(P3PU,BITNx); +#define D_PUOFF_P3(BITNx) D_EN_EREG();BITN_0(P3PU,BITNx); + +#define D_PUON_P4(BITNx) D_EN_EREG();BITN_1(P4PU,BITNx); +#define D_PUOFF_P4(BITNx) D_EN_EREG();BITN_0(P4PU,BITNx); + +#define D_PUON_P5(BITNx) D_EN_EREG();BITN_1(P5PU,BITNx); +#define D_PUOFF_P5(BITNx) D_EN_EREG();BITN_0(P5PU,BITNx); + +#define D_PUON_P6(BITNx) D_EN_EREG();BITN_1(P6PU,BITNx); +#define D_PUOFF_P6(BITNx) D_EN_EREG();BITN_0(P6PU,BITNx); + +#define D_PUON_P7(BITNx) D_EN_EREG();BITN_1(P7PU,BITNx); +#define D_PUOFF_P7(BITNx) D_EN_EREG();BITN_0(P7PU,BITNx); + + + +#define D_stdIO_P0_ALL() D_EN_EREG();P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() D_EN_EREG();P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() D_EN_EREG();P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() D_EN_EREG();P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() D_EN_EREG();P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() D_EN_EREG();P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() D_EN_EREG();P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() D_EN_EREG();P1M1=0XFF;P1M0=0XFF; + +#define D_stdIO_P2_ALL() D_EN_EREG();P2M1=0; P2M0=0; +#define D_HighI_P2_ALL() D_EN_EREG();P2M1=0; P2M0=0XFF; +#define D_HighR_P2_ALL() D_EN_EREG();P2M1=0XFF;P2M0=0; +#define D_OpenD_P2_ALL() D_EN_EREG();P2M1=0XFF;P2M0=0XFF + +#define D_stdIO_P3_ALL() D_EN_EREG();P3M1=0; P3M0=0; +#define D_HighI_P3_ALL() D_EN_EREG();P3M1=0; P3M0=0XFF; +#define D_HighR_P3_ALL() D_EN_EREG();P3M1=0XFF;P3M0=0; +#define D_OpenD_P3_ALL() D_EN_EREG();P3M1=0XFF;P3M0=0XFF + + +#define D_stdIO_P4_ALL() D_EN_EREG();P4M1=0; P4M0=0; +#define D_HighI_P4_ALL() D_EN_EREG();P4M1=0; P4M0=0XFF; +#define D_HighR_P4_ALL() D_EN_EREG();P4M1=0XFF;P4M0=0; +#define D_OpenD_P4_ALL() D_EN_EREG();P4M1=0XFF;P4M0=0XFF + +#define D_stdIO_P5_ALL() D_EN_EREG();P5M1=0; P5M0=0; +#define D_HighI_P5_ALL() D_EN_EREG();P5M1=0; P5M0=0XFF; +#define D_HighR_P5_ALL() D_EN_EREG();P5M1=0XFF;P5M0=0; +#define D_OpenD_P5_ALL() D_EN_EREG();P5M1=0XFF;P5M0=0XFF; + + + + + + +#define D_stdIO_P0(BITNx) D_EN_EREG();BITN_0(P0M1,BITNx);BITN_0(P0M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(BITNx) D_EN_EREG();BITN_0(P0M1,BITNx);BITN_1(P0M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(BITNx) D_EN_EREG();BITN_1(P0M1,BITNx);BITN_0(P0M0,BITNx); /////////10 高阻 +#define D_OpenD_P0(BITNx) D_EN_EREG();BITN_1(P0M1,BITNx);BITN_1(P0M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(BITNx) D_EN_EREG();BITN_0(P1M1,BITNx);BITN_0(P1M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(BITNx) D_EN_EREG();BITN_0(P1M1,BITNx);BITN_1(P1M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(BITNx) D_EN_EREG();BITN_1(P1M1,BITNx);BITN_0(P1M0,BITNx); /////////10 高阻 +#define D_OpenD_P1(BITNx) D_EN_EREG();BITN_1(P1M1,BITNx);BITN_1(P1M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(BITNx) D_EN_EREG();BITN_0(P2M1,BITNx);BITN_0(P2M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(BITNx) D_EN_EREG();BITN_0(P2M1,BITNx);BITN_1(P2M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(BITNx) D_EN_EREG();BITN_1(P2M1,BITNx);BITN_0(P2M0,BITNx); /////////10 高阻 +#define D_OpenD_P2(BITNx) D_EN_EREG();BITN_1(P2M1,BITNx);BITN_1(P2M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(BITNx) D_EN_EREG();BITN_0(P3M1,BITNx);BITN_0(P3M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(BITNx) D_EN_EREG();BITN_0(P3M1,BITNx);BITN_1(P3M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(BITNx) D_EN_EREG();BITN_1(P3M1,BITNx);BITN_0(P3M0,BITNx); /////////10 高阻 +#define D_OpenD_P3(BITNx) D_EN_EREG();BITN_1(P3M1,BITNx);BITN_1(P3M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(BITNx) D_EN_EREG();BITN_0(P4M1,BITNx);BITN_0(P4M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(BITNx) D_EN_EREG();BITN_0(P4M1,BITNx);BITN_1(P4M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(BITNx) D_EN_EREG();BITN_1(P4M1,BITNx);BITN_0(P4M0,BITNx); /////////10 高阻 +#define D_OpenD_P4(BITNx) D_EN_EREG();BITN_1(P4M1,BITNx);BITN_1(P4M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(BITNx) D_EN_EREG();BITN_0(P5M1,BITNx);BITN_0(P5M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(BITNx) D_EN_EREG();BITN_0(P5M1,BITNx);BITN_1(P5M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(BITNx) D_EN_EREG();BITN_1(P5M1,BITNx);BITN_0(P5M0,BITNx); /////////10 高阻 +#define D_OpenD_P5(BITNx) D_EN_EREG();BITN_1(P5M1,BITNx);BITN_1(P5M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(BITNx) D_EN_EREG();BITN_0(P6M1,BITNx);BITN_0(P6M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(BITNx) D_EN_EREG();BITN_0(P6M1,BITNx);BITN_1(P6M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(BITNx) D_EN_EREG();BITN_1(P6M1,BITNx);BITN_0(P6M0,BITNx); /////////10 高阻 +#define D_OpenD_P6(BITNx) D_EN_EREG();BITN_1(P6M1,BITNx);BITN_1(P6M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(BITNx) D_EN_EREG();BITN_0(P7M1,BITNx);BITN_0(P7M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(BITNx) D_EN_EREG();BITN_0(P7M1,BITNx);BITN_1(P7M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(BITNx) D_EN_EREG();BITN_1(P7M1,BITNx);BITN_0(P7M0,BITNx); /////////10 高阻 +#define D_OpenD_P7(BITNx) D_EN_EREG();BITN_1(P7M1,BITNx);BITN_1(P7M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +////#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif +#define L0_IAP_enter_ISP(); NOPN(10);IAP_CONTR = BITN6|BITN5; +#define L0_IAP_Hot_restart(); NOPN(10);IAP_CONTR = BITN5; + + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); + +#define D_P07_IN() D_OpenD_P0(BITN7) +#define D_P06_IN() D_OpenD_P0(BITN6) +#define D_P05_IN() D_OpenD_P0(BITN5) +#define D_P04_IN() D_OpenD_P0(BITN4) +#define D_P03_IN() D_OpenD_P0(BITN3) +#define D_P02_IN() D_OpenD_P0(BITN2) +#define D_P01_IN() D_OpenD_P0(BITN1) +#define D_P00_IN() D_OpenD_P0(BITN0) +#define D_P07_OUT() D_stdIO_P0(BITN7) +#define D_P06_OUT() D_stdIO_P0(BITN6) +#define D_P05_OUT() D_stdIO_P0(BITN5) +#define D_P04_OUT() D_stdIO_P0(BITN4) +#define D_P03_OUT() D_stdIO_P0(BITN3) +#define D_P02_OUT() D_stdIO_P0(BITN2) +#define D_P01_OUT() D_stdIO_P0(BITN1) +#define D_P00_OUT() D_stdIO_P0(BITN0) + + +#define D_P17_IN() D_OpenD_P1(BITN7) +#define D_P16_IN() D_OpenD_P1(BITN6) +#define D_P15_IN() D_OpenD_P1(BITN5) +#define D_P14_IN() D_OpenD_P1(BITN4) +#define D_P13_IN() D_OpenD_P1(BITN3) +#define D_P12_IN() D_OpenD_P1(BITN2) +#define D_P11_IN() D_OpenD_P1(BITN1) +#define D_P10_IN() D_OpenD_P1(BITN0) +#define D_P17_OUT() D_stdIO_P1(BITN7) +#define D_P16_OUT() D_stdIO_P1(BITN6) +#define D_P15_OUT() D_stdIO_P1(BITN5) +#define D_P14_OUT() D_stdIO_P1(BITN4) +#define D_P13_OUT() D_stdIO_P1(BITN3) +#define D_P12_OUT() D_stdIO_P1(BITN2) +#define D_P11_OUT() D_stdIO_P1(BITN1) +#define D_P10_OUT() D_stdIO_P1(BITN0) + + +#define D_P27_IN() D_OpenD_P2(BITN7) +#define D_P26_IN() D_OpenD_P2(BITN6) +#define D_P25_IN() D_OpenD_P2(BITN5) +#define D_P24_IN() D_OpenD_P2(BITN4) +#define D_P23_IN() D_OpenD_P2(BITN3) +#define D_P22_IN() D_OpenD_P2(BITN2) +#define D_P21_IN() D_OpenD_P2(BITN1) +#define D_P20_IN() D_OpenD_P2(BITN0) +#define D_P27_OUT() D_stdIO_P2(BITN7) +#define D_P26_OUT() D_stdIO_P2(BITN6) +#define D_P25_OUT() D_stdIO_P2(BITN5) +#define D_P24_OUT() D_stdIO_P2(BITN4) +#define D_P23_OUT() D_stdIO_P2(BITN3) +#define D_P22_OUT() D_stdIO_P2(BITN2) +#define D_P21_OUT() D_stdIO_P2(BITN1) +#define D_P20_OUT() D_stdIO_P2(BITN0) + + +#define D_P37_IN() D_OpenD_P3(BITN7) +#define D_P36_IN() D_OpenD_P3(BITN6) +#define D_P35_IN() D_OpenD_P3(BITN5) +#define D_P34_IN() D_OpenD_P3(BITN4) +#define D_P33_IN() D_OpenD_P3(BITN3) +#define D_P32_IN() D_OpenD_P3(BITN2) +#define D_P31_IN() D_OpenD_P3(BITN1) +#define D_P30_IN() D_OpenD_P3(BITN0) +#define D_P37_OUT() D_stdIO_P3(BITN7) +#define D_P36_OUT() D_stdIO_P3(BITN6) +#define D_P35_OUT() D_stdIO_P3(BITN5) +#define D_P34_OUT() D_stdIO_P3(BITN4) +#define D_P33_OUT() D_stdIO_P3(BITN3) +#define D_P32_OUT() D_stdIO_P3(BITN2) +#define D_P31_OUT() D_stdIO_P3(BITN1) +#define D_P30_OUT() D_stdIO_P3(BITN0) + + +#define D_P47_IN() D_OpenD_P4(BITN7) +#define D_P46_IN() D_OpenD_P4(BITN6) +#define D_P45_IN() D_OpenD_P4(BITN5) +#define D_P44_IN() D_OpenD_P4(BITN4) +#define D_P43_IN() D_OpenD_P4(BITN3) +#define D_P42_IN() D_OpenD_P4(BITN2) +#define D_P41_IN() D_OpenD_P4(BITN1) /// D_opend_P4(BITN1) +#define D_P40_IN() D_OpenD_P4(BITN0) +#define D_P47_OUT() D_stdIO_P4(BITN7) +#define D_P46_OUT() D_stdIO_P4(BITN6) +#define D_P45_OUT() D_stdIO_P4(BITN5) +#define D_P44_OUT() D_stdIO_P4(BITN4) +#define D_P43_OUT() D_stdIO_P4(BITN3) +#define D_P42_OUT() D_stdIO_P4(BITN2) +#define D_P41_OUT() D_stdIO_P4(BITN1) +#define D_P40_OUT() D_stdIO_P4(BITN0) + + +#define D_P57_IN() D_OpenD_P5(BITN7) +#define D_P56_IN() D_OpenD_P5(BITN6) +#define D_P55_IN() D_OpenD_P5(BITN5) +#define D_P54_IN() D_OpenD_P5(BITN4) +#define D_P53_IN() D_OpenD_P5(BITN3) +#define D_P52_IN() D_OpenD_P5(BITN2) +#define D_P51_IN() D_OpenD_P5(BITN1) +#define D_P50_IN() D_OpenD_P5(BITN0) +#define D_P57_OUT() D_stdIO_P5(BITN7) +#define D_P56_OUT() D_stdIO_P5(BITN6) +#define D_P55_OUT() D_stdIO_P5(BITN5) +#define D_P54_OUT() D_stdIO_P5(BITN4) +#define D_P53_OUT() D_stdIO_P5(BITN3) +#define D_P52_OUT() D_stdIO_P5(BITN2) +#define D_P51_OUT() D_stdIO_P5(BITN1) +#define D_P50_OUT() D_stdIO_P5(BITN0) + + +#define D_P67_IN() D_OpenD_P6(BITN7) +#define D_P66_IN() D_OpenD_P6(BITN6) +#define D_P65_IN() D_OpenD_P6(BITN5) +#define D_P64_IN() D_OpenD_P6(BITN4) +#define D_P63_IN() D_OpenD_P6(BITN3) +#define D_P62_IN() D_OpenD_P6(BITN2) +#define D_P61_IN() D_OpenD_P6(BITN1) +#define D_P60_IN() D_OpenD_P6(BITN0) +#define D_P67_OUT() D_stdIO_P6(BITN7) +#define D_P66_OUT() D_stdIO_P6(BITN6) +#define D_P65_OUT() D_stdIO_P6(BITN5) +#define D_P64_OUT() D_stdIO_P6(BITN4) +#define D_P63_OUT() D_stdIO_P6(BITN3) +#define D_P62_OUT() D_stdIO_P6(BITN2) +#define D_P61_OUT() D_stdIO_P6(BITN1) +#define D_P60_OUT() D_stdIO_P6(BITN0) + + + + +#define D_SERVE_INT0 interrupt INT0_VECTOR /// 01 00 +#define D_SERVE_TIMER0 interrupt TMR0_VECTOR /// 02 01 +#define D_SERVE_INT1 interrupt INT1_VECTOR /// 03 02 +#define D_SERVE_TIMER1 interrupt TMR1_VECTOR /// 04 03 +#define D_SERVE_UART interrupt UART1_VECTOR /// 05 04 +#define D_SERVE_ADC interrupt ADC_VECTOR /// 06 05 +#define D_SERVE_LVD interrupt LVD_VECTOR /// 07 06 +#define D_SERVE_PCA interrupt PCA_VECTOR /// 08 07 +#define D_SERVE_UART2 interrupt UART2_VECTOR /// 09 08 +#define D_SERVE_SPI interrupt SPI_VECTOR /// 10 09 +#define D_SERVE_INT2 interrupt INT2_VECTOR /// 11 10 +#define D_SERVE_INT3 interrupt INT3_VECTOR /// 12 11 +#define D_SERVE_TIMER2 interrupt TMR2_VECTOR /// 13 12 +#define D_SERVE_INT4 interrupt INT4_VECTOR /// 14 13 +#define D_SERVE_UART3 interrupt UART3_VECTOR /// 15 14 +#define D_SERVE_UART4 interrupt UART4_VECTOR /// 16 15 +#define D_SERVE_TIMER3 interrupt TMR3_VECTOR /// 17 16 +#define D_SERVE_TIMER4 interrupt TMR4_VECTOR /// 18 17 +#define D_SERVE_CMP interrupt CMP_VECTOR /// 19 18 +#define D_SERVE_PWM interrupt PWM_VECTOR /// 20 19 +#define D_SERVE_PWMFD interrupt PWMFD_VECTOR /// 21 20 +#define D_SERVE_I2C interrupt I2C_VECTOR /// 22 21 + + #define D_SERVE_P0INT interrupt P0INT_VECTOR /// 24 23 + #define D_SERVE_P1INT interrupt P1INT_VECTOR /// 25 24 + #define D_SERVE_P2INT interrupt P2INT_VECTOR /// 26 25 + #define D_SERVE_P3INT interrupt P3INT_VECTOR /// 27 26 + #define D_SERVE_P4INT interrupt P4INT_VECTOR /// 28 27 + #define D_SERVE_P5INT interrupt P5INT_VECTOR /// 29 28 + #define D_SERVE_P6INT interrupt P6INT_VECTOR /// 30 29 + #define D_SERVE_P7INT interrupt P7INT_VECTOR /// 31 30 + #define D_SERVE_M2MDMA interrupt M2MDMA_VECTOR /// 32 31 + #define D_SERVE_ADCDMA interrupt ADCDMA_VECTOR /// 33 32 + #define D_SERVE_SPIDMA interrupt SPIDMA_VECTOR /// 34 33 + #define D_SERVE_U1TXDMA interrupt U1TXDMA_VECTOR /// 35 34 + #define D_SERVE_U1RXDMA interrupt U1RXDMA_VECTOR /// 36 35 + #define D_SERVE_U2TXDMA interrupt U2TXDMA_VECTOR /// 37 36 + #define D_SERVE_U2RXDMA interrupt U2RXDMA_VECTOR /// 38 37 + #define D_SERVE_U3TXDMA interrupt U3TXDMA_VECTOR /// 39 38 + #define D_SERVE_U3RXDMA interrupt U3RXDMA_VECTOR /// 40 39 + #define D_SERVE_U4TXDMA interrupt U4TXDMA_VECTOR /// 41 40 + #define D_SERVE_U4RXDMA interrupt U4RXDMA_VECTOR /// 42 41 + #define D_SERVE_LCMDMA interrupt LCMDMA_VECTOR /// 43 42 + #define D_SERVE_LCM interrupt LCM_VECTOR /// 44 43 +#define D_P07_OpenD() D_OpenD_P0(BITN7) +#define D_P06_OpenD() D_OpenD_P0(BITN6) +#define D_P05_OpenD() D_OpenD_P0(BITN5) +#define D_P04_OpenD() D_OpenD_P0(BITN4) +#define D_P03_OpenD() D_OpenD_P0(BITN3) +#define D_P02_OpenD() D_OpenD_P0(BITN2) +#define D_P01_OpenD() D_OpenD_P0(BITN1) +#define D_P00_OpenD() D_OpenD_P0(BITN0) +#define D_P07_stdIO() D_stdIO_P0(BITN7) +#define D_P06_stdIO() D_stdIO_P0(BITN6) +#define D_P05_stdIO() D_stdIO_P0(BITN5) +#define D_P04_stdIO() D_stdIO_P0(BITN4) +#define D_P03_stdIO() D_stdIO_P0(BITN3) +#define D_P02_stdIO() D_stdIO_P0(BITN2) +#define D_P01_stdIO() D_stdIO_P0(BITN1) +#define D_P00_stdIO() D_stdIO_P0(BITN0) +#define D_P07_HighI() D_HighI_P0(BITN7) +#define D_P06_HighI() D_HighI_P0(BITN6) +#define D_P05_HighI() D_HighI_P0(BITN5) +#define D_P04_HighI() D_HighI_P0(BITN4) +#define D_P03_HighI() D_HighI_P0(BITN3) +#define D_P02_HighI() D_HighI_P0(BITN2) +#define D_P01_HighI() D_HighI_P0(BITN1) +#define D_P00_HighI() D_HighI_P0(BITN0) +#define D_P07_HighR() D_HighR_P0(BITN7) +#define D_P06_HighR() D_HighR_P0(BITN6) +#define D_P05_HighR() D_HighR_P0(BITN5) +#define D_P04_HighR() D_HighR_P0(BITN4) +#define D_P03_HighR() D_HighR_P0(BITN3) +#define D_P02_HighR() D_HighR_P0(BITN2) +#define D_P01_HighR() D_HighR_P0(BITN1) +#define D_P00_HighR() D_HighR_P0(BITN0) +#define D_P17_OpenD() D_OpenD_P1(BITN7) +#define D_P16_OpenD() D_OpenD_P1(BITN6) +#define D_P15_OpenD() D_OpenD_P1(BITN5) +#define D_P14_OpenD() D_OpenD_P1(BITN4) +#define D_P13_OpenD() D_OpenD_P1(BITN3) +#define D_P12_OpenD() D_OpenD_P1(BITN2) +#define D_P11_OpenD() D_OpenD_P1(BITN1) +#define D_P10_OpenD() D_OpenD_P1(BITN0) +#define D_P17_stdIO() D_stdIO_P1(BITN7) +#define D_P16_stdIO() D_stdIO_P1(BITN6) +#define D_P15_stdIO() D_stdIO_P1(BITN5) +#define D_P14_stdIO() D_stdIO_P1(BITN4) +#define D_P13_stdIO() D_stdIO_P1(BITN3) +#define D_P12_stdIO() D_stdIO_P1(BITN2) +#define D_P11_stdIO() D_stdIO_P1(BITN1) +#define D_P10_stdIO() D_stdIO_P1(BITN0) +#define D_P17_HighI() D_HighI_P1(BITN7) +#define D_P16_HighI() D_HighI_P1(BITN6) +#define D_P15_HighI() D_HighI_P1(BITN5) +#define D_P14_HighI() D_HighI_P1(BITN4) +#define D_P13_HighI() D_HighI_P1(BITN3) +#define D_P12_HighI() D_HighI_P1(BITN2) +#define D_P11_HighI() D_HighI_P1(BITN1) +#define D_P10_HighI() D_HighI_P1(BITN0) +#define D_P17_HighR() D_HighR_P1(BITN7) +#define D_P16_HighR() D_HighR_P1(BITN6) +#define D_P15_HighR() D_HighR_P1(BITN5) +#define D_P14_HighR() D_HighR_P1(BITN4) +#define D_P13_HighR() D_HighR_P1(BITN3) +#define D_P12_HighR() D_HighR_P1(BITN2) +#define D_P11_HighR() D_HighR_P1(BITN1) +#define D_P10_HighR() D_HighR_P1(BITN0) +#define D_P27_OpenD() D_OpenD_P2(BITN7) +#define D_P26_OpenD() D_OpenD_P2(BITN6) +#define D_P25_OpenD() D_OpenD_P2(BITN5) +#define D_P24_OpenD() D_OpenD_P2(BITN4) +#define D_P23_OpenD() D_OpenD_P2(BITN3) +#define D_P22_OpenD() D_OpenD_P2(BITN2) +#define D_P21_OpenD() D_OpenD_P2(BITN1) +#define D_P20_OpenD() D_OpenD_P2(BITN0) +#define D_P27_stdIO() D_stdIO_P2(BITN7) +#define D_P26_stdIO() D_stdIO_P2(BITN6) +#define D_P25_stdIO() D_stdIO_P2(BITN5) +#define D_P24_stdIO() D_stdIO_P2(BITN4) +#define D_P23_stdIO() D_stdIO_P2(BITN3) +#define D_P22_stdIO() D_stdIO_P2(BITN2) +#define D_P21_stdIO() D_stdIO_P2(BITN1) +#define D_P20_stdIO() D_stdIO_P2(BITN0) +#define D_P27_HighI() D_HighI_P2(BITN7) +#define D_P26_HighI() D_HighI_P2(BITN6) +#define D_P25_HighI() D_HighI_P2(BITN5) +#define D_P24_HighI() D_HighI_P2(BITN4) +#define D_P23_HighI() D_HighI_P2(BITN3) +#define D_P22_HighI() D_HighI_P2(BITN2) +#define D_P21_HighI() D_HighI_P2(BITN1) +#define D_P20_HighI() D_HighI_P2(BITN0) +#define D_P27_HighR() D_HighR_P2(BITN7) +#define D_P26_HighR() D_HighR_P2(BITN6) +#define D_P25_HighR() D_HighR_P2(BITN5) +#define D_P24_HighR() D_HighR_P2(BITN4) +#define D_P23_HighR() D_HighR_P2(BITN3) +#define D_P22_HighR() D_HighR_P2(BITN2) +#define D_P21_HighR() D_HighR_P2(BITN1) +#define D_P20_HighR() D_HighR_P2(BITN0) +#define D_P37_OpenD() D_OpenD_P3(BITN7) +#define D_P36_OpenD() D_OpenD_P3(BITN6) +#define D_P35_OpenD() D_OpenD_P3(BITN5) +#define D_P34_OpenD() D_OpenD_P3(BITN4) +#define D_P33_OpenD() D_OpenD_P3(BITN3) +#define D_P32_OpenD() D_OpenD_P3(BITN2) +#define D_P31_OpenD() D_OpenD_P3(BITN1) +#define D_P30_OpenD() D_OpenD_P3(BITN0) +#define D_P37_stdIO() D_stdIO_P3(BITN7) +#define D_P36_stdIO() D_stdIO_P3(BITN6) +#define D_P35_stdIO() D_stdIO_P3(BITN5) +#define D_P34_stdIO() D_stdIO_P3(BITN4) +#define D_P33_stdIO() D_stdIO_P3(BITN3) +#define D_P32_stdIO() D_stdIO_P3(BITN2) +#define D_P31_stdIO() D_stdIO_P3(BITN1) +#define D_P30_stdIO() D_stdIO_P3(BITN0) +#define D_P37_HighI() D_HighI_P3(BITN7) +#define D_P36_HighI() D_HighI_P3(BITN6) +#define D_P35_HighI() D_HighI_P3(BITN5) +#define D_P34_HighI() D_HighI_P3(BITN4) +#define D_P33_HighI() D_HighI_P3(BITN3) +#define D_P32_HighI() D_HighI_P3(BITN2) +#define D_P31_HighI() D_HighI_P3(BITN1) +#define D_P30_HighI() D_HighI_P3(BITN0) +#define D_P37_HighR() D_HighR_P3(BITN7) +#define D_P36_HighR() D_HighR_P3(BITN6) +#define D_P35_HighR() D_HighR_P3(BITN5) +#define D_P34_HighR() D_HighR_P3(BITN4) +#define D_P33_HighR() D_HighR_P3(BITN3) +#define D_P32_HighR() D_HighR_P3(BITN2) +#define D_P31_HighR() D_HighR_P3(BITN1) +#define D_P30_HighR() D_HighR_P3(BITN0) +#define D_P47_OpenD() D_OpenD_P4(BITN7) +#define D_P46_OpenD() D_OpenD_P4(BITN6) +#define D_P45_OpenD() D_OpenD_P4(BITN5) +#define D_P44_OpenD() D_OpenD_P4(BITN4) +#define D_P43_OpenD() D_OpenD_P4(BITN3) +#define D_P42_OpenD() D_OpenD_P4(BITN2) +#define D_P41_OpenD() D_OpenD_P4(BITN1) +#define D_P40_OpenD() D_OpenD_P4(BITN0) +#define D_P47_stdIO() D_stdIO_P4(BITN7) +#define D_P46_stdIO() D_stdIO_P4(BITN6) +#define D_P45_stdIO() D_stdIO_P4(BITN5) +#define D_P44_stdIO() D_stdIO_P4(BITN4) +#define D_P43_stdIO() D_stdIO_P4(BITN3) +#define D_P42_stdIO() D_stdIO_P4(BITN2) +#define D_P41_stdIO() D_stdIO_P4(BITN1) +#define D_P40_stdIO() D_stdIO_P4(BITN0) +#define D_P47_HighI() D_HighI_P4(BITN7) +#define D_P46_HighI() D_HighI_P4(BITN6) +#define D_P45_HighI() D_HighI_P4(BITN5) +#define D_P44_HighI() D_HighI_P4(BITN4) +#define D_P43_HighI() D_HighI_P4(BITN3) +#define D_P42_HighI() D_HighI_P4(BITN2) +#define D_P41_HighI() D_HighI_P4(BITN1) +#define D_P40_HighI() D_HighI_P4(BITN0) +#define D_P47_HighR() D_HighR_P4(BITN7) +#define D_P46_HighR() D_HighR_P4(BITN6) +#define D_P45_HighR() D_HighR_P4(BITN5) +#define D_P44_HighR() D_HighR_P4(BITN4) +#define D_P43_HighR() D_HighR_P4(BITN3) +#define D_P42_HighR() D_HighR_P4(BITN2) +#define D_P41_HighR() D_HighR_P4(BITN1) +#define D_P40_HighR() D_HighR_P4(BITN0) +#define D_P57_OpenD() D_OpenD_P5(BITN7) +#define D_P56_OpenD() D_OpenD_P5(BITN6) +#define D_P55_OpenD() D_OpenD_P5(BITN5) +#define D_P54_OpenD() D_OpenD_P5(BITN4) +#define D_P53_OpenD() D_OpenD_P5(BITN3) +#define D_P52_OpenD() D_OpenD_P5(BITN2) +#define D_P51_OpenD() D_OpenD_P5(BITN1) +#define D_P50_OpenD() D_OpenD_P5(BITN0) +#define D_P57_stdIO() D_stdIO_P5(BITN7) +#define D_P56_stdIO() D_stdIO_P5(BITN6) +#define D_P55_stdIO() D_stdIO_P5(BITN5) +#define D_P54_stdIO() D_stdIO_P5(BITN4) +#define D_P53_stdIO() D_stdIO_P5(BITN3) +#define D_P52_stdIO() D_stdIO_P5(BITN2) +#define D_P51_stdIO() D_stdIO_P5(BITN1) +#define D_P50_stdIO() D_stdIO_P5(BITN0) +#define D_P57_HighI() D_HighI_P5(BITN7) +#define D_P56_HighI() D_HighI_P5(BITN6) +#define D_P55_HighI() D_HighI_P5(BITN5) +#define D_P54_HighI() D_HighI_P5(BITN4) +#define D_P53_HighI() D_HighI_P5(BITN3) +#define D_P52_HighI() D_HighI_P5(BITN2) +#define D_P51_HighI() D_HighI_P5(BITN1) +#define D_P50_HighI() D_HighI_P5(BITN0) +#define D_P57_HighR() D_HighR_P5(BITN7) +#define D_P56_HighR() D_HighR_P5(BITN6) +#define D_P55_HighR() D_HighR_P5(BITN5) +#define D_P54_HighR() D_HighR_P5(BITN4) +#define D_P53_HighR() D_HighR_P5(BITN3) +#define D_P52_HighR() D_HighR_P5(BITN2) +#define D_P51_HighR() D_HighR_P5(BITN1) +#define D_P50_HighR() D_HighR_P5(BITN0) +#define D_P67_OpenD() D_OpenD_P6(BITN7) +#define D_P66_OpenD() D_OpenD_P6(BITN6) +#define D_P65_OpenD() D_OpenD_P6(BITN5) +#define D_P64_OpenD() D_OpenD_P6(BITN4) +#define D_P63_OpenD() D_OpenD_P6(BITN3) +#define D_P62_OpenD() D_OpenD_P6(BITN2) +#define D_P61_OpenD() D_OpenD_P6(BITN1) +#define D_P60_OpenD() D_OpenD_P6(BITN0) +#define D_P67_stdIO() D_stdIO_P6(BITN7) +#define D_P66_stdIO() D_stdIO_P6(BITN6) +#define D_P65_stdIO() D_stdIO_P6(BITN5) +#define D_P64_stdIO() D_stdIO_P6(BITN4) +#define D_P63_stdIO() D_stdIO_P6(BITN3) +#define D_P62_stdIO() D_stdIO_P6(BITN2) +#define D_P61_stdIO() D_stdIO_P6(BITN1) +#define D_P60_stdIO() D_stdIO_P6(BITN0) +#define D_P67_HighI() D_HighI_P6(BITN7) +#define D_P66_HighI() D_HighI_P6(BITN6) +#define D_P65_HighI() D_HighI_P6(BITN5) +#define D_P64_HighI() D_HighI_P6(BITN4) +#define D_P63_HighI() D_HighI_P6(BITN3) +#define D_P62_HighI() D_HighI_P6(BITN2) +#define D_P61_HighI() D_HighI_P6(BITN1) +#define D_P60_HighI() D_HighI_P6(BITN0) +#define D_P67_HighR() D_HighR_P6(BITN7) +#define D_P66_HighR() D_HighR_P6(BITN6) +#define D_P65_HighR() D_HighR_P6(BITN5) +#define D_P64_HighR() D_HighR_P6(BITN4) +#define D_P63_HighR() D_HighR_P6(BITN3) +#define D_P62_HighR() D_HighR_P6(BITN2) +#define D_P61_HighR() D_HighR_P6(BITN1) +#define D_P60_HighR() D_HighR_P6(BITN0) +#define D_P77_OpenD() D_OpenD_P7(BITN7) +#define D_P76_OpenD() D_OpenD_P7(BITN6) +#define D_P75_OpenD() D_OpenD_P7(BITN5) +#define D_P74_OpenD() D_OpenD_P7(BITN4) +#define D_P73_OpenD() D_OpenD_P7(BITN3) +#define D_P72_OpenD() D_OpenD_P7(BITN2) +#define D_P71_OpenD() D_OpenD_P7(BITN1) +#define D_P70_OpenD() D_OpenD_P7(BITN0) +#define D_P77_stdIO() D_stdIO_P7(BITN7) +#define D_P76_stdIO() D_stdIO_P7(BITN6) +#define D_P75_stdIO() D_stdIO_P7(BITN5) +#define D_P74_stdIO() D_stdIO_P7(BITN4) +#define D_P73_stdIO() D_stdIO_P7(BITN3) +#define D_P72_stdIO() D_stdIO_P7(BITN2) +#define D_P71_stdIO() D_stdIO_P7(BITN1) +#define D_P70_stdIO() D_stdIO_P7(BITN0) +#define D_P77_HighI() D_HighI_P7(BITN7) +#define D_P76_HighI() D_HighI_P7(BITN6) +#define D_P75_HighI() D_HighI_P7(BITN5) +#define D_P74_HighI() D_HighI_P7(BITN4) +#define D_P73_HighI() D_HighI_P7(BITN3) +#define D_P72_HighI() D_HighI_P7(BITN2) +#define D_P71_HighI() D_HighI_P7(BITN1) +#define D_P70_HighI() D_HighI_P7(BITN0) +#define D_P77_HighR() D_HighR_P7(BITN7) +#define D_P76_HighR() D_HighR_P7(BITN6) +#define D_P75_HighR() D_HighR_P7(BITN5) +#define D_P74_HighR() D_HighR_P7(BITN4) +#define D_P73_HighR() D_HighR_P7(BITN3) +#define D_P72_HighR() D_HighR_P7(BITN2) +#define D_P71_HighR() D_HighR_P7(BITN1) +#define D_P70_HighR() D_HighR_P7(BITN0) +#define D_P07_PUON() D_PUON_P0(BITN7) +#define D_P06_PUON() D_PUON_P0(BITN6) +#define D_P05_PUON() D_PUON_P0(BITN5) +#define D_P04_PUON() D_PUON_P0(BITN4) +#define D_P03_PUON() D_PUON_P0(BITN3) +#define D_P02_PUON() D_PUON_P0(BITN2) +#define D_P01_PUON() D_PUON_P0(BITN1) +#define D_P00_PUON() D_PUON_P0(BITN0) +#define D_P17_PUON() D_PUON_P1(BITN7) +#define D_P16_PUON() D_PUON_P1(BITN6) +#define D_P15_PUON() D_PUON_P1(BITN5) +#define D_P14_PUON() D_PUON_P1(BITN4) +#define D_P13_PUON() D_PUON_P1(BITN3) +#define D_P12_PUON() D_PUON_P1(BITN2) +#define D_P11_PUON() D_PUON_P1(BITN1) +#define D_P10_PUON() D_PUON_P1(BITN0) +#define D_P27_PUON() D_PUON_P2(BITN7) +#define D_P26_PUON() D_PUON_P2(BITN6) +#define D_P25_PUON() D_PUON_P2(BITN5) +#define D_P24_PUON() D_PUON_P2(BITN4) +#define D_P23_PUON() D_PUON_P2(BITN3) +#define D_P22_PUON() D_PUON_P2(BITN2) +#define D_P21_PUON() D_PUON_P2(BITN1) +#define D_P20_PUON() D_PUON_P2(BITN0) +#define D_P37_PUON() D_PUON_P3(BITN7) +#define D_P36_PUON() D_PUON_P3(BITN6) +#define D_P35_PUON() D_PUON_P3(BITN5) +#define D_P34_PUON() D_PUON_P3(BITN4) +#define D_P33_PUON() D_PUON_P3(BITN3) +#define D_P32_PUON() D_PUON_P3(BITN2) +#define D_P31_PUON() D_PUON_P3(BITN1) +#define D_P30_PUON() D_PUON_P3(BITN0) +#define D_P37_PUON() D_PUON_P3(BITN7) +#define D_P47_PUON() D_PUON_P4(BITN7) +#define D_P46_PUON() D_PUON_P4(BITN6) +#define D_P45_PUON() D_PUON_P4(BITN5) +#define D_P44_PUON() D_PUON_P4(BITN4) +#define D_P43_PUON() D_PUON_P4(BITN3) +#define D_P42_PUON() D_PUON_P4(BITN2) +#define D_P41_PUON() D_PUON_P4(BITN1) +#define D_P40_PUON() D_PUON_P4(BITN0) +#define D_P57_PUON() D_PUON_P5(BITN7) +#define D_P56_PUON() D_PUON_P5(BITN6) +#define D_P55_PUON() D_PUON_P5(BITN5) +#define D_P54_PUON() D_PUON_P5(BITN4) +#define D_P53_PUON() D_PUON_P5(BITN3) +#define D_P52_PUON() D_PUON_P5(BITN2) +#define D_P51_PUON() D_PUON_P5(BITN1) +#define D_P50_PUON() D_PUON_P5(BITN0) +#define D_P67_PUON() D_PUON_P6(BITN7) +#define D_P66_PUON() D_PUON_P6(BITN6) +#define D_P65_PUON() D_PUON_P6(BITN5) +#define D_P64_PUON() D_PUON_P6(BITN4) +#define D_P63_PUON() D_PUON_P6(BITN3) +#define D_P62_PUON() D_PUON_P6(BITN2) +#define D_P61_PUON() D_PUON_P6(BITN1) +#define D_P60_PUON() D_PUON_P6(BITN0) + +#define D_P77_PUON() D_PUON_P7(BITN7) +#define D_P76_PUON() D_PUON_P7(BITN6) +#define D_P75_PUON() D_PUON_P7(BITN5) +#define D_P74_PUON() D_PUON_P7(BITN4) +#define D_P73_PUON() D_PUON_P7(BITN3) +#define D_P72_PUON() D_PUON_P7(BITN2) +#define D_P71_PUON() D_PUON_P7(BITN1) +#define D_P70_PUON() D_PUON_P7(BITN0) +#define D_P07_PUOFF() D_PUOFF_P0(BITN7) +#define D_P06_PUOFF() D_PUOFF_P0(BITN6) +#define D_P05_PUOFF() D_PUOFF_P0(BITN5) +#define D_P04_PUOFF() D_PUOFF_P0(BITN4) +#define D_P03_PUOFF() D_PUOFF_P0(BITN3) +#define D_P02_PUOFF() D_PUOFF_P0(BITN2) +#define D_P01_PUOFF() D_PUOFF_P0(BITN1) +#define D_P00_PUOFF() D_PUOFF_P0(BITN0) +#define D_P17_PUOFF() D_PUOFF_P1(BITN7) +#define D_P16_PUOFF() D_PUOFF_P1(BITN6) +#define D_P15_PUOFF() D_PUOFF_P1(BITN5) +#define D_P14_PUOFF() D_PUOFF_P1(BITN4) +#define D_P13_PUOFF() D_PUOFF_P1(BITN3) +#define D_P12_PUOFF() D_PUOFF_P1(BITN2) +#define D_P11_PUOFF() D_PUOFF_P1(BITN1) +#define D_P10_PUOFF() D_PUOFF_P1(BITN0) +#define D_P27_PUOFF() D_PUOFF_P2(BITN7) +#define D_P26_PUOFF() D_PUOFF_P2(BITN6) +#define D_P25_PUOFF() D_PUOFF_P2(BITN5) +#define D_P24_PUOFF() D_PUOFF_P2(BITN4) +#define D_P23_PUOFF() D_PUOFF_P2(BITN3) +#define D_P22_PUOFF() D_PUOFF_P2(BITN2) +#define D_P21_PUOFF() D_PUOFF_P2(BITN1) +#define D_P20_PUOFF() D_PUOFF_P2(BITN0) +#define D_P37_PUOFF() D_PUOFF_P3(BITN7) +#define D_P36_PUOFF() D_PUOFF_P3(BITN6) +#define D_P35_PUOFF() D_PUOFF_P3(BITN5) +#define D_P34_PUOFF() D_PUOFF_P3(BITN4) +#define D_P33_PUOFF() D_PUOFF_P3(BITN3) +#define D_P32_PUOFF() D_PUOFF_P3(BITN2) +#define D_P31_PUOFF() D_PUOFF_P3(BITN1) +#define D_P30_PUOFF() D_PUOFF_P3(BITN0) +#define D_P37_PUOFF() D_PUOFF_P3(BITN7) +#define D_P47_PUOFF() D_PUOFF_P4(BITN7) +#define D_P46_PUOFF() D_PUOFF_P4(BITN6) +#define D_P45_PUOFF() D_PUOFF_P4(BITN5) +#define D_P44_PUOFF() D_PUOFF_P4(BITN4) +#define D_P43_PUOFF() D_PUOFF_P4(BITN3) +#define D_P42_PUOFF() D_PUOFF_P4(BITN2) +#define D_P41_PUOFF() D_PUOFF_P4(BITN1) +#define D_P40_PUOFF() D_PUOFF_P4(BITN0) +#define D_P57_PUOFF() D_PUOFF_P5(BITN7) +#define D_P56_PUOFF() D_PUOFF_P5(BITN6) +#define D_P55_PUOFF() D_PUOFF_P5(BITN5) +#define D_P54_PUOFF() D_PUOFF_P5(BITN4) +#define D_P53_PUOFF() D_PUOFF_P5(BITN3) +#define D_P52_PUOFF() D_PUOFF_P5(BITN2) +#define D_P51_PUOFF() D_PUOFF_P5(BITN1) +#define D_P50_PUOFF() D_PUOFF_P5(BITN0) +#define D_P67_PUOFF() D_PUOFF_P6(BITN7) +#define D_P66_PUOFF() D_PUOFF_P6(BITN6) +#define D_P65_PUOFF() D_PUOFF_P6(BITN5) +#define D_P64_PUOFF() D_PUOFF_P6(BITN4) +#define D_P63_PUOFF() D_PUOFF_P6(BITN3) +#define D_P62_PUOFF() D_PUOFF_P6(BITN2) +#define D_P61_PUOFF() D_PUOFF_P6(BITN1) +#define D_P60_PUOFF() D_PUOFF_P6(BITN0) + +#define D_P77_PUOFF() D_PUOFF_P7(BITN7) +#define D_P76_PUOFF() D_PUOFF_P7(BITN6) +#define D_P75_PUOFF() D_PUOFF_P7(BITN5) +#define D_P74_PUOFF() D_PUOFF_P7(BITN4) +#define D_P73_PUOFF() D_PUOFF_P7(BITN3) +#define D_P72_PUOFF() D_PUOFF_P7(BITN2) +#define D_P71_PUOFF() D_PUOFF_P7(BITN1) +#define D_P70_PUOFF() D_PUOFF_P7(BITN0) + + + + +#endif //__STC_ONLY_H_ + + + + + + + diff --git a/source/cpu/stc_only.H.bak b/source/cpu/stc_only.H.bak new file mode 100644 index 0000000..1260de9 --- /dev/null +++ b/source/cpu/stc_only.H.bak @@ -0,0 +1,520 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2022, 传控科技 +/// All rights reserved. +/// +/// @file __STC_ONLY_H_ +/// @brief macro define 和cpu相关,STC独有的 使用stc系列单片机是使用 +/// 该文件和cpu的系列和型号有限关联 至少C51的标准寄存器应该是一致的 +///(本文件实现的功能的详述) +/// +/// @version 1.0 CCsens technology +/// @author CC +/// @date 20211226 +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20220626_7517 CCmodify +///增加了 + + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __STC_ONLY_H_ +#define __STC_ONLY_H_ + +#include + +#define T3IF 0x02 + +///#define ES2 0x01 +///#define ES3 0x08 + +#define S2TI BITN1 +#define S2RI BITN0 +#define S3TI BITN1 +#define S3RI BITN0 +#define S4TI BITN1 +#define S4RI BITN0 + + +///#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +///#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + +#if 0 +#define PWM5T1 (*(unsigned int volatile xdata *)0xff38) +#define PWM5T1H (*(unsigned char volatile xdata *)0xff38) +#define PWM5T1L (*(unsigned char volatile xdata *)0xff39) + +///------------------------------------- +#define PWM5T2 (*(unsigned int volatile xdata *)0xff3a) +#define PWM5T2H (*(unsigned char volatile xdata *)0xff3a) +#define PWM5T2L (*(unsigned char volatile xdata *)0xff3b) + +#define PWM5CR (*(unsigned char volatile xdata *)0xff3c) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff3d) + +#define PWM6T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM6T1H (*(unsigned char volatile xdata *)0xff40) +#define PWM6T1L (*(unsigned char volatile xdata *)0xff41) + +#define PWM6T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM6T2H (*(unsigned char volatile xdata *)0xff42) +#define PWM6T2L (*(unsigned char volatile xdata *)0xff43) + +#define PWM6CR (*(unsigned char volatile xdata *)0xff44) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff45) + +#define PWM7T1 (*(unsigned int volatile xdata *)0xff48) +#define PWM7T1H (*(unsigned char volatile xdata *)0xff48) +#define PWM7T1L (*(unsigned char volatile xdata *)0xff49) + + +#define PWM7T2 (*(unsigned int volatile xdata *)0xff4a) +#define PWM7T2H (*(unsigned char volatile xdata *)0xff4a) +#define PWM7T2L (*(unsigned char volatile xdata *)0xff4b) + + +#define gRccUs03 DMA_SPI_TXA///(*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 PWM6T2////(*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + +#define gRccUs01_H PWM7T1H////(*(unsigned char volatile data *)0xd2)/// 定时器 4 计数寄存器(T4L,T4H) +#define gRccUs01_L PWM7T1L///(*(unsigned char volatile data *)0xd3) +////20221112_94813 CCmodify +///根据调整 + +#define gRccUs04 PWM5T2///(*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 PWM5T1///(*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 + + + + +#endif +#define gRccUs03 DMA_SPI_TXA///(*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs01 PWM7T1////(*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 PWM6T2 +#define gRccUs05 PWM5T1 + +///////////////////////////////////////////////// + +#ifdef docasdfasdf + 符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 + IE2 AFH EUSB ET4 ET3 ES4 ES3 ET2 ESPI ES2 + + EUSB∶USB中断允许位。 + 0∶禁止 USB中断1∶允许 USB中断 + ET4∶定时/计数器T4的溢出中断允许位。 + 0∶禁止 T4中断1∶允许T4中断 + ET3∶定时/计数器 T3的溢出中断允许位。 + 0∶禁止 T3中断1∶允许T3中断 + ES4∶串行口4中断允许位。 + 0∶禁止串行口4中断1∶允许串行口 4中断ES3∶串行口3中断允许位。 + 0∶禁止串行口3中断1∶允许串行口3中断 + ET2∶定时/计数器 T2的溢出中断允许位。 + 0∶禁止T2中断1∶允许T3中断ESPI∶SPI中断允许位。 + 0∶禁止 SPI中断1∶允许 SPI中断 + ES2∶串行口 2中断允许位。 + 0∶禁止串行口2中断1∶允许串行口2中断 + + +#endif +/******* +#define ES4 BITN4 +#define ES3 BITN3 +#define ES2 BITN0 + +******/ + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + +///sfr AUXINTIF = 0xef; +#define T2IF 0x01 + +/*** +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 +****/ +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + +/// >>>>> add by cc + +#include "c_bit.h" + +////端口内部4.1K上拉电阻控制位(注:P3.0和P3.1口上的上拉电阻可能会略小一些) +////0:禁止端口内部的 4.1K 上拉电阻 1:使能端口内部的 4.1K 上拉电阻 + + +#define D_PHDR_P0(BITNx) P_SW2 |= 0x80;BITN_0(P0DR,BITNx); +#define D_PDR_P0(BITNx) P_SW2 |= 0x80;BITN_1(P0DR,BITNx); +#define D_PHDR_P1(BITNx) P_SW2 |= 0x80;BITN_0(P1DR,BITNx); +#define D_PDR_P1(BITNx) P_SW2 |= 0x80;BITN_1(P1DR,BITNx); + + +#define D_PUON_P0(BITNx) P_SW2 |= 0x80;BITN_1(P0PU,BITNx); +#define D_PUOFF_P0(BITNx) P_SW2 |= 0x80;BITN_0(P0PU,BITNx); + +#define D_PUON_P1(BITNx) P_SW2 |= 0x80;BITN_1(P1PU,BITNx); +#define D_PUOFF_P1(BITNx) P_SW2 |= 0x80;BITN_0(P1PU,BITNx); + +#define D_PUON_P2(BITNx) P_SW2 |= 0x80;BITN_1(P2PU,BITNx); +#define D_PUOFF_P2(BITNx) P_SW2 |= 0x80;BITN_0(P2PU,BITNx); + +#define D_PUON_P3(BITNx) P_SW2 |= 0x80;BITN_1(P3PU,BITNx); +#define D_PUOFF_P3(BITNx) P_SW2 |= 0x80;BITN_0(P3PU,BITNx); + +#define D_PUON_P4(BITNx) P_SW2 |= 0x80;BITN_1(P4PU,BITNx); +#define D_PUOFF_P4(BITNx) P_SW2 |= 0x80;BITN_0(P4PU,BITNx); + +#define D_PUON_P5(BITNx) P_SW2 |= 0x80;BITN_1(P5PU,BITNx); +#define D_PUOFF_P5(BITNx) P_SW2 |= 0x80;BITN_0(P5PU,BITNx); + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + +#define D_stdIO_P2_ALL() P2M1=0; P2M0=0; +#define D_HighI_P2_ALL() P2M1=0; P2M0=0XFF; +#define D_HighR_P2_ALL() P2M1=0XFF;P2M0=0; +#define D_OpenD_P2_ALL() P2M1=0XFF;P2M0=0XFF + +#define D_stdIO_P3_ALL() P3M1=0; P3M0=0; +#define D_HighI_P3_ALL() P3M1=0; P3M0=0XFF; +#define D_HighR_P3_ALL() P3M1=0XFF;P3M0=0; +#define D_OpenD_P3_ALL() P3M1=0XFF;P3M0=0XFF + + +#define D_stdIO_P4_ALL() P4M1=0; P4M0=0; +#define D_HighI_P4_ALL() P4M1=0; P4M0=0XFF; +#define D_HighR_P4_ALL() P4M1=0XFF;P4M0=0; +#define D_OpenD_P4_ALL() P4M1=0XFF;P4M0=0XFF + +#define D_stdIO_P5_ALL() P5M1=0; P5M0=0; +#define D_HighI_P5_ALL() P5M1=0; P5M0=0XFF; +#define D_HighR_P5_ALL() P5M1=0XFF;P5M0=0; +#define D_OpenD_P5_ALL() P5M1=0XFF;P5M0=0XFF; + + + + + + +#define D_stdIO_P0(BITNx) P_SW2 |= 0x80;BITN_0(P0M1,BITNx);BITN_0(P0M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(BITNx) P_SW2 |= 0x80;BITN_0(P0M1,BITNx);BITN_1(P0M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(BITNx) P_SW2 |= 0x80;BITN_1(P0M1,BITNx);BITN_0(P0M0,BITNx); /////////10 高阻 +#define D_OpenD_P0(BITNx) P_SW2 |= 0x80;BITN_1(P0M1,BITNx);BITN_1(P0M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(BITNx) P_SW2 |= 0x80;BITN_0(P1M1,BITNx);BITN_0(P1M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(BITNx) P_SW2 |= 0x80;BITN_0(P1M1,BITNx);BITN_1(P1M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(BITNx) P_SW2 |= 0x80;BITN_1(P1M1,BITNx);BITN_0(P1M0,BITNx); /////////10 高阻 +#define D_OpenD_P1(BITNx) P_SW2 |= 0x80;BITN_1(P1M1,BITNx);BITN_1(P1M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(BITNx) P_SW2 |= 0x80;BITN_0(P2M1,BITNx);BITN_0(P2M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(BITNx) P_SW2 |= 0x80;BITN_0(P2M1,BITNx);BITN_1(P2M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(BITNx) P_SW2 |= 0x80;BITN_1(P2M1,BITNx);BITN_0(P2M0,BITNx); /////////10 高阻 +#define D_OpenD_P2(BITNx) P_SW2 |= 0x80;BITN_1(P2M1,BITNx);BITN_1(P2M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(BITNx) P_SW2 |= 0x80;BITN_0(P3M1,BITNx);BITN_0(P3M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(BITNx) P_SW2 |= 0x80;BITN_0(P3M1,BITNx);BITN_1(P3M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(BITNx) P_SW2 |= 0x80;BITN_1(P3M1,BITNx);BITN_0(P3M0,BITNx); /////////10 高阻 +#define D_OpenD_P3(BITNx) P_SW2 |= 0x80;BITN_1(P3M1,BITNx);BITN_1(P3M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(BITNx) P_SW2 |= 0x80;BITN_0(P4M1,BITNx);BITN_0(P4M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(BITNx) P_SW2 |= 0x80;BITN_0(P4M1,BITNx);BITN_1(P4M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(BITNx) P_SW2 |= 0x80;BITN_1(P4M1,BITNx);BITN_0(P4M0,BITNx); /////////10 高阻 +#define D_OpenD_P4(BITNx) P_SW2 |= 0x80;BITN_1(P4M1,BITNx);BITN_1(P4M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(BITNx) P_SW2 |= 0x80;BITN_0(P5M1,BITNx);BITN_0(P5M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(BITNx) P_SW2 |= 0x80;BITN_0(P5M1,BITNx);BITN_1(P5M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(BITNx) P_SW2 |= 0x80;BITN_1(P5M1,BITNx);BITN_0(P5M0,BITNx); /////////10 高阻 +#define D_OpenD_P5(BITNx) P_SW2 |= 0x80;BITN_1(P5M1,BITNx);BITN_1(P5M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(BITNx) P_SW2 |= 0x80;BITN_0(P6M1,BITNx);BITN_0(P6M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(BITNx) P_SW2 |= 0x80;BITN_0(P6M1,BITNx);BITN_1(P6M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(BITNx) P_SW2 |= 0x80;BITN_1(P6M1,BITNx);BITN_0(P6M0,BITNx); /////////10 高阻 +#define D_OpenD_P6(BITNx) P_SW2 |= 0x80;BITN_1(P6M1,BITNx);BITN_1(P6M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(BITNx) P_SW2 |= 0x80;BITN_0(P7M1,BITNx);BITN_0(P7M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(BITNx) P_SW2 |= 0x80;BITN_0(P7M1,BITNx);BITN_1(P7M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(BITNx) P_SW2 |= 0x80;BITN_1(P7M1,BITNx);BITN_0(P7M0,BITNx); /////////10 高阻 +#define D_OpenD_P7(BITNx) P_SW2 |= 0x80;BITN_1(P7M1,BITNx);BITN_1(P7M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +////#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); + +#define D_P07_IN() D_OpenD_P0(BITN7) +#define D_P06_IN() D_OpenD_P0(BITN6) +#define D_P05_IN() D_OpenD_P0(BITN5) +#define D_P04_IN() D_OpenD_P0(BITN4) +#define D_P03_IN() D_OpenD_P0(BITN3) +#define D_P02_IN() D_OpenD_P0(BITN2) +#define D_P01_IN() D_OpenD_P0(BITN1) +#define D_P00_IN() D_OpenD_P0(BITN0) +#define D_P07_OUT() D_stdIO_P0(BITN7) +#define D_P06_OUT() D_stdIO_P0(BITN6) +#define D_P05_OUT() D_stdIO_P0(BITN5) +#define D_P04_OUT() D_stdIO_P0(BITN4) +#define D_P03_OUT() D_stdIO_P0(BITN3) +#define D_P02_OUT() D_stdIO_P0(BITN2) +#define D_P01_OUT() D_stdIO_P0(BITN1) +#define D_P00_OUT() D_stdIO_P0(BITN0) + + +#define D_P17_IN() D_OpenD_P1(BITN7) +#define D_P16_IN() D_OpenD_P1(BITN6) +#define D_P15_IN() D_OpenD_P1(BITN5) +#define D_P14_IN() D_OpenD_P1(BITN4) +#define D_P13_IN() D_OpenD_P1(BITN3) +#define D_P12_IN() D_OpenD_P1(BITN2) +#define D_P11_IN() D_OpenD_P1(BITN1) +#define D_P10_IN() D_OpenD_P1(BITN0) +#define D_P17_OUT() D_stdIO_P1(BITN7) +#define D_P16_OUT() D_stdIO_P1(BITN6) +#define D_P15_OUT() D_stdIO_P1(BITN5) +#define D_P14_OUT() D_stdIO_P1(BITN4) +#define D_P13_OUT() D_stdIO_P1(BITN3) +#define D_P12_OUT() D_stdIO_P1(BITN2) +#define D_P11_OUT() D_stdIO_P1(BITN1) +#define D_P10_OUT() D_stdIO_P1(BITN0) + + +#define D_P27_IN() D_OpenD_P2(BITN7) +#define D_P26_IN() D_OpenD_P2(BITN6) +#define D_P25_IN() D_OpenD_P2(BITN5) +#define D_P24_IN() D_OpenD_P2(BITN4) +#define D_P23_IN() D_OpenD_P2(BITN3) +#define D_P22_IN() D_OpenD_P2(BITN2) +#define D_P21_IN() D_OpenD_P2(BITN1) +#define D_P20_IN() D_OpenD_P2(BITN0) +#define D_P27_OUT() D_stdIO_P2(BITN7) +#define D_P26_OUT() D_stdIO_P2(BITN6) +#define D_P25_OUT() D_stdIO_P2(BITN5) +#define D_P24_OUT() D_stdIO_P2(BITN4) +#define D_P23_OUT() D_stdIO_P2(BITN3) +#define D_P22_OUT() D_stdIO_P2(BITN2) +#define D_P21_OUT() D_stdIO_P2(BITN1) +#define D_P20_OUT() D_stdIO_P2(BITN0) + + +#define D_P37_IN() D_OpenD_P3(BITN7) +#define D_P36_IN() D_OpenD_P3(BITN6) +#define D_P35_IN() D_OpenD_P3(BITN5) +#define D_P34_IN() D_OpenD_P3(BITN4) +#define D_P33_IN() D_OpenD_P3(BITN3) +#define D_P32_IN() D_OpenD_P3(BITN2) +#define D_P31_IN() D_OpenD_P3(BITN1) +#define D_P30_IN() D_OpenD_P3(BITN0) +#define D_P37_OUT() D_stdIO_P3(BITN7) +#define D_P36_OUT() D_stdIO_P3(BITN6) +#define D_P35_OUT() D_stdIO_P3(BITN5) +#define D_P34_OUT() D_stdIO_P3(BITN4) +#define D_P33_OUT() D_stdIO_P3(BITN3) +#define D_P32_OUT() D_stdIO_P3(BITN2) +#define D_P31_OUT() D_stdIO_P3(BITN1) +#define D_P30_OUT() D_stdIO_P3(BITN0) + + +#define D_P47_IN() D_OpenD_P4(BITN7) +#define D_P46_IN() D_OpenD_P4(BITN6) +#define D_P45_IN() D_OpenD_P4(BITN5) +#define D_P44_IN() D_OpenD_P4(BITN4) +#define D_P43_IN() D_OpenD_P4(BITN3) +#define D_P42_IN() D_OpenD_P4(BITN2) +#define D_P41_IN() D_OpenD_P4(BITN1) /// D_opend_P4(BITN1) +#define D_P40_IN() D_OpenD_P4(BITN0) +#define D_P47_OUT() D_stdIO_P4(BITN7) +#define D_P46_OUT() D_stdIO_P4(BITN6) +#define D_P45_OUT() D_stdIO_P4(BITN5) +#define D_P44_OUT() D_stdIO_P4(BITN4) +#define D_P43_OUT() D_stdIO_P4(BITN3) +#define D_P42_OUT() D_stdIO_P4(BITN2) +#define D_P41_OUT() D_stdIO_P4(BITN1) +#define D_P40_OUT() D_stdIO_P4(BITN0) + + +#define D_P57_IN() D_OpenD_P5(BITN7) +#define D_P56_IN() D_OpenD_P5(BITN6) +#define D_P55_IN() D_OpenD_P5(BITN5) +#define D_P54_IN() D_OpenD_P5(BITN4) +#define D_P53_IN() D_OpenD_P5(BITN3) +#define D_P52_IN() D_OpenD_P5(BITN2) +#define D_P51_IN() D_OpenD_P5(BITN1) +#define D_P50_IN() D_OpenD_P5(BITN0) +#define D_P57_OUT() D_stdIO_P5(BITN7) +#define D_P56_OUT() D_stdIO_P5(BITN6) +#define D_P55_OUT() D_stdIO_P5(BITN5) +#define D_P54_OUT() D_stdIO_P5(BITN4) +#define D_P53_OUT() D_stdIO_P5(BITN3) +#define D_P52_OUT() D_stdIO_P5(BITN2) +#define D_P51_OUT() D_stdIO_P5(BITN1) +#define D_P50_OUT() D_stdIO_P5(BITN0) + + +#define D_P67_IN() D_OpenD_P6(BITN7) +#define D_P66_IN() D_OpenD_P6(BITN6) +#define D_P65_IN() D_OpenD_P6(BITN5) +#define D_P64_IN() D_OpenD_P6(BITN4) +#define D_P63_IN() D_OpenD_P6(BITN3) +#define D_P62_IN() D_OpenD_P6(BITN2) +#define D_P61_IN() D_OpenD_P6(BITN1) +#define D_P60_IN() D_OpenD_P6(BITN0) +#define D_P67_OUT() D_stdIO_P6(BITN7) +#define D_P66_OUT() D_stdIO_P6(BITN6) +#define D_P65_OUT() D_stdIO_P6(BITN5) +#define D_P64_OUT() D_stdIO_P6(BITN4) +#define D_P63_OUT() D_stdIO_P6(BITN3) +#define D_P62_OUT() D_stdIO_P6(BITN2) +#define D_P61_OUT() D_stdIO_P6(BITN1) +#define D_P60_OUT() D_stdIO_P6(BITN0) + + + + +#define D_SERVE_INT0 interrupt INT0_VECTOR /// 01 00 +#define D_SERVE_TIMER0 interrupt TMR0_VECTOR /// 02 01 +#define D_SERVE_INT1 interrupt INT1_VECTOR /// 03 02 +#define D_SERVE_TIMER1 interrupt TMR1_VECTOR /// 04 03 +#define D_SERVE_UART interrupt UART1_VECTOR /// 05 04 +#define D_SERVE_ADC interrupt ADC_VECTOR /// 06 05 +#define D_SERVE_LVD interrupt LVD_VECTOR /// 07 06 +#define D_SERVE_PCA interrupt PCA_VECTOR /// 08 07 +#define D_SERVE_UART2 interrupt UART2_VECTOR /// 09 08 +#define D_SERVE_SPI interrupt SPI_VECTOR /// 10 09 +#define D_SERVE_INT2 interrupt INT2_VECTOR /// 11 10 +#define D_SERVE_INT3 interrupt INT3_VECTOR /// 12 11 +#define D_SERVE_TIMER2 interrupt TMR2_VECTOR /// 13 12 +#define D_SERVE_INT4 interrupt INT4_VECTOR /// 14 13 +#define D_SERVE_UART3 interrupt UART3_VECTOR /// 15 14 +#define D_SERVE_UART4 interrupt UART4_VECTOR /// 16 15 +#define D_SERVE_TIMER3 interrupt TMR3_VECTOR /// 17 16 +#define D_SERVE_TIMER4 interrupt TMR4_VECTOR /// 18 17 +#define D_SERVE_CMP interrupt CMP_VECTOR /// 19 18 +#define D_SERVE_PWM interrupt PWM_VECTOR /// 20 19 +#define D_SERVE_PWMFD interrupt PWMFD_VECTOR /// 21 20 +#define D_SERVE_I2C interrupt I2C_VECTOR /// 22 21 + + #define D_SERVE_P0INT interrupt P0INT_VECTOR /// 24 23 + #define D_SERVE_P1INT interrupt P1INT_VECTOR /// 25 24 + #define D_SERVE_P2INT interrupt P2INT_VECTOR /// 26 25 + #define D_SERVE_P3INT interrupt P3INT_VECTOR /// 27 26 + #define D_SERVE_P4INT interrupt P4INT_VECTOR /// 28 27 + #define D_SERVE_P5INT interrupt P5INT_VECTOR /// 29 28 + #define D_SERVE_P6INT interrupt P6INT_VECTOR /// 30 29 + #define D_SERVE_P7INT interrupt P7INT_VECTOR /// 31 30 + #define D_SERVE_M2MDMA interrupt M2MDMA_VECTOR /// 32 31 + #define D_SERVE_ADCDMA interrupt ADCDMA_VECTOR /// 33 32 + #define D_SERVE_SPIDMA interrupt SPIDMA_VECTOR /// 34 33 + #define D_SERVE_U1TXDMA interrupt U1TXDMA_VECTOR /// 35 34 + #define D_SERVE_U1RXDMA interrupt U1RXDMA_VECTOR /// 36 35 + #define D_SERVE_U2TXDMA interrupt U2TXDMA_VECTOR /// 37 36 + #define D_SERVE_U2RXDMA interrupt U2RXDMA_VECTOR /// 38 37 + #define D_SERVE_U3TXDMA interrupt U3TXDMA_VECTOR /// 39 38 + #define D_SERVE_U3RXDMA interrupt U3RXDMA_VECTOR /// 40 39 + #define D_SERVE_U4TXDMA interrupt U4TXDMA_VECTOR /// 41 40 + #define D_SERVE_U4RXDMA interrupt U4RXDMA_VECTOR /// 42 41 + #define D_SERVE_LCMDMA interrupt LCMDMA_VECTOR /// 43 42 + #define D_SERVE_LCM interrupt LCM_VECTOR /// 44 43 + + + + +#endif //__STC_ONLY_H_ + + + + + + + diff --git a/source/ctask/TTSS_readme.c b/source/ctask/TTSS_readme.c new file mode 100644 index 0000000..a98e1b5 --- /dev/null +++ b/source/ctask/TTSS_readme.c @@ -0,0 +1,123 @@ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================================ +****************************************************************************/ + +#ifdef D_reame_first_before_use_TTSS +//任务命名规则: +// 1:第一层 +/// 0驱动芯片级 flash +/// 1芯片应用级 save +/// 2任务应用级 jilu_save +// +// 2:第二层/flash/i2c/7290/等各类芯片 +// 3:任务序号/不同的芯片/ +// + +命名规范 +1,函数命名规范 +D_xxxx 宏定义 +Lx_driver_function +| | | +| | |-函数功能 +| | +| |-驱动器件名称 +| +|-第几层的函数 + +第几层的函数: +LD 为了兼容和易读 定义的宏定义 基本上和寄存器或者管脚打交道的 + +L0 基本上和寄存器或者管脚打交道的函数 +L1 基本上和寄存器或者管脚打交道的函数 +L2 调用L1的函数 +L3 调用L2的函数 + + +头函数的引用原则: 高Layer调用低Layer +设计模式 :每个设备或者任务都有自己的属性 +程序是由多个流程组成: + 1,中断类的的内置特殊流程,由cpu内核调度 + 2,底层驱动级别的流程,简单的直接就是多个函数调用即可,复杂的需要专门写流程实现,甚至需要和中断类的流程相互配合 + 3,协议通讯,驱动模式等复杂驱动的流程,例如2.4g模块的不同模式设置下的数据流控制流程 + 3,功能实现的应用级别的流程,在设备模式等设置好的前提下,主要实现应用层次的工作, +多流程工作要点 : 需要画多流程并行的流程图,并结合数据流. + + +update by cc @20220307 + + + + + + + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + +app + +asp + +bsp + + +debug + +----------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------- +tpc/: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +-------------------------------------------------------------------------------------- + +简单外设 +app: call readfunc///use val +bsp: drivera readfunc+val + +复杂外设 +app: send massage --use val2 +asp: chain filter average 算法 一直执行handdle +val2 +bsp: drivera readfunc+val + + +nb : at指令长度 2--32 +*a = "dfasdfasdf" + +*b = "dfasdfa4456567sdf" + +ff 33 ff "dfasdfasdf" "dfasdfa4456567sdf" 0d 0a + + +send() +{ +send head + + +send a +send b + +send tail尾巴 + +} + +******************************************************************************/ + + +#endif + + diff --git a/source/ctask/TTSS_task.c b/source/ctask/TTSS_task.c new file mode 100644 index 0000000..1a1af48 --- /dev/null +++ b/source/ctask/TTSS_task.c @@ -0,0 +1,282 @@ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +20220830_23642 CCmodify 优化了task handdle +///cc 2023/04/08--12:13:47 TS_task_val_ tst_v;////TTSS常用的全局变量 + +*============================================================================ +****************************************************************************/ + +#include "TTSS_task.h" +//任务命名规则: +// 1:第一层 +/// 0驱动芯片级 flash +/// 1芯片应用级 save +/// 2任务应用级 jilu_save +// +// 2:第二层/flash/i2c/7290/等各类芯片 +// 3:任务序号/不同的芯片/ +// + +TS_task ts_task_init = +{ + 0L, ///vU32 n; + /// volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 + 0, ///volatile UN_TYPE sh; //当前任务段 + 0 ///volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段 + /// volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用 + + +}; +////L1_task_init +TS_task_val_ tst_v;////TTSS常用的全局变量 + +void L1_task_reg_clear(TS_task *s) +{ +// s->en = 1; +// s->pfun = 0; + s->sh = 0; + s->sh_next= 0; +/// s->sh_pre= 0; + s->n= 0; +} + + +/////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>供演示task 结构的使用 不可删除>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define D_task_test_01 0x20 +#define D_task_test_02 0x22 +#define D_task_test_03 0x23 + +#ifdef D_debug_task_test +////>>>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>> +TS_task_test_ ts_task_test; +void L2_task_test_register(void) +{ +ddd + L1_task_reg_clear(&ts_task_test.task); + L3_task_s_go(ts_task_test,D_task_init); +} + +///L2_task_test_handle(&ts_task_test); +void L2_task_test_handle(TS_task_test_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(): + L2_task_go(D_task_test_01); + TTSS_Task_step(D_task_test_01): + if(d > 8) + { + d = 0; + L2_task_go(D_task_test_02); + L1_task_Cdelay(D_Cdelay_200us); + }else + { + d ++; + } + TTSS_Task_step(D_task_test_02): + if(d > 4) + { + d = 0; + L2_task_go(D_task_test_01); + L1_task_Tdelay(D_Tdelay_100ms); + }else + { + d ++; + } + + TTSS_Task_end(); +} +#endif//#ifdef D_debug_task_test +////<<<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<< + + + +//example : +#if 0 + + +//L2_task_voice_handle(&s_task_music.task); +//L1_task_go(D_task_close); +//if(L1_task_busy(s)){ L1_task_goout(s_task_music.task,D_task_voice_send_single) } +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + case D_task_voice_cuimian2:// + + if(0 == s->volume_change) + { + //L3_voice_stop(); + s->sector = D_voice_stop; + s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_play); + L2_task_go_son(D_task_voice_play,0); + }else + { + s->volume_change --; + s->volume_temp = s->volume; + s->volume = s->volume_change*s->volume_shop/20;// + if (s->volume_temp != s->volume) + { + s->sector = D_voice_volume|s->volume; + //s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_volume3); + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian2); + } + //else + { + L2_task_delay(D_task_delay_1m); + } + } + break; + + //>>>>>>>>>>>>>>>>>> son function + case D_task_voice_play:// + if(L3_task_s_busy(s_task_wt558d)) + { + }else + { + s_task_wt558d.reg = s_task_music.sector; + L3_task_s_go(s_task_wt558d,D_task_wt558d_fun); + + L2_task_go(D_task_voice_ask); + } + break; + case D_task_voice_ask:// + if(L3_task_s_busy(s_task_wt558d)) + { + + }else + { + + L2_task_go_father();//回到 + } + break; + //<<<<<<<<<<<<<<<<<<<<<< son function + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + + +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//>>>>>>>>>>>>>>>>>>>>>记录task +struct _s_task_4ChuShengRiQi_ +{ + TS_task task; + unsigned char pic_id;//画面ID + + +}; +extern struct _s_task_4ChuShengRiQi_ s_task_4ChuShengRiQi_; + +#define D_task_4ChuShengRiQi_init 0x10 +#define D_task_4ChuShengRiQi_key 0x11 + + +extern void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s); + +void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s) +{ + switch(s->task.sh) + { + + case D_task_4ChuShengRiQi_init:// + + s->pic_id= 0; + break; + case D_task_4ChuShengRiQi_key : + if(1 == s_task_keyx1.down ) + { + s_task_keyx1.down = 0; + + if(D_keyx_left == s_task_keyx1.key_value) + {} + + + }else if(1 == s_task_keyx_4.down) + { + s_task_keyx_4.down = 0; + + + } + else {} + + //L2_task_go_son(D_task_4ChuShengRiQi_play,D_task_4ChuShengRiQi_cuimian1); + break; + + L0_task_delay(); + } +} + + + +//<<<<<<<<<<<<<<<<<<<记录task + + +/////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<供演示task 结构的使用 不可删除<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +#endif + + diff --git a/source/ctask/TTSS_task.c.bak b/source/ctask/TTSS_task.c.bak new file mode 100644 index 0000000..434a97e --- /dev/null +++ b/source/ctask/TTSS_task.c.bak @@ -0,0 +1,278 @@ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +20220830_23642 CCmodify 优化了task handdle +*============================================================================ +****************************************************************************/ + +#include "TTSS_task.h" +//任务命名规则: +// 1:第一层 +/// 0驱动芯片级 flash +/// 1芯片应用级 save +/// 2任务应用级 jilu_save +// +// 2:第二层/flash/i2c/7290/等各类芯片 +// 3:任务序号/不同的芯片/ +// + +TS_task ts_task_init = +{ + 0, ///vU32 n; + /// volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 + 0, ///volatile UN_TYPE sh; //当前任务段 + 0 ///volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段 + /// volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用 + + +}; + +void L1_task_reg_clear(TS_task *s) +{ +// s->en = 1; +// s->pfun = 0; + s->sh = 0; + s->sh_next= 0; +/// s->sh_pre= 0; + s->n= 0; +} + + +/////>>>>>>>>>>>>>>>>>>>>>>>>>>>>>供演示task 结构的使用 不可删除>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define D_task_test_01 0x20 +#define D_task_test_02 0x22 +#define D_task_test_03 0x23 + +#ifdef D_debug_task_test +////>>>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>> +TS_task_test_ ts_task_test; +void L2_task_test_register(void) +{ +ddd + L1_task_reg_clear(&ts_task_test.task); + L3_task_s_go(ts_task_test,D_task_init); +} + +///L2_task_test_handle(&ts_task_test); +void L2_task_test_handle(TS_task_test_ *s) +{ + unsigned char d = 0; + TTSS_Task_init(): + L2_task_go(D_task_test_01); + TTSS_Task_step(D_task_test_01): + if(d > 8) + { + d = 0; + L2_task_go(D_task_test_02); + L1_task_Cdelay(D_Cdelay_200us); + }else + { + d ++; + } + TTSS_Task_step(D_task_test_02): + if(d > 4) + { + d = 0; + L2_task_go(D_task_test_01); + L1_task_Tdelay(D_Tdelay_100ms); + }else + { + d ++; + } + + TTSS_Task_end(); +} +#endif//#ifdef D_debug_task_test +////<<<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<< + + + +//example : +#if 0 + + +//L2_task_voice_handle(&s_task_music.task); +//L1_task_go(D_task_close); +//if(L1_task_busy(s)){ L1_task_goout(s_task_music.task,D_task_voice_send_single) } +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + case D_task_voice_cuimian2:// + + if(0 == s->volume_change) + { + //L3_voice_stop(); + s->sector = D_voice_stop; + s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_play); + L2_task_go_son(D_task_voice_play,0); + }else + { + s->volume_change --; + s->volume_temp = s->volume; + s->volume = s->volume_change*s->volume_shop/20;// + if (s->volume_temp != s->volume) + { + s->sector = D_voice_volume|s->volume; + //s->status = D_voice_status_stop; + //L2_task_go(D_task_voice_volume3); + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian2); + } + //else + { + L2_task_delay(D_task_delay_1m); + } + } + break; + + //>>>>>>>>>>>>>>>>>> son function + case D_task_voice_play:// + if(L3_task_s_busy(s_task_wt558d)) + { + }else + { + s_task_wt558d.reg = s_task_music.sector; + L3_task_s_go(s_task_wt558d,D_task_wt558d_fun); + + L2_task_go(D_task_voice_ask); + } + break; + case D_task_voice_ask:// + if(L3_task_s_busy(s_task_wt558d)) + { + + }else + { + + L2_task_go_father();//回到 + } + break; + //<<<<<<<<<<<<<<<<<<<<<< son function + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + + +void L2_task_voice_handle(struct _s_task_music_ *s) +{ //s_task_music.task.sh + switch(s->task.sh) + { + + case D_task_voice_init:// + + s->sector = 0; + break; + case D_task_voice_cuimian : + s->sector = D_voice_music_wantsleep; + L2_task_go_son(D_task_voice_play,D_task_voice_cuimian1); + break; + case D_task_voice_cuimian1:// + L2_task_go(D_task_voice_cuimian2); + + break; + + //-----------------------task standerd code + case D_task_Tdelay://---- + s->task.n--; + if (s->task.n == 0) + { + s->task.n = 0; + L2_task_delay_over(); + } + break; + + default : + break; + } + L2_task_wt558d_handle(&s_task_wt558d); +} + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//>>>>>>>>>>>>>>>>>>>>>记录task +struct _s_task_4ChuShengRiQi_ +{ + TS_task task; + unsigned char pic_id;//画面ID + + +}; +extern struct _s_task_4ChuShengRiQi_ s_task_4ChuShengRiQi_; + +#define D_task_4ChuShengRiQi_init 0x10 +#define D_task_4ChuShengRiQi_key 0x11 + + +extern void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s); + +void L2_task_4ChuShengRiQi_handle(struct _s_task_4ChuShengRiQi_ *s) +{ + switch(s->task.sh) + { + + case D_task_4ChuShengRiQi_init:// + + s->pic_id= 0; + break; + case D_task_4ChuShengRiQi_key : + if(1 == s_task_keyx1.down ) + { + s_task_keyx1.down = 0; + + if(D_keyx_left == s_task_keyx1.key_value) + {} + + + }else if(1 == s_task_keyx_4.down) + { + s_task_keyx_4.down = 0; + + + } + else {} + + //L2_task_go_son(D_task_4ChuShengRiQi_play,D_task_4ChuShengRiQi_cuimian1); + break; + + L0_task_delay(); + } +} + + + +//<<<<<<<<<<<<<<<<<<<记录task + + +/////<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<供演示task 结构的使用 不可删除<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +#endif + + diff --git a/source/ctask/TTSS_task.h b/source/ctask/TTSS_task.h new file mode 100644 index 0000000..7f6fc29 --- /dev/null +++ b/source/ctask/TTSS_task.h @@ -0,0 +1,428 @@ +/******************************** +2013.7.23 add dictionary and task step by cc + +任务:task +任务段:task step +任务标志:sh ( struct handle) + +下一个任务段sh_next +缓存的任务段,sh_next执行完后执行sh_pre + +***************************/ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================== + +20190217 and step01 并且把delay_n添加括号保护 + +20190713 add TTSS_Cycle_every_init + + +202005103 add ; change : +20210102 add by cc + +20210411 add by cc +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) +20220830_23642 CCmodify 优化了task handdle +///cc 2023/04/08--12:13:53 TS_task_val_ tst_v;////TTSS常用的全局变量 + +****************************************************************************/ + +#ifndef _TTSS_TASK_H_ +#define _TTSS_TASK_H_ +#include "TTSS_tick.h" + +typedef struct +{ + vU32 du32; + vU16 du16; + volatile UN_TYPE i; //当前任务段 +}TS_task_val_; + +extern TS_task_val_ tst_v;////TTSS常用的全局变量 + + +typedef struct +{ + vU32 n; +/// volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 + volatile UN_TYPE sh; //当前任务段 + volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段 +/// volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用 +}TS_task; +//extern TS_task ts_task_stcadc; +#define D_task_close 0 +extern TS_task ts_task_init; + +#if 0 +#define D_task_Tdelay 0x01 +#define D_task_stop 0x04 +#define D_task_Cdelay 0x09 +#define D_task_init 0x10 +#define D_task_quit 0xf0 + +#else +#define D_task_Tdelay 0xe1 +#define D_task_stop 0xe4 +#define D_task_Cdelay 0xe9 +#define D_task_init 0xe0 +#define D_task_quit 0xf0 + +#endif + +#define TTS_for_add(i,start,len) for((i) = (start); (i) < (len); (i) ++){ +#define TTS_for_add_end() } + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 s->task +#define L2_task_delay_over() s->task.sh = s->task.sh_next +#define L2_task_go(next) s->task.sh = next +#define L2_task_en(onf) s->task.en = onf + +#define L2_task_exit(next) s->task.sh = 0 + +#define L2_task_busy(s) (D_task_close != s.task.sh) +#define L2_task_free(s) (D_task_close == s.task.sh) + +#define L2_task_go_father() s->task.sh = s->task.sh_pre +#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre + + +//>task 定时>>>>>>>>>>>>>>TTSS +/// D_task_Tdelay == task timer delay 需要额外有个定时单元 和time0定时器设置相关 +/// Delay_cycle适用于 时间短的,其一次循环取决于主循环的时间,和Tdelay比,Cdelay长时间计时误差大 +#define L2_task_switch_default_idelay(); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; +#if 0 + +#define L2_task_switch_default_idelay2(); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,3,'i');\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + +//在等待的过程中设置间隔时间,定时调用funxx +//这样在等待的空闲时间可以定时显示一些心跳信息和 +//执行心跳功能 + +#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart_fun(chhh,invent,funxx);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + + +//在等待的过程中设置间隔时间,定时显示字符ch +//这样在等待的空闲时间可以定时显示一些待机信息ch +// 通过ch表明目前运行的阶段和心跳信息 +#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_flag_idelay000(invent,ch); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,invent,ch);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + +TTSS_Task_init, Highlight +TTSS_Task_step, Highlight +TTSS_Task_end, Highlight +L2_task_go, Highlight +L1_task_Tdelay, Highlight +L1_task_Cdelay, Highlight +L2_task_go, Highlight + + + + +#endif + + +//if(delay_n+s_time0.t_10ms > 655340) +//{s_time0.t_10ms = 0;} + +//fix 201312 防止s_time0.t_10ms 溢出 +// 但是有风险 +//>>L2_task_delay一定要放在L2_task_go之后 +#define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); + + +//>>L2_task_delay一定要放在L2_task_go之后 +#define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<内部调用 s->task + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 外部调用 +#define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre; + +#define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s; +#define L3_task_s_go(s,next) (s).task.sh = next; +#define L3_task_s_en(s,onf) (s).task.en = onf; +//L1_task_goout(s_task_music.task,D_task_close); + +#define L3_task_s_busy(s) (D_task_close != (s).task.sh) +#define L3_task_s_free(s) (D_task_close == (s).task.sh) + +#define L3_task_s_step(s) ((s).task.sh) + + +#define D_task_uc unsigned char +#define D_task_ui unsigned int +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define TTSS_Task_init() switch(s->task.sh){\ + case D_task_init + +#define TTSS_Task_step(step) break;\ + case (step) +#define TTSS_step01(step) break;case (step) +#define TTSS_step02(step) break;case (step) +#define TTSS_step03(step) break;case (step) +#define TTSS_step04(step) break;case (step) +#define TTSS_step05(step) break;case (step) +#define TTSS_step06(step) break;case (step) +#define TTSS_step07(step) break;case (step) +#define TTSS_step08(step) break;case (step) +#define TTSS_step09(step) break;case (step) +#define TTSS_step10(step) break;case (step) +#define TTSS_step11(step) break;case (step) +#define TTSS_step12(step) break;case (step) + + + + + + + +#define TTSS_Task_end(); break;\ + L2_task_switch_default_idelay();} + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L1_task_reg_clear(TS_task *s); + + +#define L2_task_go_Tdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +#define L2_task_go_Cdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + + +#define L2_task_Tdelay_go(delay_n,next) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +#define L2_task_Cdelay_go(delay_n,next) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + + + + +////>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>>>> + +#ifdef D_debug_task_test + +typedef struct +{ + TS_task task; +}TS_task_test_; +extern TS_task_test_ ts_task_test; +extern void L2_task_test_handle(TS_task_test_ *s); +extern void L2_task_test_init(void); +#else + +#define L2_task_test_handle(x); +#define L2_task_test_init(); + +#endif//#ifdef D_debug_task_test + +////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< + +////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< + +////设定溢出时间 如果到了就进行执行某个操作, +////和溢出时间到了就"一直"做事 适合中间任务需要间隔的情况 和wanttime有次数上的区别 +#define TTSS_overtime_init(X,delay); (X) = TTSS_GetTick() + delay; +#define TTSS_overtime_get(X) if( (X) < TTSS_GetTick()) { +#define TTSS_overtime_end } + + + +#define TTSS_overtime_daole(X) ( (X) delay) { TTSS_Cycle_every_init(X); +#define TTSS_Cycle_every0(X,delay) if(0){ +#define TTSS_Cycle_every_end } + + +#define TTSS_run_timesX(X,n) for(X = 0;X < n;X ++) + +#define TTSS_run_overflow(X,n) if(X++ > n) + +#define TTSS_run_times(n) TTSS_run_timesX(tst_v.i,n) + + + + +//////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用), +///// timerx: 问候的时间间隔 +///// printChar 应答的内容(单字符,arccii字符可打印字符最佳) +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) \ + TTSS_overtime_get(overVal) \ + L1_uartD_uc(printChar); \ + TTSS_overtime_init(overVal,timerx);\ + TTSS_overtime_end + + +#endif//_TASK_H_ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================== +****************************************************************************/ + + + diff --git a/source/ctask/TTSS_task.h.bak b/source/ctask/TTSS_task.h.bak new file mode 100644 index 0000000..b522caf --- /dev/null +++ b/source/ctask/TTSS_task.h.bak @@ -0,0 +1,411 @@ +/******************************** +2013.7.23 add dictionary and task step by cc + +任务:task +任务段:task step +任务标志:sh ( struct handle) + +下一个任务段sh_next +缓存的任务段,sh_next执行完后执行sh_pre + +***************************/ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================== + +20190217 and step01 并且把delay_n添加括号保护 + +20190713 add TTSS_Cycle_every_init + + +202005103 add ; change : +20210102 add by cc + +20210411 add by cc +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) +20220830_23642 CCmodify 优化了task handdle + +****************************************************************************/ + +#ifndef _TTSS_TASK_H_ +#define _TTSS_TASK_H_ +#include "TTSS_tick.h" + +typedef struct +{ + vU32 n; +/// volatile UN_TYPE en; //关闭任务,也可以理解为暂停,但是使用idelay的地方时间在后台计数任务在延时到了后才暂停,而的delay相当于暂停 + volatile UN_TYPE sh; //当前任务段 + volatile UN_TYPE sh_next; //下一个任务段,并不代表一定下一任务段一定是他,有可能中间插入延时等任务段 +/// volatile UN_TYPE sh_pre; //前一个任务段,一般为调出缓存任务段使用 +}TS_task; +//extern TS_task ts_task_stcadc; +#define D_task_close 0 +extern TS_task ts_task_init; + +#if 0 +#define D_task_Tdelay 0x01 +#define D_task_stop 0x04 +#define D_task_Cdelay 0x09 +#define D_task_init 0x10 +#define D_task_quit 0xf0 + +#else +#define D_task_Tdelay 0xe1 +#define D_task_stop 0xe4 +#define D_task_Cdelay 0xe9 +#define D_task_init 0xe0 +#define D_task_quit 0xf0 + +#endif + +#define TTS_for_add(i,start,len) for((i) = (start); (i) < (len); (i) ++){ +#define TTS_for_add_end() } + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>内部调用 s->task +#define L2_task_delay_over() s->task.sh = s->task.sh_next +#define L2_task_go(next) s->task.sh = next +#define L2_task_en(onf) s->task.en = onf + +#define L2_task_exit(next) s->task.sh = 0 + +#define L2_task_busy(s) (D_task_close != s.task.sh) +#define L2_task_free(s) (D_task_close == s.task.sh) + +#define L2_task_go_father() s->task.sh = s->task.sh_pre +#define L2_task_go_son(fun,pre) s->task.sh = fun;s->task.sh_pre = pre + + +//>task 定时>>>>>>>>>>>>>>TTSS +/// D_task_Tdelay == task timer delay 需要额外有个定时单元 和time0定时器设置相关 +/// Delay_cycle适用于 时间短的,其一次循环取决于主循环的时间,和Tdelay比,Cdelay长时间计时误差大 +#define L2_task_switch_default_idelay(); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; +#if 0 + +#define L2_task_switch_default_idelay2(); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,3,'i');\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + +//在等待的过程中设置间隔时间,定时调用funxx +//这样在等待的空闲时间可以定时显示一些心跳信息和 +//执行心跳功能 + +#define L2_task_switch_fun_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_fun_idelay0000(chhh,invent,funxx); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart_fun(chhh,invent,funxx);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + + + +//在等待的过程中设置间隔时间,定时显示字符ch +//这样在等待的空闲时间可以定时显示一些待机信息ch +// 通过ch表明目前运行的阶段和心跳信息 +#define L2_task_switch_flag_idelay(invent,ch) L2_task_switch_default_idelay() +#define L2_task_switch_flag_idelay000(invent,ch); \ + case D_task_Tdelay:\ + if (TTSS_GetTick() >= s->task.n)\ + {\ + L2_task_delay_over();\ + }else\ + {\ + L2_time_beat_heart(D_TBH_ch0,invent,ch);\ + }\ + break; \ + case D_task_Cdelay:\ + s->task.n--; \ + if (s->task.n == 0) \ + { \ + s->task.n = 0; \ + L2_task_delay_over();\ + } \ + break;\ + default : \ + break; + + +TTSS_Task_init, Highlight +TTSS_Task_step, Highlight +TTSS_Task_end, Highlight +L2_task_go, Highlight +L1_task_Tdelay, Highlight +L1_task_Cdelay, Highlight +L2_task_go, Highlight + + + + +#endif + + +//if(delay_n+s_time0.t_10ms > 655340) +//{s_time0.t_10ms = 0;} + +//fix 201312 防止s_time0.t_10ms 溢出 +// 但是有风险 +//>>L2_task_delay一定要放在L2_task_go之后 +#define L1_task_Tdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); + + +//>>L2_task_delay一定要放在L2_task_go之后 +#define L1_task_Cdelay(delay_n) s->task.sh_next = s->task.sh;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<内部调用 s->task + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 外部调用 +#define L2_task_s_go_son(s,fun,pre) (s).task.sh = fun;(s).task.sh_pre = pre; + +#define L3_task_s_time_start(s,delay) (s).task.n = delay+s_nos_tick.t_1s; +#define L3_task_s_go(s,next) (s).task.sh = next; +#define L3_task_s_en(s,onf) (s).task.en = onf; +//L1_task_goout(s_task_music.task,D_task_close); + +#define L3_task_s_busy(s) (D_task_close != (s).task.sh) +#define L3_task_s_free(s) (D_task_close == (s).task.sh) + +#define L3_task_s_step(s) ((s).task.sh) + + +#define D_task_uc unsigned char +#define D_task_ui unsigned int +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +#define TTSS_Task_init() switch(s->task.sh){\ + case D_task_init + +#define TTSS_Task_step(step) break;\ + case (step) +#define TTSS_step01(step) break;case (step) +#define TTSS_step02(step) break;case (step) +#define TTSS_step03(step) break;case (step) +#define TTSS_step04(step) break;case (step) +#define TTSS_step05(step) break;case (step) +#define TTSS_step06(step) break;case (step) +#define TTSS_step07(step) break;case (step) +#define TTSS_step08(step) break;case (step) +#define TTSS_step09(step) break;case (step) +#define TTSS_step10(step) break;case (step) +#define TTSS_step11(step) break;case (step) +#define TTSS_step12(step) break;case (step) + + + + + + + +#define TTSS_Task_end(); break;\ + L2_task_switch_default_idelay();} + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L1_task_reg_clear(TS_task *s); + + +#define L2_task_go_Tdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +#define L2_task_go_Cdelay(next,delay_n) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + + +#define L2_task_Tdelay_go(delay_n,next) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Tdelay;\ + s->task.n = (delay_n) + TTSS_GetTick(); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + +#define L2_task_Cdelay_go(delay_n,next) do{ \ + if(delay_n) \ + { \ + s->task.sh_next = next;\ + s->task.sh = D_task_Cdelay;\ + s->task.n = (delay_n); \ + } \ + else \ + { \ + s->task.sh = next; \ + } \ + }while(0) + + + + +////>>>>>>>>>>>>>>>>>>>_s_task_test_>>>>>>>>>>>>>>>>>>>>>>>> + +#ifdef D_debug_task_test + +typedef struct +{ + TS_task task; +}TS_task_test_; +extern TS_task_test_ ts_task_test; +extern void L2_task_test_handle(TS_task_test_ *s); +extern void L2_task_test_init(void); +#else + +#define L2_task_test_handle(x); +#define L2_task_test_init(); + +#endif//#ifdef D_debug_task_test + +////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< + +////<<<<<<<<<<<<<<<<<<<_s_task_test_<<<<<<<<<<<<<<<<<<<<<<<< + +////设定溢出时间 如果到了就进行执行某个操作, +////和溢出时间到了就"一直"做事 适合中间任务需要间隔的情况 和wanttime有次数上的区别 +#define TTSS_overtime_init(X,delay); (X) = TTSS_GetTick() + delay; +#define TTSS_overtime_get(X) if( (X) < TTSS_GetTick()) { +#define TTSS_overtime_end } + + +#define TTSS_overtime_daole(X) ( (X) delay) { TTSS_Cycle_every_init(X); +#define TTSS_Cycle_every0(X,delay) if(0){ +#define TTSS_Cycle_every_end } + + +#define TTSS_run_times(X,n) for(X = 0;X < n;X ++) +#define TTSS_run_overflow(X,n) if(X++ > n) + + +//////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用), +///// timerx: 问候的时间间隔 +///// printChar 应答的内容(单字符,arccii字符可打印字符最佳) +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) \ + TTSS_overtime_get(overVal) \ + L0_uart0_uc(printChar); \ + TTSS_overtime_init(overVal,timerx);\ + TTSS_overtime_end + + +#endif//_TASK_H_ +/***************************************************** +*============================================================== +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================== +****************************************************************************/ + + + diff --git a/source/ctask/TTSS_tick.c b/source/ctask/TTSS_tick.c new file mode 100644 index 0000000..e0b3d82 --- /dev/null +++ b/source/ctask/TTSS_tick.c @@ -0,0 +1,167 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename TTSS_tick.h tick.c + 2019.03.11 ver 1.30 定时时间更改为25ms 解决串口接收受干扰的情况 + *2021.12.12 ver 2.10 detail +****************************************************************************************/ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================================ +****************************************************************************/ + +#include "TTSS_tick.h" + +#include "msp_uart1.h" +///#include "msp_uart2.h" +///#include "msp_uart3.h" +///#include "msp_uart4.h" + +TS_nos_tick_ s_nos_tick; +#ifdef D_use_tick_fum +void L1_task_tick_init(void) +{ + s_nos_tick.uart1_overtime_callback = L2_uart1_overtime_callback; + s_nos_tick.uart2_overtime_callback = L2_uart1_overtime_callback; + s_nos_tick.uart2_overtime_callback = L2_uart1_overtime_callback;///保护使用防止误删 容易崩溃 + + s_nos_tick.t_1s = 0; + s_nos_tick.jiffies = 0; + s_nos_tick.t1s_heartbeat= 0; + + s_nos_tick.uart1_overtime_callback = L2_uart1_overtime_callback;///必备步骤1(method step 3) +//// s_nos_tick.uart2_overtime_callback = L2_uart2_overtime_callback;///必备步骤1(method step 3) +//// s_nos_tick.uart3_overtime_callback = L2_uart3_overtime_callback;///必备步骤1(method step 3) +// s_nos_tick.uart4_overtime_callback = L2_uart4_overtime_callback;///必备步骤1(method step 3) + ///s_nos_tick.uart3_overtime_fun = NULL;///必备步骤1(method step 3) + ///s_nos_tick.uart4_overtime_fun = NULL;///必备步骤1(method step 3) + /***** + s_nos_tick.t1s_flag[0] = 0; + s_nos_tick.t1s_flag[1] = 0; + s_nos_tick.t1s_flag[2] = 0; + s_nos_tick.t1s_flag[3] = 0; + s_nos_tick.t1s_flag[4] = 0; + s_nos_tick.t1s_flag[5] = 0; + if(L2_tick_time_interval(n_stamp,7*D_Tdelay_1s)) + {// 时间溢出 + L2_tick_time_stamp(s->t_stamp); + s_nos_tick.t_10ms = 0; + s_nos_tick.tp_count = 0; + s_nos_tick.n_stamp = 0; + s_nos_tick.t1s_heartbeat= 0; + ********/ + + /// s_nos_tick.flag_1s = 0; + /// s_nos_tick.t_n = 0; + //s_nos_tick.tmp = 0; + //L0_timer0_ONF(1); +} +//JIFFIES回绕问题没有解决 参见 linux time_after宏定义 +void L1_task_tick_callback (void) +{ + ///65535*65535/3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + //s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522验证 + s_nos_tick.jiffies++; + if(s_nos_tick.jiffies % HZ == 0) + { + // 65535*65535/24/60/60/356/10 =12.7年 + s_nos_tick.t_1s ++; + s_nos_tick.t1s_heartbeat = 1; + } + s_nos_tick.uart1_overtime_callback();////必备步骤1(method step 1) +// s_nos_tick.uart2_overtime_callback();////必备步骤1(method step 2)// +// s_nos_tick.uart3_overtime_callback();////必备步骤1(method step 1) +// s_nos_tick.uart4_overtime_callback();////必备步骤1(method step 1) +} + + + +#else + +#endif + +#if 0 +/// 定时器调用 10ms 一个中断 +/// 定时器调用 25ms 一个中断 +void L1_tick_tick (void) +{ /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + s_nos_tick.tp_count++; + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证 + if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) + {// 65535*65535/24/60/60/356/10 =12.7年 + s_nos_tick.t_1s ++;//// 65535*65535/24/60/60/356/10 =12.7年 +/// s_nos_tick.flag_1s2 = 1; + s_nos_tick.t1s_heartbeat = 1; + /// LED1 = !LED1; + } + + +//<<<<<<<<<<<<<<<<<<<<<< +} + + +void L1_tick_tick (void) +{ + s_nos_tick.t_n++; + if (s_nos_tick.t_n >= D_TIMER0_10MS_COUNT)// 5500--- 100 10s--556 + /// s 5ms 65535*65535 /3600/24/365=139nian/s + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + // fixme:此处 保留了一个百年bug:) + { + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证 + if(s_nos_tick.t_10ms%D_TIMER0_1S_COUNT == 0) + {// 65535*65535/24/60/60/356/10 =12.7年 + s_nos_tick.t_1s ++;// + + // led_red =~led_red; + //s_nos_tick.t1s_flag[0] = 1; + //s_nos_tick.t1s_flag[1] = 1; + //s_nos_tick.t1s_flag[2] = 1; + //s_nos_tick.t1s_flag[3] = 1; + //s_nos_tick.t1s_flag[4] = 1; + //s_nos_tick.t1s_flag[5] = 1; + s_nos_tick.flag_1s = 1; + s_nos_tick.t1s_heatbeart = 1; + } + s_nos_tick.t_n = 0; + } + /******************* +// 0.2mm 4/0.2 = 20 20/60s = 333ms/maicong +// 0.2mm 60s 60 100 ms +// 0.2 6000ms +// 平时为1 水满一次为0 +// rain = 1;必须要做的初始化 + if(0 == rain) + { + if(1 == s_rain.temp) + {// ````\___ + s_rain.pool = s_rain.t; + s_rain.all ++; + s_rain.t = 0; + } + s_rain.temp = 0; + }else + { + s_rain.temp = 1; + } + s_rain.t ++; + + ******/ +//<<<<<<<<<<<<<<<<<<<<<< +} + + +#endif + diff --git a/source/ctask/TTSS_tick.h b/source/ctask/TTSS_tick.h new file mode 100644 index 0000000..bf87b33 --- /dev/null +++ b/source/ctask/TTSS_tick.h @@ -0,0 +1,229 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename TTSS_tick.h tick.c + *2021.12.12 ver 2.10 detail + *2022.02.15 ver 2.20 stm32 version +******************************************************************************/ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================================ +****************************************************************************/ +#ifndef __tick_H +#define __tick_H +#include "bsp_config.h" +#define D_use_tick_fum + + +typedef struct +{ + vU32 jiffies; // noos系统定时器最小技术单元 + vU32 t_1s; + vU32 stamp; + vU8 t1s_heartbeat; //noos 系统定时器整秒时刻标志,需要软件清除 + vtype print_heartbeat; + void (*uart1_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart2_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart3_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart4_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + + + ///vtype (*uart3_ overtime_fun)(void);///需要哪个注册哪个 必备步骤1(method step 1) + ///vtype (*uart4_ overtime_fun)(void);///需要哪个注册哪个 必备步骤1(method step 1) +}TS_nos_tick_; +extern TS_nos_tick_ s_nos_tick; + +#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) + #define HZ 200L +#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) + #define HZ 100L +#elif(TYPE_JIFFIES_12MS == D_sys_Jiffies) + #define HZ 80L +#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) + #define HZ 50L +#endif +#define JIFFIES (1000L/HZ) + +#define D_sys_now (s_nos_tick.jiffies) +//D_sys_delay_msec以jiffies为最小计时单位,jiffies是10ms为例,参数n=12ms时,最终延时了20ms +#define D_sys_delay_msec(n) do{ \ + if(n>0) \ + { \ + U32 mstmp = D_sys_now; \ + while(D_sys_now - mstmp < (((n)-1)/JIFFIES) + 1); \ + } \ + }while(0) + + +///12.5ms 1000/12.5 = 80 +#define D_Tdelay_Msec(n) (((n)-1) / JIFFIES + 1) +#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) +#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) +#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) +#define D_Tdelay_30ms ((30-1) / JIFFIES + 1) +#define D_Tdelay_40ms ((40-1) / JIFFIES + 1) +#define D_Tdelay_50ms ((50-1) / JIFFIES + 1) + +#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) +#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) +#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) +#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) + +#define D_Tdelay_1s (1L * HZ) +#define D_Tdelay_2s (2L * HZ) +#define D_Tdelay_3s (3L * HZ) +#define D_Tdelay_4s (4L * HZ) +#define D_Tdelay_5s (5L * HZ) +#define D_Tdelay_10s (10L * HZ) +#define D_Tdelay_15s (15L * HZ) +#define D_Tdelay_30s (30L * HZ) + +#define D_Tdelay_1min (1 * 60 * HZ) +#define D_Tdelay_10min (10 * 60 * HZ) +#define D_Tdelay_1h (60 * 60 * HZ) +#define D_Tdelay_1day (24 * 60 * 60 * HZ) + + + +#if (D_CPUfamily_32bits == D_CPUfamily_type) + + #define TTSS_GetTick() HAL_GetTick() + #define TTSS_GetTick_1s() HAL_GetTick1S()///fixme +#else + + #define TTSS_GetTick() (s_nos_tick.jiffies) + #define TTSS_GetTick_1s() (s_nos_tick.t_1s) +#endif + + +//>> 定时器: 初始化 间隔时间到 +// L0_nos_tick10ms_start(s->times); 开始初始化s->times 以10ms为一个单位 +// if( L0_nos_tick10ms_interval(s->times) < 20)// s->times 执行了20次后,也就是 定时20*10m到达 + +////使用是必须常数 + L 例如100L + +//必须配对 +#define L0_nos_tick10ms_start(start_n) start_n = TTSS_GetTick() +#define L0_nos_tick10ms_interval(start_n) (TTSS_GetTick() - start_n) + + + +#define L0_nos_tick1s_start(start_n) start_n = HAL_GetTick1S() +#define L0_nos_tick1s_interval(start_n) (HAL_GetTick1S() - start_n) + +#define L2_tick_time_space(times) (0 == (TTSS_GetTick()%times))////有bug 如果循环的间隔小于tick间隔,会重复执行 + + + +//>>>//必须配对 +#define L2_tick_time_stamp(time_stamp) time_stamp = TTSS_GetTick(); +#define L2_tick_time_interval(time_stamp,time_overflow) (( TTSS_GetTick() - time_stamp) > time_overflow) + + + +////#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,(U32)x) +///#define L3_tick_interval(x) (( TTSS_GetTick() - s_nos_tick.n_stamp) > x)////L2_tick_time_interval(s_nos_tick.n_stamp,(U32)x) +#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); + + +#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x)////x的后面必须添加L,使用(u32)(vu32)均不可 + + +#define D_print_heartbeat_nexttimes(); s_nos_tick.print_heartbeat = 1;//下一次再打印心跳 +#define D_print_heartbeat_close(); s_nos_tick.print_heartbeat = 0;//停止打印心跳 +#define D_print_heartbeat_ok() (1 == s_nos_tick.print_heartbeat)//允许打印心跳 +#define D_print_heartbeat_disable() (0 == s_nos_tick.print_heartbeat)//允许打印心跳 + + #define D_print_heartbeat() \ + if(D_print_heartbeat_disable()){\ + D_print_heartbeat_nexttimes();\ + }else + + + + +////L3_tick_interval(x)///计时时间到 + +////L2_tick_stamp() ///时间清零 + +//>>>示例如下: +#if 0 + +if(L3_tick_interval(10)) +{ + L2_tick_stamp(); +} +{ + case D_task_init:// + Lc_print_buf(" \r\n YL_ init"); + s->step = D_AT; + L0_esp_open(); + L2_task_go(D_task_YL_ready); + s_uart0_rec.ok = 0; + L2_tick_time_stamp(s->t_stamp); + // L1_task_Tdelay(1*D_Tdelay_1s); //大约6s + break; + case D_task_YL_ready: + if(1 == s_uart0_rec.ok) + { + if(strstr(s_uart0_rec.array,"ready") != NULL) + { + + Ldi_print("ready..\r\n"); + s->step = D_AT; + L2_task_go(D_task_YL_ask); + } + s_uart0_rec.ok = 0; + } + if(L2_tick_time_stamp(s->t_stamp,1*D_Tdelay_1s)) + {// 时间溢出 + L0_esp_close(); + Ldi_print("fail esp restart.\r\n"); + L2_task_go(D_task_init); + L1_task_Tdelay(2*D_Tdelay_1s); + } + break; +} +#endif + +// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔) +/// #define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 +#ifdef D_use_tick_fum +extern void L1_task_tick_init(void); +extern void L1_task_tick_callback (void); + +#else + + +#define L1_task_tick_init() +#define L1_task_tick_callback() s_nos_tick.t_10ms ++; + +#endif + + + +//L2_time_beat_heart(D_TBH_ch1,2,'t') +#define D_TBH_ch0 0 +#define D_TBH_ch1 1 +#define D_TBH_ch2 2 +#define D_TBH_ch3 3 +#define D_TBH_ch4 4 +#define D_TBH_ch5 5 +extern void L2_time_beat_heart(vU32 ch,U8 invent,U8 s); +//void L2_time_beat_heart_fun(INT32U ch,unsigned char invent,void *fun(void)); +extern void L2_time_beat_heart_fun(vU32 ch,U8 invent,void (*fun)(void)); + +#endif /* end __tick_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/ctask/TTSS_tick.h.bak b/source/ctask/TTSS_tick.h.bak new file mode 100644 index 0000000..703a421 --- /dev/null +++ b/source/ctask/TTSS_tick.h.bak @@ -0,0 +1,228 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright (c) 2023 CCSENS + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename TTSS_tick.h tick.c + *2021.12.12 ver 2.10 detail + *2022.02.15 ver 2.20 stm32 version +******************************************************************************/ +/***************************************************** +*============================================================================ +* HISTORY +* Below this line, this part is controlled by TSTS. DO NOT MODIFY!! +伪时间片嵌入式平台(Task Step by Step Turn by Turn Structure,简称TSTS) +*============================================================================ +****************************************************************************/ +#ifndef __tick_H +#define __tick_H +#include "bsp_config.h" +#define D_use_tick_fum + + +typedef struct +{ + vU32 jiffies; // noos系统定时器最小技术单元 + vU32 t_1s; + vU32 stamp; + vU8 t1s_heartbeat; //noos 系统定时器整秒时刻标志,需要软件清除 + vtype print_heartbeat; + void (*uart1_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart2_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart3_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + void (*uart4_overtime_callback)(void);///需要哪个注册哪个 必备步骤1(method step 1) + + + ///vtype (*uart3_ overtime_fun)(void);///需要哪个注册哪个 必备步骤1(method step 1) + ///vtype (*uart4_ overtime_fun)(void);///需要哪个注册哪个 必备步骤1(method step 1) +}TS_nos_tick_; +extern TS_nos_tick_ s_nos_tick; + +#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) + #define HZ 200L +#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) + #define HZ 100L +#elif(TYPE_JIFFIES_12MS == D_sys_Jiffies) + #define HZ 80L +#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) + #define HZ 50L +#endif +#define JIFFIES (1000L/HZ) + +#define D_sys_now (s_nos_tick.jiffies) +//D_sys_delay_msec以jiffies为最小计时单位,jiffies是10ms为例,参数n=12ms时,最终延时了20ms +#define D_sys_delay_msec(n) do{ \ + if(n>0) \ + { \ + U32 mstmp = D_sys_now; \ + while(D_sys_now - mstmp < (((n)-1)/JIFFIES) + 1); \ + } \ + }while(0) + + +///12.5ms 1000/12.5 = 80 +#define D_Tdelay_Msec(n) (((n)-1) / JIFFIES + 1) +#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) +#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) +#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) +#define D_Tdelay_30ms ((30-1) / JIFFIES + 1) +#define D_Tdelay_40ms ((40-1) / JIFFIES + 1) +#define D_Tdelay_50ms ((50-1) / JIFFIES + 1) + +#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) +#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) +#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) +#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) + +#define D_Tdelay_1s (1 * HZ) +#define D_Tdelay_2s (2 * HZ) +#define D_Tdelay_3s (3 * HZ) +#define D_Tdelay_4s (4 * HZ) +#define D_Tdelay_5s (5 * HZ) +#define D_Tdelay_10s (10 * HZ) +#define D_Tdelay_15s (15 * HZ) + +#define D_Tdelay_1min (1 * 60 * HZ) +#define D_Tdelay_10min (10 * 60 * HZ) +#define D_Tdelay_1h (60 * 60 * HZ) +#define D_Tdelay_1day (24 * 60 * 60 * HZ) + + + +#if (D_CPUfamily_32bits == D_CPUfamily_type) + + #define TTSS_GetTick() HAL_GetTick() + #define TTSS_GetTick_1s() HAL_GetTick1S()///fixme +#else + + #define TTSS_GetTick() (s_nos_tick.jiffies) + #define TTSS_GetTick_1s() (s_nos_tick.t_1s) +#endif + + +//>> 定时器: 初始化 间隔时间到 +// L0_nos_tick10ms_start(s->times); 开始初始化s->times 以10ms为一个单位 +// if( L0_nos_tick10ms_interval(s->times) < 20)// s->times 执行了20次后,也就是 定时20*10m到达 + +////使用是必须常数 + L 例如100L + +//必须配对 +#define L0_nos_tick10ms_start(start_n) start_n = TTSS_GetTick() +#define L0_nos_tick10ms_interval(start_n) (TTSS_GetTick() - start_n) + + + +#define L0_nos_tick1s_start(start_n) start_n = HAL_GetTick1S() +#define L0_nos_tick1s_interval(start_n) (HAL_GetTick1S() - start_n) + +#define L2_tick_time_space(times) (0 == (TTSS_GetTick()%times))////有bug 如果循环的间隔小于tick间隔,会重复执行 + + + +//>>>//必须配对 +#define L2_tick_time_stamp(time_stamp) time_stamp = TTSS_GetTick(); +#define L2_tick_time_interval(time_stamp,time_overflow) (( TTSS_GetTick() - time_stamp) > time_overflow) + + + +////#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,(U32)x) +///#define L3_tick_interval(x) (( TTSS_GetTick() - s_nos_tick.n_stamp) > x)////L2_tick_time_interval(s_nos_tick.n_stamp,(U32)x) +#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); + + +#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x)////x的后面必须添加L,使用(u32)(vu32)均不可 + + +#define D_print_heartbeat_nexttimes(); s_nos_tick.print_heartbeat = 1;//下一次再打印心跳 +#define D_print_heartbeat_close(); s_nos_tick.print_heartbeat = 0;//停止打印心跳 +#define D_print_heartbeat_ok() (1 == s_nos_tick.print_heartbeat)//允许打印心跳 +#define D_print_heartbeat_disable() (0 == s_nos_tick.print_heartbeat)//允许打印心跳 + + #define D_print_heartbeat() \ + if(D_print_heartbeat_disable()){\ + D_print_heartbeat_nexttimes();\ + }else + + + + +////L3_tick_interval(x)///计时时间到 + +////L2_tick_stamp() ///时间清零 + +//>>>示例如下: +#if 0 + +if(L3_tick_interval(10)) +{ + L2_tick_stamp(); +} +{ + case D_task_init:// + Lc_print_buf(" \r\n YL_ init"); + s->step = D_AT; + L0_esp_open(); + L2_task_go(D_task_YL_ready); + s_uart0_rec.ok = 0; + L2_tick_time_stamp(s->t_stamp); + // L1_task_Tdelay(1*D_Tdelay_1s); //大约6s + break; + case D_task_YL_ready: + if(1 == s_uart0_rec.ok) + { + if(strstr(s_uart0_rec.array,"ready") != NULL) + { + + Ldi_print("ready..\r\n"); + s->step = D_AT; + L2_task_go(D_task_YL_ask); + } + s_uart0_rec.ok = 0; + } + if(L2_tick_time_stamp(s->t_stamp,1*D_Tdelay_1s)) + {// 时间溢出 + L0_esp_close(); + Ldi_print("fail esp restart.\r\n"); + L2_task_go(D_task_init); + L1_task_Tdelay(2*D_Tdelay_1s); + } + break; +} +#endif + +// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔) +/// #define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 +#ifdef D_use_tick_fum +extern void L1_task_tick_init(void); +extern void L1_task_tick_callback (void); + +#else + + +#define L1_task_tick_init() +#define L1_task_tick_callback() s_nos_tick.t_10ms ++; + +#endif + + + +//L2_time_beat_heart(D_TBH_ch1,2,'t') +#define D_TBH_ch0 0 +#define D_TBH_ch1 1 +#define D_TBH_ch2 2 +#define D_TBH_ch3 3 +#define D_TBH_ch4 4 +#define D_TBH_ch5 5 +extern void L2_time_beat_heart(vU32 ch,U8 invent,U8 s); +//void L2_time_beat_heart_fun(INT32U ch,unsigned char invent,void *fun(void)); +extern void L2_time_beat_heart_fun(vU32 ch,U8 invent,void (*fun)(void)); + +#endif /* end __tick_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/ctask/TTSS_time_stc.c b/source/ctask/TTSS_time_stc.c new file mode 100644 index 0000000..7031bba --- /dev/null +++ b/source/ctask/TTSS_time_stc.c @@ -0,0 +1,93 @@ +#include "ttss_time_stc.h" +#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - (clk) / 1000 * timeInUs / 1000 / t) + +/*************初始化定时器0由 stc-isp v6.86L定时器计算器生成******************/ + + +#if(MainFre_5M == D_sys_MainFre) + + +#elif(MainFre_22M == D_sys_MainFre) +void L0_timer0_Init(void)//void Timer0Init(void) //12500微秒@22.1184MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初始值 + TH0 = 0xA6; //设置定时初始值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} + + +#elif(MainFre_27M == D_sys_MainFre) + + + +#elif(MainFre_44M == D_sys_MainFre) + +void L0_timer0_Init(void)/////void Timer0Init(void) //12.5m秒@44.0800MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0xA3; //设置定时初始值 + TH0 = 0x4C; //设置定时初始值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} +void L0_timer4_Init(void)/////void Timer4_Init(void) //100微秒@44.2368MHz +{ + T4T3M |= 0x20; //定时器时钟1T模式 + T4L = 0xB8; //设置定时初始值 + T4H = 0xEE; //设置定时初始值 + T4T3M |= 0x80; //定时器4开始计时 +} + +#else ///MainFre_11M +////#warn +void L0_timer0_Init(void) +{ + U16 val = D_TIMER_COUNT(12,D_sys_MainFre,D_sys_Jiffies * 1000); + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + //TL0 = 0x00; //设置定时初值 + //TH0 = 0x4C; //设置定时初值 + TL0 = val; //设置定时初值 + TH0 = val >> 8; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} + +#endif//D_sys_MainFre) +#if 0 + /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证 +#endif + +//10---87 10s +/********************** Timer0中断函数************************/ +/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre +/// 默认10ms 作为TTSS系统的定时引擎 +void timer0_isrHandle (void) D_SERVE_TIMER0 +{// + NOP(); NOP(); NOP(); + TF0 = 0; + L1_task_tick_callback(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务 + /// BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); + NOP(); NOP(); NOP(); +} + +void L1_timer0_Init(void) +{ + ///step1:时钟 + ///step2:模块使能 + ///step3:启动 + ///step4:模块中断使能 + ///step5:全局中断使能 + L0_timer0_Init(); + ET0 = 1;///经常因为替换L0_timer0_Init(由stcisp例程生成) 改指令漏掉 +} + + + diff --git a/source/ctask/TTSS_time_stc.c.bak b/source/ctask/TTSS_time_stc.c.bak new file mode 100644 index 0000000..7031bba --- /dev/null +++ b/source/ctask/TTSS_time_stc.c.bak @@ -0,0 +1,93 @@ +#include "ttss_time_stc.h" +#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536 - (clk) / 1000 * timeInUs / 1000 / t) + +/*************初始化定时器0由 stc-isp v6.86L定时器计算器生成******************/ + + +#if(MainFre_5M == D_sys_MainFre) + + +#elif(MainFre_22M == D_sys_MainFre) +void L0_timer0_Init(void)//void Timer0Init(void) //12500微秒@22.1184MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0x00; //设置定时初始值 + TH0 = 0xA6; //设置定时初始值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} + + +#elif(MainFre_27M == D_sys_MainFre) + + + +#elif(MainFre_44M == D_sys_MainFre) + +void L0_timer0_Init(void)/////void Timer0Init(void) //12.5m秒@44.0800MHz +{ + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + TL0 = 0xA3; //设置定时初始值 + TH0 = 0x4C; //设置定时初始值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} +void L0_timer4_Init(void)/////void Timer4_Init(void) //100微秒@44.2368MHz +{ + T4T3M |= 0x20; //定时器时钟1T模式 + T4L = 0xB8; //设置定时初始值 + T4H = 0xEE; //设置定时初始值 + T4T3M |= 0x80; //定时器4开始计时 +} + +#else ///MainFre_11M +////#warn +void L0_timer0_Init(void) +{ + U16 val = D_TIMER_COUNT(12,D_sys_MainFre,D_sys_Jiffies * 1000); + AUXR &= 0x7F; //定时器时钟12T模式 + TMOD &= 0xF0; //设置定时器模式 + //TL0 = 0x00; //设置定时初值 + //TH0 = 0x4C; //设置定时初值 + TL0 = val; //设置定时初值 + TH0 = val >> 8; //设置定时初值 + TF0 = 0; //清除TF0标志 + TR0 = 1; //定时器0开始计时 +} + +#endif//D_sys_MainFre) +#if 0 + /// 65535*65535 /3600/24/365=139nian/s=1.39nian/10ms + ///相当于1.39年后t_10ms 溢出,对于电池供电的系统而言 完全可以满足 + // 4,294,836,225 = 65535*65535 ;3600*24*60*60 = 31,536,000秒/年 + s_nos_tick.t_10ms ++;//D_led_D1_REV(); 20160522 验证 +#endif + +//10---87 10s +/********************** Timer0中断函数************************/ +/// 和 L0_timer0_Init 关联,需要配置 bsp_config.h中的 D_sys_MainFre +/// 默认10ms 作为TTSS系统的定时引擎 +void timer0_isrHandle (void) D_SERVE_TIMER0 +{// + NOP(); NOP(); NOP(); + TF0 = 0; + L1_task_tick_callback(); ///系统中的1sflag 和以10ms为颗粒的延时使用 为tdelay服务 + /// BITN_1(DR_who_wakeup, DRB_who_wakeup_timer0); + NOP(); NOP(); NOP(); +} + +void L1_timer0_Init(void) +{ + ///step1:时钟 + ///step2:模块使能 + ///step3:启动 + ///step4:模块中断使能 + ///step5:全局中断使能 + L0_timer0_Init(); + ET0 = 1;///经常因为替换L0_timer0_Init(由stcisp例程生成) 改指令漏掉 +} + + + diff --git a/source/ctask/TTSS_time_stc.h b/source/ctask/TTSS_time_stc.h new file mode 100644 index 0000000..08d1aee --- /dev/null +++ b/source/ctask/TTSS_time_stc.h @@ -0,0 +1,23 @@ +#ifndef _TTSS_time_stc_ +#define _TTSS_time_stc_ + +#include "bsp_config.h" +#include "TTSS_tick.h" + + +extern void L0_timer0_Init(void); +extern void L0_timer0_Init_32k(void) ; +extern void L0_timer4_Init(void); + +#define L0_timer0_open(x) TR0 = x // + +// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔) +//#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + +#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + + +#endif///_TTSS_time_ + + + diff --git a/source/ctask/TTSS_time_stc.h.bak b/source/ctask/TTSS_time_stc.h.bak new file mode 100644 index 0000000..098c2d5 --- /dev/null +++ b/source/ctask/TTSS_time_stc.h.bak @@ -0,0 +1,23 @@ +#ifndef _TTSS_time_stc_ +#define _TTSS_time_stc_ + +#include "../bsp/bsp_config.h" +#include "TTSS_tick.h" + + +extern void L0_timer0_Init(void); +extern void L0_timer0_Init_32k(void) ; +extern void L0_timer4_Init(void); + +#define L0_timer0_open(x) TR0 = x // + +// 他和t_10ms 关联,如果t_10ms递增为1时间隔为(D_TIMER0_10MS_COUNT*定时器间隔) +//#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + +#define D_TIMER0_10MS_COUNT 1 //定时器为 10ms一中断 + + +#endif///_TTSS_time_ + + + diff --git a/source/debug/cc_as_stc01_main.ini b/source/debug/cc_as_stc01_main.ini new file mode 100644 index 0000000..7636777 --- /dev/null +++ b/source/debug/cc_as_stc01_main.ini @@ -0,0 +1,7 @@ +//MODE COM4 9600,0,8,1 +//ASSIGN COM4 < SIN > SOUT +// please "dir vtreg" and show the +MODE COM2 115200,0,8,1 +ASSIGN COM2 < S0IN > S0OUT +//MODE COM1 9600,0,8,1 +//ASSIGN COM1 < S0IN > S0OUT diff --git a/source/debug/cc_ls_03_debug.ini b/source/debug/cc_ls_03_debug.ini new file mode 100644 index 0000000..87a0def --- /dev/null +++ b/source/debug/cc_ls_03_debug.ini @@ -0,0 +1,6 @@ +//MODE COM4 9600,0,8,1 +//ASSIGN COM4 < SIN > SOUT +MODE COM6 9600,0,8,1 +ASSIGN COM6 < S0IN > S0OUT +//MODE COM1 9600,0,8,1 +//ASSIGN COM1 < S0IN > S0OUT diff --git a/source/debug/debug.ini b/source/debug/debug.ini new file mode 100644 index 0000000..203177f --- /dev/null +++ b/source/debug/debug.ini @@ -0,0 +1,123 @@ +MODE COM1 9600,0,8,1 +//assign com1 SOUT +ASSIGN COM1 < SIN > SOUT +//ASSIGN WIN SOUT +KILL FUNC * +KILL BUTTON * + + +//swatch(0.5) +DEFINE BUTTON "adc", "adc()" +signal void adc (void) { +// while (1) { /* repeat forever */ + P14= 0; /* set PORTA bit 0 */ + printf("adc is on\n"); + twatch(500); + //} /* repeat */ +} + +DEFINE BUTTON "k1 ", "k1()" +signal void k1 (void) { +P2.0= 0; + //P20= 0; + printf("K1 down\n"); + swatch(0.17); + P2.0= 1; + //P20= 1; + swatch(0.17); + printf("K1 up\n"); +} + + +DEFINE BUTTON "k2 ", "k2()" +signal void k2 (void) { + P2.1= 0; + //P21= 0; + printf("K2 down\n"); + swatch(0.17); + P2.1= 1; + //P21= 1; + swatch(0.17); + printf("K2 up\n"); +} + + +DEFINE BUTTON "k3 ", "k3()" +signal void k3 (void) { + P2.2= 0; + //P22= 0; + printf("K3 down\n"); + swatch(0.07); + P2.2= 1; + //P22= 1; + swatch(0.07); + printf("K3 up\n"); +} + + + + +DEFINE BUTTON "kx4 enter/", "kx4()" +signal void kx4 (void) { + + P13= 0; /* set PORTA bit 0 */ + printf("Kx4 down\n"); + swatch(0.07); + + P13= 1; + swatch(0.07); + printf("Kx4 up\n"); +} + +DEFINE BUTTON "<-- kx1_left ", "kx1_left()" +signal void kx1_left (void) { + + P12= 0; /* set PORTA bit 0 */ + + printf("kx1_left down\n"); + swatch(0.07); + P11= 0; + swatch(0.07); + + P12= 1; + swatch(0.07); + P11= 1; + swatch(0.07); + printf("kx1_left up\n"); + +} + +DEFINE BUTTON "kx1_right--> ", "kx1_right()" +signal void kx1_right (void) { + + P11= 0; /* set PORTA bit 0 */ + + printf("kx1_right down\n"); + swatch(0.07); + P12= 0; + swatch(0.07); + + P11= 1; + swatch(0.07); + P12= 1; + swatch(0.07); + printf("kx1_right up\n"); + +} +DEFINE BUTTON "My Registers", "MyRegs()" + +FUNC void MyRegs (void) { + printf ("---------- MyRegs() ----------\n"); + printf (" R4 R8 R9 R10 R11 R12\n"); + printf (" %04X %04X %04X %04X %04X %04X\n", + R0, R1, R2, R3, R4, R5); + printf ("------------------------------\n"); +} + + + +//bs write P3,1,"check_moto()"//дp2Ķִ signal +//signal void check_moto (void) + + + diff --git a/source/debug/debug_drv.c b/source/debug/debug_drv.c new file mode 100644 index 0000000..7c82cb3 --- /dev/null +++ b/source/debug/debug_drv.c @@ -0,0 +1,376 @@ +/***************************************************************************** + * debug_drv.c: debug app + * + * Copyright(C) 2013, cc + * All rights reserved. + * + * History + * 2013.05.24 ver 1.00 Prelimnary version, first Release + * + + +if(ts_s2b_debug.idle) +{ + ts_s2b_debug.idle = 0; + printf("\r\n O"); + if(ts_s2b_debug.len > 0) + { +//// L1_uartD_sendArrayhex((U8 *)&ts_s2b_debug.t, 5); + /// xxxx///提取协议 + /// if(debgu) ts_s2b_debug.ok =1; + + printf("\r\n len = %d",(int)ts_s2b_debug.len); + ts_s2b_debug.len = 0; + } +} + + +******************************************************************************/ + +#include "debug_drv.h" +#include "msp_iicMx.h" +#include "c_type51.h" +#include "tpc_road.h" +///#include "bsp_lora_jx.h" +///#include "bsp_lora.h" + +#include "msp_eeprom.h" + +TS_P_debug *pd=NULL; + +u8 L3_tpc_D2uart(u8 cmd,u8 num) +{ + if(cmd == 0x0D) + {////D2。。。。 透传给串口2的数据 + + if(2 == num)////发送D2 11 22 33的指令后 解析完D2,给串口2 发送11 22 33 + { + printf1("\r\n - >2: %D ",(int)ts_Urec[D_UART1].num); + /// D_lora_wakeup(); + /// L1_uart2_Array(&ts_Urec[D_UART1].sp[1], ts_Urec[D_UART1].num-1); + L0_uartN_Arrayhex_withoutbuf(D_UART1,&ts_Urec[D_UART1].sp[1], ts_Urec[D_UART1].num-1); + }else if(3 == num) + { printfs("\r\n->3:"); + ////L1_uart3_Array(&ts_Urec[D_UART1].sp[1], ts_Urec[D_UART1].num-1); + }else if(4 == num) + { printfs("\r\n->4:"); + ////L1_uart4_Array(&ts_Urec[D_UART1].sp[1], ts_Urec[D_UART1].num-1); + }else + { + printfs("\r\nmust in(D2,D3,D4):"); + } + return 0; + } + return 0; +} + +////通过debug串口 透传协议 +u8 L3_tpc_hex(void) +{ + u8 cmd=0,num=0; + cmd = D_uc_high(ts_Urec[D_UART1].sp[0]);////为485 调整 第一个 + num = D_uc_low(ts_Urec[D_UART1].sp[0]); + printf(" 1->cmd=%X num=%X len = %d ",(int)cmd,(int)num, (int)ts_Urec[D_UART1].num); + +////debug协议使用串口1 故而再次简单解析 要求第一个字符必须为Fx + if(0x0F == cmd)///fx r1 r2 r3 r4 ocr + { + ///TS_P_debug +/// printfs("\r\n cmd = "); + ////pd = (TS_P_debug*)ts_Urec[D_UART1].sp; + L0_uartN_Arrayhex_withoutbuf(D_UART1,&ts_Urec[D_UART1].sp[0], ts_Urec[D_UART1].num);////(U8 *)&pd,错误的表达方式 pd就是地址 + if(num == 0x0e) + { + /// L3_tpc_FEdebug();return 0; + } + return 1; + } + if(L3_tpc_D2uart(cmd,num)) + { + return 1; + }else + { + return 0; + } + + printfs("\r\n cmd error!!"); + return 0; +} + + +////启动透传指令 开关打开 可以模拟当前串口发送 +vtype L2_debug_ONcomand(void) +{ + + if(1 == ts_Urec[D_UART1].debugok) + { ts_Urec[D_UART1].debugok = 0;////解析协议 + /// printf("\r\nw ts_Urec[D_UART1].max = %d num = %d",(int)ts_Urec[D_UART1].rmax,(int)ts_Urec[D_UART1].num); + printf1("\r\ndebugok %2x",(int)ts_Urec[D_UART1].debugok); + + } + if(1 == ts_Urec[D_UART1].ok) + { ts_Urec[D_UART1].ok = 0;////解析协议 +////printf1("\r\nD_UART1 ok %d ",(int) ts_Urec[D_UART1].num); + D_LED1_REV(); + + pd = (TS_P_debug *)ts_Urecbuf.r1; +/// L0_uartN_Arrayhex_withoutbuf(D_UART1,ts_Urecbuf.r1, ts_Urec[D_UART1].num); +///---------串口1的协议分两类 1类是 Fx开头的针对外设x的标准debug协议;例如FD开头是系统debug Fc是iic调试设备 +////一类是Dx开头的对串口x透传协议 ////D2。。。。 透传给串口2的数据 + return L3_tpc_hex();/// + + /// return 0; + } + + /********* + if(1 == ts_Urec[D_UART2].ok) + { ts_Urec[D_UART2].ok = 0;////收到一帧数据 + printf("\r\nUART2:rec: "); +/// sprintf(," %s ",ts_Urecbuf.r2); + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_Arrayhex(ts_Urecbuf.r2, ts_Urec[D_UART2].num); + Lc_buf_copy_uc(ts_Urecbuf.r5,ts_Urecbuf.r2,ts_Urec[D_UART2].num); + return L3_tpc_lora(ts_Urecbuf.r5);/// + } + *********/ + +#ifdef D_USE_UART3 + if(1 == ts_Urec[D_UART3].ok) + { ts_Urec[D_UART3].ok = 0;////解析协议 + printfs("\r\nD_UART3 ok "); + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_Arrayhex(ts_Urecbuf.r3, ts_Urec[D_UART3].num); + } +#else + #warning "CC: without uart3" + +#endif///D_USE_UART33 + + +#ifdef D_USE_UART4 + if(1 == ts_Urec[D_UART4].ok) + { ts_Urec[D_UART4].ok = 0;////解析协议 + printfs("\r\nD_UART3 ok "); + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_Arrayhex(ts_Urecbuf.r4, ts_Urec[D_UART4].num); + } +#else + #warning "CC: without uart4" +#endif///D_USE_UART4 + return 0; +} + +void L3_test_ONdebug(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 + printfs("\r\nDdebug:FD R1 R2 R3 R4 ocr FD->"); + + switch (pd->ocr) + { case 0x11:////Fd 11 22 33 44 55 66 11 + + if(pd->R6 == 0x66) + {///gb2312 + printf(" \r\n \r\n准备烧写,确认主机版本+22M晶振+监测波特率921600 后使用download \r\n "); + printf(" \r\n \r\n 3秒内点击 下载按钮 \r\n "); + + Lc_delay_ms(1000); + printf(" \r\n3\r\n "); + Lc_delay_ms(1000); + printf(" \r\n2\r\n "); + Lc_delay_ms(1000); + printf(" \r\n1\r\n "); + L0_IAP_enter_ISP();///BITN_1(IAP_CONTR, BITN6|BITN5); + }else + { + printf(" \r\n烧写命令错误\r\n ");///gb2312 + } + break; + case 0x22: + ///FD 13 01 33 44 50 /// P13 =1 + ///FX R1 R2 R3 R4 ocr + ///FD R1 R2 R3 R4 ocr + ///FD ch adr reg 12 + ///FD 01 AE 09 44 22 读取 iic第一通道的01 | 地址AE的设备 | 寄存器09 + pd->ocr = L2_IICMx_Read1Reg1D(pd->R1,pd->R2,pd->R3); + printf4("22 ch:(%2X)-%2X S %2X=%2X\r\n",(int)pd->R1,(int)pd->R2,(int)pd->R3,(int)pd->ocr); + break; + case 0x23: + ///FD 13 01 33 50 /// P13 =1 + ///FX R1 R2 R3 R4 ocr + ///FX R1 R2 R3 R4 ocr + ///FD ch adr reg dat 12 + ///FD 01 AE 09 04 23 iic第一通道的01 | 地址AE的设备 | 寄存器09 写入 04 + printf4("23 ch:(%2X)-%2X W %2X=%2X\r\n",(int)pd->R1,(int)pd->R2,(int)pd->R3,(int)pd->R4); + L2_IICMx_WriteCmd(pd->R1,pd->R2,pd->R3,pd->R4); + break; + + + default: + printfs(" pp error\r\n "); + + break; + }; + + printfs("333"); + } +} + +///#define D_keil_sim +#ifdef D_keil_sim +void UartInit(void) //9600bps@11.0592MHz +{ + SCON = 0x50; //8位数?可变波特? + AUXR |= 0x01; //串口1选择定时?为波特率发生? + AUXR |= 0x04; //定时?时钟为Fosc,?T + T2L = 0xE0; //设定定时初 ? + T2H = 0xFE; //设定定时初? + AUXR |= 0x10; //启动定时? +} + +void L3_debug_drv_init(void) +{ + + Ts_debug.uxrev = D_ts_uartX_rev; + + Ts_debug.td = (TS_P_debug *)Ts_debug.uxrev->buf; + Ts_debug.ok = &Ts_debug.uxrev->debugok; + UartInit(); + +} + + +char putchar(char ch) +{ + SBUF = ch; + while(TI == 0); + TI = 0; + return ch; +} + +#else +#warning "CC: putchar ok" + +void L3_debug_drv_init(void) +{ +/// D_s2b_road1_init(); +} + +char putchar(char ch) +{ + /* Place your implementation of fputc here */ + /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */ + /// HAL_UART_Transmit_IT(&huart4, (uint8_t *)&ch, 1); + L1_uartD_uc(ch); + return ch; + ///SBUF= ch; + /// while(t) +/// while(!TI); +// TI = 0; +/// return (SBUF = ch); +} +#endif ///#ifdef D_keil_sim + +#if 0 + +void L3_debug_drv_init(void) +{ + L0pf_send_uc = L0_uart0_uc; + Lc_print("\r\n debug shell init:\t"); +/// io õı׼д + + Lc_print("Mode:"); + #ifdef D_debug_time + Lc_print(" debug"); + #else + //D_debug_time_using + Lc_print(" normal"); + #endif +} + + +#ifdef D_debug_sim + +fff +void L3_debug_cycle(void) +{ + INTERRUPT_UART(); + TIMER0_IRQHandler(); + + + +} +#else + +#endif +void L3_test_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_sendArrayhex(Ts_debug.td,Ts_debug.td->R1); + } +} + +void L3_iicx_debug(u8 filter) +{ + if(filter == Ts_debug.td->filter) + { + if(0x10 == Ts_debug.td->ocr)///read reg1 num 读取reg1地址中的num个数? + { + + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // sla reg1 num + /// f1 32 15 06 10 + + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // sla reg1 num + /// f1 32 0x28 06 10 + /// f1 32 0x28 06 10 + /// 28 + /// 0010 1000 28 + /// 1010 1000 a8 + L2_IICM1_ReadReg(Ts_debug.td->R1,Ts_debug.td->R2,Ts_debug.d,Ts_debug.td->R3); + ///printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + L1_uartD_sendArrayhex(Ts_debug.d,Ts_debug.td->R3); +/// printf("\r\n 0x%2x\r\n",(int)Ts_debug.td->ocr); + } + else if(0x11 == Ts_debug.td->ocr) + { + L2_IICM1_ReadReg(Ts_debug.td->R1,Ts_debug.td->R2,Ts_debug.d,Ts_debug.td->R3); + //printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + //L1_uartD_sendArrayhex(Ts_debug.d,Ts_debug.td->R3); + printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + } + else if(0x12 == Ts_debug.td->ocr) + { + } + else + { + + } + } +} + + + + +#else + + + +#endif + + + +/****************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/debug/debug_drv.h b/source/debug/debug_drv.h new file mode 100644 index 0000000..1bec8ad --- /dev/null +++ b/source/debug/debug_drv.h @@ -0,0 +1,200 @@ +/***************************************************************************** + * DEBUG_DRV.h: Header file for DEBUY DRIVER FILES + * + * + * Copyright(C) 2013, cc + * All rights reserved. + * + * History + * 2013.05.24 ver 1.00 Prelimnary version, first Release + * 2020.02.22 ver 2.00 step 1 led点灯 + step 2.1 uart debug send + step 2.2 uart debug rev with led + step 2.3 debug protocol test + step 3 + step 4 timer test --> get tick + step 5 TTSS task test + step 6 + + +******************************************************************************/ + + +#ifndef __DEBUG_DRV_H +#define __DEBUG_DRV_H + +#include "c_type51.h" +#include "c_lib.h" +#include "msp_uartN.h" + +#include "msp_uart1.h" +//#include "msp_uart2.h"/// +///#include "msp_uart3.h" +///#include "msp_uart4.h"/// + +#include "stdio.h" +//#include "msp_uart4.h" +#include "tpc_x.h" +//#include "tpc_debug.h" + +extern TS_P_debug *pd; + + +#define D_cmd_filter_debug 0xfd +#define D_cmd_filter_gc032A 0xfc + +#define D_cmd_filter_weight 0xFE + + +#define D_cmd_filter_iicx 0xf1 + + +///根据实际电路进行调整 +#if 0 +#define L1_uartD_senduc(x) L1_uart4_senduc((x) +#define L1_uartD_sendArray(x,len) L1_uart4_sendArray((x),(len)) +#define L1_uartD_sendStr(x) L1_uart4_sendStr((x)) +#define L1_uartD_waitFree() L1_uart4_waitFree() +#define D_ts_uartX_rev (&TP_Uart_RE_) + +#define Uart_Send_Msg(X); L1_uartD_sendStr(X); + +#else +#define L1_uartD_0d0a() L0_uartN_0d0a(D_UART1) +#define L1_uartD_uc(x) L0_uartN_uc(D_UART1,(x)) +#define L1_uartD_us(x) L0_uartN_us(D_UART1,(x)) +#define L1_uartD_uchex(x) L0_uartN_uchex(D_UART1,(x)) +#define L1_uartD_ushex(x) L0_uartN_ushex(D_UART1,(x)) +#define L1_uartD_ulhex(x) L0_uartN_ulhex(D_UART1,(x)) +#define L1_uartD_Array(x,len) L0_uartN_Array(D_UART1,(x),(len)) +#define L1_uartD_ArrayLong(x,start,end) L0_uartN_Arraylong(D_UART1,x,start,end) + +#define L1_uartD_Arrayhex(x,len) L0_uartN_Arrayhex_withoutbuf(D_UART1,(x),(len)) +////#define L1_uartD_ushexArray(x,len) L0_uartN_ushexArray(D_UART1,(x),(len)) + + +#define L1_uartD_Str(x) L0_uartN_str(D_UART1,(x)) +#define L1_uartD_waitFree() L0_waitFree_uartN(D_UART1) +#define D_ts_uartX_rev (&ts_s2b1_road) + +#define Uart__Msg(X); L1_uartD_Str(X); +#define uartSendByte(X) L0_uartN_ushex(D_UART1,(X)) +#define Uart__Hex(x,u) L0_uartN_ushex(D_UART1,(x)) + + +#endif + +///#define xxxlog(format, ...) printf("[%s:%d->%s] ",format, __FILE__, __LINE__, __func__, ##__VA_ARGS__) + +//////#define printfs_debug + +#ifdef printfs_debug +#define printfs(str) +#define printf1(str,i1) +#define printf2(str,i1,i2) +#define printf3(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) +#else +#define printfs(str) L1_uartD_waitFree() ;printf(str) +#define printf1(str,i1) L1_uartD_waitFree() ;printf(str,i1) +#define printf2(str,i1,i2) L1_uartD_waitFree() ;printf(str,i1,i2) +#define printf3(str,i1,i2,i3) L1_uartD_waitFree() ;printf(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4) +#define printf5(str,i1,i2,i3,i4,i5) L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4,i5) + +/* + +#define printfs(str) L1_uartD_Str(str);///L1_uartD_waitFree() ;printf(str) +#define printf1(str,i1) L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1) +#define printf2(str,i1,i2) printf1(str,i1);L1_uartD_ushex(i2);///L1_uartD_waitFree() ;printf(str,i1,i2) +#define printf3(str,i1,i2,i3) printf2(str,i1,i2);L1_uartD_ushex(i3);///L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) printf3(str,i1,i2,i3);L1_uartD_ushex(i4);///L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4) +#define printf5(str,i1,i2,i3,i4,i5) printf4(str,i1,i2,i3,i4);L1_uartD_ushex(i5);///L1_uartD_Str(str);L0_uartN_ushex(i1);/// L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4,i5) +*/ + + +#endif +///L0_waitFree_uartN + +extern void L3_debug_drv_init(void); +extern void L3_test_ONdebug(u8 filter); +extern vtype L2_debug_ONcomand(void); + + +extern void L3_iicx_debug(u8 filter); + +#if 0 +if(1 == ts_uart4_rev.revok) +{ts_uart4_rev.revok= 0; + td = (TS_P_debug *)ts_uart4_rev.buf; + L1_uart4_sendArray(ts_uart4_rev.buf, 5); + if(D_sb_filter == td->filter) + { + if(0x04 == td->R1)///设置四个传感器的清零 + { //// fd 04 33 44 55 + +void L3_debug_drv_init(void); +#define L3_debug_time() L0pf_send_uc = L0_uart0_uc; ///Lc_print("\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); +extern void L3_debug_cycle(void); + + +#define UART_debug_reg ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +//#define UART_debug ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) +//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) +#define UART_debug 1 + +#define L0_debugS_uc(x) //L0_Usend_uc(UART_debug,x) +#define L0_debugS_uc_hex(x) //L0_Usend_uc_hex(UART_debug,x) +#define L0_debug_uc_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_us_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_ul_show(x,y); //L0_USART_print(UART_debug,x,y); + + +//#define L2_debug_info(x) //L0_USART_print(UART_debug,x); +#define L2_debug_Au4B(x) // L0_Usend_Au4B(UART_debug,x) +#define L0_debug_Au4B_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_Aus_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_A4B_show(x,y); //L0_USART_print(UART_debug,x,y); + + +//#define debug22(format...) Lc_print("%s (%d): ",__FILE__,__LINE__); + +//#define LOG(format, args...) Lc_print(format, ##args) +//#define RTA_printf(...) Lc_print(__VA_ARGS__) + +//#define L2_debug_info Lc_print + +//#define L3_debug_time() Lc_print(L0_uart0_uc,"\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); + + + + +#define L2_debug_info(...) \ +Lc_print(L0_uart_uc,__VA_ARGS__); + +//do { +//Lc_print("%s (%d): ", __FILE__, __LINE__); +//Lc_print(format, __VA_ARGS__); +//} while (0) + + +#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } + +#define LOG(...) {\ + Lc_print(L0_uart_uc,"%s: Line %d:\t", __FILE__, __LINE__);\ + Lc_print(L0_uart_uc, __VA_ARGS__);\ + Lc_print(L0_uart_uc,"\n");\ +} + +int main() { + int x = 3; + // һЩ... + LOG("x = %d", x); // 2-1-5.cpp: Line 12: x = 3 +} +#endif +#endif /* end __DEBUG_DRV_H */ + +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/debug/debug_drv.h.bak b/source/debug/debug_drv.h.bak new file mode 100644 index 0000000..0a37557 --- /dev/null +++ b/source/debug/debug_drv.h.bak @@ -0,0 +1,203 @@ +/***************************************************************************** + * DEBUG_DRV.h: Header file for DEBUY DRIVER FILES + * + * + * Copyright(C) 2013, cc + * All rights reserved. + * + * History + * 2013.05.24 ver 1.00 Prelimnary version, first Release + * 2020.02.22 ver 2.00 step 1 led点灯 + step 2.1 uart debug send + step 2.2 uart debug rev with led + step 2.3 debug protocol test + step 3 + step 4 timer test --> get tick + step 5 TTSS task test + step 6 + + +******************************************************************************/ + + +#ifndef __DEBUG_DRV_H +#define __DEBUG_DRV_H + +#include "c_type51.h" +#include "c_lib.h" +#include "msp_uartN.h" + +#include "msp_uart1.h" +//#include "msp_uart2.h"/// +///#include "msp_uart3.h" +///#include "msp_uart4.h"/// + +#include "stdio.h" +//#include "msp_uart4.h" +#include "tpc_x.h" +//#include "tpc_debug.h" + +extern TS_P_debug *pd; + + +#define D_cmd_filter_debug 0xfd +#define D_cmd_filter_gc032A 0xfc + +#define D_cmd_filter_weight 0xFE + + +#define D_cmd_filter_iicx 0xf1 + + +///根据实际电路进行调整 +#if 0 +#define L1_uartD_senduc(x) L1_uart4_senduc((x) +#define L1_uartD_sendArray(x,len) L1_uart4_sendArray((x),(len)) +#define L1_uartD_sendStr(x) L1_uart4_sendStr((x)) +#define L1_uartD_waitFree() L1_uart4_waitFree() +#define D_ts_uartX_rev (&TP_Uart_RE_) + +#define Uart_Send_Msg(X); L1_uartD_sendStr(X); + +#else +#define L1_uartD_0d0a() L0_uartN_0d0a(D_UART1) +#define L1_uartD_uc(x) L0_uartN_uc(D_UART1,(x)) +#define L1_uartD_us(x) L0_uartN_us(D_UART1,(x)) +#define L1_uartD_uchex(x) L0_uartN_uchex(D_UART1,(x)) +#define L1_uartD_ushex(x) L0_uartN_ushex(D_UART1,(x)) +#define L1_uartD_ulhex(x) L0_uartN_ulhex(D_UART1,(x)) +#define L1_uartD_Array(x,len) L0_uartN_Array(D_UART1,(x),(len)) +#define L1_uartD_ArrayLong(x,start,end) L0_uartN_Arraylong(D_UART1,x,start,end) +////#define L1_uartD_Arrayhex(x,len) L0_uartN_uchexArray(D_UART1,(x),(len)) + + +#define L1_uartD_Arrayhex(x,len) L0_uartN_Arrayhex_withoutbuf(D_UART1,(x),(len)) +////#define L1_uartD_ushexArray(x,len) L0_uartN_ushexArray(D_UART1,(x),(len)) + + +#define L1_uartD_Str(x) L0_uartN_str(D_UART1,(x)) +#define L1_uartD_waitFree() L0_waitFree_uartN(D_UART1) +#define D_ts_uartX_rev (&ts_s2b1_road) + +#define Uart__Msg(X); L1_uartD_Str(X); +#define uartSendByte(X) L0_uartN_ushex(D_UART1,(X)) +#define Uart__Hex(x,u) L0_uartN_ushex(D_UART1,(x)) + + +#endif + +///#define xxxlog(format, ...) printf("[%s:%d->%s] ",format, __FILE__, __LINE__, __func__, ##__VA_ARGS__) + +//////#define printfs_debug + +#ifdef printfs_debug +#define printfs(str) +#define printf1(str,i1) +#define printf2(str,i1,i2) +#define printf3(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) +#else + +#define printfs(str) L1_uartD_waitFree() ;printf(str) +#define printf1(str,i1) L1_uartD_waitFree() ;printf(str,i1) +#define printf2(str,i1,i2) L1_uartD_waitFree() ;printf(str,i1,i2) +#define printf3(str,i1,i2,i3) L1_uartD_waitFree() ;printf(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4) +#define printf5(str,i1,i2,i3,i4,i5) L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4,i5) + +/* + +#define printfs(str) L1_uartD_Str(str);///L1_uartD_waitFree() ;printf(str) +#define printf1(str,i1) L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1) +#define printf2(str,i1,i2) printf1(str,i1);L1_uartD_ushex(i2);///L1_uartD_waitFree() ;printf(str,i1,i2) +#define printf3(str,i1,i2,i3) printf2(str,i1,i2);L1_uartD_ushex(i3);///L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1,i2,i3) +#define printf4(str,i1,i2,i3,i4) printf3(str,i1,i2,i3);L1_uartD_ushex(i4);///L1_uartD_Str(str);L1_uartD_ushex(i1);///L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4) +#define printf5(str,i1,i2,i3,i4,i5) printf4(str,i1,i2,i3,i4);L1_uartD_ushex(i5);///L1_uartD_Str(str);L0_uartN_ushex(i1);/// L1_uartD_waitFree() ;printf(str,i1,i2,i3,i4,i5) +*/ + + +#endif +///L0_waitFree_uartN + +extern void L3_debug_drv_init(void); +extern void L3_test_ONdebug(u8 filter); +extern vtype L2_debug_ONcomand(void); + + +extern void L3_iicx_debug(u8 filter); + +#if 0 +if(1 == ts_uart4_rev.revok) +{ts_uart4_rev.revok= 0; + td = (TS_P_debug *)ts_uart4_rev.buf; + L1_uart4_sendArray(ts_uart4_rev.buf, 5); + if(D_sb_filter == td->filter) + { + if(0x04 == td->R1)///设置四个传感器的清零 + { //// fd 04 33 44 55 + +void L3_debug_drv_init(void); +#define L3_debug_time() L0pf_send_uc = L0_uart0_uc; ///Lc_print("\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); +extern void L3_debug_cycle(void); + + +#define UART_debug_reg ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +//#define UART_debug ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) +//#define UART_debug ((LPC_UART_TypeDef *) LPC_UART_BASE ) +#define UART_debug 1 + +#define L0_debugS_uc(x) //L0_Usend_uc(UART_debug,x) +#define L0_debugS_uc_hex(x) //L0_Usend_uc_hex(UART_debug,x) +#define L0_debug_uc_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_us_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_ul_show(x,y); //L0_USART_print(UART_debug,x,y); + + +//#define L2_debug_info(x) //L0_USART_print(UART_debug,x); +#define L2_debug_Au4B(x) // L0_Usend_Au4B(UART_debug,x) +#define L0_debug_Au4B_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_Aus_show(x,y); //L0_USART_print(UART_debug,x,y); +#define L0_debug_A4B_show(x,y); //L0_USART_print(UART_debug,x,y); + + +//#define debug22(format...) Lc_print("%s (%d): ",__FILE__,__LINE__); + +//#define LOG(format, args...) Lc_print(format, ##args) +//#define RTA_printf(...) Lc_print(__VA_ARGS__) + +//#define L2_debug_info Lc_print + +//#define L3_debug_time() Lc_print(L0_uart0_uc,"\r\n%s,-%sL:%d,",__DATE__,__TIME__,__LINE__); + + + + +#define L2_debug_info(...) \ +Lc_print(L0_uart_uc,__VA_ARGS__); + +//do { +//Lc_print("%s (%d): ", __FILE__, __LINE__); +//Lc_print(format, __VA_ARGS__); +//} while (0) + + +#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } + +#define LOG(...) {\ + Lc_print(L0_uart_uc,"%s: Line %d:\t", __FILE__, __LINE__);\ + Lc_print(L0_uart_uc, __VA_ARGS__);\ + Lc_print(L0_uart_uc,"\n");\ +} + +int main() { + int x = 3; + // һЩ... + LOG("x = %d", x); // 2-1-5.cpp: Line 12: x = 3 +} +#endif +#endif /* end __DEBUG_DRV_H */ + +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/debug/debug_drvdd.c b/source/debug/debug_drvdd.c new file mode 100644 index 0000000..a06acb6 --- /dev/null +++ b/source/debug/debug_drvdd.c @@ -0,0 +1,378 @@ +/***************************************************************************** + * debug_drv.c: debug app + * + * Copyright(C) 2013, cc + * All rights reserved. + * + * History + * 2013.05.24 ver 1.00 Prelimnary version, first Release + * + + +if(ts_s2b_debug.idle) +{ + ts_s2b_debug.idle = 0; + printf("\r\n O"); + if(ts_s2b_debug.len > 0) + { +//// L1_uartD_sendArrayhex((U8 *)&ts_s2b_debug.t, 5); + /// xxxx///提取协议 + /// if(debgu) ts_s2b_debug.ok =1; + + printf("\r\n len = %d",(int)ts_s2b_debug.len); + ts_s2b_debug.len = 0; + } +} + + +******************************************************************************/ + +#include "debug_drv.h" +///#include "msp_iicM1.h" +#include "c_type51.h" +///#include "msp_uart2.h" + +#include "tpc_road.h" +TS_P_debug *pd=NULL; + +////启动透传指令 开关打开 可以模拟当前串口发送 +vtype L2_debug_comand(void) +{ + u8 cmd=0,num=0; + if(1 == ts_Urec[D_UART1].debugok) + { ts_Urec[D_UART1].debugok = 0;////解析协议 + /// printf("\r\nw ts_Urec[D_UART1].max = %d num = %d",(int)ts_Urec[D_UART1].rmax,(int)ts_Urec[D_UART1].num); + printf("\r\ndebugok",(int)(int)ts_Urec[D_UART1].debugok); + + } + if(1 == ts_Urec[D_UART1].ok) + { ts_Urec[D_UART1].ok = 0;////解析协议 + L1_uartD_sendArrayhex(ts_Urecbuf.r1, ts_Urec[D_UART1].num);L1_uartD_0d0a(); +///---------串口1的协议分两类 1类是 Fx开头的针对外设x的标准debug协议;例如FD开头是系统debug Fc是iic调试设备 +////一类是Dx开头的对串口x透传协议 ////D2。。。。 透传给串口2的数据 + cmd = D_uc_high(ts_Urecbuf.r1[0]); + num = D_uc_low(ts_Urecbuf.r1[0]); + printf(" 0->%X %X ",(int)cmd,(int)num ); + if(cmd == 0x0D) + {////D2。。。。 透传给串口2的数据 + L1_uartD_sendArrayhex(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + if(2 == num) + { printf(" 2-> "); + L1_uart2_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + }else if(3 == num) + { printf(" 3-> "); + L1_uart3_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + }else if(4 == num) + { printf(" 4-> "); + L1_uart4_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + }else + { + } + return 1; + + } + ////debug协议使用串口1 故而再次简单解析 要求第一个字符必须为Fx + if(0x0F == cmd) + { + ///TS_P_debug + pd = (TS_P_debug*)ts_Urecbuf.r1; + L1_uartD_sendArrayhex((U8 *)pd, 5);////(U8 *)&pd,错误的表达方式 pd就是地址 + return 1; + } + printf("\r\n ok "); + } + + if(1 == ts_Urec[D_UART2].ok) + { ts_Urec[D_UART2].ok = 0;////收到一帧数据 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r2, ts_Urec[D_UART2].num); + } + if(1 == ts_Urec[D_UART3].ok) + { ts_Urec[D_UART3].ok = 0;////解析协议 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r3, ts_Urec[D_UART3].num); + } + if(1 == ts_Urec[D_UART4].ok) + { ts_Urec[D_UART4].ok = 0;////解析协议 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r4, ts_Urec[D_UART4].num); + } + + return 0; +} +////启动透传指令 开关打开 可以模拟当前串口发送 +vtype L2_debug_comand333(void) +{ + if(1 == ts_Urec[D_UART1].debugok) + { ts_Urec[D_UART1].debugok = 0;////解析协议 + /// printf("\r\nw ts_Urec[D_UART1].max = %d num = %d",(int)ts_Urec[D_UART1].rmax,(int)ts_Urec[D_UART1].num); + printf("\r\ndebugok",(int)(int)ts_Urec[D_UART1].debugok); + + } + if(1 == ts_Urec[D_UART1].ok) + { ts_Urec[D_UART1].ok = 0;////解析协议 + L1_uartD_sendArrayhex(ts_Urecbuf.r1, ts_Urec[D_UART1].num);L1_uartD_0d0a(); +///---------串口1的协议分两类 1类是 Fx开头的针对外设x的标准debug协议;例如FD开头是系统debug Fc是iic调试设备 +////一类是Dx开头的对串口x透传协议 ////D2。。。。 透传给串口2的数据 + if((ts_Urecbuf.r1[0]&0xF0) == 0xD0) + {////D2。。。。 透传给串口2的数据 + printf("\r\n Dn=%x :",(int)(ts_Urecbuf.r1[0]&0x0F)); + L1_uartD_sendArrayhex(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + if(ts_Urecbuf.r1[0]&0x0f == 0x02) + { printf(" 2-> "); + L1_uart2_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + }else if(ts_Urecbuf.r1[0]&0x0f == 0x03) + { printf(" 3-> "); + L1_uart3_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + }else if(ts_Urecbuf.r1[0]&0x0f == 0x04) + { printf(" 4-> "); + L1_uart4_sendArray(&ts_Urecbuf.r1[1], ts_Urec[D_UART1].num-1); + + }else + {printf(" 4->%x %x ",(int)(ts_Urecbuf.r1[0]&0xF0), (int)(ts_Urecbuf.r1[0]&0x0f) ); + } + return 1; + + } + ////debug协议使用串口1 故而再次简单解析 要求第一个字符必须为Fx + if(ts_Urecbuf.r1[0]&0xf0 == 0xf0) + { + ///TS_P_debug + pd = (TS_P_debug*)ts_Urecbuf.r1; + L1_uartD_sendArrayhex((U8 *)pd, 5);////(U8 *)&pd,错误的表达方式 pd就是地址 + return 1; + } + printf("\r\n ok "); + } + + if(1 == ts_Urec[D_UART2].ok) + { ts_Urec[D_UART2].ok = 0;////收到一帧数据 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r2, ts_Urec[D_UART2].num); + } + if(1 == ts_Urec[D_UART3].ok) + { ts_Urec[D_UART3].ok = 0;////解析协议 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r3, ts_Urec[D_UART3].num); + } + if(1 == ts_Urec[D_UART4].ok) + { ts_Urec[D_UART4].ok = 0;////解析协议 + + //pd = (TS_P_debug*)ts_Urecbuf.r2;//// + //L1_uartD_sendArrayhex((char *)pd, ts_Urec[D_UART2].num); + L1_uartD_sendArrayhex(ts_Urecbuf.r4, ts_Urec[D_UART4].num); + } + + return 0; +} + +void L3_test_debug(u8 filter) +{ + if(filter == pd->filter) + {///filter num d1 d2 d3 ....dn + //// FD 08 11 22 33 44 55 66 77 88 + printf("\r\n FD ok"); + + switch (pd->ocr) + { + case 0x11: + + printf("11"); + //// D_lora_wakeup(); L0_uart2_sendArray(test, 13); + printf(" lora send "); +/// L1_uartD_sendArrayhex(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_sendArrayhex(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"); + } +} + +///#define D_keil_sim +#ifdef D_keil_sim +void UartInit(void) //9600bps@11.0592MHz +{ + SCON = 0x50; //8位数?可变波特? + AUXR |= 0x01; //串口1选择定时?为波特率发生? + AUXR |= 0x04; //定时?时钟为Fosc,?T + T2L = 0xE0; //设定定时初 ? + T2H = 0xFE; //设定定时初? + AUXR |= 0x10; //启动定时? +} + +void L3_debug_drv_init(void) +{ + + Ts_debug.uxrev = D_ts_uartX_rev; + + Ts_debug.td = (TS_P_debug *)Ts_debug.uxrev->buf; + Ts_debug.ok = &Ts_debug.uxrev->debugok; + UartInit(); + +} + + +char putchar(char ch) +{ + SBUF = ch; + while(TI == 0); + TI = 0; + return ch; +} + +#else + + +void L3_debug_drv_init(void) +{ + D_s2b_road1_init(); +} + +char putchar(char ch) +{ + /* Place your implementation of fputc here */ + /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */ + /// HAL_UART_Transmit_IT(&huart4, (uint8_t *)&ch, 1); + L1_uartD_senduc(ch); + return ch; + ///SBUF= ch; + /// while(t) +/// while(!TI); +// TI = 0; +/// return (SBUF = ch); +} +#endif ///#ifdef D_keil_sim + +#if 0 + +void L3_debug_drv_init(void) +{ + L0pf_send_uc = L0_uart0_uc; + Lc_print("\r\n debug shell init:\t"); +/// io õı׼д + + Lc_print("Mode:"); + #ifdef D_debug_time + Lc_print(" debug"); + #else + //D_debug_time_using + Lc_print(" normal"); + #endif +} + + +#ifdef D_debug_sim + +fff +void L3_debug_cycle(void) +{ + INTERRUPT_UART(); + TIMER0_IRQHandler(); + + + +} + +#else + +#endif +void L3_test_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_sendArrayhex(Ts_debug.td,Ts_debug.td->R1); + } +} + +void L3_iicx_debug(u8 filter) +{ + + if(filter == Ts_debug.td->filter) + { + if(0x10 == Ts_debug.td->ocr)///read reg1 num 读取reg1地址中的num个数? + { + + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // sla reg1 num + /// f1 32 15 06 10 + + + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // sla reg1 num + /// f1 32 0x28 06 10 + /// f1 32 0x28 06 10 + /// 28 + /// 0010 1000 28 + /// 1010 1000 a8 + L2_IICM1_ReadReg(Ts_debug.td->R1,Ts_debug.td->R2,Ts_debug.d,Ts_debug.td->R3); + ///printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + L1_uartD_sendArrayhex(Ts_debug.d,Ts_debug.td->R3); +/// printf("\r\n 0x%2x\r\n",(int)Ts_debug.td->ocr); + } + else if(0x11 == Ts_debug.td->ocr) + { + L2_IICM1_ReadReg(Ts_debug.td->R1,Ts_debug.td->R2,Ts_debug.d,Ts_debug.td->R3); + //printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + //L1_uartD_sendArrayhex(Ts_debug.d,Ts_debug.td->R3); + + + printf("\r\n 0x%2x 0x%2x\r\n",(int)Ts_debug.d[0],(int)Ts_debug.d[1]); + + + + + } + else if(0x12 == Ts_debug.td->ocr) + { + } + else + { + + } + } +} + + + + +#else + + + +#endif + + + +/****************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/debug/testiic.uvla b/source/debug/testiic.uvla new file mode 100644 index 0000000..95fb5b0 Binary files /dev/null and b/source/debug/testiic.uvla differ diff --git a/source/msp/202204201431275395_202204201431274606.jpg b/source/msp/202204201431275395_202204201431274606.jpg new file mode 100644 index 0000000..ddc7a30 Binary files /dev/null and b/source/msp/202204201431275395_202204201431274606.jpg differ diff --git a/source/msp/STC8_MDU16_V1.0.LIB b/source/msp/STC8_MDU16_V1.0.LIB new file mode 100644 index 0000000..969483c Binary files /dev/null and b/source/msp/STC8_MDU16_V1.0.LIB differ diff --git a/source/msp/mcu support/.keep b/source/msp/mcu support/.keep new file mode 100644 index 0000000..e69de29 diff --git a/source/msp/mcu support/UARTN.C b/source/msp/mcu support/UARTN.C new file mode 100644 index 0000000..5721ccc --- /dev/null +++ b/source/msp/mcu support/UARTN.C @@ -0,0 +1,211 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +c_lib/c_lib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uartN.h" + +TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; + +void L0_uartN_set(U8 uartx,U8 x) /*reentrant*/ +{ + switch(uartx) + { + case 0:SBUF = (x);break; + case 1:S2BUF = (x);break; + case 2:S3BUF = (x);break; + case 3:S4BUF = (x);break; + default:break; + } +} + +U8 L0_uartN_get(U8 uartx) +{ + U8 x = 0; + switch(uartx) + { + case 0:x = SBUF; break; + case 1:x = S2BUF;break; + case 2:x = S3BUF;break; + case 3:x = S4BUF;break; + default:break; + } + return x; +} + +void L0_waitFree_uartN(U8 uartx) +{ + ts_uart[uartx].p->over = 0; + while(ts_uart[uartx].p->ok != D_ready) + { + #if 0 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_uart[uartx].p->over ++ > 600000) + { + break; + } + #endif + } +} + +void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->ok = D_clear; + ts_uart[uartx].p->over = 0; + ts_uart[uartx].p->max = len; + ts_uart[uartx].p->now = 1; + if(len <= D_send_buf_max) + { + //将参数buf拷贝至内部buf + for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) + { + ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; + } + ts_uart[uartx].p->p = ts_uart[uartx].p->buf; + } + else + { + //不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错 + ts_uart[uartx].p->p = (U8 *)buf; + } + L0_uartN_set(uartx,ts_uart[uartx].p->p[0]); +} + +void L0_uartN_uc(U8 uartx,U8 ww) +{ + L0_uartN_sendArray(uartx,&ww,1); +} + +void L0_uartN_us(U8 uartx,vU16 ww) +{ + U_U16 uStemp; + uStemp.word = ww; + ts_uart[uartx].p->buf3[0] = uStemp.BYTE2.h; + ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_ul(U8 uartx,vU32 ww) +{ + U_U32 uStemp; + L0_waitFree_uartN(uartx); + uStemp.dWord = ww; + ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0; + ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1; + ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2; + ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); +} + +void L0_uartN_0d0a(U8 uartx) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->buf3[0] = 0x0d; + ts_uart[uartx].p->buf3[1] = 0x0a; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_uchex(U8 uartx,U8 ww) +{ + L0_waitFree_uartN(uartx); + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); +} + +void L0_uartN_ushex(U8 uartx,vU16 ww) +{ + U_F16 k; + L0_waitFree_uartN(uartx); + k.us = ww; + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; + ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); +} + +void L0_uartN_ulhex(U8 uartx,U32 ww) +{ + U_U32 k; + L0_waitFree_uartN(uartx); + k.dWord = ww; + ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; + ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; + ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; + ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; + ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; + ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; + ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; + ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; + L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8); +} + +void L0_uartN_sendstr(U8 uartx,U8 *str) +{ + L0_uartN_sendArray(uartx,str,libc_strlen(str)); +} + +void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) +{ + int i; + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +////fixme:和cpu的程序容量息息相关 +#define D_send_buf_max 16 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms + /// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms + /// 128Bytes = 128*0.5ms = 64ms +#define D_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数 + +typedef struct _ts_uart0_send_buf_ +{//8byte + vU8 num; //接收到的数目注意数据长度的范围 + vU8 *p; + vU16 now; /// 当前buf所在的位置 0------(max-1) + vU16 max; /// 当前buf的最大值,也就是需要发送的长度 + vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 + vU8 ok; /// 发送完成标志 + vU8 buf[D_send_buf_max + 1]; +/// U8 buf2[D_send_buf2_max]; + vU8 buf3[D_send_buf2_max]; +//// U8 buf4[D_send_buf_max]; + /// U8 buf[D_send_buf_max + 1];//buffer 的第一位是 长度 +}TP_Uart_RE_; + +typedef struct _TS_uart_reg +{ + TP_Uart_RE_ *p; + //eUSCI_UART_Config *c; + //int sta; + //U8 heartbeat; + TP_Handler_X *t; + void (*tp_handler)(TP_Handler_X *); //reentrant; + U8 *ack; //ack +}TS_uart_reg; + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#define SERIAL_MAX_NUM 1 +extern TS_uart_reg ts_uart[SERIAL_MAX_NUM]; + +extern void L0_uartN_init(U8 uartx); +extern void L0_uartN_set(U8 uartx,U8 x); +extern U8 L0_uartN_get(U8 uartx); +extern void L0_uartN_sendArray(U8 uartx,void *buf,U16 len); +extern void L0_uartN_uc(U8 uartx,U8 ww); +extern void L0_uartN_us(U8 uartx,vU16 ww); +extern void L0_uartN_ul(U8 uartx,vU32 ww); +extern void L0_uartN_0d0a(U8 uartx); +extern void L0_uartN_uchex(U8 uartx, U8 ww); +extern void L0_uartN_ushex(U8 uartx, U16 ww); +extern void L0_uartN_ulhex(U8 uartx, U32 ww); +extern void L0_uartN_sendstr(U8 uartx,U8 *buf); +extern void L1_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n); + + +#endif //#ifndef _uartN_H + diff --git a/source/msp/mcu support/msp_SSPI0.c b/source/msp/mcu support/msp_SSPI0.c new file mode 100644 index 0000000..b6f8d7b --- /dev/null +++ b/source/msp/mcu support/msp_SSPI0.c @@ -0,0 +1,63 @@ + +#include "msp_sspi0.h" + +#define D_sspi0__DELAY 10 +TS_sspi ts_sspi0; + +vType L0_sspi0_MISO_get(void) +{ + if(D_sspi0_MISO_GET()) + { + return 1; + }else + { + return 0; + } +} + +void L0_sspi0_MOSI_set(vType v) +{ + if(v) + { + D_sspi0_MOSI_ON(); + }else + { + D_sspi0_MOSI_OFF(); + } + + Lc_delay_us(D_sspi0__DELAY); +} + +void L0_sspi0_SCLK_set(vType v) +{ + if(v) + { + D_sspi0_SCLK_ON(); + }else + { + D_sspi0_SCLK_OFF(); + } + + Lc_delay_us(D_sspi0__DELAY); +} + +void L0_sspi0_close(void) +{ + ///ܽΪ̬ +} + +void L1_sspi0_init(void) +{ + + D_sspi0_IO_init(); + ts_sspi0.pf_MISO_get = L0_sspi0_MISO_get; + ts_sspi0.pf_MOSI_set = L0_sspi0_MOSI_set; + ts_sspi0.pf_SCLK_set = L0_sspi0_SCLK_set; + + ts_sspi0.pf_close = L0_sspi0_close; +} + +/******************************END*********************************/ + + + diff --git a/source/msp/mcu support/msp_SSPI0.h b/source/msp/mcu support/msp_SSPI0.h new file mode 100644 index 0000000..3166d1c --- /dev/null +++ b/source/msp/mcu support/msp_SSPI0.h @@ -0,0 +1,51 @@ +// Description: Use of the MSP430F5528 USCI A0 peripheral for setting up and +// communicating to the ADS1220 24-bit ADC. +// +#if 0 + ADC SPI_SS P10.0 UC3BSTE 100 + SPI-SCK P10.1 UC4BSCK 1 + SPI-SIMO P10.2 UC5BSIMO 2 + SPI-SOMI P10.3 UC6BSOMI 3 + + + +#endif + +#ifndef _msp_sspi0_H +#define _msp_sspi0_H + +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" + +#include "msp_uart0.h" +#include "msp_SSPIx.h" + +#define D_sspi0_MISO_init() D_P103_IN(); +#define D_sspi0_MOSI_init() D_P102_OUT(); +#define D_sspi0_SCLK_init() D_P101_OUT(); + + +#define D_sspi0_MOSI_ON() D_P102_ON(); +#define D_sspi0_SCLK_ON() D_P101_ON();Lc_delay_us(10); + +#define D_sspi0_MOSI_OFF() D_P102_OFF(); +#define D_sspi0_SCLK_OFF() D_P101_OFF();Lc_delay_us(10); + + + +#define D_sspi0_MISO_GET() D_P103_AT() +#define D_sspi0_INT__AT() D_P10_AT() + + + +#define D_sspi0_IO_init() D_sspi0_MISO_init();\ + D_sspi0_MOSI_init();\ + D_sspi0_SCLK_init(); + + +extern TS_sspi ts_sspi0; +extern void L1_sspi0_init(void); + +#endif////_msp_SPI_sim_H + + diff --git a/source/msp/mcu support/msp_SSPI1.c b/source/msp/mcu support/msp_SSPI1.c new file mode 100644 index 0000000..fb6ce83 --- /dev/null +++ b/source/msp/mcu support/msp_SSPI1.c @@ -0,0 +1,63 @@ + +#include "msp_sspi1.h" + +#define D_sspi1__DELAY 10 +TS_sspi ts_sspi1; + +vType L0_sspi1_MISO_get(void) +{ + if(D_sspi1_MISO_GET()) + { + return 1; + }else + { + return 0; + } +} + +void L0_sspi1_MOSI_set(vType v) +{ + if(v) + { + D_sspi1_MOSI_ON(); + }else + { + D_sspi1_MOSI_OFF(); + } + + Lc_delay_us(D_sspi1__DELAY); +} + +void L0_sspi1_SCLK_set(vType v) +{ + if(v) + { + D_sspi1_SCLK_ON(); + }else + { + D_sspi1_SCLK_OFF(); + } + + Lc_delay_us(D_sspi1__DELAY); +} + +void L0_sspi1_close(void) +{ + ///ܽΪ̬ +} + +void L1_sspi1_init(void) +{ + + D_sspi1_IO_init(); + ts_sspi1.pf_MISO_get = L0_sspi1_MISO_get; + ts_sspi1.pf_MOSI_set = L0_sspi1_MOSI_set; + ts_sspi1.pf_SCLK_set = L0_sspi1_SCLK_set; + + ts_sspi1.pf_close = L0_sspi1_close; +} + +/******************************END*********************************/ + + + diff --git a/source/msp/mcu support/msp_SSPI1.h b/source/msp/mcu support/msp_SSPI1.h new file mode 100644 index 0000000..f98abe9 --- /dev/null +++ b/source/msp/mcu support/msp_SSPI1.h @@ -0,0 +1,52 @@ +// Description: Use of the MSP430F5528 USCI A0 peripheral for setting up and +// communicating to the ADS1220 24-bit ADC. +// +// +// +// MSP430x552x +// ------------------ +// /|\| | +// | | | +// --|RST P3.4|<-- MISO (DOUT) +// | | +// | P3.3|--> MOSI (DIN) +// | | +// | P2.7|--> SCLK +// | | +// | P2.6|<-- INT (DRDY) +// | | +// | P1.2|--> CS +#ifndef _msp_Ssspi1_H +#define _msp_Ssspi1_H + +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" + +#include "msp_uart0.h" +#include "msp_SSPIx.h" + +#define D_sspi1_MISO_init() D_P34_IN(); +#define D_sspi1_MOSI_init() D_P33_OUT(); +#define D_sspi1_SCLK_init() D_P27_OUT(); +///#define D_sspi1_INT__init() D_P10_IN(); + +#define D_sspi1_MISO_GET() D_P34_AT() +#define D_sspi1_MOSI_ON() D_P33_ON(); +#define D_sspi1_SCLK_ON() D_P27_ON();Lc_delay_us(10); + +#define D_sspi1_MOSI_OFF() D_P33_OFF(); +#define D_sspi1_SCLK_OFF() D_P27_OFF();Lc_delay_us(10); + +////#define D_sspi1_INT__AT() D_P10_AT() + +#define D_sspi1_IO_init() D_sspi1_MISO_init();\ + D_sspi1_MOSI_init();\ + D_sspi1_SCLK_init(); +/// D_sspi1_INT__init() + +extern TS_sspi ts_sspi1; +extern void L1_sspi1_init(void); + +#endif////_msp_SPI_sim_H + + diff --git a/source/msp/mcu support/msp_SSPI2.c b/source/msp/mcu support/msp_SSPI2.c new file mode 100644 index 0000000..64e87ca --- /dev/null +++ b/source/msp/mcu support/msp_SSPI2.c @@ -0,0 +1,62 @@ + +#include "msp_SSPI2.h" +#define D_sspi2_DELAY 10 +TS_sspi ts_sspi2; + +vType L0_sspi2_MISO_get(void) +{ + if(D_sspi2_MISO_GET()) + { + return 1; + }else + { + return 0; + } +} +void L0_sspi2_MOSI_set(vType v) +{ + if(v) + { + D_sspi2_MOSI_ON(); + }else + { + D_sspi2_MOSI_OFF(); + } + + Lc_delay_us(D_sspi2_DELAY); +} + +void L0_sspi2_SCLK_set(vType v) +{ + if(v) + { + D_sspi2_SCLK_ON(); + }else + { + D_sspi2_SCLK_OFF(); + } + + Lc_delay_us(D_sspi2_DELAY); +} + +void L0_sspi2_close(void) +{ + ///ܽΪ̬ +} + +void L1_sspi2_init(void) +{ + + D_sspi2_IO_init(); + ts_sspi2.pf_MISO_get = L0_sspi2_MISO_get; + ts_sspi2.pf_MOSI_set = L0_sspi2_MOSI_set; + ts_sspi2.pf_SCLK_set = L0_sspi2_SCLK_set; + ts_sspi2.pf_close = L0_sspi2_close; +} + + + +/******************************END*********************************/ + + + diff --git a/source/msp/mcu support/msp_SSPI2.h b/source/msp/mcu support/msp_SSPI2.h new file mode 100644 index 0000000..16ab119 --- /dev/null +++ b/source/msp/mcu support/msp_SSPI2.h @@ -0,0 +1,51 @@ +#ifndef _msp_SSPI2_H +#define _msp_SSPI2_H + +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" + +#include "msp_uart0.h" +#include "msp_SSPIx.h" +#if 0 +紮 + SPI2_SOMI P6.5 + SPI2_SIMO P6.4 + SPI2_CLK P6.3 + SPI2_CS P6.6 + + +FLASH W25Q128FVSG + SPI-FLASH-SOMI P6.5 + SPI-FLASH-SIMO P6.4 + SPI-FLASH-SCK P6.3 + SPI-FLASH-CS P6.2 + + +#endif +#define D_sspi2_MISO_init() D_P65_IN(); +#define D_sspi2_MOSI_init() D_P64_OUT(); +#define D_sspi2_SCLK_init() D_P63_OUT(); +///#define D_sspi2_INT__init() D_P10_IN(); + +#define D_sspi2_MISO_GET() D_P65_AT() +#define D_sspi2_MOSI_ON() D_P64_ON(); +#define D_sspi2_SCLK_ON() D_P63_ON();Lc_delay_us(10); + + +#define D_sspi2_MOSI_OFF() D_P64_OFF(); +#define D_sspi2_SCLK_OFF() D_P63_OFF();Lc_delay_us(10); + + +////#define D_sspi2_INT__AT() D_P10_AT() + +#define D_sspi2_IO_init() D_sspi2_MISO_init();\ + D_sspi2_MOSI_init();\ + D_sspi2_SCLK_init(); +/// D_sspi2_INT__init() + +extern TS_sspi ts_sspi2; +extern void L1_sspi2_init(void); + +#endif////_msp_SPI_sim_H + + diff --git a/source/msp/mcu support/msp_SSPIx.c b/source/msp/mcu support/msp_SSPIx.c new file mode 100644 index 0000000..2563b11 --- /dev/null +++ b/source/msp/mcu support/msp_SSPIx.c @@ -0,0 +1,54 @@ + +#include "msp_SSPIx.h" + + +void L0_SSPIx_WriteOneByte(TS_sspi *p,unsigned char command) +{ + unsigned char i; + for(i = 0; i < 8;i++) + { + if(command&0x80) + { + p->pf_MOSI_set(1); + } + else + { + p->pf_MOSI_set(0);; + } + command <<= 1; + p->pf_SCLK_set(1); +/// L0_spi2_delay(80); + p->pf_SCLK_set(0); + } +} + + + +u8 L0_SSPIx_ReadOneByte(TS_sspi *p) +{ + unsigned char result,i; + p->pf_SCLK_set(0); + for(i = 0;i<8; i++) + { + p->pf_SCLK_set(1);; + result <<= 0x01; + if( p->pf_MISO_get() ) + { + result |= 0X01; + } + // L0_spi2_delay(80); + p->pf_SCLK_set(0); + // L0_spi2_delay(80); + } + +// L0_uart0_uchex(result); +// L0_uart0_uc('.'); + return result; +} + + + +/******************************END*********************************/ + + + diff --git a/source/msp/mcu support/msp_SSPIx.h b/source/msp/mcu support/msp_SSPIx.h new file mode 100644 index 0000000..3abf290 --- /dev/null +++ b/source/msp/mcu support/msp_SSPIx.h @@ -0,0 +1,33 @@ +#ifndef _msp_SSPIx_H +#define _msp_SSPIx_H + +#include "../bsp/bsp_config.h" +#include "../ctask/tick.h" + +#include "msp_uart0.h" + +typedef struct +{ + vU32 n; + vType sh; + unsigned char sal; + vType (*pf_MISO_get)(void); + void (*pf_MOSI_set)(vType x); + void (*pf_SCLK_set)(vType x); +// void (*pf_init)(void); + void (*pf_close)(void); +}TS_sspi; + +//extern TS_sspi ts_ssp1; + +extern u8 L0_SSPIx_ReadOneByte(TS_sspi *p); + +///extern void L1_SSPIxcs_WriteOneByte(TS_sspi *p,unsigned char command); + +extern void L0_SSPIx_WriteOneByte(TS_sspi *p,unsigned char command); + + + +#endif////_msp_SPI_sim_H + + diff --git a/source/msp/mcu support/msp_siic1.c b/source/msp/mcu support/msp_siic1.c new file mode 100644 index 0000000..c2e6b6c --- /dev/null +++ b/source/msp/mcu support/msp_siic1.c @@ -0,0 +1,148 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info ޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic1.h" + +TS_siic ts_siic1; + +/*------------------------------------------------ + ˿ڶ +I2CߴݹУÿһֽڣ +ҪһӦ״̬λݵ +ͨӦλ֪Ӧλʱ +Ӧλ״̬ѭ˭ +˭ԭ򣬼ɽӦλ +Ӧʱڼ뽫SDA +ͣʹʱĸߵƽڼ䱣ȶĵ͵ƽͼ9 +Ȼ뿼ǽͱʱ +ϸı6 ӻʱ +ӦλɴӻӴӻʱӦλ + +I2C߱׼涨 ӦλΪ0ʾӦ ACK +ΪA Ϊ1ʾӦ NACK +ΪNALSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ + + + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_siic1_SDA_out(vType v) +{ + if(v) + { + L0_SDA1_OUT(); + }else + { + L0_SDA1_IN(); + } +} +void L0_siic1_SDA(vType v) +{ + if(v) + { + L0_SDA1_ON(); + }else + { + L0_SDA1_OFF(); + } +} + +vType L0_siic1_SDA_get(void) +{ + + if( 0!= L0_SDA1_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic1_SCL_out(vType v) +{ + if(v) + { + L0_SCL1_OUT(); + }else + { + L0_SCL1_IN(); + } + +} + +void L0_siic1_SCL(vType v) +{ + if(v) + { + L0_SCL1_ON(); + }else + { + L0_SCL1_OFF(); + } + + Lc_delay_us(D_SIIC1_DELAY); + + +} + + + +void L0_siic1_close(void) +{ + ///ܽΪ̬ +} + + + +void L1_siic1_INIT(void) +{ + ts_siic1.pf_SDA_out = L0_siic1_SDA_out; + ts_siic1.pf_SDA_set = L0_siic1_SDA; + ts_siic1.pf_SDA_get = L0_siic1_SDA_get; + ts_siic1.pf_SCL_out = L0_siic1_SCL_out; + ts_siic1.pf_SCL_set = L0_siic1_SCL; + ts_siic1.pf_close = L0_siic1_close; + + + + ts_siic1.sal = D_iic1_addr; + +} + + + + + + diff --git a/source/msp/mcu support/msp_siic1.h b/source/msp/mcu support/msp_siic1.h new file mode 100644 index 0000000..85a7be0 --- /dev/null +++ b/source/msp/mcu support/msp_siic1.h @@ -0,0 +1,56 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _siic1_H_ +#define _siic1_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "msp_siicx.h" + +#define L0_SDA1_OUT() D_P45_OUT() +#define L0_SDA1_IN() D_P45_IN() +#define L0_SDA1_ON() D_P45_ON() +#define L0_SDA1_OFF() D_P45_OFF() +#define L0_SDA1_AT() D_P45_AT() + +#define L0_SCL1_OUT() D_P44_OUT() +#define L0_SCL1_IN() D_P44_IN() +#define L0_SCL1_ON() D_P44_ON() +#define L0_SCL1_OFF() D_P44_OFF() + +#define D_iic1_addr (0x44<<1) + +#define D_SIIC1_DELAY 100 + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern TS_siic ts_siic1; +extern void L1_siic1_INIT(void); + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/mcu support/msp_siic2.c b/source/msp/mcu support/msp_siic2.c new file mode 100644 index 0000000..c073843 --- /dev/null +++ b/source/msp/mcu support/msp_siic2.c @@ -0,0 +1,150 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info ޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic2.h" + +TS_siic ts_siic2; + + + + +/*------------------------------------------------ + ˿ڶ +I2CߴݹУÿһֽڣ +ҪһӦ״̬λݵ +ͨӦλ֪Ӧλʱ +Ӧλ״̬ѭ˭ +˭ԭ򣬼ɽӦλ +Ӧʱڼ뽫SDA +ͣʹʱĸߵƽڼ䱣ȶĵ͵ƽͼ9 +Ȼ뿼ǽͱʱ +ϸı6 ӻʱ +ӦλɴӻӴӻʱӦλ + +I2C߱׼涨 ӦλΪ0ʾӦ ACK +ΪA Ϊ1ʾӦ NACK +ΪNALSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ + + + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_siic2_SDA_out(vType v ) +{ + if(v) + { + L0_SDA2_OUT(); + }else + { + L0_SDA2_IN(); + } +} +void L0_siic2_SDA(vType v) +{ + if(v) + { + L0_SDA2_ON(); + }else + { + L0_SDA2_OFF(); + } +} + +vType L0_siic2_SDA_get(void) +{ + + if( 0!= L0_SDA2_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic2_SCL_out(vType v) +{ + if(v) + { + L0_SCL2_OUT(); + }else + { + L0_SCL2_IN(); + } + +} + +void L0_siic2_SCL(vType v) +{ + if(v) + { + L0_SCL2_ON(); + }else + { + L0_SCL2_OFF(); + } + + Lc_delay_us(D_SIIC2_DELAY); + +} + + + +void L0_siic2_close(void) +{ + ///ܽΪ̬ +} + + + +void L1_siic2_INIT(void) +{ + ts_siic2.pf_SDA_out = L0_siic2_SDA_out; + ts_siic2.pf_SDA_set = L0_siic2_SDA; + ts_siic2.pf_SDA_get = L0_siic2_SDA_get; + ts_siic2.pf_SCL_out = L0_siic2_SCL_out; + ts_siic2.pf_SCL_set = L0_siic2_SCL; + ts_siic2.pf_close = L0_siic2_close; + + L0_iicx_SendData(&ts_siic2,0xaa); + + ts_siic2.sal = D_iic2_addr; + +} + + + + + + diff --git a/source/msp/mcu support/msp_siic2.h b/source/msp/mcu support/msp_siic2.h new file mode 100644 index 0000000..538d8a1 --- /dev/null +++ b/source/msp/mcu support/msp_siic2.h @@ -0,0 +1,55 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIIC2_H_ +#define _SIIC2_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "msp_siicx.h" + +#define L0_SDA2_OUT() D_P47_OUT() +#define L0_SDA2_IN() D_P47_IN() +#define L0_SDA2_ON() D_P47_ON() +#define L0_SDA2_OFF() D_P47_OFF() +#define L0_SDA2_AT() D_P47_AT() + +#define L0_SCL2_OUT() D_P46_OUT() +#define L0_SCL2_IN() D_P46_IN() +#define L0_SCL2_ON() D_P46_ON() +#define L0_SCL2_OFF() D_P46_OFF() + +#define D_iic2_addr 0x44 +#define D_SIIC2_DELAY 100 + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern TS_siic ts_siic2; +extern void L1_siic2_INIT(void); + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/mcu support/msp_siic3.c b/source/msp/mcu support/msp_siic3.c new file mode 100644 index 0000000..8d19471 --- /dev/null +++ b/source/msp/mcu support/msp_siic3.c @@ -0,0 +1,145 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info ޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic3.h" + +TS_siic ts_siic3; + + +/*------------------------------------------------ + ˿ڶ +I2CߴݹУÿһֽڣ +ҪһӦ״̬λݵ +ͨӦλ֪Ӧλʱ +Ӧλ״̬ѭ˭ +˭ԭ򣬼ɽӦλ +Ӧʱڼ뽫SDA +ͣʹʱĸߵƽڼ䱣ȶĵ͵ƽͼ9 +Ȼ뿼ǽͱʱ +ϸı6 ӻʱ +ӦλɴӻӴӻʱӦλ + +I2C߱׼涨 ӦλΪ0ʾӦ ACK +ΪA Ϊ1ʾӦ NACK +ΪNALSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ + + + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_siic3_SDA_out(vType v ) +{ + if(v) + { + L0_SDA3_OUT(); + }else + { + L0_SDA3_IN(); + } +} +void L0_siic3_SDA(vType v) +{ + if(v) + { + L0_SDA3_ON(); + }else + { + L0_SDA3_OFF(); + } +} + +vType L0_siic3_SDA_get(void) +{ + + if( 0!= L0_SDA3_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic3_SCL_out(vType v) +{ + if(v) + { + L0_SCL3_OUT(); + }else + { + L0_SCL3_IN(); + } + +} + +void L0_siic3_SCL(vType v) +{ + if(v) + { + L0_SCL3_ON(); + }else + { + L0_SCL3_OFF(); + } + Lc_delay_us(D_SIIC3_DELAY); + +} + + + +void L0_siic3_close(void) +{ + ///ܽΪ̬ +} + + + +void L1_siic3_INIT(void) +{ + ts_siic3.pf_SDA_out = L0_siic3_SDA_out; + ts_siic3.pf_SDA_set = L0_siic3_SDA; + ts_siic3.pf_SDA_get = L0_siic3_SDA_get; + ts_siic3.pf_SCL_out = L0_siic3_SCL_out; + ts_siic3.pf_SCL_set = L0_siic3_SCL; + ts_siic3.pf_close = L0_siic3_close; + +/// ts_siic3.sal = D_iic3_addr; +/// L0_iicx_SendData(&ts_siic3,0xaa); + +} + + + + + + diff --git a/source/msp/mcu support/msp_siic3.h b/source/msp/mcu support/msp_siic3.h new file mode 100644 index 0000000..27a9b4d --- /dev/null +++ b/source/msp/mcu support/msp_siic3.h @@ -0,0 +1,53 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIIC3_H_ +#define _SIIC3_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "msp_siicx.h" + +#define L0_SDA3_OUT() D_P85_OUT() +#define L0_SDA3_IN() D_P85_IN() +#define L0_SDA3_ON() D_P85_ON() +#define L0_SDA3_OFF() D_P85_OFF() +#define L0_SDA3_AT() D_P85_AT() + +#define L0_SCL3_OUT() D_P84_OUT() +#define L0_SCL3_IN() D_P84_IN() +#define L0_SCL3_ON() D_P84_ON() +#define L0_SCL3_OFF() D_P84_OFF() + +#define D_SIIC3_DELAY 100 + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern TS_siic ts_siic3; +extern void L1_siic3_INIT(void); + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/mcu support/msp_siicx.c b/source/msp/mcu support/msp_siicx.c new file mode 100644 index 0000000..92bf290 --- /dev/null +++ b/source/msp/mcu support/msp_siicx.c @@ -0,0 +1,336 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info ޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siicx.h" + +/*------------------------------------------------ + ˿ڶ +I2CߴݹУÿһֽڣ +ҪһӦ״̬λݵ +ͨӦλ֪Ӧλʱ +Ӧλ״̬ѭ˭ +˭ԭ򣬼ɽӦλ +Ӧʱڼ뽫SDA +ͣʹʱĸߵƽڼ䱣ȶĵ͵ƽͼ9 +Ȼ뿼ǽͱʱ +ϸı6 ӻʱ +Ӧλɴӻ;ӴӻʱӦλ + +I2C߱׼涨 ӦλΪ0ʾӦ ACK +ΪA; Ϊ1ʾӦ NACK +ΪNALSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_iicx_INIT(TS_siic *p,unsigned char v) +{ + if (v)/// + { + p->pf_SDA_set(1); + p->pf_SCL_set(1); + + p->pf_SDA_out(1); + p->pf_SCL_out(1); + + + + }else + { + + } +} + +unsigned char L0_iicx_SDA_ask(TS_siic *p) +{ + if(p->pf_SDA_get() != 0) + { + return 1; + } + else + { + return 0; + } +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_iicx_Reset(void) +{ + p->pf_SCL_set(1); p->pf_SDA_set(1);//pf_SDA_set(1);; //ȷͷ +} + + +********************/ + +//********************************************** +//ʼλ IO_SDA=1->0 +void L0_iicx_Start(TS_siic *p) +{ + p->pf_SDA_set(1);//pf_SDA_set(1);; + p->pf_SCL_set(1); + p->pf_SDA_set(0); + p->pf_SCL_set(0); + ///fixme: cc + L0_slc_1_delay(); + L0_slc_1_delay(); + L0_slc_1_delay(); +} +//************************************************ +//ֹͣλ IO_SDA = 0->1 +void L0_iicx_Stop(TS_siic *p) +{ + p->pf_SDA_set(0); + p->pf_SCL_set(1); + p->pf_SDA_set(1); + p->pf_close(); +} +//************************************************ +//Ӧ(ack:IO_SDA = 0no_ack:IO_SDA = 0) +///ӻACK +void L0_iicx_Ack(TS_siic *p) +{ + p->pf_SDA_out(1);//SDA Ϊ + p->pf_SCL_set(0); + p->pf_SDA_set(0); + p->pf_SCL_set(1); + p->pf_SCL_set(0); + p->pf_SDA_out(0); + // Lc_delay_ms(2); ///for debug wave easy to see + +} + +///ӻNOACK +void L0_iicx_NoAck(TS_siic *p) +{ + p->pf_SDA_out(1);//SDA Ϊ + p->pf_SCL_set(0); + p->pf_SDA_set(1); + p->pf_SCL_set(1); + p->pf_SCL_set(0); + p->pf_SDA_out(0); + // Lc_delay_ms(2); + +} + +/// ӻصack +void L0_iicx_WaitAck(TS_siic *p) +{ + p->pf_SDA_out(0); + p->pf_SCL_set(1); + //// + p->pf_SCL_set(0); + p->pf_SDA_out(1); + /// Lc_delay_ms(2); +} + + +/****** +I2C߱׼涨 ӦλΪ0ʾӦ ACK ΪA; +Ϊ1ʾӦ NACK ΪNA +LSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ +// SDAǷACK +bit L0_iicx_Test_Ack(void) +{ //SDA Ϊ + bit ACK_Flag = 0; + p->pf_SCL_set(0); + p->pf_SDA_set(1);//pf_SDA_set(1);; + p->pf_SCL_set(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + p->pf_SCL_set(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//ֽڷͳ +//c(Ҳǵַ)մӦ +//ǴӦλ + +void L0_iicx_SendData(TS_siic *p,unsigned char c) +{ +// unsigned char ack=8; + unsigned char BitCnt=8;//һֽ8λ + //SDA Ϊ + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //Ҫ͵ݳΪ8λ + { + if((c << BitCnt ) & 0x80) + p->pf_SDA_set(1);//pf_SDA_set(1);; //жϷλ + else + p->pf_SDA_set(0); + p->pf_SCL_set(1); //ʱΪߣ֪ͨʼλ + p->pf_SCL_set(0); + }//8clk + L0_iicx_WaitAck(p); +} +//************************************************** +//ֽڽճ +//ݣ˳Ӧ|Ӧ|i2c_ack_main(void)ʹ +//return: uchar1ֽ + +unsigned char L0_iicx_ReceiveData(TS_siic *p) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + p->pf_SDA_out(0);// p->pf_SDA_set(1);//pf_SDA_set(1);; // SDA Ϊ + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_I2C_delay(1); + p->pf_SCL_set(0); //ʱΪͣ׼λ + p->pf_SCL_set(1); //ʱΪʹЧ + L0_I2C_delay(1); + IIC_RX_Data = IIC_RX_Data << 1; + if(0 != p->pf_SDA_get())//м + IIC_RX_Data = IIC_RX_Data + 1; //λ,յλretc + L0_I2C_delay(1); + }// 8clk up + p->pf_SCL_set(0); + return IIC_RX_Data; +} +/// ȡ n p + +void L1_iicx_ReadNByte(TS_siic *p, unsigned char *b,unsigned char n) +{ + unsigned char i; + L0_iicx_Start(p); // I2C + L0_iicx_SendData(p,(p->sal)| 0x01); //ַ + //p->pf_SDA_out(0); + for(i = 0;ipf_SDA_out(1); + L0_iicx_Stop(p); +} +/// I2C豸ַΪ8bit,λΪдλ,0Ϊд,1Ϊ +////ȡֽڵģȷֽ Ȼٶȡ +void L1_iicx_Read2cmd(TS_siic *p, unsigned char *c,unsigned char *b,unsigned char n) +{ + unsigned char i; + L0_iicx_Start(p); // I2C + L0_iicx_SendData(p,(p->sal)| 0x01); //ַ + L0_iicx_SendData(p,(*c)); //ַ + L0_iicx_SendData(p,*(c+1)); + + + //p->pf_SDA_out(0); + for(i = 0;ipf_SDA_out(1); + L0_iicx_Stop(p); +} + + + + +/////////////////////////////// +///дһreg Ϊд߶ȡ +void L1_iicx_Write1Reg(TS_siic *p,unsigned char reg) +{ + L0_iicx_Start(p); //I2C + L0_iicx_SendData(p,p->sal);//ַ + L0_iicx_SendData(p,reg); +} + +void L1_iicx_Write2Reg(TS_siic *p,unsigned char reg,unsigned char reg2) +{ + L0_iicx_Start(p); //I2C + L0_iicx_SendData(p,p->sal);//ַ + L0_iicx_SendData(p,reg); + L0_iicx_SendData(p,reg2); +} + + +// sla.(reg)=cmd +void L2_iicx_Write1Reg1Cmd(TS_siic *p, unsigned char reg,unsigned char cmd) +{ + L1_iicx_Write1Reg(p,reg); + L0_iicx_SendData(p,cmd); + L0_iicx_Stop(p); + /***************** + if(gRccUs05 >0)///iicЧ ûн + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//ȡregַ(1Byte)n sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_iicx_Read1Reg(TS_siic *p,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_iicx_Write1Reg(p,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_iicx_ReadNByte(p,r,n); + +} + +void L2_iicx_Read2Reg(TS_siic *p,unsigned char H,unsigned char L, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_iicx_Write1Reg(p,H); + L0_iicx_SendData(p,L); +//S ADD R A D1 A D2 A.....DX N P + L1_iicx_ReadNByte(p,r,n); + +} + + +////// S slaW cmd cmd2 S slaR A A NACK P +////// A A A A MSB LSB CRC +void L2_iicx_Read2Cmd(TS_siic *p, unsigned char cmd,unsigned char cmd2, + unsigned char *buf,unsigned char n) +{ + L1_iicx_Write1Reg(p,cmd); + L0_iicx_SendData(p,cmd2); + + L1_iicx_ReadNByte(p,buf,n); +} + + + + diff --git a/source/msp/mcu support/msp_siicx.h b/source/msp/mcu support/msp_siicx.h new file mode 100644 index 0000000..f3b8400 --- /dev/null +++ b/source/msp/mcu support/msp_siicx.h @@ -0,0 +1,71 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIICx_H_ +#define _SIICx_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "../msp/msp_siicx.h" + + +typedef struct +{ + vU32 n; + vType sh; + unsigned char sal; + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + +}TS_siic; + +extern TS_siic ts_siic1; +extern TS_siic ts_siic2; + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +extern void L0_iicx_INIT(TS_siic *p,unsigned char v); +extern void L0_iicx_SendData(TS_siic *p,unsigned char c); +extern unsigned char L0_iicx_ReceiveData(TS_siic *p); +extern void L1_iicx_ReadNByte(TS_siic *p,unsigned char *b,unsigned char n); +/////////////////////////////// +///дһreg Ϊд߶ȡ +extern void L1_iicx_Write1Reg(TS_siic *p,unsigned char reg); +// sla.(reg)=cmd +extern void L2_iicx_Write1Reg1Cmd(TS_siic *p,unsigned char reg,unsigned char cmd); +//ȡregַn sla.(reg) sla.(reg+1)................ sla.(reg+n) +extern void L2_iicx_Read1Reg(TS_siic *p,unsigned char reg, + unsigned char *r,unsigned char n); +extern void L1_iicx_Read2cmd(TS_siic *p, unsigned char *c,unsigned char *b,unsigned char n); +extern void L2_iicx_Write2Cmd(TS_siic *p, unsigned char reg,unsigned char cmd,unsigned char cmd2); +extern void L2_iicx_Read2Cmd(TS_siic *p, unsigned char cmd,unsigned char cmd2, + unsigned char *buf,unsigned char n); +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/msp_adc.c b/source/msp/msp_adc.c new file mode 100644 index 0000000..e6fd7a5 --- /dev/null +++ b/source/msp/msp_adc.c @@ -0,0 +1,235 @@ +#include "msp_adc.h" +#include "debug_drv.h" +#include "stc_8_delay.h" + + +/********* +1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; +2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够, 内部才能和外部电势相等。 +19.1.1 ADC 控制寄存器(ADC_CONTR),PWM 触发 ADC 控制 +符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 +ADC_CONTR BCH ADC_POWER ADC_START ADC_FLAG ADC_EPWMT ADC_CHS[3:0] +ADC_POWER:ADC +电源控制位 0: +关闭 ADC 电源 1:打开 ADC 电源。 +建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗 +特别注意: 1、给 MCU 的 内部 ADC 模块电源打开后,需等待约 1ms, 等 MCU 内部的 ADC 电源稳定 后再让 ADC 工作; +2、适当加长对外部信号的采样时间,就是对 ADC 内部采样保持电容的充电或放电时间,时间够内部才能和外部电势相等。 +ADC_START:ADC 转换启动控制位。写入 1 后开始 ADC 转换,转换完成后硬件自动将此位清零。 +0:无影响。即使 ADC 已经开始转换工作,写 0 也不会停止A/D 转换。 +1:开始 ADC 转换,转换完成后硬件自动将此位清零。 +ADC_FLAG:ADC 转换结束标志位。当 ADC 完成一次转换后,硬件会自动将此位置 1, +并向 CPU 提出 中断请求。此标志位必须软件清零。 + +层次 >逻辑 >数据流 >测试 >工具 > 代码 +套路(方法论)才是最主要的 + 12位 800K + 反推 +22M / 64(采样的总时间)= + +*********/ + + +void L0_ADC_init (unsigned char onf) +{ + + if (onf) + { + ADC_CONTR = 0; + D_ADC_POWER_ON(); + /// + D_ADC_average(); + D_EN_EREG(); + ////500us B0000_1111 1msB0000_1111 + ADCTIM = B1010_0000|B0000_1111;///CSSETUP:ADC 通道选择时间控制 CSHOLD[1:0]:ADC 通道选择保持时间控制//22M + ///SMPDUTY[4:0]:ADC 模拟信号采样时间控制 Tduty(注意:SMPDUTY 一定不能设置小于 01010B) + ADCCFG = B0010_0000|4;///SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)} + + + Lc_delay_ms(1); + /// D_ADC_CH(D_ADC_CH_1_19); + // D_ADC_START(); + + // L1_ADC_Readx(D_ADC_CH_1_19); + + + printfs("\r\n L0_ADC_init on"); + + } + else + { + + } +} + + + + +/// L1_ADC_Readx(D_ADC_CH_1_19); + +U16 L1_ADC_Readx(u8 CHA) +{ + vU16 adc_data; + vU32 overtimes; + int *BGV; //内部1.19V参考信号源值存放在idata中 + //idata的EFH地址存放高字节 + //idata的F0H地址存放低字节 + //电压单位为毫伏(mV) + BGV = (int idata *)0xef; + + /// vcc = (int)(1024L * *BGV / res); //(10位ADC算法)计算VREF管脚电压,即电池电压 + // vcc = (int)(4096L * *BGV / res); //(12位ADC算法)计算VREF管脚电压,即电池电压 + //注意,此电压的单位为毫伏(mV) + + + D_ADC_CH(CHA); + D_ADC_START(); + NOP2(); + ///BITN_S(ADCEXCFG,) + while(0 == D_ADC_OVER()) + { + if(overtimes++>600000)//// + { + printf2("\r\n !3A%x W%x\t",(int)ADC_CONTR,(int)CHA); + return 0;/// !3Ac7 W7 291 + } + } + D_ADC_CLEARFLAG(); + + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + ///adc_data >>= 3; +//// r = adc_data; + return adc_data; +} + +#if 0 + +U16 L1_ADC_Read(u8 CHA) +{ + vU16 adc_data; + ADC_CONTR &=0xF8; + ADC_CONTR |=0x40;//启动AD转换 + //ADC_CONTR |= CHA; + CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清标志 + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + //adc_data = adc_data<<2; + //adc_data = ADC_RESL & 0X03; + //adc_data = adc_data | adc_data; + ///L0_uart1_sendstr("ADC:"); + ///L0_uart1_ushex(adc_data); + ///L0_uart1_0d0a(); + return (adc_data); //返回A/D转换结果(8位) + +} + +///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc) + + +void L3_ADC_debug(u8 filter) +{ + u8 i; + 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 读,判断哪个adc读取 + {//fa 05 f1 33 10 + //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->R2); + for(i = 0xf1;i <= 0xf8;i++) + { + Ts_debug.au16 = L1_ADC_Read_PT(i); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc1 + } + /* + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf2); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc2 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf3); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc3 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf4); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc4 + + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf5 ); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc5 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf6); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc6 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf7); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc7 + Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R2 = 0xf8); + printf(" %XH %d ",(int)Ts_debug.au16,(int)Ts_debug.au16); //adc8 + */ + } + else if(0x11 == Ts_debug.td->ocr) + { + //printf("\r\n ch(%d)=",(int)Ts_debug.td->R1); + //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); + } + else if(0x12 == Ts_debug.td->ocr) + { + } + else + { + //printf"(\r\n ch(%d)=",(int)Ts_debug.td->R1); + //Ts_debug.au16 = L1_ADC_Read_PT(Ts_debug.td->R1); + } + } +} + +U16 L1_ADC_Read_VBAT (unsigned char CHA)//CHA通道号 +{ + U16 adc_data; + #if 0 + U8 AD_FIN=0; //存储A/D转换标志 + //CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置 + Lc_delay_nop(1); + //ADC_CONTR |= CHA; //选择A/D当前通道 + //Lc_delay_nop(1); + ADC_CONTR |= 0x80; //启动A/D电源 + Lc_delay_ms(1); //使输入电压达到稳定(1ms即可) + ADC_CFG = 0x20; + Lc_delay_nop(1); + CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) + //ADC_CONTR |= CHA; //选择A/D当前通道 + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + Lc_delay_nop(1); + ADC_CONTR |= 0x40; //启动AD转换 + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清完成标志 + //P2 = ADC_RES; //读取ADC结果 + #endif + ADC_CONTR &=0xF8; + ADC_CONTR |=0x40;//启动AD转换 + //ADC_CONTR |= CHA; + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //查询ADC完成标志 + ADC_CONTR &= ~0x20; //清标志 + adc_data = ADC_RES; + adc_data <<= 8; + adc_data |= ADC_RESL; + //adc_data = adc_data<<2; + //adc_data = ADC_RESL & 0X03; + //adc_data = adc_data | adc_data; + //L0_uart0_ushex(adc_data); + //L0_uart0_0d0a(); + return (adc_data); //返回A/D转换结果(8位) +} +#endif diff --git a/source/msp/msp_adc.h b/source/msp/msp_adc.h new file mode 100644 index 0000000..6e4e755 --- /dev/null +++ b/source/msp/msp_adc.h @@ -0,0 +1,79 @@ +#ifndef _msp_adc_H_ +#define _msp_adc_H_ + +#include "bsp_config.h" +#include "msp_uart1.h" + +#include "debug_drv.h" + + +#define ADC_POWER BITN7 +#define ADC_START BITN6 +#define ADC_FLAG BITN5 +#define ADC_EPWMT BITN4 + +#define D_ADC_CHS_mask 0xF0 + +#define ADC_CHS3 BITN3 +#define ADC_CHS2 BITN2 +#define ADC_CHS1 BITN1 +#define ADC_CHS0 BITN0 + +#define ADC_RESFMT BITN5 + +#define ADC_SPEED3 BITN3 +#define ADC_SPEED2 BITN2 +#define ADC_SPEED1 BITN1 +#define ADC_SPEED0 BITN0 + + + +#define D_CVTIMESEL_mask 0xF8 + +#define D_CVTIMESEL_1 0 +#define D_CVTIMESEL_2 4 +#define D_CVTIMESEL_4 5 +#define D_CVTIMESEL_8 6 +#define D_CVTIMESEL_16 7 + + + +/**** +CVTIMESEL [2:0] ADC 自动转换次数 0xx 转换 1 次 100 转换 2 次并取平均值 101 转换 4 次并取平均值 110 转换 8 次并取平均值 111 转换 16 次并取平均值 + + +****/ + + +#define D_ADC_average() D_EN_EREG(); BITN_S(ADCEXCFG,D_CVTIMESEL_16,D_CVTIMESEL_mask)////4 22M 1ms--- + + +#define D_ADC_POWER_ON() BITN_1(ADC_CONTR, ADC_POWER) +#define D_ADC_POWER_OFF() BITN_0(ADC_CONTR, ADC_POWER) + +#define D_ADC_START() BITN_1(ADC_CONTR, ADC_START) +#define D_ADC_STOP() BITN_0(ADC_CONTR, ADC_START) + +#define D_ADC_OVER() BITN_G(ADC_CONTR, ADC_FLAG) +#define D_ADC_CLEARFLAG() BITN_0(ADC_CONTR, ADC_FLAG) + +#define D_ADC_CH(X) BITN_S(ADC_CONTR,X,D_ADC_CHS_mask) + +#define D_ADC_CH_1_19 15 +///#define D_ADC_POWER_OFF() + +#define D_cmd_filter_adc 0xfa +U16 L1_ADC_Read(u8 CHA); + + +void L0_ADC_init (unsigned char onf); + + +U16 L1_ADC_Readx(u8 CHA); + + + +#endif //#ifndef _msp_adc_H_ + + + diff --git a/source/msp/msp_eeprom.c b/source/msp/msp_eeprom.c new file mode 100644 index 0000000..da67905 --- /dev/null +++ b/source/msp/msp_eeprom.c @@ -0,0 +1,238 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file msp_eeprom.c +/// @brief msp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20190106 +/// @note cc_AS_stc02 由stc-isp v6.0860 +////////////////////////////////////////////////////////////////////////////// + +///cc 2023/04/07--8:44:38 +/* +EEPROM 的写操作只能将字节中的 1 写为 0,当需要将字节中的 0 写为 1,则必须执行扇区 擦除操作。 +EEPROM 的读/写操作是以 1 字节为单位进行,而 EEPROM 擦除操作是以 1 扇区(512 字节) 为单位进行, +在执行擦除操作时,如果目标扇区中有需要保留的数据,则必须预先将这些数据读取到 RAM 中暂存, +待擦除完成后再将保存的数据和需要更新的数据一起再写回 +EEPROM Write operation can only write 1 in the byte as 0, when you need to write 0 in the byte as 1, +you must be sector erased. EEPROM Read / write operation is conducted in 1 byte, +while EEPROM, erasure operation is conducted in 1 sector (512 bytes). During the wipe operation, +if the data in the target sector, the data must be read in the RAM in advance, +and the saved data will be written back together with the data to be updated + +fixme:注意时钟和flash 相关 同时关注掉电和容错 + +*/ + +#include "msp_eeprom.h" + +#include "debug_drv.h" + +#if(TYPE_MCU == TYPE_MCU_STC_8A || TYPE_MCU == TYPE_MCU_STC_8F) +xxx +#define WT_30M 0x80 +#define WT_24M 0x81 +#define WT_20M 0x82 +#define WT_12M 0x83 +#define WT_6M 0x84 +#define WT_3M 0x85 +#define WT_2M 0x86 +#define WT_1M 0x87 + +sdfasdfasdf +void L0_Iap_Idle() +{ + IAP_CONTR = 0; //关闭IAP功能 + IAP_CMD = 0; //清除命令寄存器 + IAP_TRIG = 0; //清除触发寄存器 + IAP_ADDRH = 0x80; //将地址设置到非IAP区域 + IAP_ADDRL = 0; +} + +char L0_Iap_Read(vU16 addr) +{ + char dat; + + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 1; //设置IAP读命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + dat = IAP_DATA; //读IAP数据 + L0_Iap_Idle(); //关闭IAP功能 + + return dat; +} + +void L0_Iap_Program(vU16 addr, char dat) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 2; //设置IAP写命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_DATA = dat; //写IAP数据 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + L0_Iap_Idle(); //关闭IAP功能 +} + +///每个扇区512字节 +///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 +void L0_Iap_Erase(vU16 addr) +{ + IAP_CONTR = WT_12M; //使能IAP + IAP_CMD = 3; //设置IAP擦除命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); // + L0_Iap_Idle(); //关闭IAP功能 +} + +#elif (TYPE_MCU == TYPE_MCU_STC_8G || TYPE_MCU == TYPE_MCU_STC_8H) +void L0_Iap_Idle() +{ + IAP_CONTR = 0; //关闭IAP功能 + IAP_CMD = 0; //清除命令寄存器 + IAP_TRIG = 0; //清除触发寄存器 + IAP_ADDRH = 0x80; //将地址设置到非IAP区域 + IAP_ADDRL = 0; +} + +char L0_Iap_Read(vU16 addr) +{ + char dat; + + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; + IAP_CMD = 1; //设置IAP读命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + dat = IAP_DATA; //读IAP数据 + L0_Iap_Idle(); //关闭IAP功能 + + return dat; +} + +void L0_Iap_Program(vU16 addr, char dat) +{ + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CMD = 2; //设置IAP写命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_DATA = dat; //写IAP数据 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); + L0_Iap_Idle(); //关闭IAP功能 +} + +///每个扇区512字节 +///指定地址可以为当前扇区内的任意地址,都会完整擦除当前扇区 +void L0_Iap_Erase(vU16 addr) +{ + IAP_CONTR = 0x80; //使能IAP + IAP_TPS = 12; //设置擦除等待参数 12MHz + IAP_CMD = 3; //设置IAP擦除命令 + IAP_ADDRL = addr; //设置IAP低地址 + IAP_ADDRH = addr >> 8; //设置IAP高地址 + IAP_TRIG = 0x5a; //写触发命令(0x5a) + IAP_TRIG = 0xa5; //写触发命令(0xa5) + _nop_(); // + L0_Iap_Idle(); //关闭IAP功能 +} +#endif + + +void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len) +{ + U8 i = 0; + L0_Iap_Erase(addr);/////fixme: 需要和addr配合好 一次就擦除512字节 + for(i=0;icmd) + { + //Ae 03 03 04 00 + //xx 03 R2 R3 xx + case 4: + L0_Iap_Erase(uf_ee_add.us); + break; + case 5: + L0_Iap_Program(uf_ee_add.us,p->R2); + break; + case 6: + L0_uart0_uc(L0_Iap_Read(uf_ee_add.us)); + break; + case 7:///选择地址 + uf_ee_add.BYTE2.H = p->R2; //h + uf_ee_add.BYTE2.L = p->R3; //L + break; + default: + break; + }; +} + + +****************************************************/ + + + diff --git a/source/msp/msp_eeprom.h b/source/msp/msp_eeprom.h new file mode 100644 index 0000000..be1cf27 --- /dev/null +++ b/source/msp/msp_eeprom.h @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file msp_eeprom +/// @brief msp_eeprom +/// @info +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20190106 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_eeprom_H_ +#define _msp_eeprom_H_ + +#include "c_type51.h" +#include "c_lib.h" + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "bsp_config.h" + +extern void L3_eeprom_fun(U8 *pPara); + +///每个扇区512字节 +extern void L0_Iap_Erase(vU16 addr); +extern void L0_Iap_Program(vU16 addr, char dat); +extern char L0_Iap_Read(vU16 addr); +extern void L0_Iap_Program_array(vU16 addr,U8 *buf,U8 len); +extern void L0_Iap_Read_array(vU16 addr,U8 *buf,U8 len); +extern void L1_Iap_main(void); + +#endif// #ifndef _msp_eeprom_H_ + + diff --git a/source/msp/msp_iicMx.c b/source/msp/msp_iicMx.c new file mode 100644 index 0000000..c83abc0 --- /dev/null +++ b/source/msp/msp_iicMx.c @@ -0,0 +1,827 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20230312 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_iicMx.h" +#include "stc_8_delay.h" + +TS_iicm_ ts_iicm; + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_IICMx_SDA_outin(vtype ch,vtype v) +{ + if(v)///输出 + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SDA_OUT(); + break; + case D_iicch_1: + L0_IICM1_SDA_OUT(); +#ifdef D_SIIC_USE_2 + case D_iicch_2: + L0_IICM2_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SDA_OUT(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SDA_OUT(); + break; +#endif + default: + break; + + } + // L0_slc_1_delay(); + } + else + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SDA_IN(); + break; + case D_iicch_1: + L0_IICM1_SDA_IN(); + break; +#ifdef D_SIIC_USE_2 + case D_iicch_2: + L0_IICM2_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SDA_IN(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SDA_IN(); + + break; +#endif + default: + break; + + } + // L0_slc_f_delay(); + } + +} + + +void L0_IICMx_SDA(vtype ch,vtype v) +{ + if(v) + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SDA_ON(); + break; + case D_iicch_1: + L0_IICM1_SDA_ON(); + break; +#ifdef D_SIIC_USE_2 + case D_iicch_2: + L0_IICM2_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SDA_ON(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SDA_ON(); + break; +#endif + default: + break; + + } + // L0_slc_1_delay(); + } + else + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SDA_OFF(); + break; + case D_iicch_1: + L0_IICM1_SDA_OFF(); + + break; +#ifdef D_SIIC_USE_2 + case D_iicch_2: + L0_IICM2_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SDA_OFF(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SDA_OFF(); + break; +#endif + default: + break; + + } + // L0_slc_f_delay(); + } + +} + +void L0_IICMx_SCL(vtype ch,vtype v) +{ + if(v) + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SCL_ON(); + break; + case D_iicch_1: + L0_IICM1_SCL_ON(); + break; +#ifdef D_SIIC_USE_2 + + case D_iicch_2: + L0_IICM2_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SCL_ON(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SCL_ON(); + break; +#endif + default: + break; + } + L0_slc_1_delay(ts_iicm.t1[ch]); + } + else + { + switch (ch) + { + case D_iicch_0: + L0_IICM0_SCL_OFF(); + break; + case D_iicch_1: + L0_IICM1_SCL_OFF(); + break; +#ifdef D_SIIC_USE_2 + + case D_iicch_2: + L0_IICM2_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SCL_OFF(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SCL_OFF(); + break; +#endif + default: + break; + } + + L0_slc_0_delay(ts_iicm.t0[ch]); + } + +} + +/* + +void L0_IICMX_SCL(unsigned char v) +{ + if(v) + { + L0_IICM1_SCL_ON();/// L0_SCL_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SCL_OFF();///L0_SCL_OFF(); + L0_slc_f_delay(); + } +} +void L0_IICM1_SDA(unsigned char v) +{ + if(v) + { + L0_IICM1_SDA_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SDA_OFF(); + L0_slc_f_delay(); + } +} +*/ +void L0_IICMx_INIT(vtype ch ,vtype v) +{ + if (v) + { + switch(ch) + { + case D_iicch_0: + L0_IICM0_SCL_init(); + L0_IICM0_SDA_init(); + break; + case D_iicch_1: + L0_IICM1_SCL_init(); + L0_IICM1_SDA_init(); + break; +#ifdef D_SIIC_USE_2 + case D_iicch_2: + L0_IICM2_SCL_init(); + L0_IICM2_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + L0_IICM3_SCL_init(); + L0_IICM3_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + L0_IICM4_SCL_init(); + L0_IICM4_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + L0_IICM5_SCL_init(); + L0_IICM5_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + L0_IICM6_SCL_init(); + L0_IICM6_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + L0_IICM7_SCL_init(); + L0_IICM7_SDA_init(); + break; +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + L0_IICM8_SCL_init(); + L0_IICM8_SDA_init(); + break; +#endif + default: + break; + } + L0_IICMx_SDA(ch,v); + L0_IICMx_SCL(ch,v); + } + else + { + + + } +} + +unsigned char L0_IICMx_SDA_get(vtype ch) +{ + + switch(ch) + { + case D_iicch_0: + return L0_IICM0_SDA_AT(); + case D_iicch_1: + return L0_IICM1_SDA_AT(); + +#ifdef D_SIIC_USE_2 + case D_iicch_2: + return L0_IICM2_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_3 + case D_iicch_3: + return L0_IICM3_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_4 + case D_iicch_4: + return L0_IICM4_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_5 + case D_iicch_5: + return L0_IICM5_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_6 + case D_iicch_6: + return L0_IICM6_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_7 + case D_iicch_7: + return L0_IICM7_SDA_AT(); + +#endif +#ifdef D_SIIC_USE_8 + case D_iicch_8: + return L0_IICM8_SDA_AT(); +#endif + default: + break; + } + return 0; + +} + +#define L0_IIC_SIM_INIT(x) +#define L0_IIC_SIM_close(x) +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_IICMx_Start(vtype ch) +{ + ///L0_IIC_SIM_INIT(); + + L0_IICMx_SDA_outin(ch,1); + L0_IICMx_SDA(ch,1); + L0_IICMx_SCL(ch,1); + L0_IICMx_SDA(ch,0); + L0_slc_1_delay(ts_iicm.t1[ch]); + L0_slc_1_delay(ts_iicm.t1[ch]); + L0_IICMx_SCL(ch,0); + +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_IICMx_Stop(vtype ch) +{ + + L0_IICMx_SDA(ch,0); + + L0_IICMx_SCL(ch,1); + + L0_IICMx_SDA(ch,1); + L0_IIC_SIM_INIT(); + L0_IIC_SIM_close(); +} + + +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +void L0_IICMx_Ack(vtype ch) +{ //设置SDA 口为输出 + L0_IICMx_SCL(ch,0); + + L0_IICMx_SDA(ch,0); + + L0_IICMx_SCL(ch,1); + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA(ch,1); +} + +void L0_IICMx_NoAck(vtype ch) +{ //设置SDA 口为输出 + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA(ch,1); + L0_IICMx_SCL(ch,1); + L0_IICMx_SCL(ch,0); + +} +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_I2C_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + L0_I2C_SCL(0); + L0_I2C_SDA(1); + L0_I2C_SCL(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + L0_I2C_SCL(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 +void L0_IICMx_SendData(vtype ch,unsigned char c ) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((c << BitCnt ) & 0x80) + L0_IICMx_SDA(ch,1); //判断发送位 + else + L0_IICMx_SDA(ch,0); + L0_IICMx_SCL(ch,1); //置时钟线为高,通知被控器开始接收数据位 + L0_IICMx_SCL(ch,0); + }//8clk + + L0_IICMx_SDA(ch,1); //8位发送完后释放数据线,准备接收应答位 + L0_IICMx_SDA_outin(ch,0); + L0_IICMx_SCL(ch,1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_IICMx_SCL(ch,0); + + L0_IICMx_SDA_outin(ch,1); +//// L0_IICMx_delay(ts_iicm.t[ch]); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 +unsigned char L0_IICMx_ReceiveData(vtype ch) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + L0_IICMx_SDA(ch,1); //读入数据 设置SDA 口为输入 + L0_IICMx_SDA_outin(ch,0); + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_IICMx_SCL(ch,0); //置时钟线为低,准备接收数据位 + L0_IICMx_SCL(ch,1); //置时钟线为高使数据线上数据有效 + IIC_RX_Data = IIC_RX_Data << 1; + if(1 == L0_IICMx_SDA_get(ch)) + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + }// 8clk up + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA_outin(ch,1); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 +void L1_IICMx_ReadNByte(vtype ch,unsigned char Sal, unsigned char *p,unsigned char n) +{ + unsigned char i; + L0_IICMx_Start(ch); // 启动I2C + L0_IICMx_SendData(ch,(Sal)| 0x01); //发送器件地址 + + for(i = 0;i < n-1;i ++) //读取字节数据 + { + *(p + i) = L0_IICMx_ReceiveData(ch); //读取数据 + ///printf("%x ",(int)(*(p + i))); + + L0_IICMx_Ack(ch); //__/```\__ + } + *(p + n - 1) = L0_IICMx_ReceiveData(ch); + + L0_IICMx_NoAck(ch); + L0_IICMx_Stop(ch); +} + +#if 0 + + + + +主机从从设备读取多个字节 +Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP +Slave SAK SAK SAK DATA DATA DATA +0x19 +0001 1001 +0011 001R + +#endif + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_IICMx_WriteReg(vtype ch,unsigned char sla,unsigned char reg ) +{ + L0_IICMx_Start(ch); //启动I2C + L0_IICMx_SendData(ch,sla);//发送器件地址 + L0_IICMx_SendData(ch,reg); +} + +///写入一个 s+sla+reg +void L2_IICMx_Write1Reg(vtype ch,unsigned char sla,unsigned char reg ) +{ + L1_IICMx_WriteReg(ch,sla,reg); + L0_IICMx_Stop(ch); +} + + + +// sla.(reg)=cmd +void L2_IICMx_WriteCmd(vtype ch,unsigned char sla,unsigned char reg,unsigned char cmd ) +{ + L1_IICMx_WriteReg(ch,sla,reg); + L0_IICMx_SendData(ch,cmd); + L0_IICMx_Stop(ch); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_IICMx_WriteReg(ch,sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICMx_ReadNByte(ch,sla,r,n); +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +unsigned char L2_IICMx_Read1Reg1D(vtype ch,unsigned char sla,unsigned char reg) +{ + U8 d; +// U8 d[1]; +//S ADD W A REG A + L1_IICMx_WriteReg(ch,sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICMx_ReadNByte(ch,sla,&d,1); + return d; +} + + + + +#if 0////不可删除 +///S 80H A Register Address A S 81H A Data NA P +void L2_tws_ReadReg000(unsigned char sla,unsigned char reg, + unsigned char *v) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + // U8 d[1]; + //S ADD W A REG A + //// L1_I2C_WriteReg(sla,reg); +//step 1---- + L0_I2C_Start(); //启动I2C +//step 2----L0_I2C_SendData(sla);//发送器件地址 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 3---L0_I2C_SendData(reg); + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((reg << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 4---- + L0_I2C_Start(); //启动I2C + +//step 5--- + //设置SDA 口为输出 + sla|=0x01; + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); +//step 6---receive data + //设置SDA 口为输出 +*v = L0_I2C_ReceiveData(); + L0_I2C_SCL(1); + L0_I2C_SCL(0);/// send NA +//step 7--- P + + L0_I2C_Stop(); + + + + +} + +///S 80H A Register Address A S 81H A Data NA P + + + +#endif + + + diff --git a/source/msp/msp_iicMx.c.bak b/source/msp/msp_iicMx.c.bak new file mode 100644 index 0000000..4fc3fc0 --- /dev/null +++ b/source/msp/msp_iicMx.c.bak @@ -0,0 +1,729 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_iicMx.h" +TS_iicm_ ts_iicm; + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_IICMx_SDA_outin(vtype ch,vtype v) +{ + if(v)///输出 + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SDA_OUT(); + break; + case D_iicch_2: + L0_IICM1_SDA_OUT(); + break; + case D_iicch_3: + L0_IICM2_SDA_OUT(); + break; + case D_iicch_4: + L0_IICM3_SDA_OUT(); + break; + case D_iicch_5: + L0_IICM4_SDA_OUT(); + break; + case D_iicch_6: + L0_IICM5_SDA_OUT(); + break; + case D_iicch_7: + L0_IICM6_SDA_OUT(); + break; + case D_iicch_8: + L0_IICM7_SDA_OUT(); + break; + case D_iicch_9: + L0_IICM8_SDA_OUT(); + break; + default: + break; + + } + // L0_slc_1_delay(); + } + else + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SDA_IN(); + break; + case D_iicch_2: + L0_IICM1_SDA_IN(); + + break; + case D_iicch_3: + L0_IICM2_SDA_IN(); + + break; + case D_iicch_4: + L0_IICM3_SDA_IN(); + + break; + case D_iicch_5: + L0_IICM4_SDA_IN(); + + break; + case D_iicch_6: + L0_IICM5_SDA_IN(); + + break; + case D_iicch_7: + L0_IICM6_SDA_IN(); + + break; + case D_iicch_8: + L0_IICM7_SDA_IN(); + + break; + case D_iicch_9: + L0_IICM8_SDA_IN(); + + break; + default: + break; + + } + // L0_slc_f_delay(); + } + +} + + +void L0_IICMx_SDA(vtype ch,vtype v) +{ + if(v) + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SDA_ON(); + break; + case D_iicch_2: + L0_IICM1_SDA_ON(); + break; + case D_iicch_3: + L0_IICM2_SDA_ON(); + break; + case D_iicch_4: + L0_IICM3_SDA_ON(); + break; + case D_iicch_5: + L0_IICM4_SDA_ON(); + break; + case D_iicch_6: + L0_IICM5_SDA_ON(); + break; + case D_iicch_7: + L0_IICM6_SDA_ON(); + break; + case D_iicch_8: + L0_IICM7_SDA_ON(); + break; + case D_iicch_9: + L0_IICM8_SDA_ON(); + break; + default: + break; + + } + // L0_slc_1_delay(); + } + else + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SDA_OFF(); + break; + case D_iicch_2: + L0_IICM1_SDA_OFF(); + + break; + case D_iicch_3: + L0_IICM2_SDA_OFF(); + + break; + case D_iicch_4: + L0_IICM3_SDA_OFF(); + + break; + case D_iicch_5: + L0_IICM4_SDA_OFF(); + + break; + case D_iicch_6: + L0_IICM5_SDA_OFF(); + + break; + case D_iicch_7: + L0_IICM6_SDA_OFF(); + + break; + case D_iicch_8: + L0_IICM7_SDA_OFF(); + + break; + case D_iicch_9: + L0_IICM8_SDA_OFF(); + + break; + default: + break; + + } + // L0_slc_f_delay(); + } + +} + +void L0_IICMx_SCL(vtype ch,vtype v) +{ + if(v) + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SCL_ON(); + break; + case D_iicch_2: + L0_IICM1_SCL_ON(); + break; + + case D_iicch_3: + L0_IICM2_SCL_ON(); + break; + case D_iicch_4: + L0_IICM3_SCL_ON(); + break; + case D_iicch_5: + L0_IICM4_SCL_ON(); + break; + case D_iicch_6: + L0_IICM5_SCL_ON(); + break; + case D_iicch_7: + L0_IICM6_SCL_ON(); + break; + case D_iicch_8: + L0_IICM7_SCL_ON(); + break; + case D_iicch_9: + L0_IICM8_SCL_ON(); + break; + default: + break; + } + L0_slc_1_delay(ts_iicm.t1[ch]); + } + else + { + switch (ch) + { + case D_iicch_1: + L0_IICM0_SCL_OFF(); + break; + case D_iicch_2: + L0_IICM1_SCL_OFF(); + break; + + case D_iicch_3: + L0_IICM2_SCL_OFF(); + break; + case D_iicch_4: + L0_IICM3_SCL_OFF(); + break; + case D_iicch_5: + L0_IICM4_SCL_OFF(); + break; + case D_iicch_6: + L0_IICM5_SCL_OFF(); + break; + case D_iicch_7: + L0_IICM6_SCL_OFF(); + break; + case D_iicch_8: + L0_IICM7_SCL_OFF(); + break; + case D_iicch_9: + L0_IICM8_SCL_OFF(); + break; + default: + break; + } + + L0_slc_0_delay(ts_iicm.t0[ch]); + } + +} + +/* + +void L0_IICMX_SCL(unsigned char v) +{ + if(v) + { + L0_IICM1_SCL_ON();/// L0_SCL_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SCL_OFF();///L0_SCL_OFF(); + L0_slc_f_delay(); + } +} +void L0_IICM1_SDA(unsigned char v) +{ + if(v) + { + L0_IICM1_SDA_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SDA_OFF(); + L0_slc_f_delay(); + } +} +*/ +void L0_IICMx_INIT(vtype ch ,vtype v) +{ + if (v) + { + switch(ch) + { + case D_iicch_1: + L0_IICM0_SCL_init(); + L0_IICM0_SDA_init(); + break; + case D_iicch_2: + L0_IICM1_SCL_init(); + L0_IICM1_SDA_init(); + break; + case D_iicch_3: + L0_IICM2_SCL_init(); + L0_IICM2_SDA_init(); + break; + case D_iicch_4: + L0_IICM3_SCL_init(); + L0_IICM3_SDA_init(); + break; + case D_iicch_5: + L0_IICM4_SCL_init(); + L0_IICM4_SDA_init(); + break; + case D_iicch_6: + L0_IICM5_SCL_init(); + L0_IICM5_SDA_init(); + break; + case D_iicch_7: + L0_IICM6_SCL_init(); + L0_IICM6_SDA_init(); + break; + case D_iicch_8: + L0_IICM7_SCL_init(); + L0_IICM7_SDA_init(); + break; + case D_iicch_9: + L0_IICM8_SCL_init(); + L0_IICM8_SDA_init(); + break; + default: + break; + } + L0_IICMx_SDA(ch,v); + L0_IICMx_SCL(ch,v); + } + else + { + + + } +} + +unsigned char L0_IICMx_SDA_get(vtype ch) +{ + + switch(ch) + { + case D_iicch_1: + return L0_IICM0_SDA_AT(); + case D_iicch_2: + return L0_IICM1_SDA_AT(); + + case D_iicch_3: + return L0_IICM2_SDA_AT(); + + case D_iicch_4: + return L0_IICM3_SDA_AT(); + + case D_iicch_5: + return L0_IICM4_SDA_AT(); + + case D_iicch_6: + return L0_IICM5_SDA_AT(); + + case D_iicch_7: + return L0_IICM6_SDA_AT(); + + case D_iicch_8: + return L0_IICM7_SDA_AT(); + + case D_iicch_9: + return L0_IICM8_SDA_AT(); + default: + + break; + + + } + return 0; + +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_I2C_Reset(void) +{ + L0_I2C_SCL(1); L0_I2C_SDA(1); //确认释放总线 +} + + +********************/ + + +#define L0_IIC_SIM_INIT(x) +#define L0_IIC_SIM_close(x) +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_IICMx_Start(vtype ch) +{ + ///L0_IIC_SIM_INIT(); + L0_IICMx_SDA(ch,1); + L0_IICMx_SCL(ch,1); + L0_IICMx_SDA(ch,0); + L0_IICMx_SCL(ch,0); + +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_IICMx_Stop(vtype ch) +{ + + + + L0_IICMx_SDA(ch,0); + + L0_IICMx_SCL(ch,1); + + L0_IICMx_SDA(ch,1); + L0_IIC_SIM_INIT(); + L0_IIC_SIM_close(); +} + + +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +void L0_IICMx_Ack(vtype ch) +{ //设置SDA 口为输出 + L0_IICMx_SCL(ch,0); + + L0_IICMx_SDA(ch,0); + + L0_IICMx_SCL(ch,1); + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA(ch,1); +} + +void L0_IICMx_NoAck(vtype ch) +{ //设置SDA 口为输出 + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA(ch,1); + L0_IICMx_SCL(ch,1); + L0_IICMx_SCL(ch,0); + +} +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_I2C_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + L0_I2C_SCL(0); + L0_I2C_SDA(1); + L0_I2C_SCL(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + L0_I2C_SCL(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 +void L0_IICMx_SendData(vtype ch,unsigned char c ) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((c << BitCnt ) & 0x80) + L0_IICMx_SDA(ch,1); //判断发送位 + else + L0_IICMx_SDA(ch,0); + L0_IICMx_SCL(ch,1); //置时钟线为高,通知被控器开始接收数据位 + L0_IICMx_SCL(ch,0); + }//8clk + L0_IICMx_SDA(ch,1); //8位发送完后释放数据线,准备接收应答位 + L0_IICMx_SCL(ch,1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_IICMx_SCL(ch,0); +//// L0_IICMx_delay(ts_iicm.t[ch]); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 +unsigned char L0_IICMx_ReceiveData(vtype ch) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + L0_IICMx_SDA_outin(ch,0); + L0_IICMx_SDA(ch,1); //读入数据 设置SDA 口为输入 + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_IICMx_SCL(ch,0); //置时钟线为低,准备接收数据位 + L0_IICMx_SCL(ch,1); //置时钟线为高使数据线上数据有效 + IIC_RX_Data = IIC_RX_Data << 1; + if(1 == L0_IICMx_SDA_get(ch)) + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + }// 8clk up + L0_IICMx_SCL(ch,0); + L0_IICMx_SDA_outin(ch,1); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 +void L1_IICMx_ReadNByte(vtype ch,unsigned char Sal, unsigned char *p,unsigned char n) +{ + unsigned char i; + L0_IICMx_Start(ch); // 启动I2C + L0_IICMx_SendData(ch,(Sal)| 0x01); //发送器件地址 + for(i = 0;i < n-1;i ++) //读取字节数据 + { + *(p + i) = L0_IICMx_ReceiveData(ch); //读取数据 + ///printf("%x ",(int)(*(p + i))); + L0_IICMx_Ack(ch); //__/```\__ + } + *(p + n - 1) = L0_IICMx_ReceiveData(ch); + L0_IICMx_NoAck(ch); + L0_IICMx_Stop(ch); +} + +#if 0 +主机从从设备读取多个字节 +Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP +Slave SAK SAK SAK DATA DATA DATA +0x19 +0001 1001 +0011 001R + +#endif + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_IICMx_WriteReg(vtype ch,unsigned char sla,unsigned char reg ) +{ + L0_IICMx_Start(ch); //启动I2C + L0_IICMx_SendData(ch,sla);//发送器件地址 + L0_IICMx_SendData(ch,reg); +} + +///写入一个 s+sla+reg +void L2_IICMx_Write1Reg(vtype ch,unsigned char sla,unsigned char reg ) +{ + L1_IICMx_WriteReg(ch,sla,reg); + L0_IICMx_Stop(ch); +} + + + +// sla.(reg)=cmd +void L2_IICMx_WriteCmd(vtype ch,unsigned char sla,unsigned char reg,unsigned char cmd ) +{ + L1_IICMx_WriteReg(ch,sla,reg); + L0_IICMx_SendData(ch,cmd); + L0_IICMx_Stop(ch); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_IICMx_WriteReg(ch,sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICMx_ReadNByte(ch,sla,r,n); +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +unsigned char L2_IICMx_Read1Reg1D(vtype ch,unsigned char sla,unsigned char reg) +{ + U8 d; +// U8 d[1]; +//S ADD W A REG A + L1_IICMx_WriteReg(ch,sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICMx_ReadNByte(ch,sla,&d,1); + return d; +} + + + + +#if 0////不可删除 +///S 80H A Register Address A S 81H A Data NA P +void L2_tws_ReadReg000(unsigned char sla,unsigned char reg, + unsigned char *v) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + // U8 d[1]; + //S ADD W A REG A + //// L1_I2C_WriteReg(sla,reg); +//step 1---- + L0_I2C_Start(); //启动I2C +//step 2----L0_I2C_SendData(sla);//发送器件地址 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 3---L0_I2C_SendData(reg); + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((reg << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 4---- + L0_I2C_Start(); //启动I2C + +//step 5--- + //设置SDA 口为输出 + sla|=0x01; + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); +//step 6---receive data + //设置SDA 口为输出 +*v = L0_I2C_ReceiveData(); + L0_I2C_SCL(1); + L0_I2C_SCL(0);/// send NA +//step 7--- P + + L0_I2C_Stop(); + + + + +} + +///S 80H A Register Address A S 81H A Data NA P + + + +#endif + + + diff --git a/source/msp/msp_iicMx.h b/source/msp/msp_iicMx.h new file mode 100644 index 0000000..aa416fd --- /dev/null +++ b/source/msp/msp_iicMx.h @@ -0,0 +1,97 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本? 和cpu无关,唯??要修改的就是头函数中的管脚定? +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述? +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_iicM1_H_ +#define _msp_iicM1_H_ + +#include "c_lib.h" +#include "bsp_config.h" + +#if(MainFre_5M == D_sys_MainFre) + + +#define D_iicm_delay 1 + +#elif(MainFre_11M == D_sys_MainFre) +// #define L0_slc_1_delay(x) +// #define L0_slc_0_delay(x) + +#define D_iicm_delay 1 + #define L0_slc_1_delay(x) Lc_delay_nop(x); + #define L0_slc_0_delay(x) Lc_delay_nop(x); +#elif(MainFre_22M == D_sys_MainFre) + +#define D_iicm_delay 2 + + #define L0_slc_1_delay(x) Lc_delay_nop(x); + #define L0_slc_0_delay(x) Lc_delay_nop(x); +#elif(MainFre_27M == D_sys_MainFre) + +#define D_iicm_delay 3 + + +#elif(MainFre_44M == D_sys_MainFre) + +#define D_iicm_delay 4 + + #define L0_slc_1_delay(x) Lc_delay_us(x); + #define L0_slc_0_delay(x) Lc_delay_us(x); + +#else ///MainFre_11M +///#warnning +#endif//D_sys_MainFre) + + + + +///>>>端口位定义,可修?!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +typedef struct +{ + u16 t1[D_iic_chnum]; + u16 t0[D_iic_chnum]; + +}TS_iicm_; +extern TS_iicm_ ts_iicm; + + + + +//<<<<端口位定义,可修 !!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +extern void L2_IICMx_Write1Reg(vtype ch,unsigned char sla,unsigned char reg ); + +extern void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_IICMx_WriteCmd(vtype ch,unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_IICMx_INIT(vtype ch,unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg(ch,x,y,z) L2_IICMx_ReadReg((ch),(x),(y),(z),1) + +extern unsigned char L2_IICMx_Read1Reg1D(vtype ch,unsigned char sla,unsigned char reg); + +void L0_IICMx_SCL(vtype ch,vtype v); + +void L0_IICMx_SDA(vtype ch,vtype v); + + +void L0_IICMx_Stop(vtype ch); + + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/msp_iicMx.h.bak b/source/msp/msp_iicMx.h.bak new file mode 100644 index 0000000..0f0e0c6 --- /dev/null +++ b/source/msp/msp_iicMx.h.bak @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本? 和cpu无关,唯??要修改的就是头函数中的管脚定? +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述? +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_iicM1_H_ +#define _msp_iicM1_H_ + +#include "c_lib.h" +#include "bsp_config.h" +#define D_iic_chnum 2 + + +///>>>端口位定义,可修?!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +typedef struct +{ + u8 t1[D_iic_chnum]; + u8 t0[D_iic_chnum]; + +}TS_iicm_; +extern TS_iicm_ ts_iicm; + + +#if 0 + +#else + +#if 10 +#define L0_slc_1_delay(x) Lc_delay_nop(x); +#define L0_slc_0_delay(x) Lc_delay_nop(x); // 4us + +#define L0_IICMx_delay(x) ///Lc_delay_us(1) + + +#else +#define L0_slc_1_delay() Lc_delay_nop(16); +#define L0_slc_0_delay() Lc_delay_nop(8); // 4us +#endif + +#endif + +//<<<<端口位定义,可修 !!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +extern void L2_IICMx_Write1Reg(vtype ch,unsigned char sla,unsigned char reg ); + +extern void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_IICMx_WriteCmd(vtype ch,unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_IICMx_INIT(vtype ch,unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg(ch,x,y,z) L2_IICMx_ReadReg((ch),(x),(y),(z),1) + +extern unsigned char L2_IICMx_Read1Reg1D(vtype ch,unsigned char sla,unsigned char reg); + +void L0_IICMx_SCL(vtype ch,vtype v); + +void L0_IICMx_SDA(vtype ch,vtype v); + + +void L0_IICMx_Stop(vtype ch); + + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/msp_time2.c b/source/msp/msp_time2.c new file mode 100644 index 0000000..a251eac --- /dev/null +++ b/source/msp/msp_time2.c @@ -0,0 +1,44 @@ +#include "msp_Time2.h" + +#include "msp_uart1.h" +///_TS_timer2 ts_timer2; +#if 10 + +void L0_timer2_init(void)////void Timer2Init(void) //3毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x66; //设置定时初始值 + T2H = 0xEA; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +#else + +void L0_timer2_init10_22M(void)///void Timer2Init(void) //10毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x00; //设置定时初始值 + T2H = 0xB8; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +void L0_timer2_init(void)///void Timer2Init(void) //35毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x00; //设置定时初始值 + T2H = 0x04; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +void timer2_isrHanddle(void) D_SERVE_TIMER2 +{ +/// ts_timer2.callback(ts_timer2.p); +/// ts_timer2.callback(ts_timer2.p); +} + + + +#endif + +/******************************END*********************************/ + + + + diff --git a/source/msp/msp_time2.h b/source/msp/msp_time2.h new file mode 100644 index 0000000..4c273d6 --- /dev/null +++ b/source/msp/msp_time2.h @@ -0,0 +1,21 @@ +#ifndef _MSP_TIMER2_H +#define _MSP_TIMER2_H + +#include "c_type51.h" +#include "bsp_config.h" +#include "../ctask/TTSS_tick.h" +#include "msp_uart1.h" + +extern void L0_timer2_init(void); + + +#define L0_timer2_stop(); BITN_0(AUXR, T2R);/// +#define L0_timer2_start(); BITN_1(AUXR, T2R);/////定时器2开始计时 +#define L0_timer2_int_on(); BITN_1(IE2,ET2); +#define L0_timer2_int_off(); BITN_0(IE2,ET2); + + +#endif + + + diff --git a/source/msp/nouse/msp_adc.c b/source/msp/nouse/msp_adc.c new file mode 100644 index 0000000..0c316c9 --- /dev/null +++ b/source/msp/nouse/msp_adc.c @@ -0,0 +1,135 @@ +#include "msp_adc.h" +#include "debug_drv.h" +TS_task_adc_ ts_task_adc; + +void L0_ADC_init (void) +{ + ADCCFG = 0x20; + ADC_CONTR = 0x81; //??ADC??ADC1 +} + +U16 L1_ADC_Read_PT (u8 CHA) +{ + + U16 adc_data; + + ADC_CONTR &=0xF8; + ADC_CONTR |=0x40;//??AD?? + //ADC_CONTR |= CHA; + CHA &= 0x07; //??ADC?8???????(0000 0111 ?0?5?) + ADC_CONTR = (ADC_CONTR & 0xF0) | CHA; + NOP(); + NOP(); + while (!(ADC_CONTR & 0x20)); //??ADC???? + ADC_CONTR &= ~0x20; //??? + + adc_data = ADC_RES; + //adc_data <<= 8; + //adc_data |= ADC_RESL; + //adc_data = adc_data<<2; + //adc_data = ADC_RESL & 0X03; + //adc_data = adc_data | adc_data; + // L0_uartN_ushex(adc_data); + //L0_uartN_0d0a(); +/// L1_uartD_senduc('*'); + return (adc_data); + +} + +#define D_ADC_SCH1 2 +#define D_ADC_SCH2 3 +////右列U3 adc2---pin12 adc3 p1.3 + +//adc数据初始化 +void l2_task_adc_init() +{ + L1_task_init(&ts_task_adc.task); + L3_task_s_go(ts_task_adc, D_task_init); +} + + +//adc采集 +void L3_task_adc_handle(TS_task_adc_ *s) +{ + TTSS_Task_init(): + printf("\r\n adc1"); + s->change = 0; + s->fn = 0; + s->chok1 = 0;s->sum1 = 0;s->avrage1 = 0;s->ch_now = 0; + L2_task_go(D_TASK_adc_read); + TTSS_Task_step(D_TASK_adc_read): //adc判断读取 + if(1 == s->change) + { + s->change = 0; + s->fn = 0; + L2_task_go(D_TASK_adc_change_ch); + }else + { + + } + TTSS_Task_step(D_TASK_adc_change_ch): //adc判断读取 + if(0 == s->ch_now) + { + s->val = L1_ADC_Read_PT(D_ADC_SCH1); + } + else + { + s->val = L1_ADC_Read_PT(D_ADC_SCH2); + } + printf(" %d:%d-%d ",(int)s->ch_now,(int)s->fn,(int)s->val); + s->sum1 += s->val; + s->sum1 -= s->avrage1; + s->avrage1 = s->sum1 >> 3; + if(s->fn >= 12) + { + s->chok1 = 1; + + L2_task_go(D_TASK_adc_read); + }else + { + s->fn ++; + ///L2_task_Cdelay_go(10000,D_TASK_adc_change_ch);////100000--2s + L2_task_Cdelay_go(100,D_TASK_adc_change_ch);////100000--2s + + } + TTSS_Task_end(); +} + + +#if 0 +///D_cmd_filter_adc L3_ADC_debug(D_cmd_filter_adc) +void L3_ADC_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 + { + + } + } +} + +#endif + + diff --git a/source/msp/nouse/msp_adc.h b/source/msp/nouse/msp_adc.h new file mode 100644 index 0000000..01e9484 --- /dev/null +++ b/source/msp/nouse/msp_adc.h @@ -0,0 +1,66 @@ +#ifndef _msp_adc_H_ +#define _msp_adc_H_ + + +#include "stdio.h" +//#include "c_type51.h" +///#include "c_lib.h" +#include "bsp_config.h" +#include "msp_uart1.h" +///#include "msp_uartN.h" + +#include "TTSS_task.h" +////#define L1_uartD_senduc(x) L0_uartN_uc(D_UART1,(x)); + +typedef struct +{ + TS_task task; + + vU8 ch_now; + + + vU8 chok1; ///当前通道的adc采样ok + vU8 chok2; ///当前通道的adc采样ok + vU8 change; + + vU8 val; + vU8 fn; + + + vU32 sum1; + vU32 avrage1; + vU16 u16_out1; + vU8 u8_out1; + + vU32 sum2; + vU32 avrage2; + vU16 u16_out2; + vU8 u8_out2; + + + vU32 sum3; + vU32 avrage3; + vU16 u16_out3; + vU8 u8_out3; + + +}TS_task_adc_; + +extern TS_task_adc_ ts_task_adc; + +#define D_TASK_adc_read 0x31 +#define D_TASK_adc_change_ch 0x30 + + +extern void L0_ADC_init(void); +extern U16 L1_ADC_Read_PT(u8 CHA); +#define D_cmd_filter_adc 0xfa +extern void L3_ADC_debug(u8 filter); + + +extern void L0_ADC_init(void); +extern U16 L1_ADC_Read_PT(u8 CHA); +extern void l2_task_adc_init(); +extern void L3_task_adc_handle(TS_task_adc_ *s); + +#endif //#ifndef _msp_iicM1_H_ diff --git a/source/msp/nouse/msp_id.c b/source/msp/nouse/msp_id.c new file mode 100644 index 0000000..c2c345b --- /dev/null +++ b/source/msp/nouse/msp_id.c @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2018, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file msp_eeprom.c +/// @brief msp @ driver config +///------------------------------------------------------------------------- +/// @version 1.0 +/// @author CC +/// @date 20190106 +/// @note cc_AS_stc02 由stc-isp v6.0860 +////////////////////////////////////////////////////////////////////////////// +#include "msp_id.h" + +#define MSP_ID_LEN 7 + +void L0_id_get(U8 *id) +{ + U8 i = 0; + char *ID = (char idata *)0xf1; + for(i=0;i>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + + +#include "msp_uart0.h" + +extern void L0_id_get(U8 *id); +extern void L0_id_get_rom(U8 *id); +extern void L0_id_main(void); + +#endif// #ifndef _msp_eeprom_H_ + + + diff --git a/source/msp/nouse/msp_iicM1.c b/source/msp/nouse/msp_iicM1.c new file mode 100644 index 0000000..706954c --- /dev/null +++ b/source/msp/nouse/msp_iicM1.c @@ -0,0 +1,382 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_iicM1.h" + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +void L0_IICM1_SCL(unsigned char v) +{ + if(v) + { + L0_IICM1_SCL_ON();/// L0_SCL_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SCL_OFF();///L0_SCL_OFF(); + L0_slc_0_delay(); + } +} +void L0_IICM1_SDA(unsigned char v) +{ + if(v) + { + L0_IICM1_SDA_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SDA_OFF(); + L0_slc_0_delay(); + } +} +void L0_IICM1_INIT(unsigned char v) +{ + if (v) + { + //L0_IIC_SIM_INIT(); + L0_IICM1_SCL_init(); + L0_IICM1_SDA_init(); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + }else + { + + + } +} + +unsigned char L0_IICM1_SDA_ask(void) +{ + + return L0_IICM1_SDA_AT(); + +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_I2C_Reset(void) +{ + L0_I2C_SCL(1); L0_I2C_SDA(1); //确认释放总线 +} + + +********************/ + + +#define L0_IIC_SIM_INIT() +#define L0_IIC_SIM_close() +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_IICM1_Start(void) +{ + ///L0_IIC_SIM_INIT(); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + L0_IICM1_SDA(0); + L0_IICM1_SCL(0); +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_IICM1_Stop(void) +{ + L0_IICM1_SDA(0); + + L0_IICM1_SCL(1); + + L0_IICM1_SDA(1); + L0_IIC_SIM_INIT(); + L0_IIC_SIM_close(); +} +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +void L0_IICM1_Ack(void) +{ //设置SDA 口为输出 + L0_IICM1_SCL(0); + L0_IICM1_SDA(0); + L0_IICM1_SCL(1); + L0_IICM1_SCL(0); + L0_IICM1_SDA(1); +} + +void L0_IICM1_NoAck(void) +{ //设置SDA 口为输出 + L0_IICM1_SCL(0); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + L0_IICM1_SCL(0); + +} +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_I2C_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + L0_I2C_SCL(0); + L0_I2C_SDA(1); + L0_I2C_SCL(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + L0_I2C_SCL(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 +void L0_IICM1_SendData(unsigned char c) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((c << BitCnt ) & 0x80) + L0_IICM1_SDA(1); //判断发送位 + else + L0_IICM1_SDA(0); + L0_IICM1_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_IICM1_SCL(0); + }//8clk + L0_IICM1_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_IICM1_SCL(1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_IICM1_SCL(0); + L0_IICM1_delay(); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 +unsigned char L0_IICM1_ReceiveData(void) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + L0_IICM1_SDA(1); //读入数据 设置SDA 口为输入 + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_IICM1_delay(1); + L0_IICM1_SCL(0); //置时钟线为低,准备接收数据位 + L0_IICM1_SCL(1); //置时钟线为高使数据线上数据有效 + L0_IICM1_delay(1); + IIC_RX_Data = IIC_RX_Data << 1; + if(1 == L0_IICM1_SDA_ask()) + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + L0_IICM1_delay(1); + }// 8clk up + L0_IICM1_SCL(0); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 +void L1_IICM1_ReadNByte(unsigned char Sal, unsigned char *p,unsigned char n) +{ + unsigned char i; + L0_IICM1_Start(); // 启动I2C + L0_IICM1_SendData((Sal)| 0x01); //发送器件地址 + for(i = 0;i < n-1;i ++) //读取字节数据 + { + *(p + i) = L0_IICM1_ReceiveData(); //读取数据 + ///printf("%x ",(int)(*(p + i))); + L0_IICM1_Ack(); //__/```\__ + } + *(p + n - 1) = L0_IICM1_ReceiveData(); + L0_IICM1_NoAck(); + L0_IICM1_Stop(); +} + +#if 0 +主机从从设备读取多个字节 +Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP +Slave SAK SAK SAK DATA DATA DATA +0x19 +0001 1001 +0011 001R + +#endif + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_IICM1_WriteReg(unsigned char sla,unsigned char reg) +{ + L0_IICM1_Start(); //启动I2C + L0_IICM1_SendData(sla);//发送器件地址 + L0_IICM1_SendData(reg); +} + + + +// sla.(reg)=cmd +void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd) +{ + L1_IICM1_WriteReg(sla,reg); + L0_IICM1_SendData(cmd); + L0_IICM1_Stop(); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_IICM1_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM1_ReadNByte(sla,r,n); +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +unsigned char L2_IICM1_Read1Reg1D(unsigned char sla,unsigned char reg) +{ + U8 d; +// U8 d[1]; +//S ADD W A REG A + L1_IICM1_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM1_ReadNByte(sla,&d,1); + return d; +} + +#if 0////不可删除 +///S 80H A Register Address A S 81H A Data NA P +void L2_tws_ReadReg000(unsigned char sla,unsigned char reg, + unsigned char *v) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + // U8 d[1]; + //S ADD W A REG A + //// L1_I2C_WriteReg(sla,reg); +//step 1---- + L0_I2C_Start(); //启动I2C +//step 2----L0_I2C_SendData(sla);//发送器件地址 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 3---L0_I2C_SendData(reg); + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((reg << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 4---- + L0_I2C_Start(); //启动I2C + +//step 5--- + //设置SDA 口为输出 + sla|=0x01; + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); +//step 6---receive data + //设置SDA 口为输出 +*v = L0_I2C_ReceiveData(); + L0_I2C_SCL(1); + L0_I2C_SCL(0);/// send NA +//step 7--- P + + L0_I2C_Stop(); + + + + +} + +///S 80H A Register Address A S 81H A Data NA P + + + +#endif + + + diff --git a/source/msp/nouse/msp_iicM1.h b/source/msp/nouse/msp_iicM1.h new file mode 100644 index 0000000..c561ffc --- /dev/null +++ b/source/msp/nouse/msp_iicM1.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_iicM1_H_ +#define _msp_iicM1_H_ + +#include "c_lib.h" +#include "bsp_config.h" + + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + +#if 0 +//// for stc 11.0M +#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +#define L0_I2C_delay(x) NOP();NOP();///Lc_delay_us(x) +#else +///#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +///#define L0_I2C_delay(x) NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(x) + +//#define delay10us() Lc_delay_us(3000) //根据cpu的速率进行相应的调整 +//#define L0_I2C_delay(x) Lc_delay_us(10000) +///#define delay10us() Lc_delay_us(80) //20us +///#define L0_I2C_delay(x) Lc_delay_us(300) //25us + +#define L0_slc_1_delay() Lc_delay_nop(4); +#define L0_slc_0_delay() Lc_delay_nop(1); // 4us + +#define L0_IICM1_delay(x) ///Lc_delay_us(80) + +#endif + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_IICM1_INIT(unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg(x,y,z) L2_IICM1_ReadReg((x),(y),(z),1) + +extern unsigned char L2_IICM1_Read1Reg1D(unsigned char sla,unsigned char reg); + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/nouse/msp_iicM2.c b/source/msp/nouse/msp_iicM2.c new file mode 100644 index 0000000..7164729 --- /dev/null +++ b/source/msp/nouse/msp_iicM2.c @@ -0,0 +1,383 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +///#include "msp_iicM1.h" +#include "msp_iicM2.h" + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +void L0_IICM2_SCL(unsigned char v) +{ + if(v) + { + L0_IICM2_SCL_ON();/// L0_SCL_ON(); + L0_slc2_1_delay(); + } + else + { + L0_IICM2_SCL_OFF();///L0_SCL_OFF(); + L0_slc2_0_delay(); + } +} +void L0_IICM2_SDA(unsigned char v) +{ + if(v) + { + L0_IICM2_SDA_ON(); + L0_slc2_1_delay(); + } + else + { + L0_IICM2_SDA_OFF(); + L0_slc2_0_delay(); + } +} +void L0_IICM2_INIT(unsigned char v) +{ + if (v) + { + //L0_IIC_SIM2_INIT(); + L0_IICM2_SCL_init(); + L0_IICM2_SDA_init(); + L0_IICM2_SDA(1); + L0_IICM2_SCL(1); + }else + { + + + } +} + +unsigned char L0_IICM2_SDA_ask(void) +{ + + return L0_IICM2_SDA_AT(); + +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_I2C_Reset(void) +{ + L0_I2C_SCL(1); L0_I2C_SDA(1); //确认释放总线 +} + + +********************/ + + +#define L0_IIC_SIM2_INIT() +#define L0_IIC_SIM2_close() +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_IICM2_Start(void) +{ + ///L0_IIC_SIM2_INIT(); + L0_IICM2_SDA(1); + L0_IICM2_SCL(1); + L0_IICM2_SDA(0); + L0_IICM2_SCL(0); +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_IICM2_Stop(void) +{ + L0_IICM2_SDA(0); + + L0_IICM2_SCL(1); + + L0_IICM2_SDA(1); + L0_IIC_SIM2_INIT(); + L0_IIC_SIM2_close(); +} +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +void L0_IICM2_Ack(void) +{ //设置SDA 口为输出 + L0_IICM2_SCL(0); + L0_IICM2_SDA(0); + L0_IICM2_SCL(1); + L0_IICM2_SCL(0); + L0_IICM2_SDA(1); +} + +void L0_IICM2_NoAck(void) +{ //设置SDA 口为输出 + L0_IICM2_SCL(0); + L0_IICM2_SDA(1); + L0_IICM2_SCL(1); + L0_IICM2_SCL(0); + +} +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_I2C_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + L0_I2C_SCL(0); + L0_I2C_SDA(1); + L0_I2C_SCL(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + L0_I2C_SCL(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 +void L0_IICM2_SendData(unsigned char c) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((c << BitCnt ) & 0x80) + L0_IICM2_SDA(1); //判断发送位 + else + L0_IICM2_SDA(0); + L0_IICM2_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_IICM2_SCL(0); + }//8clk + L0_IICM2_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_IICM2_SCL(1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_IICM2_SCL(0); + L0_IICM2_delay(); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 +unsigned char L0_IICM2_ReceiveData(void) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + L0_IICM2_SDA(1); //读入数据 设置SDA 口为输入 + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_IICM2_delay(1); + L0_IICM2_SCL(0); //置时钟线为低,准备接收数据位 + L0_IICM2_SCL(1); //置时钟线为高使数据线上数据有效 + L0_IICM2_delay(1); + IIC_RX_Data = IIC_RX_Data << 1; + if(1 == L0_IICM2_SDA_ask()) + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + L0_IICM2_delay(1); + }// 8clk up + L0_IICM2_SCL(0); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 +void L1_IICM2_ReadNByte(unsigned char Sal, unsigned char *p,unsigned char n) +{ + unsigned char i; + L0_IICM2_Start(); // 启动I2C + L0_IICM2_SendData((Sal)| 0x01); //发送器件地址 + for(i = 0;i < n-1;i ++) //读取字节数据 + { + *(p + i) = L0_IICM2_ReceiveData(); //读取数据 + ///printf("%x ",(int)(*(p + i))); + L0_IICM2_Ack(); //__/```\__ + } + *(p + n - 1) = L0_IICM2_ReceiveData(); + L0_IICM2_NoAck(); + L0_IICM2_Stop(); +} + +#if 0 +主机从从设备读取多个字节 +Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP +Slave SAK SAK SAK DATA DATA DATA +0x19 +0001 1001 +0011 001R + +#endif + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_IICM2_WriteReg(unsigned char sla,unsigned char reg) +{ + L0_IICM2_Start(); //启动I2C + L0_IICM2_SendData(sla);//发送器件地址 + L0_IICM2_SendData(reg); +} + + + +// sla.(reg)=cmd +void L2_IICM2_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd) +{ + L1_IICM2_WriteReg(sla,reg); + L0_IICM2_SendData(cmd); + L0_IICM2_Stop(); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICM2_ReadReg(unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_IICM2_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM2_ReadNByte(sla,r,n); +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +unsigned char L2_IICM2_Read1Reg1D(unsigned char sla,unsigned char reg) +{ + U8 d; +// U8 d[1]; +//S ADD W A REG A + L1_IICM2_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM2_ReadNByte(sla,&d,1); + return d; +} + +#if 0////不可删除 +///S 80H A Register Address A S 81H A Data NA P +void L2_tws_ReadReg000(unsigned char sla,unsigned char reg, + unsigned char *v) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + // U8 d[1]; + //S ADD W A REG A + //// L1_I2C_WriteReg(sla,reg); +//step 1---- + L0_I2C_Start(); //启动I2C +//step 2----L0_I2C_SendData(sla);//发送器件地址 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 3---L0_I2C_SendData(reg); + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((reg << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 4---- + L0_I2C_Start(); //启动I2C + +//step 5--- + //设置SDA 口为输出 + sla|=0x01; + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); +//step 6---receive data + //设置SDA 口为输出 +*v = L0_I2C_ReceiveData(); + L0_I2C_SCL(1); + L0_I2C_SCL(0);/// send NA +//step 7--- P + + L0_I2C_Stop(); + + + + +} + +///S 80H A Register Address A S 81H A Data NA P + + + +#endif + + + diff --git a/source/msp/nouse/msp_iicM2.h b/source/msp/nouse/msp_iicM2.h new file mode 100644 index 0000000..70a49d8 --- /dev/null +++ b/source/msp/nouse/msp_iicM2.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_iicM2_H_ +#define _msp_iicM2_H_ + +#include "c_lib.h" +#include "bsp_config.h" + + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + +#if 0 +//// for stc 11.0M +#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +#define L0_I2C_delay(x) NOP();NOP();///Lc_delay_us(x) +#else +///#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +///#define L0_I2C_delay(x) NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(x) + +//#define delay10us() Lc_delay_us(3000) //根据cpu的速率进行相应的调整 +//#define L0_I2C_delay(x) Lc_delay_us(10000) +///#define delay10us() Lc_delay_us(80) //20us +///#define L0_I2C_delay(x) Lc_delay_us(300) //25us + +#define L0_slc2_1_delay() Lc_delay_nop(4); +#define L0_slc2_0_delay() Lc_delay_nop(1); // 4us + +#define L0_IICM2_delay(x) ///Lc_delay_us(80) + +#endif + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L2_IICM2_ReadReg(unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_IICM2_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_IICM2_INIT(unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg2(x,y,z) L2_IICM2_ReadReg((x),(y),(z),1) + +extern unsigned char L2_IICM2_Read1Reg1D(unsigned char sla,unsigned char reg); + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/nouse/msp_iicMx c.c b/source/msp/nouse/msp_iicMx c.c new file mode 100644 index 0000000..a3a075b --- /dev/null +++ b/source/msp/nouse/msp_iicMx c.c @@ -0,0 +1,447 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_iicM1.h" + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_IICMx_SDA(vtype ch,vtype v) +{ + +} + +vtype L0_IICMx_SDA_get(vtype ch,vtype v) +{ + +} + + +void L0_IICMx_SCL(vtype ch,vtype v) +{ + if(v) + { + L0_IICM1_SCL_ON();/// L0_SCL_ON(); + switch (ch) + { + case 0: + L0_IICM1_SCL_ON(); + break; + case 1: + L0_IICM1_SCL_ON(); + break; + + case 2: + L0_IICM1_SCL_ON(); + break; + + + + } + + + + L0_slc_1_delay(); + } + else + { + + switch (ch) + { + case 0: + L0_IICM1_SCL_Off(); + break; + case 1: + L0_IICM1_SCL_Off(); + break; + + case 2: + L0_IICM1_SCL_ON(); + break; + + + + } + + + + + L0_slc_0_delay(); + } +} + + + + +void L0_IICM1_SCL(unsigned char v) +{ + if(v) + { + L0_IICM1_SCL_ON();/// L0_SCL_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SCL_OFF();///L0_SCL_OFF(); + L0_slc_0_delay(); + } +} +void L0_IICM1_SDA(unsigned char v) +{ + if(v) + { + L0_IICM1_SDA_ON(); + L0_slc_1_delay(); + } + else + { + L0_IICM1_SDA_OFF(); + L0_slc_0_delay(); + } +} +void L0_IICM1_INIT(unsigned char v) +{ + if (v) + { + //L0_IIC_SIM_INIT(); + L0_IICM1_SCL_init(); + L0_IICM1_SDA_init(); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + }else + { + + + } +} + +unsigned char L0_IICM1_SDA_ask(void) +{ + + return L0_IICM1_SDA_AT(); + +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_I2C_Reset(void) +{ + L0_I2C_SCL(1); L0_I2C_SDA(1); //确认释放总线 +} + + +********************/ + + +#define L0_IIC_SIM_INIT() +#define L0_IIC_SIM_close() +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_IICM1_Start(void) +{ + ///L0_IIC_SIM_INIT(); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + L0_IICM1_SDA(0); + L0_IICM1_SCL(0); +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_IICM1_Stop(void) +{ + L0_IICM1_SDA(0); + + L0_IICM1_SCL(1); + + L0_IICM1_SDA(1); + L0_IIC_SIM_INIT(); + L0_IIC_SIM_close(); +} +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +void L0_IICM1_Ack(void) +{ //设置SDA 口为输出 + L0_IICM1_SCL(0); + L0_IICM1_SDA(0); + L0_IICM1_SCL(1); + L0_IICM1_SCL(0); + L0_IICM1_SDA(1); +} + +void L0_IICM1_NoAck(void) +{ //设置SDA 口为输出 + L0_IICM1_SCL(0); + L0_IICM1_SDA(1); + L0_IICM1_SCL(1); + L0_IICM1_SCL(0); + +} +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_I2C_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + L0_I2C_SCL(0); + L0_I2C_SDA(1); + L0_I2C_SCL(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + L0_I2C_SCL(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 +void L0_IICM1_SendData(unsigned char c) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((c << BitCnt ) & 0x80) + L0_IICM1_SDA(1); //判断发送位 + else + L0_IICM1_SDA(0); + L0_IICM1_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_IICM1_SCL(0); + }//8clk + L0_IICM1_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_IICM1_SCL(1); + ///gRccUs05 += L0_I2C_SDA_ask(); + L0_IICM1_SCL(0); + L0_IICM1_delay(); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 +unsigned char L0_IICM1_ReceiveData(void) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + L0_IICM1_SDA(1); //读入数据 设置SDA 口为输入 + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_IICM1_delay(1); + L0_IICM1_SCL(0); //置时钟线为低,准备接收数据位 + L0_IICM1_SCL(1); //置时钟线为高使数据线上数据有效 + L0_IICM1_delay(1); + IIC_RX_Data = IIC_RX_Data << 1; + if(1 == L0_IICM1_SDA_ask()) + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + L0_IICM1_delay(1); + }// 8clk up + L0_IICM1_SCL(0); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 +void L1_IICM1_ReadNByte(unsigned char Sal, unsigned char *p,unsigned char n) +{ + unsigned char i; + L0_IICM1_Start(); // 启动I2C + L0_IICM1_SendData((Sal)| 0x01); //发送器件地址 + for(i = 0;i < n-1;i ++) //读取字节数据 + { + *(p + i) = L0_IICM1_ReceiveData(); //读取数据 + ///printf("%x ",(int)(*(p + i))); + L0_IICM1_Ack(); //__/```\__ + } + *(p + n - 1) = L0_IICM1_ReceiveData(); + L0_IICM1_NoAck(); + L0_IICM1_Stop(); +} + +#if 0 +主机从从设备读取多个字节 +Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP +Slave SAK SAK SAK DATA DATA DATA +0x19 +0001 1001 +0011 001R + +#endif + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_IICM1_WriteReg(unsigned char sla,unsigned char reg) +{ + L0_IICM1_Start(); //启动I2C + L0_IICM1_SendData(sla);//发送器件地址 + L0_IICM1_SendData(reg); +} + + + +// sla.(reg)=cmd +void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd) +{ + L1_IICM1_WriteReg(sla,reg); + L0_IICM1_SendData(cmd); + L0_IICM1_Stop(); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } + ***************/ +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A + L1_IICM1_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM1_ReadNByte(sla,r,n); +} + +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +unsigned char L2_IICM1_Read1Reg1D(unsigned char sla,unsigned char reg) +{ + U8 d; +// U8 d[1]; +//S ADD W A REG A + L1_IICM1_WriteReg(sla,reg); +//S ADD R A D1 A D2 A.....DX N P + L1_IICM1_ReadNByte(sla,&d,1); + return d; +} + +#if 0////不可删除 +///S 80H A Register Address A S 81H A Data NA P +void L2_tws_ReadReg000(unsigned char sla,unsigned char reg, + unsigned char *v) +{ + unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + // U8 d[1]; + //S ADD W A REG A + //// L1_I2C_WriteReg(sla,reg); +//step 1---- + L0_I2C_Start(); //启动I2C +//step 2----L0_I2C_SendData(sla);//发送器件地址 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 3---L0_I2C_SendData(reg); + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((reg << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); + +//step 4---- + L0_I2C_Start(); //启动I2C + +//step 5--- + //设置SDA 口为输出 + sla|=0x01; + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { + if((sla << BitCnt ) & 0x80) + L0_I2C_SDA(1); //判断发送位 + else + L0_I2C_SDA(0); + L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位 + L0_I2C_SCL(0); + }//8clk + L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位 + L0_I2C_SCL(1); + L0_I2C_SCL(0); +//step 6---receive data + //设置SDA 口为输出 +*v = L0_I2C_ReceiveData(); + L0_I2C_SCL(1); + L0_I2C_SCL(0);/// send NA +//step 7--- P + + L0_I2C_Stop(); + + + + +} + +///S 80H A Register Address A S 81H A Data NA P + + + +#endif + + + diff --git a/source/msp/nouse/msp_iicMx f.h b/source/msp/nouse/msp_iicMx f.h new file mode 100644 index 0000000..c561ffc --- /dev/null +++ b/source/msp/nouse/msp_iicMx f.h @@ -0,0 +1,63 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _msp_iicM1_H_ +#define _msp_iicM1_H_ + +#include "c_lib.h" +#include "bsp_config.h" + + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + +#if 0 +//// for stc 11.0M +#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +#define L0_I2C_delay(x) NOP();NOP();///Lc_delay_us(x) +#else +///#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +///#define L0_I2C_delay(x) NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(x) + +//#define delay10us() Lc_delay_us(3000) //根据cpu的速率进行相应的调整 +//#define L0_I2C_delay(x) Lc_delay_us(10000) +///#define delay10us() Lc_delay_us(80) //20us +///#define L0_I2C_delay(x) Lc_delay_us(300) //25us + +#define L0_slc_1_delay() Lc_delay_nop(4); +#define L0_slc_0_delay() Lc_delay_nop(1); // 4us + +#define L0_IICM1_delay(x) ///Lc_delay_us(80) + +#endif + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_IICM1_INIT(unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg(x,y,z) L2_IICM1_ReadReg((x),(y),(z),1) + +extern unsigned char L2_IICM1_Read1Reg1D(unsigned char sla,unsigned char reg); + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/nouse/msp_iicN1.h b/source/msp/nouse/msp_iicN1.h new file mode 100644 index 0000000..99ed2bc --- /dev/null +++ b/source/msp/nouse/msp_iicN1.h @@ -0,0 +1,62 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _IIC_M1_H_ +#define _IIC_M1_H_ + +#include "c_lib.h" +#include "bsp_config.h" + + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + + +#if 0 +//// for stc 11.0M +#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +#define L0_I2C_delay(x) NOP();NOP();///Lc_delay_us(x) +#else +///#define delay10us() NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(1) //根据cpu的速率进行相应的调整 +///#define L0_I2C_delay(x) NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();///Lc_delay_us(x) + +//#define delay10us() Lc_delay_us(3000) //根据cpu的速率进行相应的调整 +//#define L0_I2C_delay(x) Lc_delay_us(10000) +///#define delay10us() Lc_delay_us(80) //20us +///#define L0_I2C_delay(x) Lc_delay_us(300) //25us + +#define L0_slc_1_delay() Lc_delay_nop(4); +#define L0_slc_0_delay() Lc_delay_nop(1); // 4us + +#define L0_I2C_delay(x) ///Lc_delay_us(80) + +#endif + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern void L2_I2C_ReadReg(unsigned char sla,unsigned char reg,unsigned char *r,unsigned char n); +extern void L2_I2C_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd); +extern void L0_I2C_INIT(unsigned char v); +////extern void L2_tws_ReadReg(unsigned char sla,unsigned char reg, +//// unsigned char *v); +#define L2_tws_ReadReg(x,y,z) L2_I2C_ReadReg((x),(y),(z),1) + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/nouse/msp_time1.c b/source/msp/nouse/msp_time1.c new file mode 100644 index 0000000..55eca80 --- /dev/null +++ b/source/msp/nouse/msp_time1.c @@ -0,0 +1,204 @@ +#include "msp_Time1.h" +#define D_TIMER_COUNT(t,clk,timeInUs) (U16)(65536- 1.0 * (clk) / 1000 * (1.0 * timeInUs / 1000) / t) +_TS_timer1 ts_timer1; +#if 0 + + +void L0_timer1_Init_7ms(void) //7毫秒@11.0592MHz +{ + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xCD; //设置定时初值 + TH1 = 0xE6; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init_5ms(void) //5毫秒@11.0592MHz +{//0x7F示波器测试大约40ms,led闪烁 肉眼可见 + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0x00; //设置定时初值 + TH1 = 0xEE; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init_1ms(void) //1毫秒@11.0592MHz +{ + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xCD; //设置定时初值 + TH1 = 0xD4; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + +void L0_timer1_Init(void) //600微秒@11.0592MHz +{ + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,TYPE_JIFFIES_600US); + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + + +//0x7F示波器测试大约40ms,led闪烁 肉眼可见 +void L0_timer1_reset(void) +{ + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,TYPE_JIFFIES_600US); + TR1 = 0; + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 + TR1 = 1; + TF1 = 0; +} + + +void L0_timer1_start() //600微秒@11.0592MHz +{ +#if 0 + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0x14; //设置定时初值 + TH1 = 0xE6; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc + +#else + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,TYPE_JIFFIES_600US); + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + //TL1 = 0xCD; //设置定时初始值 + //TH1 = 0xD4; //设置定时初始值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +#endif +} + + +void L0_timer1_restart() //600微秒@11.0592MHz +{ + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,TYPE_JIFFIES_600US); + TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果 +#if 1 + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc + +#else + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xCD; //设置定时初始值 + TH1 = 0xD4; //设置定时初始值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +#endif +} + +void L0_timer1_stop2222(void) +{ + TR1 = 0; + TF1 = 0; +} + +void L0_timer1_init6666(void) //TYPE_JIFFIES_25MS@11.0592MHz +{ + U16 val = D_TIMER_COUNT(1,D_sys_MainFre,TYPE_JIFFIES_25MS); + TR1 = 0; //先关闭,否则会重复中断,起不到resetart效果 + AUXR |= 0x40; //定时器时钟1T模式 + TMOD &= 0x0F; //设置定时器模式 + //TL1 = 0x14; //设置定时初值 + //TH1 = 0xE6; //设置定时初值 + TL1 = val; //设置定时初值 + TH1 = val >>8; //设置定时初值 + TF1 = 0; //清除TF1标志 + TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc + + + + +} + +#endif + + + + +void L0_timer1_init(void) +///void Timer1Init(void) //20毫秒@22.1184MHz +{ + AUXR &= 0xBF; //定时器时钟12T模式 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0x00; //设置定时初始值 + TH1 = 0x70; //设置定时初始值 + TF1 = 0; //清除TF1标志 +// TR1 = 1; //定时器1开始计时 + ET1 = 1; //add by cc +} + + +void timer1_isrHanddle(void) interrupt 3//// D_SERVE_TIMER1 +{ + + TF1 = 0; //清除TF1标志 + + D_motor1_BI_rev(); + +#if 0 + Ts_uart_rev_ *p = &s_uart0_rec; + #define D_s_modbus_min 4 //modbus协议的最小长度 + + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + //LED1 ^= 1; + p->head = 0; + #ifdef D_use_crc + crc16qq(p->crc,p->buf,p->num - 2); ////fixme 20220311 ///crc16qq(p->crc,p->buf,p->num - 2); //校验CRC + #endif + + // crc16(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + p->ok = 1; + LED0 ^= 1; + } + p->debugok = 1; + } + L0_timer1_stop(); +#endif +/// L2_callback_uart0_free(); + +// ts_timer1.callback(); + +} + + +/******************************END*********************************/ + + + + diff --git a/source/msp/nouse/msp_time2.c b/source/msp/nouse/msp_time2.c new file mode 100644 index 0000000..94e763d --- /dev/null +++ b/source/msp/nouse/msp_time2.c @@ -0,0 +1,42 @@ +#include "msp_Time2.h" + +#include "msp_uart1.h" +_TS_timer2 ts_timer2; +#if 10 + +void L0_timer2_init(void)////void Timer2Init(void) //3毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x66; //设置定时初始值 + T2H = 0xEA; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +#else + +void L0_timer2_init10_22M(void)///void Timer2Init(void) //10毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x00; //设置定时初始值 + T2H = 0xB8; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +void L0_timer2_init(void)///void Timer2Init(void) //35毫秒@22.1184MHz +{ + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0x00; //设置定时初始值 + T2H = 0x04; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} +#endif +void timer2_isrHanddle(void) D_SERVE_TIMER2 +{ +/// ts_timer2.callback(ts_timer2.p); +/// ts_timer2.callback(ts_timer2.p); +} + + +/******************************END*********************************/ + + + + diff --git a/source/msp/nouse/msp_time2.h b/source/msp/nouse/msp_time2.h new file mode 100644 index 0000000..fe44ef9 --- /dev/null +++ b/source/msp/nouse/msp_time2.h @@ -0,0 +1,28 @@ +#ifndef _MSP_TIMER2_H +#define _MSP_TIMER2_H + +#include "c_type51.h" +#include "../bsp/bsp_config.h" +#include "../ctask/TTSS_tick.h" +#include "msp_uart1.h" + +extern void L0_timer2_init(void); + + +#define L0_timer2_stop(); BITN_0(AUXR, T2R);/// +#define L0_timer2_start(); BITN_1(AUXR, T2R);/////定时器2开始计时 +#define L0_timer2_int_on(); BITN_1(IE2,ET2); +#define L0_timer2_int_off(); BITN_0(IE2,ET2); + +typedef struct +{ +/// void (*callback)(Ts_uart_rev_ *p); +// Ts_uart_rev_ *p; + int *p; +}_TS_timer2; +extern _TS_timer2 ts_timer2; + +#endif + + + diff --git a/source/msp/simiic n/msp_siic1.c b/source/msp/simiic n/msp_siic1.c new file mode 100644 index 0000000..24481a8 --- /dev/null +++ b/source/msp/simiic n/msp_siic1.c @@ -0,0 +1,140 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2022, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 +/// @info 如无必要请勿修改 +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20220404 +/// @info 优化init函数 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic1.h" + +void L0_siic1_SDA_out(vType v) +{ + if(v) + { + L0_SDA1_OUT(); + }else + { + L0_SDA1_IN(); + } +} +void L0_siic1_SDA(vType v) +{ +/// printf("sda\r\n"); + if(v) + { + L0_SDA1_ON(); + }else + { + L0_SDA1_OFF(); + } +} + +vType L0_siic1_SDA_get(void) +{ + + if( 0!= L0_SDA1_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic1_SCL_out(vType v) +{ + if(v) + { + L0_SCL1_OUT(); + }else + { + L0_SCL1_IN(); + } + +} + +void L0_siic1_SCL(vType v) +{ + if(v) + { + L0_SCL1_ON(); + }else + { + L0_SCL1_OFF(); + } + + Lc_delay_us(D_SIIC1_DELAY); + + +} + + + +void L0_siic1_close(void) +{ + ///管教设置为高阻态 +} + + + +void L1_siic1_INIT(vtype openclose) +{ + + ts_siic[D_IIC_CH1].n = 0; + ts_siic[D_IIC_CH1].sh = D_IIC_CH1; + ts_siic[D_IIC_CH1].sal = D_iic1_addr;//unsigned char sal; // + ts_siic[D_IIC_CH1].pf_SDA_out = L0_siic1_SDA_out;//void (*pf_SDA_out)(vType x); // + ts_siic[D_IIC_CH1].pf_SDA_set = L0_siic1_SDA;//void (*pf_SDA_set)(vType x); // + ts_siic[D_IIC_CH1].pf_SDA_get = L0_siic1_SDA_get;//vType (*pf_SDA_get)(void); // + ts_siic[D_IIC_CH1].pf_SCL_out = L0_siic1_SCL_out;//void (*pf_SCL_out)(vType x); // + ts_siic[D_IIC_CH1].pf_SCL_set = L0_siic1_SCL;//void (*pf_SCL_set)(vType x); // +/// ts_siic[D_IIC_CH1].pf_init = L1_siic1_INIT;//void (*pf_init)(void); // + + + + if (openclose) + { + + + }else + { + + } + +} + +/*** + + +TS_siic ts_siic1= +{ + + 0,//vU32 n; // + 1,//vType sh; // + D_iic1_addr,//unsigned char sal; // + L0_siic1_SDA_out,//void (*pf_SDA_out)(vType x); // + L0_siic1_SDA,//void (*pf_SDA_set)(vType x); // + L0_siic1_SDA_get,//vType (*pf_SDA_get)(void); // + L0_siic1_SCL_out,//void (*pf_SCL_out)(vType x); // + L0_siic1_SCL,//void (*pf_SCL_set)(vType x); // + L1_siic1_INIT//void (*pf_init)(void); // +}; + + +**/ + diff --git a/source/msp/simiic n/msp_siic1.h b/source/msp/simiic n/msp_siic1.h new file mode 100644 index 0000000..53522a4 --- /dev/null +++ b/source/msp/simiic n/msp_siic1.h @@ -0,0 +1,38 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _siic1_H_ +#define _siic1_H_ + +#include "c_lib.h" + + +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "bsp_config.h" + +#include "msp_siicx.h" + + +#define D_SIIC1_DELAY 100 + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/simiic n/msp_siic2.c b/source/msp/simiic n/msp_siic2.c new file mode 100644 index 0000000..4c5e58c --- /dev/null +++ b/source/msp/simiic n/msp_siic2.c @@ -0,0 +1,150 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic2.h" + +TS_siic ts_siic2; + + + + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + + + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_siic2_SDA_out(vType v ) +{ + if(v) + { + L0_SDA2_OUT(); + }else + { + L0_SDA2_IN(); + } +} +void L0_siic2_SDA(vType v) +{ + if(v) + { + L0_SDA2_ON(); + }else + { + L0_SDA2_OFF(); + } +} + +vType L0_siic2_SDA_get(void) +{ + + if( 0!= L0_SDA2_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic2_SCL_out(vType v) +{ + if(v) + { + L0_SCL2_OUT(); + }else + { + L0_SCL2_IN(); + } + +} + +void L0_siic2_SCL(vType v) +{ + if(v) + { + L0_SCL2_ON(); + }else + { + L0_SCL2_OFF(); + } + + Lc_delay_us(D_SIIC2_DELAY); + +} + + + +void L0_siic2_close(void) +{ + ///管教设置为高阻态 +} + + + +void L1_siic2_INIT(void) +{ + ts_siic2.pf_SDA_out = L0_siic2_SDA_out; + ts_siic2.pf_SDA_set = L0_siic2_SDA; + ts_siic2.pf_SDA_get = L0_siic2_SDA_get; + ts_siic2.pf_SCL_out = L0_siic2_SCL_out; + ts_siic2.pf_SCL_set = L0_siic2_SCL; + ts_siic2.pf_close = L0_siic2_close; + + L0_iicx_SendData(&ts_siic2,0xaa); + + ts_siic2.sal = D_iic2_addr; + +} + + + + + + diff --git a/source/msp/simiic n/msp_siic2.h b/source/msp/simiic n/msp_siic2.h new file mode 100644 index 0000000..538d8a1 --- /dev/null +++ b/source/msp/simiic n/msp_siic2.h @@ -0,0 +1,55 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIIC2_H_ +#define _SIIC2_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "msp_siicx.h" + +#define L0_SDA2_OUT() D_P47_OUT() +#define L0_SDA2_IN() D_P47_IN() +#define L0_SDA2_ON() D_P47_ON() +#define L0_SDA2_OFF() D_P47_OFF() +#define L0_SDA2_AT() D_P47_AT() + +#define L0_SCL2_OUT() D_P46_OUT() +#define L0_SCL2_IN() D_P46_IN() +#define L0_SCL2_ON() D_P46_ON() +#define L0_SCL2_OFF() D_P46_OFF() + +#define D_iic2_addr 0x44 +#define D_SIIC2_DELAY 100 + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +extern TS_siic ts_siic2; +extern void L1_siic2_INIT(void); + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/simiic n/msp_siic3.c b/source/msp/simiic n/msp_siic3.c new file mode 100644 index 0000000..8d19471 --- /dev/null +++ b/source/msp/simiic n/msp_siic3.c @@ -0,0 +1,145 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info ޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siic3.h" + +TS_siic ts_siic3; + + +/*------------------------------------------------ + ˿ڶ +I2CߴݹУÿһֽڣ +ҪһӦ״̬λݵ +ͨӦλ֪Ӧλʱ +Ӧλ״̬ѭ˭ +˭ԭ򣬼ɽӦλ +Ӧʱڼ뽫SDA +ͣʹʱĸߵƽڼ䱣ȶĵ͵ƽͼ9 +Ȼ뿼ǽͱʱ +ϸı6 ӻʱ +ӦλɴӻӴӻʱӦλ + +I2C߱׼涨 ӦλΪ0ʾӦ ACK +ΪA Ϊ1ʾӦ NACK +ΪNALSB֮ӦͷSDAߣSDA +ԵȴӦλ +ڽһֽڵݣ +߲ٽոʱӦӦ +ֽ֪ͨ˷Ӧ״̬ +Ӧֹ͡ + + + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); + +/// void (*pf_init)(void); + void (*pf_close)(void); + + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_siic3_SDA_out(vType v ) +{ + if(v) + { + L0_SDA3_OUT(); + }else + { + L0_SDA3_IN(); + } +} +void L0_siic3_SDA(vType v) +{ + if(v) + { + L0_SDA3_ON(); + }else + { + L0_SDA3_OFF(); + } +} + +vType L0_siic3_SDA_get(void) +{ + + if( 0!= L0_SDA3_AT()) + { + return 1; + }else + { + return 0; + } +} + +void L0_siic3_SCL_out(vType v) +{ + if(v) + { + L0_SCL3_OUT(); + }else + { + L0_SCL3_IN(); + } + +} + +void L0_siic3_SCL(vType v) +{ + if(v) + { + L0_SCL3_ON(); + }else + { + L0_SCL3_OFF(); + } + Lc_delay_us(D_SIIC3_DELAY); + +} + + + +void L0_siic3_close(void) +{ + ///ܽΪ̬ +} + + + +void L1_siic3_INIT(void) +{ + ts_siic3.pf_SDA_out = L0_siic3_SDA_out; + ts_siic3.pf_SDA_set = L0_siic3_SDA; + ts_siic3.pf_SDA_get = L0_siic3_SDA_get; + ts_siic3.pf_SCL_out = L0_siic3_SCL_out; + ts_siic3.pf_SCL_set = L0_siic3_SCL; + ts_siic3.pf_close = L0_siic3_close; + +/// ts_siic3.sal = D_iic3_addr; +/// L0_iicx_SendData(&ts_siic3,0xaa); + +} + + + + + + diff --git a/source/msp/simiic n/msp_siic3.h b/source/msp/simiic n/msp_siic3.h new file mode 100644 index 0000000..27a9b4d --- /dev/null +++ b/source/msp/simiic n/msp_siic3.h @@ -0,0 +1,53 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, ؿƼ +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic ģio 汾 cpu޹أΨһҪ޸ĵľͷеĹܽŶ +/// @info io ,طޱҪ޸ +///ļʵֵĹܵ +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIIC3_H_ +#define _SIIC3_H_ + +#include "../clib/type.h" +#include "../clib/clib.h" +#include "../ctask/tick.h" + + +///>>>˿λ壬޸!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "../bsp/bsp_config.h" + +#include "msp_siicx.h" + +#define L0_SDA3_OUT() D_P85_OUT() +#define L0_SDA3_IN() D_P85_IN() +#define L0_SDA3_ON() D_P85_ON() +#define L0_SDA3_OFF() D_P85_OFF() +#define L0_SDA3_AT() D_P85_AT() + +#define L0_SCL3_OUT() D_P84_OUT() +#define L0_SCL3_IN() D_P84_IN() +#define L0_SCL3_ON() D_P84_ON() +#define L0_SCL3_OFF() D_P84_OFF() + +#define D_SIIC3_DELAY 100 + +//<<<<˿λ壬޸!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern TS_siic ts_siic3; +extern void L1_siic3_INIT(void); + + + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/simiic n/msp_siicx.c b/source/msp/simiic n/msp_siicx.c new file mode 100644 index 0000000..8e809bb --- /dev/null +++ b/source/msp/simiic n/msp_siicx.c @@ -0,0 +1,483 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#include "msp_siicx.h" + +#include "debug_drv.h" + + +TS_siic_ xdata ts_siic[D_IIC_NUM]; + +/*------------------------------------------------ + 端口定义 +在I2C总线传输数据过程中,每传输一个字节, +都要跟一个应答状态位。接收器接收数据的情况 +可以通过应答位来告知发送器。应答位的时钟脉冲 +仍由主机产生,而应答位的数据状态则遵循“谁 +接收谁产生”的原则,即总是由接收器产生应答位, +在响应的时钟脉冲期间接收器必须将SDA 线拉 +低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) , +当然必须考虑建立和保持时间 +(详细请查阅表6) 。主机向从机发送数据时, +应答位由从机产生;主机从从机接收数据时,应答位 +由主机产生。 +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , +常常简记为A; 为1则表示非应答 (NACK) , +常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 + +------------------------------------------------*/ +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + +void L0_iicx_INIT(TS_siic_ *p,unsigned char v) +{ +TS_siic_ *pp = p; +/// p->pf_init(1); + if (v)///正常工作 + { + // p->pf_SDA_set(1); + // p->pf_SCL_set(1); + + pp->pf_SDA_out(1); + pp->pf_SCL_out(1); + +// // + + + }else + { + + } +} + +unsigned char L0_iicx_SDA_ask(TS_siic_ *p) +{ + if(p->pf_SDA_get() != 0) + { + return 1; + } + else + { + return 0; + } +} + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + +/**************** + +void L0_iicx_Reset(void) +{ + p->pf_SCL_set(1); p->pf_SDA_set(1);//pf_SDA_set(1);; //确认释放总线 +} + + +********************/ + +//********************************************** +//送起始位 IO_SDA=1->0 +void L0_iicx_Start(TS_siic_ *p) +{ + #if 0 + + TS_siic *pp = p; + pp->pf_SDA_set(1);//pf_SDA_set(1);; + pp->pf_SCL_set(1); + pp->pf_SDA_set(0); + pp->pf_SCL_set(0); + + #else + + p->pf_SDA_set(1);//pf_SDA_set(1);; + p->pf_SCL_set(1); + p->pf_SDA_set(0); + p->pf_SCL_set(0); + #endif + ///fixme: cc + L0_slc_1_delay(); + L0_slc_1_delay(); + L0_slc_1_delay(); +} +//************************************************ +//送停止位 IO_SDA = 0->1 +void L0_iicx_Stop(TS_siic_ *p) +{ + p->pf_SDA_set(0); + p->pf_SCL_set(1); + p->pf_SDA_set(1); +/// p->pf_init(0); +} +//************************************************ +//主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0) +///主机给从机的ACK +void L0_iicx_Ack(TS_siic_ *p) +{ + p->pf_SDA_out(1);//设置SDA 口为输出 + p->pf_SCL_set(0); + p->pf_SDA_set(0); + p->pf_SCL_set(1); + p->pf_SCL_set(0); + p->pf_SDA_out(0); + // Lc_delay_ms(2); ///for debug wave easy to see + +} + +///主机给从机的NOACK +void L0_iicx_NoAck(TS_siic_ *p) +{ + p->pf_SDA_out(1);//设置SDA 口为输出 + p->pf_SCL_set(0); + p->pf_SDA_set(1); + p->pf_SCL_set(1); + p->pf_SCL_set(0); + p->pf_SDA_out(0); + // Lc_delay_ms(2); + +} + +/// 从机返回的ack +void L0_iicx_WaitAck(TS_siic_ *p) +{ + p->pf_SDA_out(0); + p->pf_SCL_set(1); + //// + p->pf_SCL_set(0); + p->pf_SDA_out(1); + /// Lc_delay_ms(2); +} + + +/****** +I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A; +为1则表示非应答 (NACK) ,常简记为NA。 +发送器发送LSB之后,应当释放SDA线(拉高SDA) , +以等待接收器产生应答位。 +如果接收器在接收完最后一个字节的数据, +或者不能再接收更多的数据时,应当产生非应答信 +号来通知发送器。发送器如果发现接收器产生了非应答状态, +则应当终止发送。 +// 检测 SDA是否回ACK +bit L0_iicx_Test_Ack(void) +{ //设置SDA 口为输入 + bit ACK_Flag = 0; + p->pf_SCL_set(0); + p->pf_SDA_set(1);//pf_SDA_set(1);; + p->pf_SCL_set(1); + + + if(IO_SDA = 0) + ACK_Flag = 1; + else + ACK_Flag = 0; + p->pf_SCL_set(0); + return ACK_Flag; + // return 1;// debug +} +*******/ +//************************************************* +//字节发送程序 +//发送c(可以是数据也可是地址),送完后接收从应答 +//不考虑从应答位 + +void L0_iicx_SendData(TS_siic_ *p,unsigned char c) +{ + TS_siic_ *pp = p; + TS_siic_ *tt = p; +// unsigned char ack=8; + unsigned char BitCnt=8;//一字节8位 + //设置SDA 口为输出 + for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位 + { +//printf("\r\nBitCnt=%d",(int)BitCnt); + if((c << BitCnt ) & 0x80) + pp->pf_SDA_set(1);//pf_SDA_set(1);; //判断发送位;/// ;// + else + pp->pf_SDA_set(0); + + tt->pf_SCL_set(1); //置时钟线为高,通知被控器开始接收数据位 + tt->pf_SCL_set(0); + /// printf("\r\nqq=%d",(int)BitCnt); + pp = p; + tt = p; + }//8clk + L0_iicx_WaitAck(tt); +} +//************************************************** +//字节接收程序 +//接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用 +//return: uchar型1字节 + +unsigned char L0_iicx_ReceiveData(TS_siic_ *p) +{ + unsigned char BitCnt=8,IIC_RX_Data = 0; + p->pf_SDA_out(0);// p->pf_SDA_set(1);//pf_SDA_set(1);; //读入数据 设置SDA 口为输入 + for(BitCnt = 0;BitCnt<8;BitCnt++) + { + L0_I2C_delay(1); + p->pf_SCL_set(0); //置时钟线为低,准备接收数据位 + p->pf_SCL_set(1); //置时钟线为高使数据线上数据有效 + L0_I2C_delay(1); + IIC_RX_Data = IIC_RX_Data << 1; + if(0 != p->pf_SDA_get())//切记 非零和零的区别 + IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中 + L0_I2C_delay(1); + }// 8clk up + p->pf_SCL_set(0); + return IIC_RX_Data; +} +/// 读取 n个数据 放入p中 + +void L0_iicx_ReadNByte(TS_siic_ *p, unsigned char *b,unsigned char n) +{ + + TS_siic_ *pp = p; + TS_siic_ *tt = p; + unsigned char i; + + +printf("111 3\r\n"); + L0_iicx_Start(pp); // 启动I2C + +printf("222 3\r\n"); + L0_iicx_SendData(pp,(pp->sal)| 0x01); //发送器件地址 + //p->pf_SDA_out(0); + for(i = 0;ipf_SDA_out(1); + L0_iicx_Stop(tt); +} + + + +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +void L1_iicx_Write1Reg(TS_siic_ *p,unsigned char reg) +{ +//printf("L1_iicx_Write1Reg 3\r\n"); + L0_iicx_Start(p); //启动I2C + +//printf("L0_iicx_Start\r\n"); + L0_iicx_SendData(p,p->sal);//发送器件地址 + +///printf("L0_iicx_SendData\r\n"); + L0_iicx_SendData(p,reg); +} + +void L1_iicx_Write2Reg(TS_siic_ *p,unsigned char reg,unsigned char reg2) +{ + L0_iicx_Start(p); //启动I2C + L0_iicx_SendData(p,p->sal);//发送器件地址 + L0_iicx_SendData(p,reg); + L0_iicx_SendData(p,reg2); +} + + + +//读取reg地址(1Byte)的1个数据 sla.(reg) sla.(reg+1). 有返回值的 为了兼容 +unsigned char L2_iicx_Read1Reg1DataR(TS_siic_ *p,unsigned char reg) +{ + unsigned char d; +// U8 d[1]; +//S ADD W A REG A + L1_iicx_Write1Reg(p,reg); +//S ADD R A D1 A D2 A.....DX N P + L0_iicx_ReadNByte(p,&d,1); + return d; + +} + + +//读取reg地址(1Byte)的1个数据 sla.(reg) sla.(reg+1). 没有返回值的 为了兼容 +void L2_iicx_Read1Reg1Data(TS_siic_ *p,unsigned char reg,unsigned char *r) +{ +//S ADD W A REG A + L1_iicx_Write1Reg(p,reg); +//S ADD R A D1 A D2 A.....DX N P + L0_iicx_ReadNByte(p,r,1); +} + + +void L2_iicx_Read1RegNData(TS_siic_ *p,unsigned char reg, + unsigned char *r,unsigned char n) +{ + +#if 0 + +///printf("L2_iicx_Read1RegNData\r\n"); + +p->pf_SDA_set(1);//pf_SDA_set(1);; + + +///printf("pf_SDA_set\r\n"); + +p->pf_SCL_set(1); +///p->pf_SDA_set(0); +///p->pf_SCL_set(0); + +printf("pf_SCL_set\r\n"); + + +//L0_iicx_Start(p); //启动I2C +//L0_iicx_SendData(p,p->sal);//发送器件地址 +//L0_iicx_SendData(p,reg); + +#else + printf("L2_iicx_Read1RegNData\r\n"); + //S ADD W A REG A + L1_iicx_Write1Reg(p,reg); + + printf("L1_iicx_Write1Reg\r\n"); + //S ADD R A D1 A D2 A.....DX N P + L0_iicx_ReadNByte(p,r,1); + + + + printf("L0_iicx_ReadNByte\r\n"); + +#endif + +} + + +void L2_iicx_Read2RegNdata(TS_siic_ *p,unsigned char H,unsigned char L, + unsigned char *r,unsigned char n) +{ +// U8 d[1]; +//S ADD W A REG A +/// L1_iicx_Write1Reg(p,H); +/// L0_iicx_SendData(p,L); + L1_iicx_Write2Reg(p,H,L); +//S ADD R A D1 A D2 A.....DX N P + L0_iicx_ReadNByte(p,r,n); + +} +/****** +// sla.(reg)=cmd +void L2_iicx_Write1Reg1Cmd(TS_siic *p, unsigned char reg,unsigned char cmd) +{ + L1_iicx_Write1Reg(p,reg); + L0_iicx_SendData(p,cmd); + L0_iicx_Stop(p); + /***************** + if(gRccUs05 >0)///测试iic有效否 发现没有结果 + { + L0_uart0_uc(gRccUs05);gRccUs05 = 0; + } +} + +////// S slaW cmd cmd2 S slaR A A NACK P +////// A A A A MSB LSB CRC +void L2_iicx_Read2Cmd(TS_siic *p, unsigned char cmd,unsigned char cmd2, + unsigned char *buf,unsigned char n) +{ + L1_iicx_Write1Reg(p,cmd); + L0_iicx_SendData(p,cmd2); + + L1_iicx_ReadNByte(p,buf,n); +} + +/// I2C设备地址为8bit,其中最低位为读写位,0为写,1为读 +////读取两个字节的,先发送两个字节 然后再读取 +void L1_iicx_Read2cmd(TS_siic *p, unsigned char *c,unsigned char *b,unsigned char n) +{ + unsigned char i; + L0_iicx_Start(p); // 启动I2C + L0_iicx_SendData(p,(p->sal)| 0x01); //发送器件地址 + L0_iicx_SendData(p,(*c)); //发送器件地址 + L0_iicx_SendData(p,*(c+1)); + + + //p->pf_SDA_out(0); + for(i = 0;ipf_SDA_out(1); + L0_iicx_Stop(p); +} + +void L2_iicx_Read1RegNData(TS_siic *p,unsigned char reg, + unsigned char *r,unsigned char n) +*********/ + +void L3_iicx_debug(u8 filter) +{ + if(filter == Ts_debug.td->filter) + { + ///while(9) + { + printf("\r\n 0x%2x\r\n",(int)Ts_debug.td->ocr); + } + // L0_uart0_uc("A"); + // L0_uart0_0d0a(); + if(0x10 == Ts_debug.td->ocr)///read reg1 num 读取reg1地址中的num个数据 + { + //NUM: 0 1 2 3 4 + // Fx R1 R2 R3 ocr + // TS_siic reg1 num + /// f1 00 0x28 06 10 + /// f1 00 0x28 06 10 + + + /// while(9) + { + L2_iicx_Read1RegNData(&ts_siic[Ts_debug.td->R1],Ts_debug.td->R2,Ts_debug.d,Ts_debug.td->R3); + L1_uartD_uchexArray(Ts_debug.d,Ts_debug.td->R3); + // +/// printf("\r\n 0x%2x\r\n",(int)Ts_debug.td->ocr); + } + }else if(0x11 == Ts_debug.td->ocr)//read reg1 reg2 num 读取reg1地址中的num个数据 + { + + + + }else if(0x12 == Ts_debug.td->ocr)//write + {///设置重量 + +/// printf("\r\n set[ %d].adc = 0x%04x\r\n",(int)Ts_debug.td->R1, (vU16)tst_weight.out6); + } + + + + else + { + + } + } +} + + + + diff --git a/source/msp/simiic n/msp_siicx.h b/source/msp/simiic n/msp_siicx.h new file mode 100644 index 0000000..bf51d1a --- /dev/null +++ b/source/msp/simiic n/msp_siicx.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file iic_sim +/// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管脚定义 +/// @info 除了io配置 ,其他地方如无必要请勿修改 +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + +#ifndef _SIICx_H_ +#define _SIICx_H_ + +#include "c_lib.h" + +#include "c_type51.h" +///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#include "bsp_config.h" + +#include "msp_siicx.h" + + +#define L0_slc_1_delay() Lc_delay_nop(4); +#define L0_slc_0_delay() Lc_delay_nop(1); // 4us + +#define L0_I2C_delay(x) ///Lc_delay_us(80) + +typedef struct +{ + unsigned long n; + vType sh; + unsigned char sal; + void (*pf_SDA_out)(vType x); + void (*pf_SDA_set)(vType x); + vType (*pf_SDA_get)(void); + void (*pf_SCL_out)(vType x); + void (*pf_SCL_set)(vType x); +/// void (*pf_init)(vType x); +}TS_siic_; + +#define D_IIC_NUM 2 +#define D_IIC_CH1 0 +#define D_IIC_CH2 1 +#define D_IIC_CH3 2 +#define D_IIC_CH4 3 + +extern TS_siic_ xdata ts_siic[D_IIC_NUM]; + +#define D_IIC_GSENSOR D_IIC_CH1 + +//<<<<端口位定义,可修改!!!!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +extern void L0_iicx_INIT(TS_siic_ *p,unsigned char v); +extern void L0_iicx_SendData(TS_siic_ *p,unsigned char c); +extern unsigned char L0_iicx_ReceiveData(TS_siic_ *p); + +void L2_iicx_Read1Reg1Data(TS_siic_ *p,unsigned char reg,unsigned char *r); + +extern void L0_iicx_ReadNByte(TS_siic_ *p,unsigned char *b,unsigned char n); +/////////////////////////////// +///写入一个reg 为后续的写命令或者读取服务 +extern void L1_iicx_Write1Reg(TS_siic_ *p,unsigned char reg); +// sla.(reg)=cmd +extern void L1_iicx_Write2Reg(TS_siic_ *p,unsigned char reg,unsigned char reg2); + +extern void L2_iicx_Write1Reg1Cmd(TS_siic_ *p,unsigned char reg,unsigned char cmd); +//读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n) +extern unsigned char L2_iicx_Read1Reg1DataR(TS_siic_ *p,unsigned char reg); +extern void L1_iicx_Read2cmd(TS_siic_ *p, unsigned char *c,unsigned char *b,unsigned char n); +extern void L2_iicx_Write2Cmd(TS_siic_ *p, unsigned char reg,unsigned char cmd,unsigned char cmd2); +extern void L2_iicx_Read2Cmd(TS_siic_ *p, unsigned char cmd,unsigned char cmd2, + unsigned char *buf,unsigned char n); + + +void L2_iicx_Read1RegNData(TS_siic_ *p,unsigned char reg, + unsigned char *r,unsigned char n); +#define D_cmd_filter_iicx 0xf1 + + +extern void L3_iicx_debug(u8 filter); +extern void L1_siic1_INIT(vtype openclose); + +#endif// #ifndef _IIC_H_ + diff --git a/source/msp/simiic.zip b/source/msp/simiic.zip new file mode 100644 index 0000000..a87e757 Binary files /dev/null and b/source/msp/simiic.zip differ diff --git a/source/msp/uart/msp_UART2.c b/source/msp/uart/msp_UART2.c new file mode 100644 index 0000000..ded4a97 --- /dev/null +++ b/source/msp/uart/msp_UART2.c @@ -0,0 +1,282 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART2 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + + + +////20221217_213321 CCmodify new uart struct for road protocol +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +c_lib/c_lib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART2_Init + UART2_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_UART2.h" +///#include "msp_time2.h" +#include "c_crc.h" +#include "c_delay.h" +///#include "tpc_debug.h" +#include "debug_drv.h" +#include "tpc_road.h" +//#define _USE_485 + +///static volatile TS_Uart_Send_ ts_uart_send_shop; + +///>>>>>>>>>>>>>>>>和cpu相关 + + +#if(MainFre_5M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + void L0_uart2_init(void) /// void UartInit(void) //115200bps@22.1184MHz + { + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFC; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + + + +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_44M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + void L0_uart2_init(void) /// void UartInit(void) //115200bps@44.2368MHz + { + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xF8; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + + + + + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + +#else ///MainFre_11M + #if(BRT_115200 == D_UART2_BRT) + void L0_uart2_init(void) ///void UartInit(void) //115200bps@11.0592MHz + { + S2CON = 0x50; //8位数据,可变波特率 + AUXR |= 0x04; //定时器时钟1T模式 + T2L = 0xE8; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>和cpu相关 + +void L0_uart2_buf_init(void) +{ +/// ts_uart[uNum2].p = &ts_uart_send_shop; + ts_Usend[D_UART2].max = ts_Usend[D_UART2].now = 0; + ts_Usend[D_UART2].ok = D_ready; + L0_uartN_sbuf(D_UART2); + ts_Usend[D_UART2].max_def = D_send2_max; + + D_s2b_road2_init(); + + L0_uart2_init(); +L0_uart2_IntRIClear(); L0_uart2_IntTIClear(); + D_UART2_ES_INT(1); //打开串口中断 + +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //默认处于接收状态 +#endif + L1_UART2_timer_isFree_init(); +} + + +////U8 overtime_t; //超时溢出的计数器 +////U8 overtime_flag; ///0:没有超时溢出 1:超时溢出 +////U8 over_flag; ////串口接收结束的状态 0:超时溢出 1:超出max接收 + +///D_LED4_REV(); + +void L2_uart2_overtime_callback(void) +{////必须清除当前的idle + if(0 == ts_Urec[D_UART2].idle) + { + if(ts_Urec[D_UART2].overtime_t >= 2) + { + ts_Urec[D_UART2].idle = 1;//总线空闲 + ts_Urec[D_UART2].head = 0; + + //// printf(" ts_s2b_debug.fifo = %d ",(int)ts_s2b_debug.fifo); + if(ts_Urec[D_UART2].fifo > 0) + {ts_Urec[D_UART2].fifo = 0; + ts_Urec[D_UART2].ok = 1;/// 接收到的数据结束 : 总线空闲+buf非空 + + //// L1_uartD_sendArray((U8 *)ts_debug_rec.filter, 5); + /******* + L1_uartD_sendArrayhex((U8 *)&ts_debug_rec.filter, 5); + ts_debug_rec.filter = 0x31; + ts_debug_rec.R1 = 0x32; + ts_debug_rec.R2 = 0x33; + ts_debug_rec.R3 = 0x34; + ts_debug_rec.ocr = 0x35; + + L1_uartD_sendArrayhex((U8 *)&ts_debug_rec.filter, 5); + *********/ + + } + } + ts_Urec[D_UART2].overtime_t ++; + } +} + + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_UART2(void) D_SERVE_UART2 +{ + if(L0_uart2_IntRI()) //如果是U0接收中断 + { + L0_uart2_IntRIClear(); //清除接收中断标志 + + ///>>>>>>>>>>>>>接收协议 可以更改为其他协议>>>>>>>>>>>>>>>>>>>>>>>> + ts_Urec[D_UART2].reg = L0_uart2_get(); + ts_Urec[D_UART2].idle = 0; + ts_Urec[D_UART2].overtime_t = 0;///需要和tick 定时器中的配合 作为接收超时判定 + /// L1_s2b_PH5_debug(&ts_s2b_debug); + /// L1_s2b_PH5_debug(TS_s2b_debug); +/// L1_s2b_road2(&ts_Urec[D_UART2]); + L1_s2b_road2(D_UART2); + ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + } + if(L0_uart2_IntTI()) //如果是U0发送中断 + { + L0_uart2_IntTIClear(); //清除发送中断标志 + if(ts_Usend[D_UART2].max != ts_Usend[D_UART2].now) + { + ///L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + L0_uart2_set(ts_Usend[D_UART2].sbuf[ts_Usend[D_UART2].now]); + ts_Usend[D_UART2].now ++; + } + else + { + ts_Usend[D_UART2].ok = D_ready; + ts_Usend[D_UART2].max = 0; + ts_Usend[D_UART2].now = 0;//可以发送下一个数据 +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //切换到接收状态 + ///gfgfgfh + #endif + } + } + //NOP(); NOP(); NOP(); +} + +///L2_callback_UART2_free(&s_UART2_rec); +#if 0 + +void L1_uart2_sendArray(U8 * buf, U16 len) +{ +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum2,buf,len); +} + +void L2_callback_UART2_free(Ts_uart_rev_ *p) +{ + + ///Ts_uart_rev_ *p = &s_UART2_rec; + #define D_s_modbus_min 4 //modbus协议的最小长度 + +/// D_P24_REV(); +////while(9) D_P24_REV(); + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + //LED1 ^= 1; + p->head = 0; + #ifdef D_use_crc + crc16qq(p->crc,p->buf,p->num - 2); ////fixme 20220311 ///crc16qq(p->crc,p->buf,p->num - 2); //校验CRC + #endif + + // crc16(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + p->ok = 1; + /// LED0 ^= 1; + } + p->debugok = 1;////s_UART2_rec.debugok + } + L1_UART2_isFree_over(); + +//// D_motor1_FI_rev(); + +} + +#endif + diff --git a/source/msp/uart/msp_UART2.h b/source/msp/uart/msp_UART2.h new file mode 100644 index 0000000..4c2bac1 --- /dev/null +++ b/source/msp/uart/msp_UART2.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/c_lib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART2_Init + UART2_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _UART2_H +#define _UART2_H +#include "bsp_config.h" +//#include "tpc_modbus.h" +#include "msp_uartN.h" +//#include "msp_time2.h" + +//#include "../tpc/tpc_x.h" + +#define D_UART2_ES_INT(x) (x) ? (BITN_1(IE2,ES2)) : (BITN_0(IE2,ES2)) +#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI) +#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) +#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) +#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) +#define L0_uart2_get() (S2BUF) +#define L0_uart2_set(x) (S2BUF = x) +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern void L0_uart2_buf_init(void); +/////extern void L1_uart2_sendArray(U8 * buf, U16 len); + +#define L0_uart2_uc(X) L0_uartN_uc(D_UART2,X) +#define L0_uart2_us(X) L0_uartN_us(D_UART2,X) +#define L0_uart2_ul(X) L0_uartN_ul(D_UART2,X) +#define L0_uart2_0d0a() L0_uartN_0d0a(0) +#define L0_uart2_uchex(X) L0_uartN_uchex(D_UART2,X) +#define L0_uart2_ushex(X) L0_uartN_ushex(D_UART2,X) +#define L0_uart2_ulhex(X) L0_uartN_ulhex(D_UART2,X) +#define L0_uart2_str(buf) L0_uartN_str(D_UART2,buf) +#define L1_uart2_Array(buf,len) L0_uartN_Array(D_UART2,(buf),(len)) + + +#define L1_uart2_Arrayhex(buf,len) L0_uartN_uchexArray(D_UART2,(buf),(len)) + +///void L2_callback_UART2_free(void); + +///void L2_callback_UART2_free(Ts_uart_rev_ *p); + +#define L1_UART2_isFree(); /////L0_timer2_start(); +#define L1_UART2_isFree_over(); /////L0_timer2_stop(); +#define L1_UART2_timer_isFree_init(); /////L0_timer2_init();L0_timer2_stop();\ + /////L0_timer2_int_on();\ + /////ts_timer2.callback = L2_callback_UART2_free;ts_timer2.p = &s_UART2_rec; +extern void L2_uart2_overtime_callback(void); + +#endif //#ifndef _UART2_H + diff --git a/source/msp/uart/msp_UART3.c b/source/msp/uart/msp_UART3.c new file mode 100644 index 0000000..d31af93 --- /dev/null +++ b/source/msp/uart/msp_UART3.c @@ -0,0 +1,212 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart3.h" + +#include "tpc_road.h" + + + +#if(MainFre_5M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + void L0_uart3_init(void) /// void UartInit(void) //115200bps@22.1184MHz + { + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M &= 0xFD; //定时器时钟12T模式 + T3L = 0xFC; //设置定时初始值 + T3H = 0xFF; //设置定时初始值 + T4T3M |= 0x08; //定时器3开始计时 + } + + /******* + void L0_uart3_init(void) ///void UartInit(void) //115200bps@22.1184MHz + { + S3CON = 0x10; //8位数据,可变波特率 + S3CON &= 0xBF; //串口3选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFC; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + ********/ + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + + + +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_44M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + + + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + +#else ///MainFre_11M + #if(BRT_115200 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +void L0_uart3_buf_init(void) +{ + ts_Usend[D_UART3].max = ts_Usend[D_UART3].now = 0; + ts_Usend[D_UART3].ok = D_ready; + + ts_Usend[D_UART3].sbuf = ts_Usendbuf.s3; + D_s2b_road3_init(); + L0_uart3_init(); + L0_uart3_IntRIClear(); L0_uart3_IntTIClear(); + D_UART3_ES_INT(1); //打开串口中断 + +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart3_sendArray(U8 * buf, U16 len) +{ +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(D_UART3,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +///#define D_SERVE_UART3 interrupt 17 +void INTERRUPT_UART3(void) D_SERVE_UART3 +{ + NOP(); NOP(); NOP(); + if(L0_uart3_IntRI()) //如果是U0接收中断 + { + L0_uart3_IntRIClear(); //清除接收中断标志 + ts_Urec[D_UART3].reg = L0_uart3_get(); + ts_Urec[D_UART3].idle = 0; + ts_Urec[D_UART3].overtime_t = 0;///需要和tick 定时器中的配合 作为接收超时判定 +/// L1_s2b_road3(&ts_Urec[D_UART3]); + + L1_s2b_road3(D_UART3); + + } + if(L0_uart3_IntTI()) + { + if(L0_uart3_IntTI()) //如果是U0发送中断 + { + L0_uart3_IntTIClear(); //清除发送中断标志 + if(ts_Usend[D_UART3].max != ts_Usend[D_UART3].now) + { + ///L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + L0_uart3_set(ts_Usend[D_UART3].sbuf[ts_Usend[D_UART3].now]); + ts_Usend[D_UART3].now ++; + } + else + { + ts_Usend[D_UART3].ok = D_ready; + ts_Usend[D_UART3].max = 0; + ts_Usend[D_UART3].now = 0;//可以发送下一个数据 +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //切换到接收状态 + ///gfgfgfh +#endif + } + + } + } + NOP(); NOP(); NOP(); +} + + + +void L2_uart3_overtime_callback(void) +{////必须清除当前的idle + if(0 == ts_Urec[D_UART3].idle) + { + if(ts_Urec[D_UART3].overtime_t >= 2) + { + ts_Urec[D_UART3].idle = 1;//总线空闲 + ts_Urec[D_UART3].head = 0; + + if(ts_Urec[D_UART3].fifo > 0) + { + ts_Urec[D_UART3].fifo = 0; + ts_Urec[D_UART3].ok = 1;/// 接收到的数据结束 : 总线空闲+buf非空 + } + } + ts_Urec[D_UART3].overtime_t ++; + } +} + + + + + + diff --git a/source/msp/uart/msp_UART3.h b/source/msp/uart/msp_UART3.h new file mode 100644 index 0000000..c8d2a93 --- /dev/null +++ b/source/msp/uart/msp_UART3.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart3_Init + uart3_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart3_H +#define _uart3_H + +#include "bsp_config.h" +//#include "tpc_modbus.h" +#include "msp_uartN.h" + + +//#define S4SM0 BITN7 +#define D_UART3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) +//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3) +//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3) +#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI) +#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI) +#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) +#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) +#define L0_uart3_set(x) S3BUF = (x); +#define L0_uart3_get() (S3BUF) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart3_buf_init(void); +void L0_uart3_sendArray(U8 * buf, U16 len); + +#define L0_uart3_uc(X) L0_uartN_uc(D_UART3,X) +#define L0_uart3_us(X) L0_uartN_us(D_UART3,X) +#define L0_uart3_ul(X) L0_uartN_ul(D_UART3,X) +#define L0_uart3_0d0a() L0_uartN_0d0a(D_UART3) +#define L0_uart3_uchex(X) L0_uartN_uchex(D_UART3,X) +#define L0_uart3_ushex(X) L0_uartN_ushex(D_UART3,X) +#define L0_uart3_ulhex(X) L0_uartN_ulhex(D_UART3,X) +#define L0_uart3_sendstr(buf) L0_uartN_sendstr(D_UART3,buf) +#define L1_uart3_sendArray(buf,len) L0_uartN_sendArray(D_UART3,(buf),(len)) + +#define L1_uart3_sendArrayhex(buf,len) L0_uartN_uchexArray(D_UART3,(buf),(len)) +extern void L2_uart3_overtime_callback(void); + + +#endif //#ifndef _uart3_H + diff --git a/source/msp/uart/msp_UART3.zip b/source/msp/uart/msp_UART3.zip new file mode 100644 index 0000000..9ce1409 Binary files /dev/null and b/source/msp/uart/msp_UART3.zip differ diff --git a/source/msp/uart/msp_UART4.c b/source/msp/uart/msp_UART4.c new file mode 100644 index 0000000..ae6605e --- /dev/null +++ b/source/msp/uart/msp_UART4.c @@ -0,0 +1,215 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart4.h" + +#include "tpc_road.h" + + + +#if(MainFre_5M == D_sys_MainFre) +#elif(MainFre_22M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + /************* void L0_uart4_init(void)/// void UartInit(void) //115200bps@22.1184MHz + { + S4CON = 0x10; //8位数据,可变波特率 + S4CON |= 0x40; //串口4选择定时器4为波特率发生器 + T4T3M &= 0xDF; //定时器时钟12T模式 + T4L = 0xFC; //设置定时初始值 + T4H = 0xFF; //设置定时初始值 + T4T3M |= 0x80; //定时器4开始计时 + } + + *********/ + + + void L0_uart4_init(void) ///void UartInit(void) //115200bps@22.1184MHz + { + S4CON = 0x10; //8位数据,可变波特率 + S4CON &= 0xBF; //串口4选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFC; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + + + +#elif(MainFre_27M == D_sys_MainFre) +#elif(MainFre_44M == D_sys_MainFre) + #if(BRT_115200 == D_UART2_BRT) + + + #elif(BRT_460800 == D_UART2_BRT) + #elif(BRT_921600 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + #endif//D_sys_MainFre) + +#else ///MainFre_11M + #if(BRT_115200 == D_UART2_BRT) + #elif(BRT_19200 == D_UART2_BRT) + #elif(BRT_9600== D_UART2_BRT) + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +void L0_uart4_buf_init(void) +{ + ts_Usend[D_UART4].max = ts_Usend[D_UART4].now = 0; + ts_Usend[D_UART4].ok = D_ready; + + ts_Usend[D_UART4].sbuf = ts_Usendbuf.s4; + D_s2b_road4_init(); + L0_uart4_init(); + L0_uart4_IntRIClear(); L0_uart4_IntTIClear(); + D_UART4_ES_INT(1); //打开串口中断 + +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart4_sendArray(U8 * buf, U16 len) +{ +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(D_UART4,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +///#define D_SERVE_UART4 interrupt 17 +void INTERRUPT_UART4(void) D_SERVE_UART4 +{ + NOP(); NOP(); NOP(); + if(L0_uart4_IntRI()) //如果是U0接收中断 + { + L0_uart4_IntRIClear(); //清除接收中断标志 + ts_Urec[D_UART4].reg = L0_uart4_get(); + ts_Urec[D_UART4].idle = 0; + ts_Urec[D_UART4].overtime_t = 0;///需要和tick 定时器中的配合 作为接收超时判定 + /// L1_s2b_PH5_debug(&ts_s2b_debug); + /// L1_s2b_PH5_debug(TS_s2b_debug); +/// L1_s2b_road4(&ts_Urec[D_UART4]); + L1_s2b_road4(D_UART4); + } + if(L0_uart4_IntTI()) + { + if(L0_uart4_IntTI()) //如果是U0发送中断 + { + L0_uart4_IntTIClear(); //清除发送中断标志 + if(ts_Usend[D_UART4].max != ts_Usend[D_UART4].now) + { + ///L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + L0_uart4_set(ts_Usend[D_UART4].sbuf[ts_Usend[D_UART4].now]); + ts_Usend[D_UART4].now ++; + } + else + { + ts_Usend[D_UART4].ok = D_ready; + ts_Usend[D_UART4].max = 0; + ts_Usend[D_UART4].now = 0;//可以发送下一个数据 +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_UART4_485_RX() //切换到接收状态 + ///gfgfgfh +#endif + } + + } + } + NOP(); NOP(); NOP(); +} + + + + +void L2_uart4_overtime_callback(void) +{////必须清除当前的idle + if(0 == ts_Urec[D_UART4].idle) + { + if(ts_Urec[D_UART4].overtime_t >= 2) + { + ts_Urec[D_UART4].idle = 1;//总线空闲 + ts_Urec[D_UART4].head = 0; + + //// printf(" ts_s2b_debug.fifo = %d ",(int)ts_s2b_debug.fifo); + if(ts_Urec[D_UART4].fifo > 0) + { + ts_Urec[D_UART4].fifo = 0; + ts_Urec[D_UART4].ok = 1;/// 接收到的数据结束 : 总线空闲+buf非空 + } + } + ts_Urec[D_UART4].overtime_t ++; + } +} + + + + + + diff --git a/source/msp/uart/msp_UART4.h b/source/msp/uart/msp_UART4.h new file mode 100644 index 0000000..869abde --- /dev/null +++ b/source/msp/uart/msp_UART4.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart4_Init + uart4_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#ifndef _uart4_H +#define _uart4_H + +#include "bsp_config.h" +//#include "tpc_modbus.h" +#include "msp_uartN.h" + + + +#define D_UART4_ES_INT(x) (x) ? (BITN_1(IE2,ES4)) : (BITN_0(IE2,ES4)) +#define L0_uart4_IntRI() (S4CON & S4RI)//BITN_G(SCON,U0RI) +#define L0_uart4_IntTI() (S4CON & S4TI)//BITN_G(SCON,U0TI) +#define L0_uart4_IntRIClear(); BITN_0(S4CON,S4RI) +#define L0_uart4_IntTIClear(); BITN_0(S4CON,S4TI) +#define L0_uart4_get() (S4BUF) +#define L0_uart4_set(x) (S4BUF = x) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern void L0_uart4_buf_init(void); + +#define L0_uart4_uc(X) L0_uartN_uc(D_UART4,X) +#define L0_uart4_us(X) L0_uartN_us(D_UART4,X) +#define L0_uart4_ul(X) L0_uartN_ul(D_UART4,X) +#define L0_uart4_0d0a() L0_uartN_0d0a(0) +#define L0_uart4_uchex(X) L0_uartN_uchex(D_UART4,X) +#define L0_uart4_ushex(X) L0_uartN_ushex(D_UART4,X) +#define L0_uart4_ulhex(X) L0_uartN_ulhex(D_UART4,X) +#define L0_uart4_sendstr(buf) L0_uartN_sendstr(D_UART4,buf) +#define L1_uart4_sendArray(buf,len) L0_uartN_sendArray(D_UART4,(buf),(len)) +#define L1_uart4_sendArrayhex(buf,len) L0_uartN_uchexArray(D_UART4,(buf),(len)) + +#define L1_uart2_isFree(); ///L0_timer2_start(); +#define L1_uart2_isFree_over(); //L0_timer2_stop(); +#define L1_uart2_timer_isFree_init(); //L0_timer2_init();L0_timer2_stop();\ + //L0_timer2_int_on();\ + //ts_timer2.callback = L2_callback_uart2_free;ts_timer2.p = &s_uart2_rec; + +extern void L2_uart4_overtime_callback(void); + +#endif //#ifndef _uart4_H + + + diff --git a/source/msp/uart/msp_uart1.c b/source/msp/uart/msp_uart1.c new file mode 100644 index 0000000..568d3e9 --- /dev/null +++ b/source/msp/uart/msp_uart1.c @@ -0,0 +1,336 @@ + +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为uart1 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +c_lib/c_lib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart1_Init + uart1_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart1.h" +///#include "msp_time2.h" +#include "c_crc.h" +#include "c_delay.h" +//#include "tpc_debug.h" +#include "debug_drv.h" +#include "tpc_road.h" +//#define _USE_485 + +///static volatile TS_Uart_Send_ ts_uart_send_shop; + +///>>>>>>>>>>>>>>>>和cpu相关 + + +#if(MainFre_5M == D_sys_MainFre) + + +#elif(MainFre_22M == D_sys_MainFre) + + + + #if(BRT_921600 == D_UART1_BRT) + void L0_uart1_init(void) /// void UartInit(void) //921600bps@22.1184MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x40; //定时器时钟1T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xFA; //设置定时初始值 + TH1 = 0xFF; //设置定时初始值 + ET1 = 0; //禁止定时器中断 + TR1 = 1; //定时器1开始计时 + } + #elif(BRT_460800 == D_UART1_BRT) + #elif(BRT_115200 == D_UART1_BRT) + void L0_uart1_init(void) /// void UartInit(void) //115200bps@22.1184MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x40; //定时器时钟1T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xD0; //设置定时初始值 + TH1 = 0xFF; //设置定时初始值 + ET1 = 0; //禁止定时器中断 + TR1 = 1; //定时器1开始计时 + } + #warning "MainFre_22M BRT_115200" + + #elif(BRT_19200 == D_UART1_BRT) + #elif(BRT_9600== D_UART1_BRT) + #else///9600 + #endif//) + + + + +#elif(MainFre_27M == D_sys_MainFre) + + +#elif(MainFre_44M == D_sys_MainFre) + #if(BRT_115200 == D_UART1_BRT) + #elif(BRT_460800 == D_UART1_BRT) + + + void L0_uart1_init(void) /// void UartInit(void) //460800bps@44.2368MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR &= 0xBF; //定时器时钟12T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xFE; //设置定时初始值 + TH1 = 0xFF; //设置定时初始值 + ET1 = 0; //禁止定时器%d中断 + TR1 = 1; //定时器1开始计时 + } + +#elif(BRT_921600 == D_UART1_BRT) + + + void L0_uart1_init(void) /// void UartInit(void) //921600bps@44.2368MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR &= 0xBF; //定时器时钟12T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xFF; //设置定时初始值 + TH1 = 0xFF; //设置定时初始值 + ET1 = 0; //禁止定时器%d中断 + TR1 = 1; //定时器1开始计时 + } + #info "0000" + + + #elif(BRT_19200 == D_UART1_BRT) + #elif(BRT_9600== D_UART1_BRT) + #else///9600 +#endif//D_sys_MainFre) + +#else ///MainFre_11M + + #if(BRT_115200 == D_UART1_BRT) + + void L0_uart1_init(void) ///void UartInit(void) //115200bps@11.0592MHz + { + SCON = 0x50; //8位数据,可变波特率 + AUXR |= 0x01; //串口1选择定时器2为波特率发生器 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFE; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + + + #elif(BRT_19200 == D_UART1_BRT) + + + #elif(BRT_9600== D_UART1_BRT) + + + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>和cpu相关 +void L1_uart1_open(void) +{// + L0_uart1_buf_init();//串口初始化// + + EA = 1; + L0_uart1_str("\r\nuart1 open"); +} + +void L0_uart1_buf_init(void) +{ + L0_uartN_sbuf(D_UART1); + D_s2b_road1_init(); + + D_stdIO_P3(BITN1); + D_stdIO_P3(BITN0);////PIN19 TXD1 D+ + + L0_uart1_init(); + L0_uart1_IntRIClear(); + L0_uart1_IntTIClear(); + D_UART1_RS_EN(1); + D_uart1_ES_INT(1); //打开串口中断 + +#if (D_UART1_485_TYPE != TYPE_485_NONE) + D_UART1_485_RX(); //默认处于接收状态 +#endif +} +/* + +void L0_uart1_Array(U8 * buf, U16 len) +{ +#if (D_UART1_485_TYPE != TYPE_485_NONE) + D_UART1_485_TX(); //切换到输出状态 +#endif + L0_uartN_Array(D_UART1,buf,len); +} +*/ + + +////U8 overtime_t; //超时溢出的计数器 +////U8 overtime_flag; ///0:没有超时溢出 1:超时溢出 +////U8 over_flag; ////串口接收结束的状态 0:超时溢出 1:超出max接收 + +///D_LED4_REV(); + +void L2_uart1_overtime_callback(void) +{////必须清除当前的idle + if(0 == ts_Urec[D_UART1].idle) + { + if(ts_Urec[D_UART1].overtime_t >= 2) + { + ts_Urec[D_UART1].idle = 1;//总线空闲 + ts_Urec[D_UART1].head = 0; + + //// printf(" ts_s2b_debug.fifo = %d ",(int)ts_s2b_debug.fifo); + if(ts_Urec[D_UART1].fifo > 0) + {ts_Urec[D_UART1].fifo = 0; + ts_Urec[D_UART1].ok = 1;/// 接收到的数据结束 : 总线空闲+buf非空 + ts_Urec[D_UART1].sp = ts_Urecbuf.r1; + //// L1_uartD_sendArray((U8 *)ts_debug_rec.filter, 5); + /******* + L1_uartD_sendArrayhex((U8 *)&ts_debug_rec.filter, 5); + ts_debug_rec.filter = 0x31; + ts_debug_rec.R1 = 0x32; + ts_debug_rec.R2 = 0x33; + ts_debug_rec.R3 = 0x34; + ts_debug_rec.ocr = 0x35; + + L1_uartD_sendArrayhex((U8 *)&ts_debug_rec.filter, 5); + *********/ + + } + } + ts_Urec[D_UART1].overtime_t ++; + } +} + + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_UART(void) D_SERVE_UART +{ + if(L0_uart1_IntRI()) //如果是U0接收中断 + { + L0_uart1_IntRIClear(); //清除接收中断标志 +/// D_LED1_REV(); + + ///>>>>>>>>>>>>>接收协议 可以更改为其他协议>>>>>>>>>>>>>>>>>>>>>>>> + ts_Urec[D_UART1].reg = L0_uart1_get(); + ts_Urec[D_UART1].idle = 0; + ts_Urec[D_UART1].overtime_t = 0;///需要和tick 定时器中的配合 作为接收超时判定 + /// L1_s2b_PH5_debug(&ts_s2b_debug); + /// L1_s2b_PH5_debug(TS_s2b_debug); + L1_s2b_road(D_UART1); + ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + } + if(L0_uart1_IntTI()) //如果是U0发送中断 + { + L0_uart1_IntTIClear(); //清除发送中断标志 + if(ts_Usend[D_UART1].max != ts_Usend[D_UART1].now) + { + ///L0_uartN_set(uNum1,ts_uart[uNum1].p->p[ts_uart[uNum1].p->now]); + L0_uart1_set(ts_Usend[D_UART1].sbuf[ts_Usend[D_UART1].now]); + ts_Usend[D_UART1].now ++;//发送本包的下一个数据 + } + else + { + ts_Usend[D_UART1].ok = D_ready; + ts_Usend[D_UART1].max = 0; + ts_Usend[D_UART1].now = 0;//可以发送下一包数据 +#if (D_UART1_485_TYPE != TYPE_485_NONE) + D_UART1_485_RX() //切换到接收状态 + ///gfgfgfh + #endif + } + } + //NOP(); NOP(); NOP(); +} + +///L2_callback_uart1_free(&s_uart1_rec); +#if 0 + +void L2_callback_uart1_free(Ts_uart_rev_ *p) +{ + + ///Ts_uart_rev_ *p = &s_uart1_rec; + #define D_s_modbus_min 4 //modbus协议的最小长度 + +/// D_P24_REV(); +////while(9) D_P24_REV(); + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + //LED1 ^= 1; + p->head = 0; + #ifdef D_use_crc + crc16qq(p->crc,p->buf,p->num - 2); ////fixme 20220311 ///crc16qq(p->crc,p->buf,p->num - 2); //校验CRC + #endif + + // crc16(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + p->ok = 1; + /// LED0 ^= 1; + } + p->debugok = 1;////s_uart1_rec.debugok + } + L1_uart1_isFree_over(); + +//// D_motor1_FI_rev(); + +} + +#endif diff --git a/source/msp/uart/msp_uart1.h b/source/msp/uart/msp_uart1.h new file mode 100644 index 0000000..c1f6679 --- /dev/null +++ b/source/msp/uart/msp_uart1.h @@ -0,0 +1,100 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/c_lib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart1_Init + uart1_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart1_H +#define _uart1_H +#include "bsp_config.h" +//#include "tpc_modbus.h" +#include "msp_uartN.h" +//#include "msp_time2.h" + +//#include "../tpc/tpc_x.h" +#define D_UART1_RS_EN(x) REN = (x) + +#define D_uart1_ES_INT(x) ES = (x) +#define L0_uart1_IntRI() (RI)//BITN_G(SCON,U0RI) +#define L0_uart1_IntTI() (TI)//BITN_G(SCON,U0TI) +#define L0_uart1_IntRIClear(); RI = 0;//BITN_0(SCON,U0RI) +#define L0_uart1_IntTIClear(); TI = 0;//BITN_0(SCON,U0TI) +#define L0_uart1_set(x) (SBUF = (x)) +#define L0_uart1_get() (SBUF) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +extern void L1_uart1_open(void); + +extern void L0_uart1_buf_init(void); +extern void L0_uart1_Array(U8 * buf, U16 len); + +#define L1_uart1_uc(X) L0_uartN_uc(D_UART1,X) +#define L0_uart1_us(X) L0_uartN_us(D_UART1,X) +#define L0_uart1_ul(X) L0_uartN_ul(D_UART1,X) +#define L0_uart1_0d0a() L0_uartN_0d0a(0) +#define L0_uart1_uchex(X) L0_uartN_uchex(D_UART1,X) +#define L0_uart1_ushex(X) L0_uartN_ushex(D_UART1,X) +#define L0_uart1_ulhex(X) L0_uartN_ulhex(D_UART1,X) +#define L0_uart1_str(buf) L0_uartN_str(D_UART1,buf) +#define L1_uart1_Array(buf,len) L0_uartN_Array(D_UART1,(buf),(len)) +#define L1_uart1_Arrayhex(buf,len) L0_uartN_uchexArray(D_UART1,(buf),(len)) + +///void L2_callback_uart1_free(void); + +///void L2_callback_uart1_free(Ts_uart_rev_ *p); + +#define L1_uart1_isFree(); /////L0_timer2_start(); +#define L1_uart1_isFree_over(); /////L0_timer2_stop(); +#define L1_uart1_timer_isFree_init(); /////L0_timer2_init();L0_timer2_stop();\ + /////L0_timer2_int_on();\ + /////ts_timer2.callback = L2_callback_uart1_free;ts_timer2.p = &s_uart1_rec; +extern void L2_uart1_overtime_callback(void); + +#endif //#ifndef _uart1_H + diff --git a/source/msp/uart/msp_uartN.c b/source/msp/uart/msp_uartN.c new file mode 100644 index 0000000..3233ed5 --- /dev/null +++ b/source/msp/uart/msp_uartN.c @@ -0,0 +1,405 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 + +/***************************************************************************** +update by cc @20220305 + + + +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + +app +asp +bsp + +debug 选择哪个串口作为debug协议的通讯 + +----------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------- +tpc/: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 + +-------------------------------------------------------------------------------------------- +msp/msp_uartx.c + + + + + +-------------------------------------------------------------------------------------------- +msp/msp_uart0.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "msp_uartN.h" + +TS_Uart_Send_ ts_Usend[SERIAL_MAX_NUM]= {0}; +TS_send_buf_ ts_Usendbuf; + +TS_rec_road_ ts_Urec[SERIAL_MAX_NUM]= {0}; +TS_rec_buf_ ts_Urecbuf; + code vU16 S_send_max[4]= + { + D_send1_max, + D_send2_max, + D_send3_max, + D_send4_max + }; + + void L0_uartN_set(U8 uartx,U8 x) + { + switch(uartx) + { + case 0: + SBUF = (x); + break; + case 1: + S2BUF = (x);/// + break; + case 2: + S3BUF = (x); + break; + case 3: + S4BUF = (x); + break; + default:break; + } + } +/* +void L0_waitFree_uartN888(U8 uartx) +{ + ts_Usend[uartx].over = 0; + while(ts_Usend[uartx].now != 0) + { + #if 10 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_Usend[uartx].over ++ > 600000)///这样写居然出错 + + {////ts_uart[uartx].p->ok = D_ready; + + ts_Usend[uartx].now = 0; + break; + } + #endif + } +} +*/ + +void L0_waitFree_uartN(U8 uartx) +{ + ts_Usend[uartx].over = 0; + while(ts_Usend[uartx].now != 0) + { + #if 10 //发送数据特别快时,某些情况下会导致数据发送出错 + /// if(ts_uart[uartx].p->over ++ > 600000)///这样写居然出错(vU32) + ts_Usend[uartx].over ++; + if(ts_Usend[uartx].over > 20000)////600 000--4s + {////ts_uart[uartx].p->ok = D_ready; + ts_Usend[uartx].max = ts_Usend[uartx].now; + ts_Usend[uartx].ok = D_ready; + // ts_Usend[uartx].over = 0; + // ts_Usend[uartx].now = 1; + ts_Usend[uartx].now = 0; + break; + } + #endif + } +} + +#define D_485R 0 +#define D_485S 1 + + +void L0_uartN_485(U8 uartx,U8 x) +{ + if (D_485R == x) + { + switch(uartx) + { + case 0: + D_UART1_485_RX(); + break; + case 1: + break; + case 2: + break; + case 3: + //// D_UART4_485_RX(); + break; + default:break; + } + }else + { + switch(uartx) + { + case 0: + D_UART1_485_TX(); + break; + case 1: + break; + case 2: + break; + case 3: + //// D_UART4_485_TX(); + break; + default:break; + } + } + +} + +void L0_uartN_Array(U8 uartx,void *buf,U16 len) +{ + u16 i; + + L0_waitFree_uartN(uartx); + + L0_uartN_485(uartx,D_485S); + ts_Usend[uartx].ok = D_ready; + ts_Usend[uartx].over = 0; + ts_Usend[uartx].now = 1; + if (len > ts_Usend[uartx].max_def) + { + len = ts_Usend[uartx].max_def - 1; + } + ts_Usend[uartx].max = len; + //将参数buf拷贝至内部buf + for(i = 0;i < len;i ++) + { + ts_Usend[uartx].sbuf[i] = ((U8*)buf)[i]; + } + L0_uartN_set(uartx,ts_Usend[uartx].sbuf[0]); +} + + +void L0_uartN_Arraylong(U8 uartx,U8 *buf,U16 usStart,U16 usEnd) +{ + //L0_uart0_sendbuf(str,strlen(str)); + U16 t; + t = usEnd-usStart; + t ++; + L0_uartN_Array(uartx,&buf[usStart],t); +} + + +void L0_uartN_uc(U8 uartx,U8 ww) +{ + L0_uartN_Array(uartx,&ww,1); +} + +void L0_uartN_us(U8 uartx,vU16 ww) +{ + U_U16 uStemp; + uStemp.word = ww; + ts_Usend[uartx].buf3[0] = uStemp.BYTE2.h; + ts_Usend[uartx].buf3[1] = uStemp.BYTE2.l; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_ul(U8 uartx,vU32 ww) +{ + U_U32 uStemp; + L0_waitFree_uartN(uartx); + uStemp.dWord = ww; + ts_Usend[uartx].buf3[0] = uStemp.BYTE4.byte0; + ts_Usend[uartx].buf3[1] = uStemp.BYTE4.byte1; + ts_Usend[uartx].buf3[2] = uStemp.BYTE4.byte2; + ts_Usend[uartx].buf3[3] = uStemp.BYTE4.byte3; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,4); +} + +void L0_uartN_0d0a(U8 uartx) +{ + L0_waitFree_uartN(uartx); + ts_Usend[uartx].buf3[0] = 0x0d; + ts_Usend[uartx].buf3[1] = 0x0a; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_uchex(U8 uartx,U8 ww) +{ + L0_waitFree_uartN(uartx); + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(ww)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (ww)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_ushex(U8 uartx,vU16 ww) +{ + U_F16 k; + L0_waitFree_uartN(uartx); + k.us = ww; + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; + ts_Usend[uartx].buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + ts_Usend[uartx].buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,4); +} + +void L0_uartN_ulhex(U8 uartx,U32 ww) +{ + U_U32 k; + L0_waitFree_uartN(uartx); + k.dWord = ww; + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; + ts_Usend[uartx].buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; + ts_Usend[uartx].buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; + ts_Usend[uartx].buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; + ts_Usend[uartx].buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; + ts_Usend[uartx].buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; + ts_Usend[uartx].buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,8); +} + +void L0_uartN_str(U8 uartx,U8 *str) +{ + L0_uartN_Array(uartx,str,Lc_strlen(str)); +} + +void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) +{ + int i; + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//withoutbuf>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +void L0_uartN_sbuf(U8 uartx)/////cc 2023/04/23--4:23:19 修正bug 调用时放到ts_Usend[uartx].max 复制的前面 +{ + ts_Usend[uartx].max = 0; + ts_Usend[uartx].now = 0; + ts_Usend[uartx].ok = D_ready; + ts_Usend[uartx].max_def = S_send_max[uartx]; + switch(uartx) + { + case 0: + ts_Usend[uartx].sbuf = ts_Usendbuf.s1; + break; + case 1: + ts_Usend[uartx].sbuf = ts_Usendbuf.s2; + break; + case 2: + ts_Usend[uartx].sbuf = ts_Usendbuf.s3; + break; + case 3: + ts_Usend[uartx].sbuf = ts_Usendbuf.s4; + break; + default:break; + } +} + +////使用内置的usend buf的发送 cc 2023/04/23--4:25:8 调用的时候不可使用本通道的缓存 +void L0_uartN_Array_withoutbuf(U8 uartx,U16 len) +{ +/// u16 i; + L0_waitFree_uartN(uartx); + + L0_uartN_485(uartx,D_485S); + L0_uartN_sbuf(uartx); + + if (len > ts_Usend[uartx].max_def) + { + len = ts_Usend[uartx].max_def - 1; + } + ts_Usend[uartx].max = len; + ts_Usend[uartx].now = 1; + L0_uartN_set(uartx,ts_Usend[uartx].sbuf[0]); +} + +///cc 2023/04/23--4:25:8 调用的时候不可使用本通道的缓存 +void L0_uartN_Arrayhex_withoutbuf(U8 uartx,vU8 *buf,U16 len) +{ + vU16 i;vU16 t; + + L0_waitFree_uartN(uartx); + L0_uartN_sbuf(uartx); + if (len > (ts_Usend[uartx].max_def/3)) + { + len = ts_Usend[uartx].max_def/3 - 1; + } + for(i = 0;i < len;i ++) + { + + t = i * 3; + ts_Usend[uartx].sbuf[t] = cguHex2Char[D_uc_high(buf[i])][1];/// 34 '3'--33 + t ++; + ts_Usend[uartx].sbuf[t] = cguHex2Char[D_uc_low (buf[i])][1];/// 34 '3'--33 + t ++; + ts_Usend[uartx].sbuf[t] = ' '; + t ++; + + } +// len 2 11x 22x \0 + ts_Usend[uartx].sbuf[t] = ' '; + t++; + ts_Usend[uartx].sbuf[t] = 0x00; + L0_uartN_Array_withoutbuf(uartx,t-1); + +} + + + + + + + + + + + + + + diff --git a/source/msp/uart/msp_uartN.c.bak b/source/msp/uart/msp_uartN.c.bak new file mode 100644 index 0000000..30211f2 --- /dev/null +++ b/source/msp/uart/msp_uartN.c.bak @@ -0,0 +1,403 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 + +/***************************************************************************** +update by cc @20220305 + + + +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + +app +asp +bsp + +debug 选择哪个串口作为debug协议的通讯 + +----------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------------- +tpc/: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 + +-------------------------------------------------------------------------------------------- +msp/msp_uartx.c + + + + + +-------------------------------------------------------------------------------------------- +msp/msp_uart0.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "msp_uartN.h" + +TS_Uart_Send_ ts_Usend[SERIAL_MAX_NUM]= {0}; +TS_send_buf_ ts_Usendbuf; + +TS_rec_road_ ts_Urec[SERIAL_MAX_NUM]= {0}; +TS_rec_buf_ ts_Urecbuf; + code vU16 S_send_max[4]= + { + D_send1_max, + D_send2_max, + D_send3_max, + D_send4_max + }; + + void L0_uartN_set(U8 uartx,U8 x) + { + switch(uartx) + { + case 0: + SBUF = (x); + break; + case 1: + S2BUF = (x);/// + break; + case 2: + S3BUF = (x); + break; + case 3: + S4BUF = (x); + break; + default:break; + } + } +/* +void L0_waitFree_uartN888(U8 uartx) +{ + ts_Usend[uartx].over = 0; + while(ts_Usend[uartx].now != 0) + { + #if 10 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_Usend[uartx].over ++ > 600000)///这样写居然出错 + + {////ts_uart[uartx].p->ok = D_ready; + + ts_Usend[uartx].now = 0; + break; + } + #endif + } +} +*/ + +void L0_waitFree_uartN(U8 uartx) +{ + ts_Usend[uartx].over = 0; + while(ts_Usend[uartx].now != 0) + { + #if 10 //发送数据特别快时,某些情况下会导致数据发送出错 + /// if(ts_uart[uartx].p->over ++ > 600000)///这样写居然出错(vU32) + ts_Usend[uartx].over ++; + if(ts_Usend[uartx].over > 20000)////600 000--4s + {////ts_uart[uartx].p->ok = D_ready; + ts_Usend[uartx].max = ts_Usend[uartx].now; + ts_Usend[uartx].ok = D_ready; + // ts_Usend[uartx].over = 0; + // ts_Usend[uartx].now = 1; + ts_Usend[uartx].now = 0; + break; + } + #endif + } +} + +#define D_485R 0 +#define D_485S 1 + + +void L0_uartN_485(U8 uartx,U8 x) +{ + if (D_485R == x) + { + switch(uartx) + { + case 0: + D_UART1_485_RX(); + break; + case 1: + break; + case 2: + break; + case 3: + //// D_UART4_485_RX(); + break; + default:break; + } + }else + { + switch(uartx) + { + case 0: + D_UART1_485_TX(); + break; + case 1: + break; + case 2: + break; + case 3: + //// D_UART4_485_TX(); + break; + default:break; + } + } + +} + +void L0_uartN_Array(U8 uartx,void *buf,U16 len) +{ + u16 i; + + L0_waitFree_uartN(uartx); + + L0_uartN_485(uartx,D_485S); + ts_Usend[uartx].ok = D_ready; + ts_Usend[uartx].over = 0; + ts_Usend[uartx].now = 1; + if (len > ts_Usend[uartx].max_def) + { + len = ts_Usend[uartx].max_def - 1; + } + ts_Usend[uartx].max = len; + //将参数buf拷贝至内部buf + for(i = 0;i < len;i ++) + { + ts_Usend[uartx].sbuf[i] = ((U8*)buf)[i]; + } + L0_uartN_set(uartx,ts_Usend[uartx].sbuf[0]); +} + + +void L0_uartN_Arraylong(U8 uartx,U8 *buf,U16 usStart,U16 usEnd) +{ + //L0_uart0_sendbuf(str,strlen(str)); + U16 t; + t = usEnd-usStart; + t ++; + L0_uartN_Array(uartx,&buf[usStart],t); +} + + +void L0_uartN_uc(U8 uartx,U8 ww) +{ + L0_uartN_Array(uartx,&ww,1); +} + +void L0_uartN_us(U8 uartx,vU16 ww) +{ + U_U16 uStemp; + uStemp.word = ww; + ts_Usend[uartx].buf3[0] = uStemp.BYTE2.h; + ts_Usend[uartx].buf3[1] = uStemp.BYTE2.l; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_ul(U8 uartx,vU32 ww) +{ + U_U32 uStemp; + L0_waitFree_uartN(uartx); + uStemp.dWord = ww; + ts_Usend[uartx].buf3[0] = uStemp.BYTE4.byte0; + ts_Usend[uartx].buf3[1] = uStemp.BYTE4.byte1; + ts_Usend[uartx].buf3[2] = uStemp.BYTE4.byte2; + ts_Usend[uartx].buf3[3] = uStemp.BYTE4.byte3; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,4); +} + +void L0_uartN_0d0a(U8 uartx) +{ + L0_waitFree_uartN(uartx); + ts_Usend[uartx].buf3[0] = 0x0d; + ts_Usend[uartx].buf3[1] = 0x0a; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_uchex(U8 uartx,U8 ww) +{ + L0_waitFree_uartN(uartx); + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(ww)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (ww)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,2); +} + +void L0_uartN_ushex(U8 uartx,vU16 ww) +{ + U_F16 k; + L0_waitFree_uartN(uartx); + k.us = ww; + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; + ts_Usend[uartx].buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; + ts_Usend[uartx].buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,4); +} + +void L0_uartN_ulhex(U8 uartx,U32 ww) +{ + U_U32 k; + L0_waitFree_uartN(uartx); + k.dWord = ww; + ts_Usend[uartx].buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; + ts_Usend[uartx].buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; + ts_Usend[uartx].buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; + ts_Usend[uartx].buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; + ts_Usend[uartx].buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; + ts_Usend[uartx].buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; + ts_Usend[uartx].buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; + ts_Usend[uartx].buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; + L0_uartN_Array(uartx,ts_Usend[uartx].buf3,8); +} + +void L0_uartN_str(U8 uartx,U8 *str) +{ + L0_uartN_Array(uartx,str,Lc_strlen(str)); +} + +void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) +{ + int i; + for(i=0;i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//withoutbuf>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +void L0_uartN_sbuf(U8 uartx)/////cc 2023/04/23--4:23:19 修正bug 调用时放到ts_Usend[uartx].max 复制的前面 +{ + ts_Usend[uartx].max = 0; + ts_Usend[uartx].now = 0; + ts_Usend[uartx].ok = D_ready; + ts_Usend[uartx].max_def = S_send_max[uartx]; + switch(uartx) + { + case 0: + ts_Usend[uartx].sbuf = ts_Usendbuf.s1; + break; + case 1: + ts_Usend[uartx].sbuf = ts_Usendbuf.s2; + break; + case 2: + ts_Usend[uartx].sbuf = ts_Usendbuf.s3; + break; + case 3: + ts_Usend[uartx].sbuf = ts_Usendbuf.s4; + break; + default:break; + } +} + +////使用内置的usend buf的发送 cc 2023/04/23--4:25:8 调用的时候不可使用本通道的缓存 +void L0_uartN_Array_withoutbuf(U8 uartx,U16 len) +{ +/// u16 i; + L0_waitFree_uartN(uartx); + + L0_uartN_485(uartx,D_485S); + L0_uartN_sbuf(uartx); + + if (len > ts_Usend[uartx].max_def) + { + len = ts_Usend[uartx].max_def - 1; + } + ts_Usend[uartx].max = len; + L0_uartN_set(uartx,ts_Usend[uartx].sbuf[0]); +} + +///cc 2023/04/23--4:25:8 调用的时候不可使用本通道的缓存 +void L0_uartN_Arrayhex_withoutbuf(U8 uartx,vU8 *buf,U16 len) +{ + vU16 i;vU16 t; + + L0_waitFree_uartN(uartx); + if (len > (ts_Usend[uartx].max_def/3)) + { + len = ts_Usend[uartx].max_def/3 - 1; + } + for(i = 0;i < len;i ++) + { + + t = i * 3; + ts_Usend[uartx].sbuf[t] = cguHex2Char[D_uc_high(buf[i])][1];/// 34 '3'--33 + t ++; + ts_Usend[uartx].sbuf[t] = cguHex2Char[D_uc_low (buf[i])][1];/// 34 '3'--33 + t ++; + ts_Usend[uartx].sbuf[t] = ' '; + t ++; + + } +// len 2 11x 22x \0 + ts_Usend[uartx].sbuf[t] = ' '; + t++; + ts_Usend[uartx].sbuf[t] = 0x00; + L0_uartN_Array_withoutbuf(uartx,t-1); + +} + + + + + + + + + + + + + + diff --git a/source/msp/uart/msp_uartN.h b/source/msp/uart/msp_uartN.h new file mode 100644 index 0000000..16df153 --- /dev/null +++ b/source/msp/uart/msp_uartN.h @@ -0,0 +1,170 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uartN_H +#define _uartN_H +#include "c_lib.h" +#include "tpc_x.h" +#include "bsp_config.h" +#define D_UART1 0 +#define D_UART2 1 +#define D_UART3 2 +#define D_UART4 3 + + +#define D_uartN_free() (0 == ts_Usend[uartx].max) +#define D_uartN_busy() (0 != ts_Usend[uartx].max) +#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) +typedef struct +{ + U8 reg; +//// U8 f2; + U8 overtime_t; //超时溢出的计数器 + U8 idle; ///0:没有超时溢出 1:超时溢出 总线空闲 +/// U8 over_flag; ////串口接收结束的状态 0:超时溢出 1:超出max接收 + U8 head; //接收标志头标志 +/// U8 f; //接收标志头标志 + U16 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + U8 ok; //接收协议ok标志 + U8 debugok; + U16 rmax; +/// U8 len; + U8 fifo;////有数据FIFO= 1;空闲标志读取后之后fifo =0 + U8 *sp; +/// U8 t[D_debug_max+1]; +}TS_rec_road_;///处理debug类型的协议时使用变量 ////协议处理变量 +extern TS_rec_road_ ts_Urec[SERIAL_MAX_NUM]; + + + +/////可以依据实际使用独立定制 +#define D_rec1_max 128 +#define D_rec2_max 1 +#define D_rec3_max 1 +#define D_rec4_max 1 + + +typedef struct +{ + U8 r1[D_rec1_max]; + U8 r2[D_rec2_max]; + U8 r3[D_rec3_max]; + U8 r4[D_rec4_max]; + U8 r5[D_rec4_max]; +/// U8 t[D_debug_max+1]; +}TS_rec_buf_;///处理debug类型的协议时使用变量 ////协议处理变量 +extern TS_rec_buf_ ts_Urecbuf; + + + +#define D_send1_max 128 +#define D_send2_max 1 +#define D_send3_max 1 +#define D_send4_max 1 + + +typedef struct +{ + U8 s1[D_send1_max]; + U8 s2[D_send2_max]; + U8 s3[D_send3_max]; + U8 s4[D_send4_max]; +/// U8 t[D_debug_max+1]; +}TS_send_buf_;///处理debug类型的协议时使用变量 ////协议处理变量 +extern TS_send_buf_ ts_Usendbuf; + + +typedef struct +{ + vU16 num; //注意数据长度的范围 + //// vU8 *p; + vU16 now; /// 当前buf所在的位置 0------(max-1) + vU16 max; /// 当前buf的最大值,也就是需要发送的长度 + vU8 overtime; + vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 + vU8 ok; /// 发送完成标志 + vU8 *sbuf;////sbuf[] + vU16 max_def; /// 当前buf的最大值,D_sendx_max 需要在初始化的时候赋值 + vU8 buf3[D_UART_send_buf2_max]; +}TS_Uart_Send_; + +extern TS_Uart_Send_ ts_Usend[SERIAL_MAX_NUM]; + + +extern void L0_uartN_init(U8 uartx); +extern void L0_uartN_Array(U8 uartx,void *buf,U16 len); +extern void L0_uartN_Arraylong(U8 uartx,U8 *buf,U16 usStart,U16 usEnd); + +extern void L0_uartN_uc(U8 uartx,U8 ww); +extern void L0_uartN_us(U8 uartx,vU16 ww); +extern void L0_uartN_ul(U8 uartx,vU32 ww); +extern void L0_uartN_0d0a(U8 uartx); +extern void L0_uartN_uchex(U8 uartx, U8 ww); +extern void L0_uartN_ushex(U8 uartx, U16 ww); +extern void L0_uartN_ulhex(U8 uartx, U32 ww); +extern void L0_uartN_str(U8 uartx,U8 *buf); +extern void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n); +extern void L0_waitFree_uartN(U8 uartx); +extern void L0_uartN_set(U8 uartx,U8 x); +////使用内置的usend buf的发送 +extern void L0_uartN_ushexArray(U8 uartx,vU16 *buf,U16 n); + + +////把发送缓存中的len个数据用中断自动发送出去 +extern void L0_uartN_Array_withoutbuf(U8 uartx,U16 len); + +///要把buf的内容经过hex转化后 放入发送缓存中 +extern void L0_uartN_Arrayhex_withoutbuf(U8 uartx,vU8 *buf,U16 len); +extern void L0_uartN_sbuf(U8 uartx); + +#endif //#ifndef _uartN_H + diff --git a/source/msp/uart/新建文件夹/msp_UART2.c b/source/msp/uart/新建文件夹/msp_UART2.c new file mode 100644 index 0000000..65a9be4 --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART2.c @@ -0,0 +1,173 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版 本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart2.h" + +///#include "tpc_wifi.h" ///本串口要使用的写意 + +static volatile TS_Uart_Send_ ts_uart2_send_shop; + +///>>>>>>>>>>>>>>>>和cpu相关 + + +#if(MainFre_5M == D_sys_MainFre) + + +#elif(MainFre_22M == D_sys_MainFre) + + +#elif(MainFre_27M == D_sys_MainFre) + + +#else ///MainFre_11M + + #if(BRT_115200 == D_uart2_BRT) + + void L0_uart2_init(void) /// void UartInit(void) //115200bps@11.0592MHz + { + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFE; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + + + #elif(BRT_19200 == D_UART1_BRT) + + + #elif(BRT_9600== D_UART1_BRT) + + + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>和cpu相关 + + +void L0_uart2_buf_init(void) +{ + +/// L1_s2b_lora_init(); + + ts_uart[uNum2].now = 0; + ts_uart[uNum2].ok = D_ready; + L0_uart2_init(); + D_uart2_ES_INT(1); //打开串口中断 + +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart2_sendArray555555(U8 * buf, U16 len) +{ +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum2,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_uart2(void) D_SERVE_UART2// using 2 +{ + //NOP(); NOP(); NOP(); + if(L0_uart2_IntRI()) //如果是U2接收中断 + { + L0_uart2_IntRIClear(); //清除接收中断标志 + + ///>>>>>>>>>>>>>接收协议 可以更改为其他协议>>>>>>>>>>>>>>>>>>>>>>>> +/// ts_s2b_lrdlora.reg = L0_uart2_get(); +// L1_s2b_lora(&ts_s2b_lrdlora); + ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<< (ts_uart[uNum2].t); + } + if(L0_uart2_IntTI()) //如果是U0发送中断 + { + L0_uart2_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum2].max != ts_uart[uNum2].now) + { + L0_uart2_set(ts_uart[uNum2].buf[ts_uart[uNum2].now]); + ts_uart[uNum2].now ++; + } + else + { + ts_uart[uNum2].ok = D_ready; + ts_uart[uNum2].max = 0; + ts_uart[uNum2].now = 0;//可以发送下一个数据 +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +} + + + + + + + + + + + diff --git a/source/msp/uart/新建文件夹/msp_UART2.h b/source/msp/uart/新建文件夹/msp_UART2.h new file mode 100644 index 0000000..74a68e5 --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART2.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart2_Init + uart2_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart2_H +#define _uart2_H + +#include "bsp_config.h" +//#include "tpc_modbus.h" +#include "msp_uartN.h" + +#define D_uart2_ES_INT(x) (x) ? (BITN_1(IE2,ES2)) : (BITN_0(IE2,ES2)) +#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI) +#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) +#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) +#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) +#define L0_uart2_get() (S2BUF) +#define L0_uart2_set(x) (S2BUF = x) +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart2_buf_init(void); +////void L0_uart2_sendArray(U8 * buf, U16 len); + +#define L0_uart2_uc(X) L0_uartN_uc(uNum2,X) +#define L0_uart2_us(X) L0_uartN_us(uNum2,X) +#define L0_uart2_ul(X) L0_uartN_ul(uNum2,X) +#define L0_uart2_0d0a() L0_uartN_0d0a(0) +#define L0_uart2_uchex(X) L0_uartN_uchex(uNum2,X) +#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) +#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) +#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) + +#define L0_uart2_sendArray(buf,len) L0_uartN_sendArray(uNum2,buf,len) + +#define L1_uart2_isFree(); ///L0_timer2_start(); +#define L1_uart2_isFree_over(); //L0_timer2_stop(); +#define L1_uart2_timer_isFree_init(); //L0_timer2_init();L0_timer2_stop();\ + //L0_timer2_int_on();\ + //ts_timer2.callback = L2_callback_uart2_free;ts_timer2.p = &s_uart2_rec; + + +#endif //#ifndef _uart2_H + diff --git a/source/msp/uart/新建文件夹/msp_UART3.c b/source/msp/uart/新建文件夹/msp_UART3.c new file mode 100644 index 0000000..6b72646 --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART3.c @@ -0,0 +1,170 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "uart3.h" +#include "time.h" +#include + +static volatile Ts_uart_send_buf ts_uart_send_shop; +struct _tp_handler_x s_uart3_rec; +TS_PH4_modbus s_uart3_ack; + +void L0_uart3_init(void) +{ +#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器3时钟为Fosc,即1T + T3L = 0xE8; //设定定时初值 + T3H = 0xFF; //设定定时初值 + T4T3M |= 0x08; //启动定时器3 + +#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器3时钟为Fosc,即1T + T3L = 0xD0; //设定定时初值 + T3H = 0xFF; //设定定时初值 + T4T3M |= 0x08; //启动定时器3 +#endif + +} + +void L0_uart3_buf_init(void) +{ + ts_uart[uNum3].p = &ts_uart_send_shop; + ts_uart[uNum3].p->now = 0; + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].t = &s_uart3_rec; + ts_uart[uNum3].t->head = 0; + ts_uart[uNum3].t->ok = 0; + ts_uart[uNum3].tp_handler = L1_s2b_PH4; + ts_uart[uNum3].ack = (U8*)&s_uart3_ack; + L0_uart3_init(); + //D_uart3_ES_INT_OPEN(); //打开串口中断 + D_uart3_ES_INT(1); //打开串口中断 + +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart3_sendArray(U8 * buf, U16 len) +{ +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum3,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +#define D_SERVE_UART3 interrupt 17 +void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 +{ + NOP(); NOP(); NOP(); + if(L0_uart3_IntRI()) //如果是U0接收中断 + { + L0_uart3_IntRIClear(); //清除接收中断标志 + ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); + ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); + //L0_timer4_start(0); + } + if(L0_uart3_IntTI()) + { + if(L0_uart3_IntTI()) //如果是U0发送中断 + { + L0_uart3_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now) + { + L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + ts_uart[uNum3].p->now ++; + } + else + { + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].p->max = 0; + ts_uart[uNum3].p->now = 0;//可以发送下一个数据 +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //切换到接收状态 +#endif + } + } + } + NOP(); NOP(); NOP(); +} + +void timer4_isrHanddle(void) D_SERVE_TIMER4 +{ + struct _tp_handler_x *p = &s_uart3_rec; + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + p->head = 0; + crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + LED0 ^= 1; + } + L0_timer4_stop(); +} + + diff --git a/source/msp/uart/新建文件夹/msp_UART3.h b/source/msp/uart/新建文件夹/msp_UART3.h new file mode 100644 index 0000000..1d0afa6 --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART3.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart3_Init + uart3_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart3_H +#define _uart3_H + +#include "../bsp/bsp_config.h" +#include "../tpc/tpc_modbus.h" +#include "uartN.h" + +//#define S4SM0 BITN7 +#define D_uart3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) +//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3) +//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3) +#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI) +#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI) +#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) +#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) +#define L0_uart3_set(x) S3BUF = (x); +#define L0_uart3_get() (S3BUF) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart3_buf_init(void); +void L0_uart3_sendArray(U8 * buf, U16 len); + +#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) +#define L0_uart3_us(X) L0_uartN_us(uNum3,X) +#define L0_uart3_ul(X) L0_uartN_ul(uNum3,X) +#define L0_uart3_0d0a() L0_uartN_0d0a(uNum3) +#define L0_uart3_uchex(X) L0_uartN_uchex(uNum3,X) +#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X) +#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X) +#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) +#define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) + +extern TP_Handler_X s_uart3_rec; +extern TS_PH4_modbus s_uart3_ack; + +#endif //#ifndef _uart3_H + diff --git a/source/msp/uart/新建文件夹/msp_UART4.c b/source/msp/uart/新建文件夹/msp_UART4.c new file mode 100644 index 0000000..06ddec6 --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART4.c @@ -0,0 +1,163 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +// 20160413 CC-ACC-VH02 +// 连接至 J22 RXD0 TXD0 +//P5_DIR &= ~BITN1; //p5.1输出TXD +//P5_DIR |= BITN0; //p5.0输入RXD +//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD +//P5_SEL1 |= BITN0 +BITN1; + +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart4.h" + +///#include "tpc_wifi.h" ///本串口要使用的写意 + +static volatile TS_Uart_Send_ ts_uart4_send_shop; + +///>>>>>>>>>>>>>>>>和cpu相关 + + +#if(MainFre_5M == D_sys_MainFre) + + +#elif(MainFre_22M == D_sys_MainFre) + + +#elif(MainFre_27M == D_sys_MainFre) + + +#else ///MainFre_11M + + #if(BRT_115200 == D_uart4_BRT) + + void L0_uart4_init(void) /// void UartInit(void) //115200bps@11.0592MHz + { + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFE; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 + } + + + #elif(BRT_19200 == D_uart4_BRT) + + + #elif(BRT_9600== D_uart4_BRT) + + + #else///9600 + + #endif//D_sys_MainFre) + +#endif//D_sys_MainFre) + +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>和cpu相关 + + +void L0_uart4_buf_init(void) +{ + +/// L1_s2b_lora_init(); + + ts_uart[uNum4].now = 0; + ts_uart[uNum4].ok = D_ready; + L0_uart4_init(); + D_uart4_ES_INT(1); //打开串口中断 + + +} + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_uart4(void) D_SERVE_UART4// using 2 +{ + //NOP(); NOP(); NOP(); + if(L0_uart4_IntRI()) //如果是U2接收中断 + { + L0_uart4_IntRIClear(); //清除接收中断标志 + + ///>>>>>>>>>>>>>接收协议 可以更改为其他协议>>>>>>>>>>>>>>>>>>>>>>>> + ///ts_s2b_lrdlora.reg = L0_uart4_get(); + ///L1_s2b_lora(&ts_s2b_lrdlora); + ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<< (ts_uart[uNum4].t); + } + if(L0_uart4_IntTI()) //如果是U0发送中断 + { + L0_uart4_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum4].max != ts_uart[uNum4].now) + { + L0_uart4_set(ts_uart[uNum4].buf[ts_uart[uNum4].now]); + ts_uart[uNum4].now ++; + } + else + { + ts_uart[uNum4].ok = D_ready; + ts_uart[uNum4].max = 0; + ts_uart[uNum4].now = 0;//可以发送下一个数据 +#if (D_UART4_485_TYPE != TYPE_485_NONE) + D_uart4_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +} + + + + + + + + + + + diff --git a/source/msp/uart/新建文件夹/msp_UART4.h b/source/msp/uart/新建文件夹/msp_UART4.h new file mode 100644 index 0000000..1d0fd9b --- /dev/null +++ b/source/msp/uart/新建文件夹/msp_UART4.h @@ -0,0 +1,91 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart4_Init + uart4_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#ifndef _uart4_H +#define _uart4_H + +#include "bsp_config.h" + +#include "msp_uartN.h" + + +#define D_uart4_ES_INT(x) (x) ? (BITN_1(IE2,ES4)) : (BITN_0(IE2,ES4)) +#define L0_uart4_IntRI() (S4CON & S4RI)//BITN_G(SCON,U0RI) +#define L0_uart4_IntTI() (S4CON & S4TI)//BITN_G(SCON,U0TI) +#define L0_uart4_IntRIClear(); BITN_0(S4CON,S4RI) +#define L0_uart4_IntTIClear(); BITN_0(S4CON,S4TI) +#define L0_uart4_get() (S4BUF) +#define L0_uart4_set(x) (S4BUF = x) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart4_buf_init(void); +void L0_uart4_sendArray(U8 * buf, U16 len); + +#define L0_uart4_uc(X) L0_uartN_uc(uNum4,X) +#define L0_uart4_us(X) L0_uartN_us(uNum4,X) +#define L0_uart4_ul(X) L0_uartN_ul(uNum4,X) +#define L0_uart4_0d0a() L0_uartN_0d0a(0) +#define L0_uart4_uchex(X) L0_uartN_uchex(uNum4,X) +#define L0_uart4_ushex(X) L0_uartN_ushex(uNum4,X) +#define L0_uart4_ulhex(X) L0_uartN_ulhex(uNum4,X) +#define L0_uart4_sendstr(buf) L0_uartN_sendstr(uNum4,buf) +#define L1_uart4_uchexArray(buf) L0_uartN_sendArray(uNum4,buf) + +#define L1_uart2_isFree(); ///L0_timer2_start(); +#define L1_uart2_isFree_over(); //L0_timer2_stop(); +#define L1_uart2_timer_isFree_init(); //L0_timer2_init();L0_timer2_stop();\ + //L0_timer2_int_on();\ + //ts_timer2.callback = L2_callback_uart2_free;ts_timer2.p = &s_uart2_rec; + +#endif //#ifndef _uart4_H + + + diff --git a/source/tpc/nouse/tpc_0d0a.c b/source/tpc/nouse/tpc_0d0a.c new file mode 100644 index 0000000..99c5bf1 --- /dev/null +++ b/source/tpc/nouse/tpc_0d0a.c @@ -0,0 +1,47 @@ +#include "tpc_0d0a.h" +#include "c_lib.h" + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//L1_uart_2strbuf(&s_uart0_rec);s_uart0_rec.ok = 2 +/// 接收以od oa为结束的标准的assci码的协议 类似 send xx (回车换行)测试时注意以回车换行 +/// 为结束标志,也就是发送的数据后面 必须有回车换行 :0x0d 0x0a + + +//对于连续的多条协议,比如:abcdefg\r\n12345\r\n,如果前一条处理不及时,可能会被后一条覆盖 +void L1_s2b_0d0a(Ts_uart_rev_ *p) //reentrant +{ + if(p->head == 0) + { + p->head = 1; + p->num = 0; + } + + if(p->num >= D_tp_handle_x_len) + { + p->num = 0; + } + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + p->buf[++p->num] = p->cashe[0]; + //p->buf[++p->num] = p->cashe[0]; + + if ((p->num > 2) && (p->cashe[0] == 0x0a) && (p->cashe[1] == 0x0d))// 0d0a + { + if(1 != p->ok) + { + p->buf[0] = p->num - 2; //去掉0d0a + if(p->sp2 != NULL) //备份缓冲区不为null + { + //byte_copy_uc(p->buf + 1,p->__buf,p->num-2); //经过调试,此处不要调用外部函数,入栈出栈会增加出错风险 + for(p->i=0;p->ibuf[0]+1;p->i++) + { + p->sp2[p->i] = p->buf[p->i]; + } + } + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + p->head = 0; + } +} + diff --git a/source/tpc/nouse/tpc_0d0a.h b/source/tpc/nouse/tpc_0d0a.h new file mode 100644 index 0000000..23d8c5f --- /dev/null +++ b/source/tpc/nouse/tpc_0d0a.h @@ -0,0 +1,33 @@ +#ifndef TPC_0D0A_H +#define TPC_0D0A_H + +#include "tpc_x.h" + +///----------------------------------------------------------------------------------------- +//#define D_s_SSTR_0D0A_len 64 //str类的协议需要长度大一些,容易bug的地方,限制为接收64bytes的数据 +#if 0 +#define FLAG_NONE 0 +#define FLAG_DISCARD 1 +#define FLAG_CCID 2 +#define FLAG_CIP 3 +typedef struct _s_PC1_0D0A_ +{//8byte + vU8 reg; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + + vU8 cashe[4]; + //vU8 filter1; + //vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 __buf[D_s_SSTR_0D0A_len+1];//buffer + vU8 buf[D_s_SSTR_0D0A_len+1];//array的第一位是 长度 //协议缓冲 + // U8 pro[16]; ///解析协议用 +}TS_Handle_0d0a; +#endif +extern void L1_s2b_0d0a(Ts_uart_rev_ *p); //reentrant; + +#endif diff --git a/source/tpc/nouse/tpc_ccmodbus.c b/source/tpc/nouse/tpc_ccmodbus.c new file mode 100644 index 0000000..659f90c --- /dev/null +++ b/source/tpc/nouse/tpc_ccmodbus.c @@ -0,0 +1,205 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_ccmodbus.h" +#include "c_lib.h" + +#if 0 +U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} +#endif + +U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) +{ + U8 pkglen = 0; + pccmodbus->filter1 = D_CMD_Filter1_ff; + pccmodbus->filter2 = D_CMD_Filter2_fe; + pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info); +#if 0 + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + break; + case MODBUS_OPER_WRITE: + pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + break; + case MODBUS_OPER_WRITE_M: + pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + break; + default: + break; + } + pccmodbus->num = pkglen; +#endif + return pccmodbus->num + 3; +} + +U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) +{ + U16 pkglen = L3_modbus_slaver_ack((TS_PH4_modbus*)&pccmodbus->slaver, (TS_PH4_modbus*)&pModbusAck->slaver); + pModbusAck->filter1 = D_CMD_Filter1_ff; + pModbusAck->filter2 = D_CMD_Filter2_fe; + pModbusAck->num = pkglen; + return pkglen + 3; +} + +void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + L3_modbus_master_handler((TS_PH4_modbus*)pmodbus->slaver,p_slaver_info); +} + +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 0 1 2 3 4 5 6 7 8 9 10 +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/////使用前必须初始化p->head_0等 +void L1_s2b_PH3(Ts_uart_rev_ *p)// reentrant +{ + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + if (0 == p->head) + { + if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) + { + p->head = 1; + p->max = D_tp_handle_x_len; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->head_0; + p->sp[p->num++] = p->head_1; + } + } + else + { + p->sp[p->num++] = p->cashe[0]; + if(p->num == 3)//数量 第3个数据 + { + p->max = p->cashe[0] + 3; + if((p->max > D_tp_handle_x_len) || (p->max < D_s_ccmodbus_min)) + { + p->head = 0; + return; //error 超过最大长度 + } + } + if(p->num >= p->max) + { + crc16(p->crc,p->buf + 3,p->num - 3 - 2); + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(Ts_uart_rev_ *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + + +/****************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/tpc/nouse/tpc_ccmodbus.h b/source/tpc/nouse/tpc_ccmodbus.h new file mode 100644 index 0000000..d71b3e3 --- /dev/null +++ b/source/tpc/nouse/tpc_ccmodbus.h @@ -0,0 +1,98 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +/***************************************************************************** +@version 1.2 +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/uartlib.c: +公用的函数 和硬件无关 +接收各类协议的处理函数 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + + + +#ifndef __TPC_CCMODBUS_H_ +#define __TPC_CCMODBUS_H_ + +#include "tpc_x.h" +#include "tpc_modbus.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/// 校验码的范围为 + +//#define D_s_PH3_ccmodbus_max 128 +#define D_s_ccmodbus_min (D_s_modbus_min + 3) + +typedef struct +{//8byte + vU8 filter1; + vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 slaver; //发送方的地址或命令 + vU8 oper; //命令 + vU8 buf[D_tp_handle_x_len + 8];//D_s_PH3_ccmodbus_max - 3,长一点防止越界 + vU8 crc[2]; //crc16 +}TS_PH3_ccmodbus; + +#if 0 +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}CCMD_SLAVER_INFO; +#endif + +extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); +extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); +extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH3(Ts_uart_rev_ *p);// reentrant; + +#endif /* end __TPC_CCMODBUS_H_ */ + diff --git a/source/tpc/nouse/tpc_debug.c b/source/tpc/nouse/tpc_debug.c new file mode 100644 index 0000000..5aaeeb1 --- /dev/null +++ b/source/tpc/nouse/tpc_debug.c @@ -0,0 +1,121 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_debug.h" +///#include "c_lib.h" + + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 +//相关功能移动到tpc_fx.c +/// 实践中发现 如果收到多个以0d0a结束的短协议时,如果 +/// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的 +/// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲 +/// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲 +/// 会在自身满了后自动清除 +//_s_HRTU_P_rf_ +/// _s_HRTU_Pfx_ +/// fx 11 22 33 oc -- oc = 11+ 22+33 +//buf 0 1 2 3 [4] +//fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03) + +//对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖 + +#if 0 + + +void L1_s2b_PH1 (TP_Handler_X *p) +{ + if (0 == p->head) + { + if (D_HETU_FX_fi == (p->reg & p->head_0)) + { + p->head = 1; + p->num = 1; + p->buf[0] = p->reg; + //p->ok = 1; + } + } + else + { + p->buf[p->num++] = p->reg; + if(p->num >= D_HETU_FX_buf_max) // [D_HETU_FX_buf_max == 5] + { + p->ocr = p->buf[1]; + p->ocr += p->buf[2]; + p->ocr += p->buf[3]; + if(p->ocr == p->buf[D_HETU_FX_buf_max-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + +#else +void L1_s2b_PH1(Ts_uart_rev_ *p) +{} + +#endif + + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(Ts_uart_rev_ *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/nouse/tpc_debug.h b/source/tpc/nouse/tpc_debug.h new file mode 100644 index 0000000..86f2092 --- /dev/null +++ b/source/tpc/nouse/tpc_debug.h @@ -0,0 +1,58 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_DEBUG_H_ +#define __TPC_DEBUG_H_ + + +///#include "type.h"/// + +#include "tpc_x.h"/// +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +/************** + +//定长协议:长度固定为5个字节 +//eg: F1 01 02 03 06 +typedef struct +{//8byte + vU8 filter; + vU8 R1; + vU8 R2; + vU8 R3; + vU8 ocr; +}TS_P_debug; + +***********/ + +#define D_HETU_FX_buf_max 5 //定长协议 长度为5 + +///extern void L1_s2b_PH1 (Ts_uart_rev_ *p);// reentrant; + +#endif /* end __TPC_DEBUG_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/nouse/tpc_lora.c b/source/tpc/nouse/tpc_lora.c new file mode 100644 index 0000000..2ab9725 --- /dev/null +++ b/source/tpc/nouse/tpc_lora.c @@ -0,0 +1,276 @@ +#include "tpc_lora.h" +#include "c_lib.h" +#include "debug_drv.h" +TS_pp_lrdlora_ ts_lrdlora_send, ts_lrdlora_rec; +ts_s2b_lrdlora_ ts_s2b_lrdlora;////协议处理变量 + +///查询MAC地址指令 68 00 07 91 01 99 16 +/// 帧头 长度 配置 MAC地址 校验和 帧尾 +#define DATA_LORA_LEN 7 +#if 0 +配置MAC,NetID,band指令 配置MAC地址指令 68 00 0D 90 01 61 61 62 62 63 63 EA 16 发1 + 帧头 长度 配置 REQ 配置的MAC地址 校验和 帧尾 收1 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 +send: + 68 00 0D 90 01 61 61 62 62 63 63 EA 16 + | | | |ocr + | tail +rec: + 68 00 07 20 00 27 16 + | | | |ocr + | tail + + + + 查询MAC地址指令 68 00 07 91 01 99 16 发2 + 帧头 长度 配置 MAC地址 校验和 帧尾 收2 68 00 0D 20 00 61 61 62 62 63 63 27 16 + 1|0010001 帧头 长度 配置 成功 查询到的MAC地址 校验和 帧尾 + 68 0|0100000 + + 配置NetID地址指令 68 00 08 90 02 AB 45 16 发3 + 帧头 长度 配置 REQ NetID地址 校验和 帧尾 收3 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询NetID地址指令 68 00 07 91 02 9A 16 发4 + 帧头 长度 配置 REQ 校验和 帧尾 收4 68 00 08 20 00 AB D3 16 + 1|0010000 帧头 长度 配置 成功 结果 校验和 帧尾 + 0|0100000 + + 配置Band地址指令 68 00 08 90 03 09 A4 16 发5 + 帧头 长度 配置 REQ band地址 校验和 帧尾 收5 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询Band地址指令 68 00 07 91 03 9B 16 发6 + 帧头 长度 配置 REQ 校验和 帧尾 收6 68 00 08 20 00 09 27 16 + 1|0010000 帧头 长度 配置 成功 查询到band=09 校验和 帧尾 + 0|0100000 + +集中器点抄 点抄空包 68 00 0C 84 61 61 62 62 63 63 DC 16 发7 该指令需要入网,是否能够模拟入网??? + 帧头 长度 配置 配置的MAC地址 校验和 帧尾 收7 68 00 07 20 00 27 16 + 1|0000100 指令下发成功 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 10 05 61 61 62 62 63 63 FF E3 00 09 4C 16 + 应答 帧头 长度 配置 MAC地址 RSSI=-16 SNR=13 校验和 帧尾 + 0|0000401 + 收7 68 00 07 06 00 0D 16 + 点抄结束 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 06 03 09 16 + 应答3次 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 通过串口TX给MCU 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 以避免串口丢包 帧头 长度 配置 校验和 帧尾 + 0|0000011 + +#endif +u8 test3[]={0x68,0x00,0x07,0x20,0x00,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16,0x68,0x00,0x06,0x03,0x09,0x16,0x68,0x00,0x06,0x04,0x0a,0x16 }; +///u8 test3[]={0x68,0x00,0x07,0x20,0x34,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; +///u8 test3[]={0x68,0x00,0x09,0x20,0x34,0x56,0x78,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; + +void L1_s2b_lora_init(void) //reentrant 初始化 +{ + u8 i = 0; + ts_s2b_lrdlora.ok = 0; + ts_s2b_lrdlora.debugok = 0; + ts_s2b_lrdlora.head = 0; + ts_s2b_lrdlora.num = 0; + ts_s2b_lrdlora.sp = (U8 *)&ts_lrdlora_rec; + + ts_s2b_lrdlora.tp = &ts_lrdlora_rec; + +/************ + for (i = 0;i < 27;i ++) + { + ts_s2b_lrdlora.reg =test3[i]; + L1_s2b_lora(&ts_s2b_lrdlora); + }************/ +} + +/// 68 00 07 20 00 27 16 +//// | | | |ocr +/// | tail +/* num 0 1 2 3 4 5 6 + 0 68 + 1 68 00 + 2 68 00 07 + 6 68 00 07 20 00 27 16 + + 68 00 07 20 00 27 16 + + 68 00 08 20 00 00 28 16 +*/ +void L1_s2b_lora(ts_s2b_lrdlora_ *p) +{ + if(p->head == 0) + { + if (D_lrdlora_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { + if(p->num <3) + { + p->sp[p->num] = p->reg; + p->num++; + }else if(3 == p->num) + { + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->ocr = p->sp[1] + p->sp[2]; + p->a=p->len ; + if(p->len > D_TS_lrdlora_data_len2) + { + p->ok = 4; + p->head = 0; + } + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + } + else if(p->num < (p->len-2)) + { + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + if(p->num > D_TS_lrdlora_data_len2) + { + p->ok = 2;p->head = 0; + } + }else if(p->num == (p->len-2)) + { + p->tp->ocr = p->reg; + p->num++; + }else + { + p->tp->filtert = p->reg; + if (0x16 == p->tp->filtert )/////&&////( ) (ocr == p->sp[p->len-2] ) + { p->ok = 3; + if(p->tp->ocr = p->ocr) + { + p->ok = 1; + } + } + p->head = 0; + } + } +} + + +#if 0 + +void L1_s2b_lora(ts_s2b_lrdlora_ *p) +{ + if(p->head == 0) + { + if (D_lrdlora_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { +// vU8 ocr; +// + p->sp[p->num] = p->reg; + p->num++; + if(p->num <3) + { + } + + { + + //p->sp[1] //00 + //p->sp[2] //07 + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->a=p->len ; + if(p->len > D_TS_lrdlora_data_len2) + { + p->len = D_TS_lrdlora_data_len2; + + } + } + + + else if(p->num < p->len) + { + if(p->num > D_TS_lrdlora_data_len2) + { + p->num = D_TS_lrdlora_data_len2;p->ok = 2;p->head = 0; + } + p->sp[p->num] = p->reg; ///此时reg需要指向报文的第四个字节数 + p->num++; + }else if(p->num >= p->len) + {/// >= len +// vU8 i; +// for(i = 1;i <= (p->len-3);i++) ///计算校验和 cal ocr +// { +// ocr = ocr + p->sp[i]; +// } + p->ok = 1; + if ( //// (ocr == p->sp[p->len-2] )&& + (0x16 == p->sp[p->len-1] ) ) + { + p->head = 0;p->ok = 3; + } + p->head = 0; + }else + { + ///p->ok = 3; + + } + } +} + + +void TS_lora_send(void) + +{ + + TS_lrdlora_send.filter = 0x68; + ///send(TS_lrdlora_send.filter) + L1_uartD_uchexArray(TS_lrdlora_send.filter, 1); + ///send(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD) ///命令字或运算 + L1_uartD_uchexArray(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD, 1); + p=TS_lrdlora_send.buf; + for(len) + { + send(*p); + p++ + cor ; + } + ///send(TS_lrdlora_send.ocr) + L1_uartD_uchexArray(TS_lrdlora_send.ocr,1); + ///send(TS_lrdlora_send.filtert) + L1_uartD_uchexArray(TS_lrdlora_send.filtert,1); + +} +#endif + + +vU8 Fun_SC_Check(vU8 *p1, vU16 len)//累加校验和 +{ + vU8 sum = 0; + for(len;len >= 1; len--) + { + sum += *p1++; + } + + return sum; +} + + diff --git a/source/tpc/nouse/tpc_lora.h b/source/tpc/nouse/tpc_lora.h new file mode 100644 index 0000000..7fe6285 --- /dev/null +++ b/source/tpc/nouse/tpc_lora.h @@ -0,0 +1,77 @@ +#ifndef TPC_lora_H +#define TPC_lora_H + +#include "tpc_x.h" + +#define D_TS_lrdlora_data_len 12 + +#define D_TS_lrdlora_data_len2 12 + +typedef struct +{//8byte + vU8 filter; ///0x68 + vU16 len; //长度 + vU8 CMD:7; + vU8 DIR:1; + + vU8 buf[D_TS_lrdlora_data_len+1];//buffer + vU8 ocr; +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + + vU8 filtert; ///0x16 + vU8 buf2[44]; +}TS_pp_lrdlora_;///协议处理函数 pp protocal package 协包议 + +extern TS_pp_lrdlora_ ts_lrdlora_send, ts_lrdlora_rec; +#define D_lrdlora_filter 0x68 +#define D_lrdlora_filtertail 0x16 + +typedef struct +{ + U8 reg; + vU16 len; + vU16 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + U8 head; //接收标志头标志 + U8 ok; //接收协议ok标志 + U8 debugok; + U8 ocr; + U8 a; + + U8 *sp; + TS_pp_lrdlora_ *tp; +}ts_s2b_lrdlora_;////协议处理变量 +extern ts_s2b_lrdlora_ ts_s2b_lrdlora; + +#if 0 +send() + +{TS_lrdlora_send.filter = 0x68; + send(TS_lrdlora_send.filter) + send(TS_lrdlora_send.len) + send(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD) + p=TS_lrdlora_send.buf; + for(len) + { + send(*p); + p++ + cor ; + + } + + send(TS_lrdlora_send.ocr) + send(TS_lrdlora_send.filtert) + +} +#endif +////1、帧头: 帧起始标志,固定值为 0x68。 +////2、长度: 帧头到帧尾的总字节长度。 +////3、DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 +////4、CMD: 命令字,指示不同的帧类型。 +////5、数据: 可变长的数据部分,不同命令的数据字段内容不同,参照各条命令中的定义。 +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 +////7、帧尾: 帧结束标志,固定值为 0x16。 + +extern void L1_s2b_lora(ts_s2b_lrdlora_ *p); +extern void L1_s2b_lora_init(void); + +#endif diff --git a/source/tpc/nouse/tpc_modbus.c b/source/tpc/nouse/tpc_modbus.c new file mode 100644 index 0000000..5ebc031 --- /dev/null +++ b/source/tpc/nouse/tpc_modbus.c @@ -0,0 +1,255 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情.d + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_modbus.h" +#include "../bsp/bsp_config.h" +#include "../ctask/TTSS_tick.h" +#include "c_lib.h" +///#include "app_config.h" + +U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} + +U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(Ts_uart_rev_ *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + +#if 0 +//MODBUS协议分割函数,该函数应该被timer0中断调用 +//本函数负责检查modbus crc,不负责校验业务ID +//校验业务ID,在具体的业务处理函数中实现 +void L1_modbus_split(struct _tp_handler_x *p) +{ + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + p->head = 0; + } +} +#endif + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/nouse/tpc_modbus.h b/source/tpc/nouse/tpc_modbus.h new file mode 100644 index 0000000..c2026e3 --- /dev/null +++ b/source/tpc/nouse/tpc_modbus.h @@ -0,0 +1,112 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_MODBUS_H_ +#define __TPC_MODBUS_H_ + +#include "tpc_x.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +/** + * 用户协议 + */ +enum MODBUS_OPER +{ + MODBUS_OPER_READ = 0x03, + MODBUS_OPER_READCONFIG = 0x04, + MODBUS_OPER_WRITE = 0x06, + MODBUS_OPER_WRITE_M = 0x10, + MODBUS_OPER_ERR = 0x8F, +}; + +//协议类型: MODBUS RTU模式 +//#define D_s_PH4_modbus_max (128) +//#define D_s_PH4_modbus_max (64) +#define D_s_modbus_min 4 //modbus协议的最小长度 + +typedef struct ts_ph4_modbus +{ + U8 slaver; //从机地址 + U8 oper; //功能码 + U8 buf[D_TPC_HANDLER_X_LEN + 8]; + U8 crc[2]; +}TS_PH4_modbus; + +typedef struct s_modbus_03_ack +{ + U8 bytes; + U8 buf[D_tp_handle_x_len-1]; +}Modbus03Ack; + +typedef struct s_modbus_06_ack +{ + U16 reg; + U16 val; +}Modbus06Ack; + +typedef struct s_modbus_10_ack +{ + U16 reg; + U16 num; +}Modbus10Ack; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}MD_SLAVER_INFO; + +#if 0 +typedef struct +{ + U8 reg; + U8 slaver; //对于主设备,slaver代表当前轮询的包的id,主设备每次轮询时,总是应该将slaver设置为轮询到的从设备id;对于从设备,slaver总是等于slaverId + U8 max; //接收到的数目的最大值 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + U8 buf[D_s_PH4_modbus_max + 8]; + vU8 crc[2]; + vU32 modbusstmp; +}TS_Handle_PH4; +#endif +extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info); +//extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize); +extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck); +extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); + + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/nouse/tpc_wifi.c b/source/tpc/nouse/tpc_wifi.c new file mode 100644 index 0000000..78330f0 --- /dev/null +++ b/source/tpc/nouse/tpc_wifi.c @@ -0,0 +1,276 @@ +#include "tpc_wifi.h" +#include "c_lib.h" +#include "debug_drv.h" +TS_pp_ewifi_ ts_ewifi_send, ts_ewifi_rec; +ts_s2b_ewifi_ ts_s2b_ewifi;////协议处理变量 + +///查询MAC地址指令 68 00 07 91 01 99 16 +/// 帧头 长度 配置 MAC地址 校验和 帧尾 +#define DATA_wifi_LEN 7 +#if 0 +配置MAC,NetID,band指令 配置MAC地址指令 68 00 0D 90 01 61 61 62 62 63 63 EA 16 发1 + 帧头 长度 配置 REQ 配置的MAC地址 校验和 帧尾 收1 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 +send: + 68 00 0D 90 01 61 61 62 62 63 63 EA 16 + | | | |ocr + | tail +rec: + 68 00 07 20 00 27 16 + | | | |ocr + | tail + + + + 查询MAC地址指令 68 00 07 91 01 99 16 发2 + 帧头 长度 配置 MAC地址 校验和 帧尾 收2 68 00 0D 20 00 61 61 62 62 63 63 27 16 + 1|0010001 帧头 长度 配置 成功 查询到的MAC地址 校验和 帧尾 + 68 0|0100000 + + 配置NetID地址指令 68 00 08 90 02 AB 45 16 发3 + 帧头 长度 配置 REQ NetID地址 校验和 帧尾 收3 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询NetID地址指令 68 00 07 91 02 9A 16 发4 + 帧头 长度 配置 REQ 校验和 帧尾 收4 68 00 08 20 00 AB D3 16 + 1|0010000 帧头 长度 配置 成功 结果 校验和 帧尾 + 0|0100000 + + 配置Band地址指令 68 00 08 90 03 09 A4 16 发5 + 帧头 长度 配置 REQ band地址 校验和 帧尾 收5 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询Band地址指令 68 00 07 91 03 9B 16 发6 + 帧头 长度 配置 REQ 校验和 帧尾 收6 68 00 08 20 00 09 27 16 + 1|0010000 帧头 长度 配置 成功 查询到band=09 校验和 帧尾 + 0|0100000 + +集中器点抄 点抄空包 68 00 0C 84 61 61 62 62 63 63 DC 16 发7 该指令需要入网,是否能够模拟入网??? + 帧头 长度 配置 配置的MAC地址 校验和 帧尾 收7 68 00 07 20 00 27 16 + 1|0000100 指令下发成功 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 10 05 61 61 62 62 63 63 FF E3 00 09 4C 16 + 应答 帧头 长度 配置 MAC地址 RSSI=-16 SNR=13 校验和 帧尾 + 0|0000401 + 收7 68 00 07 06 00 0D 16 + 点抄结束 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 06 03 09 16 + 应答3次 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 通过串口TX给MCU 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 以避免串口丢包 帧头 长度 配置 校验和 帧尾 + 0|0000011 + +#endif +u8 test3[]={0x68,0x00,0x07,0x20,0x00,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16,0x68,0x00,0x06,0x03,0x09,0x16,0x68,0x00,0x06,0x04,0x0a,0x16 }; +///u8 test3[]={0x68,0x00,0x07,0x20,0x34,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; +///u8 test3[]={0x68,0x00,0x09,0x20,0x34,0x56,0x78,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; + +void L1_s2b_wifi_init(void) //reentrant 初始化 +{ + u8 i = 0; + ts_s2b_ewifi.ok = 0; + ts_s2b_ewifi.debugok = 0; + ts_s2b_ewifi.head = 0; + ts_s2b_ewifi.num = 0; + ts_s2b_ewifi.sp = (U8 *)&ts_ewifi_rec; + + ts_s2b_ewifi.tp = &ts_ewifi_rec; + +/************ + for (i = 0;i < 27;i ++) + { + ts_s2b_ewifi.reg =test3[i]; + L1_s2b_wifi(&ts_s2b_ewifi); + }************/ +} + +/// 68 00 07 20 00 27 16 +//// | | | |ocr +/// | tail +/* num 0 1 2 3 4 5 6 + 0 68 + 1 68 00 + 2 68 00 07 + 6 68 00 07 20 00 27 16 + + 68 00 07 20 00 27 16 + + 68 00 08 20 00 00 28 16 +*/ +void L1_s2b_wifi(ts_s2b_ewifi_ *p) +{ + if(p->head == 0) + { + if (D_ewifi_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { + if(p->num <3) + { + p->sp[p->num] = p->reg; + p->num++; + }else if(3 == p->num) + { + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->ocr = p->sp[1] + p->sp[2]; + p->a=p->len ; + if(p->len > D_TS_ewifi_data_len2) + { + p->ok = 4; + p->head = 0; + } + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + } + else if(p->num < (p->len-2)) + { + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + if(p->num > D_TS_ewifi_data_len2) + { + p->ok = 2;p->head = 0; + } + }else if(p->num == (p->len-2)) + { + p->tp->ocr = p->reg; + p->num++; + }else + { + p->tp->filtert = p->reg; + if (0x16 == p->tp->filtert )/////&&////( ) (ocr == p->sp[p->len-2] ) + { p->ok = 3; + if(p->tp->ocr = p->ocr) + { + p->ok = 1; + } + } + p->head = 0; + } + } +} + + +#if 0 + +void L1_s2b_wifi(ts_s2b_ewifi_ *p) +{ + if(p->head == 0) + { + if (D_ewifi_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { +// vU8 ocr; +// + p->sp[p->num] = p->reg; + p->num++; + if(p->num <3) + { + } + + { + + //p->sp[1] //00 + //p->sp[2] //07 + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->a=p->len ; + if(p->len > D_TS_ewifi_data_len2) + { + p->len = D_TS_ewifi_data_len2; + + } + } + + + else if(p->num < p->len) + { + if(p->num > D_TS_ewifi_data_len2) + { + p->num = D_TS_ewifi_data_len2;p->ok = 2;p->head = 0; + } + p->sp[p->num] = p->reg; ///此时reg需要指向报文的第四个字节数 + p->num++; + }else if(p->num >= p->len) + {/// >= len +// vU8 i; +// for(i = 1;i <= (p->len-3);i++) ///计算校验和 cal ocr +// { +// ocr = ocr + p->sp[i]; +// } + p->ok = 1; + if ( //// (ocr == p->sp[p->len-2] )&& + (0x16 == p->sp[p->len-1] ) ) + { + p->head = 0;p->ok = 3; + } + p->head = 0; + }else + { + ///p->ok = 3; + + } + } +} + + +void TS_wifi_send(void) + +{ + + TS_ewifi_send.filter = 0x68; + ///send(TS_ewifi_send.filter) + L1_uartD_uchexArray(TS_ewifi_send.filter, 1); + ///send(TS_ewifi_send.DIR|TS_ewifi_send.CMD) ///命令字或运算 + L1_uartD_uchexArray(TS_ewifi_send.DIR|TS_ewifi_send.CMD, 1); + p=TS_ewifi_send.buf; + for(len) + { + send(*p); + p++ + cor ; + } + ///send(TS_ewifi_send.ocr) + L1_uartD_uchexArray(TS_ewifi_send.ocr,1); + ///send(TS_ewifi_send.filtert) + L1_uartD_uchexArray(TS_ewifi_send.filtert,1); + +} +#endif + + +vU8 Fun_SC_Check(vU8 *p1, vU16 len)//累加校验和 +{ + vU8 sum = 0; + for(len;len >= 1; len--) + { + sum += *p1++; + } + + return sum; +} + + diff --git a/source/tpc/nouse/tpc_wifi.h b/source/tpc/nouse/tpc_wifi.h new file mode 100644 index 0000000..c6c552e --- /dev/null +++ b/source/tpc/nouse/tpc_wifi.h @@ -0,0 +1,77 @@ +#ifndef TPC_wifi_H +#define TPC_wifi_H + +#include "tpc_x.h" + +#define D_TS_ewifi_data_len 12 + +#define D_TS_ewifi_data_len2 12 + +typedef struct +{//8byte + vU8 filter; ///0x68 + vU16 len; //长度 + vU8 CMD:7; + vU8 DIR:1; + + vU8 buf[D_TS_ewifi_data_len+1];//buffer + vU8 ocr; +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + + vU8 filtert; ///0x16 +/// vU8 buf2[44]; +}TS_pp_ewifi_;///协议处理函数 pp protocal package 协包议 + +extern TS_pp_ewifi_ ts_ewifi_send, ts_ewifi_rec; +#define D_ewifi_filter 0x68 +#define D_ewifi_filtertail 0x16 + +typedef struct +{ + U8 reg; + vU16 len; + vU16 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + U8 head; //接收标志头标志 + U8 ok; //接收协议ok标志 + U8 debugok; + U8 ocr; + U8 a; + + U8 *sp; + TS_pp_ewifi_ *tp; +}ts_s2b_ewifi_;////协议处理变量 +extern ts_s2b_ewifi_ ts_s2b_ewifi; + +#if 0 +send() + +{TS_ewifi_send.filter = 0x68; + send(TS_ewifi_send.filter) + send(TS_ewifi_send.len) + send(TS_ewifi_send.DIR|TS_ewifi_send.CMD) + p=TS_ewifi_send.buf; + for(len) + { + send(*p); + p++ + cor ; + + } + + send(TS_ewifi_send.ocr) + send(TS_ewifi_send.filtert) + +} +#endif +////1、帧头: 帧起始标志,固定值为 0x68。 +////2、长度: 帧头到帧尾的总字节长度。 +////3、DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 +////4、CMD: 命令字,指示不同的帧类型。 +////5、数据: 可变长的数据部分,不同命令的数据字段内容不同,参照各条命令中的定义。 +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 +////7、帧尾: 帧结束标志,固定值为 0x16。 + +extern void L1_s2b_wifi(ts_s2b_ewifi_ *p); +extern void L1_s2b_wifi_init(void); + +#endif diff --git a/source/tpc/tpc_0d0a.c b/source/tpc/tpc_0d0a.c new file mode 100644 index 0000000..99c5bf1 --- /dev/null +++ b/source/tpc/tpc_0d0a.c @@ -0,0 +1,47 @@ +#include "tpc_0d0a.h" +#include "c_lib.h" + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +//L1_uart_2strbuf(&s_uart0_rec);s_uart0_rec.ok = 2 +/// 接收以od oa为结束的标准的assci码的协议 类似 send xx (回车换行)测试时注意以回车换行 +/// 为结束标志,也就是发送的数据后面 必须有回车换行 :0x0d 0x0a + + +//对于连续的多条协议,比如:abcdefg\r\n12345\r\n,如果前一条处理不及时,可能会被后一条覆盖 +void L1_s2b_0d0a(Ts_uart_rev_ *p) //reentrant +{ + if(p->head == 0) + { + p->head = 1; + p->num = 0; + } + + if(p->num >= D_tp_handle_x_len) + { + p->num = 0; + } + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + p->buf[++p->num] = p->cashe[0]; + //p->buf[++p->num] = p->cashe[0]; + + if ((p->num > 2) && (p->cashe[0] == 0x0a) && (p->cashe[1] == 0x0d))// 0d0a + { + if(1 != p->ok) + { + p->buf[0] = p->num - 2; //去掉0d0a + if(p->sp2 != NULL) //备份缓冲区不为null + { + //byte_copy_uc(p->buf + 1,p->__buf,p->num-2); //经过调试,此处不要调用外部函数,入栈出栈会增加出错风险 + for(p->i=0;p->ibuf[0]+1;p->i++) + { + p->sp2[p->i] = p->buf[p->i]; + } + } + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + p->head = 0; + } +} + diff --git a/source/tpc/tpc_0d0a.h b/source/tpc/tpc_0d0a.h new file mode 100644 index 0000000..d5394a9 --- /dev/null +++ b/source/tpc/tpc_0d0a.h @@ -0,0 +1,32 @@ +#ifndef TPC_0D0A_H +#define TPC_0D0A_H + +#include "tpc_x.h" + +///----------------------------------------------------------------------------------------- +//#define D_s_SSTR_0D0A_len 64 //str类的协议需要长度大一些,容易bug的地方,限制为接收64bytes的数据 +#if 0 +#define FLAG_NONE 0 +#define FLAG_DISCARD 1 +#define FLAG_CCID 2 +#define FLAG_CIP 3 +typedef struct _s_PC1_0D0A_ +{//8byte + vU8 reg; + // vU8 sub_num; //接收到的数目注意数据长度的范围 + vU8 head; //接收标志头标志 + + vU8 cashe[4]; + //vU8 filter1; + //vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + + vU8 ok; //接收协议ok标志 + vU8 max; //接收到的数目的最大值 + vU8 __buf[D_s_SSTR_0D0A_len+1];//buffer + vU8 buf[D_s_SSTR_0D0A_len+1];//array的第一位是 长度 //协议缓冲 + // U8 pro[16]; ///解析协议用 +}TS_Handle_0d0a; +#endif + +#endif diff --git a/source/tpc/tpc_ccmodbus.c b/source/tpc/tpc_ccmodbus.c new file mode 100644 index 0000000..659f90c --- /dev/null +++ b/source/tpc/tpc_ccmodbus.c @@ -0,0 +1,205 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_ccmodbus.h" +#include "c_lib.h" + +#if 0 +U8 L3_pack_ccmodbus_03(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_06(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_ccmodbus_10(TS_PH3_ccmodbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} +#endif + +U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info) +{ + U8 pkglen = 0; + pccmodbus->filter1 = D_CMD_Filter1_ff; + pccmodbus->filter2 = D_CMD_Filter2_fe; + pccmodbus->num = L3_pack_modbus((TS_PH4_modbus*)&pccmodbus->slaver, slaver_info); +#if 0 + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + pkglen = L3_pack_ccmodbus_03(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + break; + case MODBUS_OPER_WRITE: + pkglen = L3_pack_ccmodbus_06(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + break; + case MODBUS_OPER_WRITE_M: + pkglen = L3_pack_ccmodbus_10(pccmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + break; + default: + break; + } + pccmodbus->num = pkglen; +#endif + return pccmodbus->num + 3; +} + +U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck) +{ + U16 pkglen = L3_modbus_slaver_ack((TS_PH4_modbus*)&pccmodbus->slaver, (TS_PH4_modbus*)&pModbusAck->slaver); + pModbusAck->filter1 = D_CMD_Filter1_ff; + pModbusAck->filter2 = D_CMD_Filter2_fe; + pModbusAck->num = pkglen; + return pkglen + 3; +} + +void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + L3_modbus_master_handler((TS_PH4_modbus*)pmodbus->slaver,p_slaver_info); +} + +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 0 1 2 3 4 5 6 7 8 9 10 +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/////使用前必须初始化p->head_0等 +void L1_s2b_PH3(Ts_uart_rev_ *p)// reentrant +{ + p->cashe[1] = p->cashe[0]; + p->cashe[0] = p->reg;// + + if (0 == p->head) + { + if ((p->cashe[1] == p->head_0)&&(p->cashe[0] == p->head_1)) + { + p->head = 1; + p->max = D_tp_handle_x_len; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->head_0; + p->sp[p->num++] = p->head_1; + } + } + else + { + p->sp[p->num++] = p->cashe[0]; + if(p->num == 3)//数量 第3个数据 + { + p->max = p->cashe[0] + 3; + if((p->max > D_tp_handle_x_len) || (p->max < D_s_ccmodbus_min)) + { + p->head = 0; + return; //error 超过最大长度 + } + } + if(p->num >= p->max) + { + crc16(p->crc,p->buf + 3,p->num - 3 - 2); + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(Ts_uart_rev_ *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + + +/****************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/tpc/tpc_ccmodbus.h b/source/tpc/tpc_ccmodbus.h new file mode 100644 index 0000000..d71b3e3 --- /dev/null +++ b/source/tpc/tpc_ccmodbus.h @@ -0,0 +1,98 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +/***************************************************************************** +@version 1.2 +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/uartlib.c: +公用的函数 和硬件无关 +接收各类协议的处理函数 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + + + +#ifndef __TPC_CCMODBUS_H_ +#define __TPC_CCMODBUS_H_ + +#include "tpc_x.h" +#include "tpc_modbus.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///协议类型: 十六进制协议3->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +/// 发送的数据为有ff fe开头的十六进制的长协议,内包含标准的modbus协议 +///FF FE 08 52 16 11 22 33 44 F5 9F 发送了一个modbus协议包(8个数据52 16 11 22 33 44 F5 9F ) +/// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F +/// 校验码的范围为 + +//#define D_s_PH3_ccmodbus_max 128 +#define D_s_ccmodbus_min (D_s_modbus_min + 3) + +typedef struct +{//8byte + vU8 filter1; + vU8 filter2; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 slaver; //发送方的地址或命令 + vU8 oper; //命令 + vU8 buf[D_tp_handle_x_len + 8];//D_s_PH3_ccmodbus_max - 3,长一点防止越界 + vU8 crc[2]; //crc16 +}TS_PH3_ccmodbus; + +#if 0 +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}CCMD_SLAVER_INFO; +#endif + +extern U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, MD_SLAVER_INFO *slaver_info); +extern U16 L3_ccmodbus_slaver_ack(TS_PH3_ccmodbus *pccmodbus,TS_PH3_ccmodbus *pModbusAck); +extern void L3_ccmodbus_master_handler(TS_PH3_ccmodbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH3(Ts_uart_rev_ *p);// reentrant; + +#endif /* end __TPC_CCMODBUS_H_ */ + diff --git a/source/tpc/tpc_debug.c b/source/tpc/tpc_debug.c new file mode 100644 index 0000000..61b2fa3 --- /dev/null +++ b/source/tpc/tpc_debug.c @@ -0,0 +1,172 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_debug.h" +///#include "c_lib.h" + +TS_pp_debug_ ts_debug_rec; +TS_s2b_debug_ ts_s2b_debug;////协议处理变量 +/* + +void L1_s2b_debug_init(void) //reentrant +{ + ts_s2b_debug.ok = 0; + ts_s2b_debug.debugok = 0; + ts_s2b_debug.head = 0; + ts_s2b_debug.num = 0; + ts_s2b_debug.f = 0xf0; + ts_s2b_debug.sp = (U8 *)&ts_debug_rec; + +} +*/ + +//NUM: 0 1 2 3 4 +// Fx R1 R2 R3 ocr +// F+从机 R1 R2 R3 校验 +//相关功能移动到tpc_fx.c +/// 实践中发现 如果收到多个以0d0a结束的短协议时,如果 +/// 协议之间间隔时间太短,ok处理不及时 会出现丢失协议的 +/// 的情况,所以 对于短暂的多个协议 应该有一定容量的缓冲 +/// 保留 ,同时 处理完协议后,应该清除接收缓冲,否则缓冲 +/// 会在自身满了后自动清除 +//_s_HRTU_P_rf_ +/// _s_HRTU_Pfx_ +/// fx 11 22 33 oc -- oc = 11+ 22+33 +//buf 0 1 2 3 [4] +//fd 01 02 03 06 fd为头 010203为数据 06为数据校验和(01+02+03) + +//对于连续的多条协议,如果前一条处理不及时,可能会被后一条覆盖 + +#if 0 + + +void L1_s2b_PH1 (TP_Handler_X *p) +{ + if (0 == p->head) + { + if (D_HETU_FX_fi == (p->reg & p->head_0)) + { + p->head = 1; + p->num = 1; + p->buf[0] = p->reg; + //p->ok = 1; + } + } + else + { + p->buf[p->num++] = p->reg; + if(p->num >= D_HETU_FX_buf_max) // [D_HETU_FX_buf_max == 5] + { + p->ocr = p->buf[1]; + p->ocr += p->buf[2]; + p->ocr += p->buf[3]; + if(p->ocr == p->buf[D_HETU_FX_buf_max-1]) + { + if (p->ok != 1) + { + p->ok = 1;//收到 命令结束,必须有个地方清0,否则无法再次接受报文 + } + } + p->head = 0; //放在if (p->ok != 1) 外 + } + } +} + +#else + +#endif +/* + + +//MODBUS协议解析函数 012345 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH5_debug222(TS_s2b_debug_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + if(p->reg&0xf0 == p->f) + { + p->head = 1; + p->max = 5; + p->num = 0; + p->sp[p->num++] = p->reg; + } + } + else + { + p->sp[p->num++] = p->reg; + if(p->num < p->max) + { + }else + {//// + p->ok = 1; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} +void L1_s2b_PH5_debug(TS_s2b_debug_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + p->f2 = p->reg&0xf0; + if(p->f2 == p->f) + { + p->head = 1; + p->max = 5; + p->num = 0; + p->sp[p->num++] = p->reg; + } + } + else + { + p->sp[p->num++] = p->reg; + if(p->num < p->max) + { + }else + {//// + p->ok = 1; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} +*/ + + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_debug.h b/source/tpc/tpc_debug.h new file mode 100644 index 0000000..28d8850 --- /dev/null +++ b/source/tpc/tpc_debug.h @@ -0,0 +1,75 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_DEBUG_H_ +#define __TPC_DEBUG_H_ + +//// + + +///#include "type.h"/// + +#include "tpc_x.h"/// +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +typedef struct +{ + U8 reg; + U8 f2; + U8 overtime; + U8 head; //接收标志头标志 + U8 f; //接收标志头标志 + U8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + U8 ok; //接收协议ok标志 + U8 debugok; + U8 max; + U8 *sp; + + U8 t[18]; +}TS_s2b_debug_;///处理debug类型的协议时使用变量 ////协议处理变量 +extern TS_s2b_debug_ ts_s2b_debug; +#define D_HETU_FX_buf_max 5 //定长协议 长度为5 + +typedef struct +{//8byte + vU8 filter; + vU8 R1; + vU8 R2; + vU8 R3; + vU8 ocr; +}TS_pp_debug_;////fx开头的简易5字节debug协议的数据包 ---debug类型的协议 +extern TS_pp_debug_ ts_debug_rec; + +void L1_s2b_debug_init(void); +///L1_s2b_PH5_debug(&ts_debug_rec); +extern void L1_s2b_PH5_debug(TS_s2b_debug_ *p); + +///extern void L1_s2b_PH5_debug(ts_s2b_debug_ z); +#endif /* end __TPC_DEBUG_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_lora.c b/source/tpc/tpc_lora.c new file mode 100644 index 0000000..8e7e602 --- /dev/null +++ b/source/tpc/tpc_lora.c @@ -0,0 +1,276 @@ +#include "tpc_lora.h" +#include "c_lib.h" +#include "debug_drv.h" +TS_pp_lrdlora_ ts_lrdlora_send, ts_lrdlora_rec; +ts_s2b_lrdlora_ ts_s2b_lrdlora;////协议处理变量 + +///查询MAC地址指令 68 00 07 91 01 99 16 +/// 帧头 长度 配置 MAC地址 校验和 帧尾 +#define DATA_LORA_LEN 7 +#if 0 +配置MAC,NetID,band指令 配置MAC地址指令 68 00 0D 90 01 61 61 62 62 63 63 EA 16 发1 + 帧头 长度 配置 REQ 配置的MAC地址 校验和 帧尾 收1 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 +send: + 68 00 0D 90 01 61 61 62 62 63 63 EA 16 + | | | |ocr + | tail +rec: + 68 00 07 20 00 27 16 + | | | |ocr + | tail + + + + 查询MAC地址指令 68 00 07 91 01 99 16 发2 + 帧头 长度 配置 MAC地址 校验和 帧尾 收2 68 00 0D 20 00 61 61 62 62 63 63 27 16 + 1|0010001 帧头 长度 配置 成功 查询到的MAC地址 校验和 帧尾 + 68 0|0100000 + + 配置NetID地址指令 68 00 08 90 02 AB 45 16 发3 + 帧头 长度 配置 REQ NetID地址 校验和 帧尾 收3 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询NetID地址指令 68 00 07 91 02 9A 16 发4 + 帧头 长度 配置 REQ 校验和 帧尾 收4 68 00 08 20 00 AB D3 16 + 1|0010000 帧头 长度 配置 成功 结果 校验和 帧尾 + 0|0100000 + + 配置Band地址指令 68 00 08 90 03 09 A4 16 发5 + 帧头 长度 配置 REQ band地址 校验和 帧尾 收5 68 00 07 20 00 27 16 + 1|0010000 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + + 查询Band地址指令 68 00 07 91 03 9B 16 发6 + 帧头 长度 配置 REQ 校验和 帧尾 收6 68 00 08 20 00 09 27 16 + 1|0010000 帧头 长度 配置 成功 查询到band=09 校验和 帧尾 + 0|0100000 + +集中器点抄 点抄空包 68 00 0C 84 61 61 62 62 63 63 DC 16 发7 该指令需要入网,是否能够模拟入网??? + 帧头 长度 配置 配置的MAC地址 校验和 帧尾 收7 68 00 07 20 00 27 16 + 1|0000100 指令下发成功 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 10 05 61 61 62 62 63 63 FF E3 00 09 4C 16 + 应答 帧头 长度 配置 MAC地址 RSSI=-16 SNR=13 校验和 帧尾 + 0|0000401 + 收7 68 00 07 06 00 0D 16 + 点抄结束 帧头 长度 配置 成功 校验和 帧尾 + 0|0100000 + 收7 68 00 06 03 09 16 + 应答3次 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 通过串口TX给MCU 帧头 长度 配置 校验和 帧尾 + 0|0000011 + 收7 68 00 06 03 09 16 + 以避免串口丢包 帧头 长度 配置 校验和 帧尾 + 0|0000011 + +#endif +u8 test3[]={0x68,0x00,0x07,0x20,0x00,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16,0x68,0x00,0x06,0x03,0x09,0x16,0x68,0x00,0x06,0x04,0x0a,0x16 }; +///u8 test3[]={0x68,0x00,0x07,0x20,0x34,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; +///u8 test3[]={0x68,0x00,0x09,0x20,0x34,0x56,0x78,0x27,0x16,0x68,0x16,0x68,0x10 ,0x07,0x20,0x00,0x16}; + +void L1_s2b_lora_init(void) //reentrant 初始化 +{ + u8 i = 0; + ts_s2b_lrdlora.ok = 0; + ts_s2b_lrdlora.debugok = 0; + ts_s2b_lrdlora.head = 0; + ts_s2b_lrdlora.num = 0; + ts_s2b_lrdlora.sp = (U8 *)&ts_lrdlora_rec; + + ts_s2b_lrdlora.tp = &ts_lrdlora_rec; + +/************ + for (i = 0;i < 27;i ++) + { + ts_s2b_lrdlora.reg =test3[i]; + L1_s2b_lora(&ts_s2b_lrdlora); + }************/ +} + +/// 68 00 07 20 00 27 16 +//// | | | |ocr +/// | tail +/* num 0 1 2 3 4 5 6 + 0 68 + 1 68 00 + 2 68 00 07 + 6 68 00 07 20 00 27 16 + + 68 00 07 20 00 27 16 + + 68 00 08 20 00 00 28 16 +*/ +void L1_s2b_lora(ts_s2b_lrdlora_ *p) +{ + if(p->head == 0) + { + if (D_lrdlora_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { + if(p->num <3) + { + p->sp[p->num] = p->reg; + p->num++; + }else if(3 == p->num) + { + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->ocr = p->sp[1] + p->sp[2]; + p->a=p->len ; + if(p->len > D_TS_lrdlora_data_len2) + { + p->ok = 4; + p->head = 0; + } + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + } + else if(p->num < (p->len-2)) + { + p->sp[p->num] = p->reg; + p->ocr += p->sp[p->num]; + p->num++; + if(p->num > D_TS_lrdlora_data_len2) + { + p->ok = 2;p->head = 0; + } + }else if(p->num == (p->len-2)) + { + p->tp->ocr = p->reg; + p->num++; + }else + { + p->tp->filtert = p->reg; + if (0x16 == p->tp->filtert )/////&&////( ) (ocr == p->sp[p->len-2] ) + { p->ok = 3; + if(p->tp->ocr = p->ocr) + { + p->ok = 1; + } + } + p->head = 0; + } + } +} + + +#if 0 + +void L1_s2b_lora(ts_s2b_lrdlora_ *p) +{ + if(p->head == 0) + { + if (D_lrdlora_filter == p->reg) + { + p->head = 1; + p->num = 0; + p->len = 5; + p->sp[p->num] = p->reg; + p->num++; + } + } + else + { +// vU8 ocr; +// + p->sp[p->num] = p->reg; + p->num++; + if(p->num <3) + { + } + + { + + //p->sp[1] //00 + //p->sp[2] //07 + p->len = D_2uc_u16(p->sp[1], p->sp[2]); ///可以读到整个报文的长度 + p->a=p->len ; + if(p->len > D_TS_lrdlora_data_len2) + { + p->len = D_TS_lrdlora_data_len2; + + } + } + + + else if(p->num < p->len) + { + if(p->num > D_TS_lrdlora_data_len2) + { + p->num = D_TS_lrdlora_data_len2;p->ok = 2;p->head = 0; + } + p->sp[p->num] = p->reg; ///此时reg需要指向报文的第四个字节数 + p->num++; + }else if(p->num >= p->len) + {/// >= len +// vU8 i; +// for(i = 1;i <= (p->len-3);i++) ///计算校验和 cal ocr +// { +// ocr = ocr + p->sp[i]; +// } + p->ok = 1; + if ( //// (ocr == p->sp[p->len-2] )&& + (0x16 == p->sp[p->len-1] ) ) + { + p->head = 0;p->ok = 3; + } + p->head = 0; + }else + { + ///p->ok = 3; + + } + } +} + + +void TS_lora_send(void) + +{ + + TS_lrdlora_send.filter = 0x68; + ///send(TS_lrdlora_send.filter) + L1_uartD_uchexArray(TS_lrdlora_send.filter, 1); + ///send(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD) ///命令字或运算 + L1_uartD_uchexArray(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD, 1); + p=TS_lrdlora_send.buf; + for(len) + { + send(*p); + p++ + cor ; + } + ///send(TS_lrdlora_send.ocr) + L1_uartD_uchexArray(TS_lrdlora_send.ocr,1); + ///send(TS_lrdlora_send.filtert) + L1_uartD_uchexArray(TS_lrdlora_send.filtert,1); + +} +#endif + +/* +vU8 Fun_SC_Check(vU8 *p1, vU16 len)//累加校验和 +{ + vU8 sum = 0; + for(len;len >= 1; len--) + { + sum += *p1++; + } + + return sum; +} +*/ + diff --git a/source/tpc/tpc_lora.h b/source/tpc/tpc_lora.h new file mode 100644 index 0000000..7fe6285 --- /dev/null +++ b/source/tpc/tpc_lora.h @@ -0,0 +1,77 @@ +#ifndef TPC_lora_H +#define TPC_lora_H + +#include "tpc_x.h" + +#define D_TS_lrdlora_data_len 12 + +#define D_TS_lrdlora_data_len2 12 + +typedef struct +{//8byte + vU8 filter; ///0x68 + vU16 len; //长度 + vU8 CMD:7; + vU8 DIR:1; + + vU8 buf[D_TS_lrdlora_data_len+1];//buffer + vU8 ocr; +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 + + vU8 filtert; ///0x16 + vU8 buf2[44]; +}TS_pp_lrdlora_;///协议处理函数 pp protocal package 协包议 + +extern TS_pp_lrdlora_ ts_lrdlora_send, ts_lrdlora_rec; +#define D_lrdlora_filter 0x68 +#define D_lrdlora_filtertail 0x16 + +typedef struct +{ + U8 reg; + vU16 len; + vU16 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + U8 head; //接收标志头标志 + U8 ok; //接收协议ok标志 + U8 debugok; + U8 ocr; + U8 a; + + U8 *sp; + TS_pp_lrdlora_ *tp; +}ts_s2b_lrdlora_;////协议处理变量 +extern ts_s2b_lrdlora_ ts_s2b_lrdlora; + +#if 0 +send() + +{TS_lrdlora_send.filter = 0x68; + send(TS_lrdlora_send.filter) + send(TS_lrdlora_send.len) + send(TS_lrdlora_send.DIR|TS_lrdlora_send.CMD) + p=TS_lrdlora_send.buf; + for(len) + { + send(*p); + p++ + cor ; + + } + + send(TS_lrdlora_send.ocr) + send(TS_lrdlora_send.filtert) + +} +#endif +////1、帧头: 帧起始标志,固定值为 0x68。 +////2、长度: 帧头到帧尾的总字节长度。 +////3、DIR: 指示帧传送方向,0:模组->用户。1:用户->模组。 +////4、CMD: 命令字,指示不同的帧类型。 +////5、数据: 可变长的数据部分,不同命令的数据字段内容不同,参照各条命令中的定义。 +////6、校验和:从长度到数据字段的校验码,使用累加和进行计算,即各字节相加求和取最低字节。 +////7、帧尾: 帧结束标志,固定值为 0x16。 + +extern void L1_s2b_lora(ts_s2b_lrdlora_ *p); +extern void L1_s2b_lora_init(void); + +#endif diff --git a/source/tpc/tpc_modbus.c b/source/tpc/tpc_modbus.c new file mode 100644 index 0000000..5ebc031 --- /dev/null +++ b/source/tpc/tpc_modbus.c @@ -0,0 +1,255 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情.d + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_modbus.h" +#include "../bsp/bsp_config.h" +#include "../ctask/TTSS_tick.h" +#include "c_lib.h" +///#include "app_config.h" + +U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} + +U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(Ts_uart_rev_ *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_TPC_HANDLER_X_LEN; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + +#if 0 +//MODBUS协议分割函数,该函数应该被timer0中断调用 +//本函数负责检查modbus crc,不负责校验业务ID +//校验业务ID,在具体的业务处理函数中实现 +void L1_modbus_split(struct _tp_handler_x *p) +{ + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + p->head = 0; + } +} +#endif + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_modbus.c.bak b/source/tpc/tpc_modbus.c.bak new file mode 100644 index 0000000..29bc8c4 --- /dev/null +++ b/source/tpc/tpc_modbus.c.bak @@ -0,0 +1,254 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情.d + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_modbus.h" +#include "../bsp/bsp_config.h" +#include "../ctask/TTSS_tick.h" +#include "c_lib.h" + +U8 L3_pack_modbus_03(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_READ; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_06(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U8 *buf) +{ + U8 bufsize = 4; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = buf[0]; + pmodbus->buf[3] = buf[1]; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +U8 L3_pack_modbus_10(TS_PH4_modbus *pmodbus ,U8 slaverId, U16 reg, U16 num, U8 bytes, U8 *buf) +{ + U8 bufsize = 5,i = 0; + pmodbus->slaver = slaverId; + pmodbus->oper = MODBUS_OPER_WRITE_M; + pmodbus->buf[0] = reg >> 8 & 0xFF; + pmodbus->buf[1] = reg >> 0 & 0xFF; + pmodbus->buf[2] = num >> 8 * 0xFF; + pmodbus->buf[3] = num >> 0 & 0xFF; + pmodbus->buf[4] = bytes; + + for(i=0;ibuf[5+i] = buf[i]; + } + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize + bytes); + pmodbus->buf[bufsize + bytes] = pmodbus->crc[0]; + pmodbus->buf[bufsize + bytes + 1] = pmodbus->crc[1]; + + return bufsize + bytes + 2 + 2; +} + +U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info) +{ + switch(slaver_info->oper) + { + case MODBUS_OPER_READ: + return L3_pack_modbus_03(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum); + case MODBUS_OPER_WRITE: + return L3_pack_modbus_06(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->buf); + case MODBUS_OPER_WRITE_M: + return L3_pack_modbus_10(pmodbus,slaver_info->slaver,slaver_info->reg,slaver_info->regnum,slaver_info->bytes,slaver_info->buf); + default: + return 0; + } +} + +U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize) +{ + pmodbus->slaver = slaver; + pmodbus->oper = oper; + crc16(pmodbus->crc,&pmodbus->slaver,2 + bufsize); + pmodbus->buf[bufsize] = pmodbus->crc[0]; + pmodbus->buf[bufsize + 1] = pmodbus->crc[1]; + + return bufsize + 2 + 2; +} + +//MODBUS从设备数据处理函数 +static Modbus03Ack *pModbus03Ack; +static Modbus06Ack *pModbus06Ack; +static Modbus10Ack *pModbus10Ack; +static U16 modbuslen = 0,reg,num,val,count; +U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U16 i = 0,j = 0,regval = 0; + pModbus03Ack = (Modbus03Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if((num <= D_MODBUS_REG_MAX_NUM) && (reg <= sizeof(R)/2)) //每次最多读取D_MODBUS_REG_MAX_NUM个寄存器.防止越界 + { + for(i=0; ibuf[j++] = regval >> 8 & 0xFF; + pModbus03Ack->buf[j++] = regval & 0xFF; + } + pModbus03Ack->bytes = num * 2; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, pModbus03Ack->bytes + 1); + } + break; + } + case MODBUS_OPER_WRITE: + { + pModbus06Ack = (Modbus06Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + val = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + if(reg <= sizeof(R)/2) + { + *(REG_2_MEM(reg)) = val; + pModbus06Ack->reg = reg; + pModbus06Ack->val = *(REG_2_MEM(reg)); + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + case MODBUS_OPER_WRITE_M: + { + U16 i = 0; + pModbus10Ack = (Modbus10Ack *)pModbusAck->buf; + reg = ((U16)pmodbus->buf[0]) << 8 | ((U16)pmodbus->buf[1]); + num = ((U16)pmodbus->buf[2]) << 8 | ((U16)pmodbus->buf[3]); + count = pmodbus->buf[4]; + if((num <= D_MODBUS_REG_MAX_NUM) && (reg < sizeof(R)/2)) //每次最多写入20个寄存器 40个字节,以防止越界 + { + for(i=0; ibuf[5+i*2]) << 8 | ((U16)pmodbus->buf[5+i*2+1]); + } + pModbus10Ack->reg = reg; + pModbus10Ack->num = num; + modbuslen = L3_pack_modbusack(pModbusAck, pmodbus->slaver, pmodbus->oper, 4); + } + break; + } + default:break; + } + return modbuslen; +} + +//MODBUS主设备轮询时,从设备返回数据处理函数 +//MD_SLAVER_INFO需要被正确定义 +void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info) +{ + switch(pmodbus->oper) + { + case MODBUS_OPER_READ: + case MODBUS_OPER_READCONFIG: + { + U8 i = 0; + for(i=0;ibuf[0];i++) + { + //此处假设字节序一致 + p_slaver_info->buf[i] = pmodbus->buf[i + 1]; + //TODO 字节序不一致时的处理 + } + break; + } + case MODBUS_OPER_WRITE: + case MODBUS_OPER_WRITE_M: + default: break; + } +} + +//MODBUS协议解析函数 +//超出D_tp_handle_x_len,不继续保存数据 +void L1_s2b_PH4(struct _tp_handler_x *p) +{ + //p->modbusstmp = D_sys_now; + if(p->head == 0) + { + p->head = 1; + p->max = D_tp_handle_x_len; + p->sp = p->buf; + p->num = 0; + p->sp[p->num++] = p->reg; + } + else + { + if(p->num < p->max) + { + p->sp[p->num++] = p->reg; + } + } +} + +#if 0 +//MODBUS协议分割函数,该函数应该被timer0中断调用 +//本函数负责检查modbus crc,不负责校验业务ID +//校验业务ID,在具体的业务处理函数中实现 +void L1_modbus_split(struct _tp_handler_x *p) +{ + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + crc16_irq(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + p->head = 0; + } +} +#endif + +/****************************************************************************** +** End Of File +******************************************************************************/ + diff --git a/source/tpc/tpc_modbus.h b/source/tpc/tpc_modbus.h new file mode 100644 index 0000000..2f39865 --- /dev/null +++ b/source/tpc/tpc_modbus.h @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_MODBUS_H_ +#define __TPC_MODBUS_H_ + +#include "tpc_x.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +/** + * 用户协议 + */ +enum MODBUS_OPER +{ + MODBUS_OPER_READ = 0x03, + MODBUS_OPER_READCONFIG = 0x04, + MODBUS_OPER_WRITE = 0x06, + MODBUS_OPER_WRITE_M = 0x10, + MODBUS_OPER_ERR = 0x8F, +}; + +//协议类型: MODBUS RTU模式 +//#define D_s_PH4_modbus_max (128) +//#define D_s_PH4_modbus_max (64) +#define D_s_modbus_min 4 //modbus协议的最小长度 + +typedef struct ts_ph4_modbus +{ + U8 slaver; //从机地址 + U8 oper; //功能码 + U8 buf[D_TPC_HANDLER_X_LEN + 8]; + U8 crc[2]; +}TS_PH4_modbus; + +typedef struct s_modbus_03_ack +{ + U8 bytes; + U8 buf[D_tp_handle_x_len-1]; +}Modbus03Ack; + +typedef struct s_modbus_06_ack +{ + U16 reg; + U16 val; +}Modbus06Ack; + +typedef struct s_modbus_10_ack +{ + U16 reg; + U16 num; +}Modbus10Ack; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}MD_SLAVER_INFO; + +#if 0 +typedef struct +{ + U8 reg; + U8 slaver; //对于主设备,slaver代表当前轮询的包的id,主设备每次轮询时,总是应该将slaver设置为轮询到的从设备id;对于从设备,slaver总是等于slaverId + U8 max; //接收到的数目的最大值 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + U8 buf[D_s_PH4_modbus_max + 8]; + vU8 crc[2]; + vU32 modbusstmp; +}TS_Handle_PH4; +#endif +extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info); +//extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize); +extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck); +extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH4(Ts_uart_rev_ *p); +extern void L1_modbus_split(Ts_uart_rev_ *p); + + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_modbus.h.bak b/source/tpc/tpc_modbus.h.bak new file mode 100644 index 0000000..80e0890 --- /dev/null +++ b/source/tpc/tpc_modbus.h.bak @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_MODBUS_H_ +#define __TPC_MODBUS_H_ + +#include "tpc_x.h" +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +/** + * 用户协议 + */ +enum MODBUS_OPER +{ + MODBUS_OPER_READ = 0x03, + MODBUS_OPER_READCONFIG = 0x04, + MODBUS_OPER_WRITE = 0x06, + MODBUS_OPER_WRITE_M = 0x10, + MODBUS_OPER_ERR = 0x8F, +}; + +//协议类型: MODBUS RTU模式 +//#define D_s_PH4_modbus_max (128) +//#define D_s_PH4_modbus_max (64) +#define D_s_modbus_min 4 //modbus协议的最小长度 + +typedef struct ts_ph4_modbus +{ + U8 slaver; //从机地址 + U8 oper; //功能码 + U8 buf[D_tp_handle_x_len + 8]; + U8 crc[2]; +}TS_PH4_modbus; + +typedef struct s_modbus_03_ack +{ + U8 bytes; + U8 buf[D_tp_handle_x_len-1]; +}Modbus03Ack; + +typedef struct s_modbus_06_ack +{ + U16 reg; + U16 val; +}Modbus06Ack; + +typedef struct s_modbus_10_ack +{ + U16 reg; + U16 num; +}Modbus10Ack; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}MD_SLAVER_INFO; + +#if 0 +typedef struct +{ + U8 reg; + U8 slaver; //对于主设备,slaver代表当前轮询的包的id,主设备每次轮询时,总是应该将slaver设置为轮询到的从设备id;对于从设备,slaver总是等于slaverId + U8 max; //接收到的数目的最大值 + vU8 head; //接收标志头标志 + vU8 ok; //接收协议ok标志 + vU8 num; + vU8 *sp; + U8 buf[D_s_PH4_modbus_max + 8]; + vU8 crc[2]; + vU32 modbusstmp; +}TS_Handle_PH4; +#endif +extern U8 L3_pack_modbus(TS_PH4_modbus *pmodbus, MD_SLAVER_INFO *slaver_info); +//extern U8 L3_pack_modbusack(TS_PH4_modbus *pmodbus ,U8 slaver, U8 oper, U8 bufsize); +extern U16 L3_modbus_slaver_ack(TS_PH4_modbus *pmodbus,TS_PH4_modbus *pModbusAck); +extern void L3_modbus_master_handler(TS_PH4_modbus *pmodbus,MD_SLAVER_INFO *p_slaver_info); +extern void L1_s2b_PH4(struct _tp_handler_x *p); +extern void L1_modbus_split(struct _tp_handler_x *p); + + +#endif /* end __TPC_UART_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_road.c b/source/tpc/tpc_road.c new file mode 100644 index 0000000..be79a51 --- /dev/null +++ b/source/tpc/tpc_road.c @@ -0,0 +1,302 @@ + +/***************************************************************************** +update by cc @201501101001 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +uartcom/uartlib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/uartcom0 + 和uart相关的通讯协议 com + n + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/uprotocol: 主要是为 uartcom + n服务的 驱动层到应用层缓存的过度 +公用的串口通讯定义 + struct _s_protocol_ 的公共协议包(关键的结构体)的声明------struct _s_protocol_ + void L1_uart_2buf(struct _s_protocol_ *p)串行数据保存到缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc----------s_at0 +----------------------------------------------------------------------------------------- +********************************************************************************/ + +#include "tpc_road.h" +///#include "c_lib.h" + +///TS_pp_debug_ ts_debug_rec; +///TS_s2b_debug_ ts_s2b1_road;////协议处理变量 + +void L1_s2b_road_init(u8 ch) // +{ + ts_Urec[ch].ok = 0; + ts_Urec[ch].debugok = 0; + ts_Urec[ch].head = 0; + ts_Urec[ch].num = 0; + ///printf("\r\nw ts_Urec[D_UART1].max = %d num = %d",(int)ts_Urec[D_UART1].rmax,(int)ts_Urec[D_UART1].num); +} + +//MODBUS协议解析函数 012345 +//透传协议 就像路过 有时间超时溢出 收到啥就向上传递啥 +void L1_s2b_road(u8 ch) +{ + /// ts_Urec[ch].ok = 1; + if(ts_Urec[ch].head == 0) + { + { + ts_Urec[ch].head = 1; + ts_Urec[ch].num = 0; + ts_Urec[ch].ok = 0; + ts_Urec[ch].fifo = 0; + ts_Urec[ch].sp[ts_Urec[ch].num ] = ts_Urec[ch].reg; + /// ts_Urec[ch].sp[ts_Urec[ch].num ] = SBUF;// L0_uart1_get();; + ts_Urec[ch].num ++; + } + } + else + { + ts_Urec[ch].sp[ts_Urec[ch].num ] = ts_Urec[ch].reg; + ts_Urec[ch].num ++; +/// ts_Urec[ch].len = ts_Urec[ch].num; + ts_Urec[ch].fifo = ts_Urec[ch].num; + if(ts_Urec[ch].num < ts_Urec[ch].rmax) + { + }else + {////保护使用 + ts_Urec[ch].ok = 2; + ts_Urec[ch].debugok = 1; + ts_Urec[ch].head = 0; + ts_Urec[ch].num = 0; + } + } +} + +void L1_s2b_road2(u8 ch) +{ + if(ts_Urec[ch].head == 0) + { + { + ts_Urec[ch].head = 1; + ts_Urec[ch].num = 0; + ts_Urec[ch].ok = 0; + ts_Urec[ch].fifo = 0; + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; + } + } + else + { + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; +/// ts_Urec[ch].len = ts_Urec[ch].num; + ts_Urec[ch].fifo = ts_Urec[ch].num; + if(ts_Urec[ch].num < ts_Urec[ch].rmax) + { + }else + {////保护使用 + ts_Urec[ch].ok = 2; + ts_Urec[ch].debugok = 1; + ts_Urec[ch].head = 0; + ts_Urec[ch].num = 0; + } + } +} +void L1_s2b_road3(u8 ch) +{ + if(ts_Urec[ch].head == 0) + { + { + ts_Urec[ch].head = 1; + ts_Urec[ch].num = 0; + ts_Urec[ch].ok = 0; + ts_Urec[ch].fifo = 0; + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; + } + } + else + { + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; +/// ts_Urec[ch].len = ts_Urec[ch].num; + ts_Urec[ch].fifo = ts_Urec[ch].num; + if(ts_Urec[ch].num < ts_Urec[ch].rmax) + { + }else + {////保护使用 + ts_Urec[ch].ok = 2; + ts_Urec[ch].debugok = 1; + ts_Urec[ch].head = 0; + ts_Urec[ch].num = 0; + } + } +} +void L1_s2b_road4(u8 ch) +{ + if(ts_Urec[ch].head == 0) + { + { + ts_Urec[ch].head = 1; + ts_Urec[ch].num = 0; + ts_Urec[ch].ok = 0; + ts_Urec[ch].fifo = 0; + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; + } + } + else + { + ts_Urec[ch].sp[ts_Urec[ch].num ++] = ts_Urec[ch].reg; +/// ts_Urec[ch].len = ts_Urec[ch].num; + ts_Urec[ch].fifo = ts_Urec[ch].num; + if(ts_Urec[ch].num < ts_Urec[ch].rmax) + { + }else + {////保护使用 + ts_Urec[ch].ok = 2; + ts_Urec[ch].debugok = 1; + ts_Urec[ch].head = 0; + ts_Urec[ch].num = 0; + } + } +} + + +/****************************************************************************** +** End Of File +******************************************************************************/ + +/****************************************************************************** +** c func lib + +void L1_s2b_road(TS_rec_road_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + { + p->head = 1; + //// p->max = D_debug_max; + p->num = 0; + p->ok = 0; + p->fifo = 0; + p->sp[p->num ++] = p->reg; + } + } + else + { + p->sp[p->num ++] = p->reg; +/// p->len = p->num; + p->fifo = p->num; + if(p->num < p->rmax) + { + }else + {////保护使用 + p->ok = 2; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} + + +//透传协议 就像路过 有时间超时溢出 收到啥就向上传递啥 +void L1_s2b_road2(TS_rec_road_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + { + p->head = 1; + //// p->max = D_debug_max; + p->num = 0; + p->ok = 0; + p->fifo = 0; + p->sp[p->num ++] = p->reg; + } + } + else + { + p->sp[p->num ++] = p->reg; + /// p->len = p->num; + p->fifo = p->num; + if(p->num < p->rmax) + { + }else + {////保护使用 + p->ok = 2; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} + +void L1_s2b_road3(TS_rec_road_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + { + p->head = 1; + //// p->max = D_debug_max; + p->num = 0; + p->ok = 0; + p->fifo = 0; + p->sp[p->num ++] = p->reg; + } + } + else + { + p->sp[p->num ++] = p->reg; + /// p->len = p->num; + p->fifo = p->num; + if(p->num < p->rmax) + { + }else + {////保护使用 + p->ok = 2; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} +void L1_s2b_road4(TS_rec_road_ *p) +{ + /// p->ok = 1; + if(p->head == 0) + { + { + p->head = 1; + //// p->max = D_debug_max; + p->num = 0; + p->ok = 0; + p->fifo = 0; + p->sp[p->num ++] = p->reg; + } + } + else + { + p->sp[p->num ++] = p->reg; + /// p->len = p->num; + p->fifo = p->num; + if(p->num < p->rmax) + { + }else + {////保护使用 + p->ok = 2; + p->debugok = 1; + p->head = 0; + p->num = 0; + } + } +} + + +******************************************************************************/ + diff --git a/source/tpc/tpc_road.h b/source/tpc/tpc_road.h new file mode 100644 index 0000000..8bf9795 --- /dev/null +++ b/source/tpc/tpc_road.h @@ -0,0 +1,48 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2023 CCSENS +/// All rights reserved. +/// +/// @file tpc_fsk.c +/// @brief transaction protocol control of fsk +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// @version 1.2 CCsens technology +/// @author CC +/// @date 20180308 +/// @info 整理 + +// +////////////////////////////////////////////////////////////////////////// + + +#ifndef __TPC_ROAD_H_ +#define __TPC_ROAD_H_ +#include "tpc_x.h"/// + +#define D_s2b_road1_init() ts_Urec[D_UART1].sp = ts_Urecbuf.r1;ts_Urec[D_UART1].rmax = D_rec1_max;L1_s2b_road_init(D_UART1) +#define D_s2b_road2_init() ts_Urec[D_UART2].sp = ts_Urecbuf.r2;ts_Urec[D_UART2].rmax = D_rec2_max;L1_s2b_road_init(D_UART2) +#define D_s2b_road3_init() ts_Urec[D_UART3].sp = ts_Urecbuf.r3;ts_Urec[D_UART3].rmax = D_rec3_max;L1_s2b_road_init(D_UART3) +#define D_s2b_road4_init() ts_Urec[D_UART4].sp = ts_Urecbuf.r4;ts_Urec[D_UART4].rmax = D_rec4_max;L1_s2b_road_init(D_UART4) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +void L1_s2b_road_init(u8 ch) ; +extern void L1_s2b_road(u8 ch); +extern void L1_s2b_road2(u8 ch); +extern void L1_s2b_road3(u8 ch); +extern void L1_s2b_road4(u8 ch); + + +#endif /* end __TPC_ROAD_H_ */ +/***************************************************************************** +** End Of File +******************************************************************************/ + + + diff --git a/source/tpc/tpc_x.h b/source/tpc/tpc_x.h new file mode 100644 index 0000000..b29afa4 --- /dev/null +++ b/source/tpc/tpc_x.h @@ -0,0 +1,55 @@ +#ifndef TPC_X_H +#define TPC_X_H + +#include "bsp_config.h" +////// +#include "c_type51.h"/// + +#include "msp_uartN.h" + + + +/************* + +1,帧头帧尾 +又分 +fx 11 22 33 44 ocr +77 66 xxxxx 88 +68 len xxx dat ocr 16 +2,字符型 odoa结束 + +3,纯粹的超时 + + + + + + +*********/ + + + +typedef struct +{//8byte + vU8 filter; + vU8 R1; + vU8 R2; + vU8 R3; + vU8 R4; + vU8 R5; + vU8 R6; + vU8 ocr; +}TS_P_debug; + +////#define D_HETU_FX_buf_max 5 //定长协议 长度为5 + + + + + + + + + + +#endif diff --git a/source/tpc/tpc_x.h.bak b/source/tpc/tpc_x.h.bak new file mode 100644 index 0000000..61dd866 --- /dev/null +++ b/source/tpc/tpc_x.h.bak @@ -0,0 +1,33 @@ +#ifndef TPC_X_H +#define TPC_X_H + +#include "../bsp/bsp_config.h" +#if 0 +#include "tpc_debug.h" +#include "tpc_ccmodbus.h" +#include "tpc_modbus.h" +#include "tpc_0d0a.h" +#endif + +typedef struct _tp_handler_x +{//8byte + vU8 reg; + vU8 head; //接收标志头标志 + vU8 cashe[2]; + vU8 head_0; + vU8 head_1; + vU8 num; //接收到的数据的计数, 随着数据接收而变化注意数据长度的范围 + vU8 ok; //接收协议ok标志 + vU8 debugok; //接收debug协议ok标志 + vU8 max; //接收到的数目的最大值 + //vU8 __buf[D_tp_handle_x_len+1];//buffer + vU8 buf[D_tp_handle_x_len+16];//array的第一位是 长度 //协议缓冲 + vU8 *sp; + vU8 *sp2; //备份值,如果协议需要备份,单独提供备份缓冲区 + vU8 ocr; + vU8 crc[2]; + vU32 modbusstmp; + U8 i; +}TP_Handler_X; + +#endif