From f3bfba2bc554fb00d3ffa2889f61c742187939e7 Mon Sep 17 00:00:00 2001 From: liyating Date: Tue, 4 Jan 2022 17:46:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=94=E5=A4=B4=E6=95=B0=E6=8D=AE=E4=BC=A0?= =?UTF-8?q?=E8=BE=93ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_ps5ws.uvprojx | 61 +- si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 466352 -> 524492 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 151552 -> 176128 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 1808 -> 2048 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 128024 -> 140168 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 128024 -> 140168 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 244 -> 240 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 128024 -> 140168 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 65536 -> 81920 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 968 -> 1128 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 21176 -> 23144 bytes source/app/app_config.c | 15 +- source/app/app_config.h | 13 +- source/app/app_task_tcp.c | 102 +- source/app/app_task_tcp_control.c | 14 +- source/app/main.c | 69 +- source/app/main.h | 14 +- source/app/{ => nouse}/task_adc.c | 0 source/app/{ => nouse}/task_adc.h | 0 source/app/{ => nouse}/task_debug.c | 0 source/app/{ => nouse}/task_debug.h | 0 source/app/{ => nouse}/task_key | 0 source/app/task_pen_head.c | 2 +- source/app/task_register.c | 2 +- source/app/task_w600.c | 8 +- source/app/task_w600.h | 4 +- source/asp/asp readme.txt | 16 + source/asp/asp_SDX1.H | 82 ++ source/asp/asp_oid.c | 135 ++ source/asp/asp_oid.h | 38 + source/asp/asp_power.h | 22 + source/asp/asp_sdx1.c | 853 +++++++++++++ source/asp/nouse/asp_SI24R1m.c | 1041 +++++++++++++++ source/asp/nouse/asp_SI24R1m.h | 113 ++ source/asp/nouse/asp_task_WC.c | 123 ++ source/asp/nouse/asp_task_WC.h | 39 + source/bsp/bsp_config.c | 2 +- source/bsp/bsp_config.h | 154 ++- source/bsp/bsp_config_const.h | 12 + source/bsp/bsp_oid.c | 739 +++++++++++ source/bsp/bsp_oid.h | 164 +++ source/bsp/chipid.h | 2 +- source/bsp/{ => nouse}/868.c | 0 source/bsp/{ => nouse}/868.h | 0 source/bsp/nouse/bsp_config.h.bak | 240 ++++ source/bsp/nouse/bsp_config_const.h.bak | 161 +++ source/bsp/{ => nouse}/cs1232.c | 0 source/bsp/{ => nouse}/cs1232.h | 2 +- source/bsp/rs485.h | 2 +- source/clib/clib.c | 13 +- source/clib/clib.h | 4 +- source/clib/type.h | 110 +- source/clib/type.h.bak | 355 ++++++ source/cpu/STC_stc8h3k.H | 1394 +++++++++++++++++++++ source/cpu/c51_macro.H | 301 +++++ source/cpu/{ => nouse}/STC_stc8a8k.H | 0 source/cpu/{ => nouse}/stc_macro.H | 0 source/cpu/{ => nouse}/stc_stc15w.H | 0 source/cpu/{ => nouse}/stc_stc8G1k.H | 0 source/cpu/{ => nouse}/stc_stc8f.h | 0 source/cpu/{ => nouse}/stc_stc8hxx.h | 0 source/cpu/stc_only.H | 258 ++++ source/ctask/tick.c | 4 +- source/ctask/tick.h | 22 +- source/ctask/tick.h.bak | 94 ++ source/msp/eeprom.h | 2 +- source/msp/{ => mcu support}/UART0.C | 2 +- source/msp/{ => mcu support}/UART2.C | 9 +- source/msp/{ => mcu support}/UART2.h | 2 +- source/msp/{ => mcu support}/UART4.h | 0 source/msp/{ => mcu support}/uart_x.c | 2 +- source/msp/msp_uart0.C | 187 +++ source/msp/{UART0.h => msp_uart0.h} | 8 +- source/msp/msp_uart2.C | 183 +++ source/msp/msp_uart2.h | 94 ++ source/msp/msp_uart_x.c | 236 ++++ source/msp/{uart_x.h => msp_uart_x.h} | 5 +- source/msp/{UART3.c => nouse/msp_uart3.c} | 4 +- source/msp/{UART3.h => nouse/msp_uart3.h} | 2 +- source/msp/{UART4.C => nouse/msp_uart4.C} | 0 source/tpc/ccmodbus.h | 2 +- 81 files changed, 7340 insertions(+), 197 deletions(-) rename source/app/{ => nouse}/task_adc.c (100%) rename source/app/{ => nouse}/task_adc.h (100%) rename source/app/{ => nouse}/task_debug.c (100%) rename source/app/{ => nouse}/task_debug.h (100%) rename source/app/{ => nouse}/task_key (100%) create mode 100644 source/asp/asp readme.txt create mode 100644 source/asp/asp_SDX1.H create mode 100644 source/asp/asp_oid.c create mode 100644 source/asp/asp_oid.h create mode 100644 source/asp/asp_power.h create mode 100644 source/asp/asp_sdx1.c create mode 100644 source/asp/nouse/asp_SI24R1m.c create mode 100644 source/asp/nouse/asp_SI24R1m.h create mode 100644 source/asp/nouse/asp_task_WC.c create mode 100644 source/asp/nouse/asp_task_WC.h create mode 100644 source/bsp/bsp_oid.c create mode 100644 source/bsp/bsp_oid.h rename source/bsp/{ => nouse}/868.c (100%) rename source/bsp/{ => nouse}/868.h (100%) create mode 100644 source/bsp/nouse/bsp_config.h.bak create mode 100644 source/bsp/nouse/bsp_config_const.h.bak rename source/bsp/{ => nouse}/cs1232.c (100%) rename source/bsp/{ => nouse}/cs1232.h (99%) create mode 100644 source/clib/type.h.bak create mode 100644 source/cpu/STC_stc8h3k.H create mode 100644 source/cpu/c51_macro.H rename source/cpu/{ => nouse}/STC_stc8a8k.H (100%) rename source/cpu/{ => nouse}/stc_macro.H (100%) rename source/cpu/{ => nouse}/stc_stc15w.H (100%) rename source/cpu/{ => nouse}/stc_stc8G1k.H (100%) rename source/cpu/{ => nouse}/stc_stc8f.h (100%) rename source/cpu/{ => nouse}/stc_stc8hxx.h (100%) create mode 100644 source/cpu/stc_only.H create mode 100644 source/ctask/tick.h.bak rename source/msp/{ => mcu support}/UART0.C (99%) rename source/msp/{ => mcu support}/UART2.C (96%) rename source/msp/{ => mcu support}/UART2.h (99%) rename source/msp/{ => mcu support}/UART4.h (100%) rename source/msp/{ => mcu support}/uart_x.c (99%) create mode 100644 source/msp/msp_uart0.C rename source/msp/{UART0.h => msp_uart0.h} (95%) create mode 100644 source/msp/msp_uart2.C create mode 100644 source/msp/msp_uart2.h create mode 100644 source/msp/msp_uart_x.c rename source/msp/{uart_x.h => msp_uart_x.h} (95%) rename source/msp/{UART3.c => nouse/msp_uart3.c} (98%) rename source/msp/{UART3.h => nouse/msp_uart3.h} (99%) rename source/msp/{UART4.C => nouse/msp_uart4.C} (100%) diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index b131346..1f9339c 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -7,19 +7,19 @@ - STC8F2K16S2 + STC8H3K64S4 0x0 MCS-51 - AT80C31X2 - Atmel - IRAM(0 - 0x7F) CLOCK(60000000) MODP2 + STC8H3K64S4 Series + STC + IRAM(0-0xFF) XRAM(0-0x0BFF) IROM(0-0xFFF8) CLOCK(35000000) MODP2 "LIB\STARTUP.A51" ("Standard 8051 Startup Code") - 4027 - REG51.H + 63300 + STC8.H @@ -35,8 +35,8 @@ d:\Keil\C51\BIN\ - - + STC\ + STC\ 0 0 @@ -45,7 +45,7 @@ 1 ..\out\ - cc_stc02_ps5ws + stc_touch_pen 1 0 1 @@ -109,11 +109,11 @@ S8051.DLL DP51.DLL - -p51X + -pDP8051 S8051.DLL TP51.DLL - -p51X + -p51 @@ -154,8 +154,8 @@ 0 0 1 - 0 - 0 + 1 + 1 0 0 1 @@ -229,17 +229,17 @@ 1 0x0 - 0x0 + 0xfff9 0 0x0 - 0x80 + 0x100 0 0x0 - 0x0 + 0xc00 0 @@ -270,7 +270,7 @@ - ..\source\msp + ..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\source\asp;..\source\clib\znFAT @@ -364,6 +364,16 @@ + + asp + + + asp_oid.c + 1 + ..\source\asp\asp_oid.c + + + bsp @@ -387,6 +397,11 @@ 1 ..\source\bsp\w600.c + + bsp_oid.c + 1 + ..\source\bsp\bsp_oid.c + @@ -403,19 +418,19 @@ ..\source\msp\eeprom.c - uart_x.c + msp_uart0.C 1 - ..\source\msp\uart_x.c + ..\source\msp\msp_uart0.C - uart0.c + msp_uart_x.c 1 - ..\source\msp\uart0.c + ..\source\msp\msp_uart_x.c - uart2.c + msp_uart2.C 1 - ..\source\msp\uart2.c + ..\source\msp\msp_uart2.C diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index bd5b0ed472d8d8d5b38ecf6079f05c1c84643ebd..548ad48ab4e0660fde750890b7fc93d6acd4adfa 100644 GIT binary patch literal 524492 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¾^~P$t#=9!#_lSHZ#0o}weRn~df9}~V^Wx9EyXEfc@3_*J zTeJQ@q{~pxy}RhLo<$+>R$d=<<9v zA4J1EpQ$o26=vMgagWM5r7zF#m0Mfq4`|tq`p)B)L!(8{!2aQ)YncCSRy<2flV?c0 zK?D2b%DKIA{SOvhAn^KpAUC6mf+4!)QJ-g0x<=nlSEwzs~Yf+pb@i7fJFHg!d zpKn{|k64~J&y|gcFCTwdemFzon;LLlksJ;Ad>3+VQZ_!SWmnJ6%oHPs!dgkxvz!m6 zw7OUG>frPB&ip@{IDbsbZYXx>%hIDWo44q`z|3;NX3y1tGbD`epi=unjy(kRV-x2e zmh+k(6^-uh-Nj}W$`9HXv^OAObk2Ofwf9n;eUR)SKP%6qIiO+p zWcgAyAYpW6gU{DH%eayAPo#OaqOo%)i{`{3EsQfHjLwrqRz`s%S(pB>#=1LYYKMpriYe7$qieeh?rtd1#j&JoR| z9(m#n38Qo7^KI+=87*7wgLD<>geCs~{uFuQ3<;xi=JRdq{IgoNs-H{efcp7~^28Yu zM(51u+t&H#v}|?kE}aMR>*s^=#2FGs=gjBZ*7>tq_LQ;_P(RZhjC0*BY;?|izHOa< z{#0kRlJd(l{YN<0{YXaV%;($I`4_ZoQl7U&v^TgkgL8d}#^{{+eA_zzqLxj{^Oho@ zJae52XGj>GGoNo;=U>vYNqLrYcJtZ3Lxb~CGp^{I`Fz_tf9_Q0tr6vUR<1Zh!swj& zeA_yIUdtxsIizEhD_}T7!swj&eA_zzvX)KC^VW#+e7ihxhJ?{M^ZB-Q{(_cG%CnsF z%kv3&;tUC+bLR7H>-;OHI&X_8&(Dx2&X6!VXFlJy&R^8BNqOEDQ9nOTo;X9o=$!d{ z+dBWMmQBj@wutilYGGoNo;=Pzs7s%-4) z>f0OASMVlz;tUC+bLR7H>--fhTa}H{IpEm+R(awK38Qo7^KI+=RV`bUjmkN{Y`k5b zI77ndocVm)I{%uMP0GgRh-^hVwyHNu=YYa7Do>mtVRX)XzHObqp=G0;KPgYHjnIet2o1cZe>4p~ zU+>(sFZXx856(X&Ih^Uk#hKUMna}sm&dvIAe^<*^^>bA=@^`|UnJIbV3<;xi=JRdq{QKVrXZE@K zX-L_Ld=h-V-nr>M_^t1QGy5FQDZMkF@132S?Sp@yWs`j{r0?q%`BF9@VRU7K&(}LQ z-3R|r%O?9^NI%kyJaLAE(K++^wsrm^Et~9vA^k{q$P;Hs7@aepZ(HX-*0M?22uMo6E`)8&aXB#h3P&$q4fpK95pY=rd5JV%~5L*hA%oHL(q zTjxL1vPszp>63Yu6mf=x(K++^wsrpV`8*Hz?$OVv1l*VVVtL{W38Qo7^KI+=7xQ^G z=YZyO$IIl2GbD`8na{Va^Iv`+oIfE?+M*vvSi$T2*wp-p&(}LQJ$C=q_rdwoQp5RE zl_IabGoSCBotquIzpZ7fbJ((M3z9>qh+nGi@Tk_rt%|Lym| z`NLAg84^Ft$T{=*-q~5!ntylkcQ^-sKjrhUGZ`;4L)D*%reUwIRCxg6aD>^ z&uQE1H9(x55xU|E!k78R87RGoSB5&Q0?C&uN~6 zz6bOLIpPd)hWFQy2A^+R=YP?%(cc65Wy#?TafT1jkOrS`TjzhZJjZ?y=$n$m8R86m z+2HeC$hk>*{x>Zf{XL-Hkt5&xNqM1Or@`mzov-8#ntylk?|RRg;h~{oXaB%~;_lwv z?C;;u+m>ngV)b@judSwQ@cDY@75uS*^MB|)o1Q*0F*z|O{>*y4ZHX(#?wa-gAzdH7 ze8#Z;3@+fm+Q9igPm^=)n>wrY+{pRAomRm79GIMLX!p!L}Y56r8QhH}T-?q;Gqh(jm>L)Trj!$K(&Mp3BO_Ar6 z)O~62`L=cbj+Q;Ma^8}zG-LWJT9$K;lpEdp_u>n_7rG zr}T9lpKn{|@0qi{pE=&fZsBEqy>d?Jo%wv*I`aUDl_%tUeBtf4nfn`+b4u^b=iAnq zx@P_DBe#y}nFX`s$FrYh&j0bN8Ys^x&*2YA@cFiN=J^|I#>S?KgU2REgDO1sHyzXL zo6$Azm-sSCuIk}l)!*0$n$*wba{_g{*T_`SJ3TTpRxO`{9xcrFA+c8j?T@t8u}o#s zJM)evZT|0vGxu8J42c(OD4o~YYer`*=-m7nWt?}D=e|S7BGPQ%jmEkD%sEFXooP*% zv3x;i{Y~Zk?t(l=J3n3<#TgPeYVgi07IfCT8amS_L!S3dPac^b$*=TiyW?zac=1{d zzHF>q(7E}u;G&(6$q{Er+@Ya#o^N%mTF|-q@57#VYM#sAFtx3<8@*hM;S7n_X}~%C zZOYXPI;&_jEE{!s9t?P12#%L&z!?%-HI#YYV6PdSxrlSqx-Q!JCOP2@iCZ+3&hxFi zH48d7uj}aFU>_vU*#$#>Z_t1{x*GPs@)@LxMIb&dcp-TFg=Z@gmNv8al5!FkEcjvZq{G!1z3^gZ>Rj7~Qpr zjSD!_ezpHByo=!2y%Og*Wy>bcbzh6oId95zCeK?s z?Kx?l7PIa4R6WIBzy zT%`50_2D!u&)f?U*)RGq$7j#^?KJLJmF3i#^3(KuFuEV<;o3IN5NF7DYtp!Q z5$7iN_E0}Z_ak*m4rhone58gnE?LC+boC>VQ=B2rkh(gJ`!C|$v}{E8$!wM!&JbsK zm4-AfUBtO*o}>F@9wa&HHi$EPpoTOqTg16}p38ous6LqoNDgO+GaS;8#^sARpRPU` za*8v=86MM+#ubY=H|>*Ir+y^r=ZI$#-N7UEgrClbJISV4f?&~stJAg z#6-Q;_S~vPafUd<%QU3%z(t&!mgkMd@fr1smJR>i`8OrepK+!JNEqF@)q@srUP|8= z$8O4nemF7YUKvgz>9ws-CQoR(JWrX=HplFG(4Xg{VS8gmR6(w`{4^0~NPJlX&MT~@ zW{&RDP4ZmMsm2YRR~LJ@C4ToQ%VxZ|T+32#K*H$CMxA3=eg@5-S#ABIqmw5l@=sk$ zL5;~To+%$Z_t$bFb++?B&0fi$8s>Se>bjXN2aA2Xx0Nf*9DhU0vwcW>TLZZ~V{Wfh zTQ4aawKMN+T5nvay6*Vop@aJErQ;(rI?F1Kj!fv<_cSYM5uedAI78xV8gO1U*Nd)p z(<08z+oE&MGsi}5lk-T{tsGC6pOogli&tMyIn!Fw`h%h~(|M!vJSEL4+2u+z#ynGj zVrkD-5V_Tm5Yh@Dy%XGq+n0q12&U3cXo z&Q05*Ys!i)tY?N}$vO=w>+5csZLxg;=cOD|mQS2GUau>HxYAxud9hpZRhiD~r}o$p zrE_anR=r$n@hrphG^D(^{$s_fqnx+LINu>JoKs$0xz@NQ$a!;TjPpr};hgf~TDIaN zGo6=Dj~#KV%z8;VzNdzi_jYT1RIc-FBmT75ZDDCIalJ%C%FEm;9-Zl|@0O}XS2gU$ z^G{;w>*6R43FBR~`7bTswxnxqo78@;lxL=n<)0GL&fvToa^4L&ey8!+B+s=oNA{-e z=jb;7E!sBD5NBBDT$2`$%XE%z^V9ak8R86Y(vZfri#VUIHvdt{aqNaT!^dk#qbt)n zy3K!Ba%(j}oZ%h~Y3#^#-qTYI^>^LSJE%ul>>Nl}-D-NjmZBZkUoFk+P1SUb?#j7W ztoK1pmJP!CO^eX3P1yI^P8EOVBJXc98&~SOn)Ux7U6#Irp31v+Udr|Eb+JvPj>k%l zJU_CM=-o@?Lhv-7;UGa}EplINQB z|3S0nf;?ZBmFIz;9s7rhfqlJ$b1Ti5xJ1ixK3em^n)YR*_8m&{%<;!g*x_9S_48SK z=ADbK{lmNO;{8qj^gz7{N6&Ow^4#z8tn$b$xwYRAgu>HlouY3k?GQP&MC&-k`=J|)lpOLg7;Naz2hy6%Qd=hIQw9msS( z9d+G}na-!9u6shJ^XWJrys2`2vRK!3cHO&ST^D`N_G477uGWx}wsacQaZjwgYv;3h zLqq442T#t9&7^D0n|`zw$2p}xw|bI%bDWd1@xOKsTl?PJwrm7no7kZo(~p#rKF2gD z8&An78_R>QO>|2R=ak;LkZ+FjeA)QlJMXT2N86T-;Onq`Ri0D&JX1DCa>_<{sG%+3^3N4G`Y+GF>$ z(vP%71H4*;?~^%Hm5cGVwD>>cBi;fb10iB*SdEd$#h;--c{$;+WsZiT*-4vpXZ~Q&Krh@xbHG-AFTH|_CbQz z8*OTSRF{ie<$h^3dj)&y|KWOrI_?(vrghy?u3MdV8m_g~zB5Ul)#h*9mmA&YAJS({ zc}~eOCJpj?%;ouXw)yG6#yO?0H;&6U$65Erhdx7cxN=UpCQY)YCvu&G>*s;WIi+`= z%yf>vhiYHtoYI%)sZ8fpYKulTp}ALs@|@BiQ=XdZ9DE$yTRErn&eNIB8~gSS>vGlp zeZ$56u0i&kym*=xC(n?0y9U~#%k3AWm^0sxOP$9v0_LLOaggsko*0>)?JU$N4frw; z_r&8232vY*+t2ey@LA;<-?q*?>%Mf3`SMbi9C3!kO&Ut)`piYYkDcj!&Ybhi*uFJS^wyn0KNiB#oBu;23oh4euZHqWJz3*$?OqJ&BZy%IGj}s^bDd#g>zUTG@ocVt? zZP(2?Pmhh3Ys?#SUkvvoro7Ot@{UaBv+V({TZ{3T>D~GQQ1;U=-yuJ828oYrplqby zT{^jdGw*Gh=d*R*%|58dz)c(~W{yry+0v~?^oKq`LrU8HX*_KK=cSYl-IrTd8@)ri z!7jgkrW|vuhJ^8~a=ISZ^&I5?NAOuJYgj+e*L9tTI!A2rtPvM+ajq}s8lCeql02u* zjmySdT^Dmq*(F~-XGp+%+tmE%nF~0x-!^sTxe#UH=$n`wq-QWMuGQk?84}kra(RB% z0?t;4H!K_Hp6c9vY;0tj&9sfQubg%8+B-ix)A^J<59jB(ON!(f5=NKj=VUsclIP*R z>^yhN6K6;mo%3@uouk_uyXDC~2nopjYH2)g0cZBXrtOWh=E^e%m6_SB!mRCbenOrh zVRU(Z{sPYIgH7vao;_RE8z)9>BblS?v^>s`FgoWKWIE69gC|Chj@?miC}Yey70!?_ zI_DSuKjz*8JdWym++Is^!PsDW?~ni?i7eSbI^>o6Y!PQjD2?-tvp83+pBv{^LFa>fwnN6hYdKFsK8r^- zapw9<)qY*WIp}OPY=$JP#WjQIGqoi8L#6|>?yX?{`^K+ls*z9ULg~GiP^^M%Kwe`R?X*f zysjr`ypFaS=d$hIERS)X`Szh&?QvN-x8q!%!^)2Wg?!o2pxEII3EJ+$dA>ep_IRgr z*?;cQ0S=)XP=3MaC9!hQ#$U;XEh% z*4!t~;#{@=%y->$@YSbxZ>(?JwR7{fEo`doxUVdUGbA1?lg*7M&Ej137+gHOyXf@y z)I+|bjPpM-H|JUMJdYb$TRuIs69n9f(*_TxTT@=%#_?sNS?{`M57v)rqu z^>TfBM712w$XM>0RL+o4nsR=z(>W{Wkg?n<*MMH)bdElU<^H2ZGC|G@;i)p^ z@zN&F)X!D>qS5ED7s;kMx60XzPZlq0;;aJ|75jD3=dc%w8{^M8Pt1II_;ROn^f~N$ zaXL(pL@c-w3>ZP{ag-8DNVic$|laOj6W|fPEtbdpAuEQPDLLnzixFT zf5_rhO`Kaf26fEbJ?cCo#5pPDT%MaMO*y~1iF4I*ew{44SiYicaO}cCy~EWW;4>ZO5>c56_oc{Rds&7IA`Ph+?VUNzPI?28<2RqO!PCm8ow-7tGzZW=hB(? zR;i!gAj_6x1-(Jz{P&Pe;|vKpUO4BUtYQC_W!oJ?Pwa4p#Kkfd z&PV8TX6)Z~o!=zOmgiQzLF4>8#R+FfFlJIXYsTtp?B8b2RmS<>EX$^Anjzls#K)q_;ZoZ{_*EK%cdEB&UpuXvS9yO=c>8!c3C!! zKletBKaJq!oH|7R`3pSo~i3%#-FR4r@SpI=iIqUZoE^Ljc!xu8?m4B zKGL!BJP-D7S=Q&JKUD1_y-SuY$De!aG2_oG#ev*_gwpgk*uU0U>+lNaDesnL%X8S? z|Ka#E`?p=^_sFv4xM*_zpNv1Vf7^9_uPx{Q(fBj_w_WG=*>e6LjX$%0+jV}wEF0ZN zVjPru0}{}VKeK)Kd+N*Q*S^*Y3dF3uXV24rhHJAovG`l z{%6_{gY$<0*C`~!Df7^Bbuq-=MKgW!jR~gG?|F-M=k$uaV zQ#W^v${HwVNGMG?vwz!l{^-8t95QA;A)YuxLTQ}YzwJ7IY~OMY88fePUjh5KUFVPQ zTh1Y4=HpVflrtohrkvTo?K*!#mM!mprrwCS|CupdoFSn!&g|cIoj)ndMxS>xo^iNL zIZr}93-+&dUe4bu^hH0FI|rS2Gro^=PV3D6ZP)qJvTQN_-1|Qre`fz$XC1MrP|l3? z=~!+rJ0>RXBxA)z$+%>HfHnR}?_?%KAgzPng|#QZW@i73@_?q^nfx;!U;@IE;G z?I2j8oEy&9rUe5~mv!Kr(>i}f-q5b|=VjUQyn9*DSndY#rT+{GiervGIz;EpJ}cWT zbEB{EsywJr&R>va%kd2v{R$b&9gt1q3<=7+aAxGOh|f8kzbMO==PApA#&YdA{|%y9 zILpRTuz#DCbCvUyFUhj0O<5N48weOT)7MI0sQ2ILtMa}I z^#;!6IqXQ#c-?B*KAVOFeSVzhX1_@Cm8_iGaW3nPk)V2Glls+akf0vHxkFnKUa8f- zI*W5>#d0pkHwtI}_{RIhiQIt12W2X9V@Bv}vp83&>-No!nDGs+N#G0##&V0?Sg6mL zeckC?j&F;`6XKizCjEc!5lX^Gv<*O{a4?{+yiM zAGrFkIN}V6&&Y)HoZ3w9?pw1sS3L%^+z1(yxl#OZhQyO(D$02#pT9kebJb%o%Z-pR znb(OU&X9PIOoj7IzwSFu=d7Hk*oHSAAS=Kb5)YTDaOQ5iBEIW%&dNDtOy)(Rg)<~x zBU9l#lN;Z2I&+?K&4z8$EB8!J>W4ncL0H{l>$3}G5u71$g-kei>MtqsO0D+&S)8l( zH|D3$TNP{b&+jO!pf8&9Otab_G;!wttkQp`9o&DQzG7^m-oJKTz?V?TX1NDqL874P zXQlIgT|aM<(0wt}ycaJvnQPl!e0SD}oWf3B*W^8|zC@dibJ=z)IdRG2M_D=N&Q;5K zQR%!{5;|LNyAP|3$^6*qT%LDF_4zl-Kf6dKNbLqsktvU#G;!t_sCo=W_xTw=!WrTW zPnIcZ(&?P_kvPQNak;DkXNWVj&cAXxXMLoQ z^OQ~Eh%>|)-bSW8e(iM5%6WUf-gY0;C&C%x49}1$kKZ_*vvLmU^KTY8oFUHeESd87 zt0m2*g+pFRuD5NBx1`S(ue@;YqPdG}Uv#2MlY&y^{U zKg{A>wM~ic^Isxzhsu=G)*F9p;#~DQEdA$0>ghzKTL&5SN>E-Vtv)_a7C2C*lANm1 zpU>k@$@$;H{`7|q*qOhp`D2`;f4gC|Y>LsBoTr)1bDr|&% zdG8LdXTJOjc|uO)r0&b(?@s5AU03C+b3a}sYrr|@{${QJa5{JGx;pfCmsW}&xsh{b zbg_{Cr_*`PZc_-(r_@~wWXego=kYJ6^ZxR?OZweeLBBP}XG&>9Mw2AZZ9bRv+?=^H zZHoLGmD`j>^;l_KX$MP|{{u>8(55gD3ClL+aQ@ZK@*T5N$G&a>=hAmxR?aQ8-9g{c zS(Z#bmMcm+rb~Y3LHTx=a&D#Vjy?v*Meb;sa@u<#I>p!JJe`+-|1sCM$>*F)%xb%w z&I_k^*SE?KO>7UUrMVZLT*!Hfah~gRUNTX98C;|HY}ViE)3U#OURsdnnycB0%Dh-0 z?q$8vN?mtL^!Ygk=ZkN<7s8~PmKipGacJA_^JJq;PqquIR z^{qVSJhnKul7dZvYdNWF`G<hxsRcTI!0s=pd!SWnXX)2D=7ap6o*-AMt7*OM} zivoOE1^pqM%YKp4IPafwId|6otztPR=ZPq1e9K85>SO!ehKroe(fLgOo_-u8m*H_T z<*~Slvz~udEa!y-_0`+9Y#pkPcIT^Y`|*QhNy-@#N|PITKA&B@P4mC%bu0PYap_#| z8y-$;Xdj%!<6NH1D~6+)m-h)Njq_2nIJa0oi*rmn z_=w~T38is9dKTxZ_47gEl6c|_38itqb(nKZJNPv5#2FGw<9vFUb4)vUvv}eR z38is9Bg{Fb9eloc;tUC;aXvH5Ii?+aiFo1+38itqjo*1{dehL_sCMvy;)ydPl*aii zr?b@0rE^F-c#U}C3<;%izU?f|E!5A+Ii?+an0Vq038itq-7L;k>*twrj%f$47f+la zp)}67pT)WLa*k;SA0?hRLqchsyJvB(TF%lArrd~W2Olq(fTXU}bJoa1y}uw`uH#&uKOF|A;& zMgfo;WkD!SIiKrvURXK@-F0&NRr}94N7c=2c7sf8Kc{s* z&*?l*oO^~=vbm7hE^8q-AfYtUeNCKOX}fXm4RpRrJaLAE(m1aOa9$SZe5H8e3<;%i z?sq!#IeHGmdjIg+@xfv{p81z#VVohMG|mG}oagZ7PGXGkcG^N`ayprEb6*t^}dN>BhLAI zWqF(-p)}4TPUn=*%cAo6L*j`uB$UQ^ZJcvRKEGQ$afXD_IFCA=Q$8CAUJWzO!N(vQUxXGkcG^Mup+z!~SM=?#0Pi!HT3|Gq4WGbEJ8d7aa_b7bvkvG$nx zJ7hIDLqchsFZ4Q(T{KXvJ!Za1RwGLKy+|dEa&3JRXWm=&+^TE5XKaY~2gM1po<%Z2 zLTRKgYU13=Sb;bP{CZg7$NYGiaE64^IA82`?hP&Hlf)BeNGOf-C4T47az0T!afZZ+ z%#8CroX(5u_3?@R`r47)43~jRJ2yxCa&ZLB$P(F-o&}3x-N87v{pMxJUIp- zp)}5yJDocxV%x!u;z>^AG|IINO`KV#az3vQ7(8NoDJ~PT{hZeM3a@itf4R93GM+(h zbm`;oaI}#M<#*}#pj79<($)&^Oh#g@>1n`V?NGf zgX1g`5zm*E;GEMsZ*@8^NY29%!m^GRBb2{FGDE(DIOQ`WlqR3A zY~tKXKF<^9HA4|stP025Cuc|~jq_Cj&f|k|Rdjc9hJ?~MZ+AMA8{>h}OOrDsl*W07 z(|K;+nACK|`XlD&bQJXlB$UQ^r_*^s-@1$B`e4`<@9&EzbzM$dZ|rK~EH72ApS#34 ztkRIp(xT#=(>m{VI?q`l8wiXa$hvUOX`S!obe`LP!T4ZQgCeefNzRZ^nta~V#JQ#V zxqtYAfuReF4Ft^pD(j$}A)z$RQ*P%qqy1xXcO-pFJaNuxb7Q)Rv%FOK7@XISa}P^| z#J6QFIOnv^d!5ev^{-viT_5NRy2Z72L8_l2p)|R1bra`S^10z0bR704XGkcG^EENf z{ZZw7kK_yqrE$JC$~mZ<$CEQ8l*akG0OzHF`8=GQA)z$R_l|N7D(8XZ3<;%izE6yE zSUz8xoFSn!&eumd2bJ?ga)yM`INvwGxhF86*Cc01D2?;|qMU=uc`!LcLTQ}uALAUB z&-YBukWd=u8={q4&sQX8 zNGOf-lcJo1%K4Jy3<;%iezMbfu8cp2eAuy2tlc#^LqchspW<}x=)bsFdC>ervYtgU z<+S%B-PFWcUaEX;qH~}xRQgWo+A$=QrktPJ#JQDm{{08m^wsrVnV6fBUYK$N5=!Iz zG^g{T%sJvp(94rEB$USa=}zax4d>P4>${8Xc;>H2&X7AbK}&M{Z&UzD67p)}6VaymDT!Lf__immwOFG%?q5^yTQgB?#W&}-p=rCz z--uQk=jTN^N8Oy8oE!Iy%X9nrl;=C0wXUO_`(x@lzEhEMF27q*Y0CKpPG_w*a2{AY zGU!VSUAikdLqchsU+8q!V-V+{`guWehJ?~MzsTv_DCeO1dB5Zg38isx9ip)}4fjdGrd>2J(U&X75_q z`WtUZ&X78~Gg6-*{tkhJ?~Mzd6u3BA?%soFSn!&ToluUN^RMEU3fr;p7Yn zrEz|1m~%{r;{(YV5=!IzHm9@J8(PjWg9RT<&X7*|#X`DY8<{Z<3es6Mygwi;F$mu+j z8!;W|_a$dYD2?-nBb@`70&1agOOfe>FKnLTQ{o;dGwK=a~NU*OD_Nl*aj! zPUo3&j_E&tJvl={X`DY5=^RkkeIq$TLTQ{o?R1{WjhMFk%gGrMO5^;QAm^z5^JkJX zB$USavtiCL_46l_GbEJ8`EyR^vVM;0KYuDYLqchsKksxd>y4=X^JkMYB$USa3r^?q z7>w#ae>yosLTQ}880H+)fBsx@hJ?~Mf63`QlN&Mp=g%i+NGOf-mm{46+LSLOXGkcG z^H-eCDW7|z`p-X2&X7*5<^UsqrB$USan@;DMa*pXg{~|df1R8mp)}6Fb2^vxb5#HNH^~_iO5^-{r*m0vMD?G4pPV6~ zG|qo;I+w>_RR8(6$r%z#)QiTOla(JIS=j(0-r!Uz<3~OO?Opq)VIwz7B#dYJ5}XIOnv^ ze{(uZIR|7!;miDvGU1%lI{)42Eaf~LSF{(>njl>D)CaU)qzl7lC^x=bYC0-)`sO3kM=((>kt8&N;1fO}-4N z{GGXWey^<~?&rAF`aa1yr*)p=bnYCC{SnanCFh*hxx?=qS=H69PtG~5bEn(+qHf)( zL9_cO=bYBL%kLao&i75uIj!?tr*p^3&|jFKFT{FIDf0M*fhWZ1&D`inbdPO5?nr(|O)dPv~!e_9bUX zD2?+%r}F}FUNbH~fL3h6Js(QWkWd=u{hiM9)j2MqS0rahD2?-?5a;ob@6E!oKRLtl zx&0oh#ZG7Pc`Wc}npY=hNGMG?AK-K*pT~#$24cR+LVjN&IYUBeoDXz5lh5PBarr!u zoFSn!&Pzg^n%i)&<6)Ehai^U+S{&Y{8XIAiHwBX`D}TI#bT$gK<|U z&PmRYP#WixozCR*c%byT$r%z#<9teh^TmUGQKzuAp5zP(rExyh?>r$tmA2rDJH+FPg34rsSN{I^W9a+&MHF+73P`Ip?&_w{|*riE~svM{z$n zIp?&_r#qdcoO{_;RD4-hL_X)V&SyBCrJQ>s%lUiBIj40#)9Ebb9I0G;N^;I=op0lG zULcoKdV4Mi8?gIFa)yM`)X!%%ah8`_=+}+)ujm^I8{fE6HcdX~wB>x;CeE$Y&vT`m z2UhS;#>Bs5H8?{;Y0CL_O`KaP=Xpb8a@M`3*g(L1yQ~A}oVJ{A-^96F*tt>z2~qdrS{L{3<;$v=jBbDTgi>i zH3Qwn+GFO+Qf@#(X`IjYJBQXAy~!C8O5=Qv-#N6;-;cc?ULqnvZvK2o34xpTBTRGN+e&N;2~3cqt` ze}j$y&N;1fzu!5uzd=U;=bYAg!0#N|-=HIab583#=ywk7Z_p9IIj41A>30t8Z=9W+ zb6V$BerHx67U#&CDCeBkd9~k})rZBovL>8!TIV6BbJu8h*nOA$<42`F5-gwFdtA?N z;w&#!9^Vk>(7R4fO3si_E-4eoR+X`F{6oC90Jqmwfvl*W0D z(|Mkh^T-4vf-%vNoFSn!&LbhtD~k;T%oiqSNGOf-TBoxdgOTZ6yN7sE*X6Wz-Dnf% zR{H!n2c~oFlH{DzI^W&tEcM1n|F~=@DE3Qr9VC<{H^!Pc%S)})&!g*je^AUx&X7*DIVlT*C`38isf=XCBEjXVNtHEv#^-pFZ> z!3&!>w^DC(jxOz{JfdP$R)lj->%89Y99qzKPtG~5^F@B=&~sRhXUaLJb-vi|9C{8* zRgZH{>wJmdIrJQMB01-@&iC*;hn~aIK2gp&t@EXR=g@Q53zKtB>wHhYbLctj`sAF` zI$!2=?iyVhdJcPZYP%t!H0@x$iL<=aLLX^q=sE1k$r%z#<9xZ(dG6@a&~w;BQhx&y zO5?mC!a1-dJSI6qLTQ|@a5~SEa*jNQ?M%*)P#WirAZ|!|qPbIj!?fzjNq0 z?7fn6PV2nO?;Ls#yC*s4w9dQz&Y|b9Q^`4}b-tJ1IrJQMIyvXG&U^gMq35uBlXFh% zJmqxm8tn-^hdm~>-H=e4c5u3hv%J(oAE_tw9QKst3<;%i-s^OpJK7U^4tr?oZ$Lt6 zoUe{>4r~dJP0o-|8s}@A&hw<4BhO*Gk~1Wf#`)S1=at0<0_Ka7GbEJ8`8ubw)ElAa zu=m7Mrku8}yLS`kR{Eki2c~oF(&U`eI^W0XEcHg{Iqd$au7iZqgUjN z*v{k(RRbF5`}&M=leUIJ7Pa7U3-{#Qg7t6 z$KVZ3oLi|kI!AlEDUYalxU2~0oYwgPe&@)luJ(xJoYOi#(C-|24tryA&S{+=~{`5hkaCX&S{+=;&%=`hkbN%&S{+=>UR!3hkZOMfi2;2$r%z#J3OJjq{V7&K;wn-RIg1 z#glp?r#%Lr+{C$+dZTl6SvTbo6)%z%;hfVtKgI7HS=H5EoSbu7=bQY_q35tKNzOT~ z^HcrKq35tKP0l&3^V9s!p$Fm1l5 zO5^-|r?b=>q35tq6i@nfIc;6{f+o(b^hI$FOy}AYl5mX}(opF_`K=O$-JD2?-r{m!B1u!kjQNGOf-OPtP9*M*+L-YV4_kWd=umpYw0 zMnk)zwKs|<^+ry648E+1b1U^m=jifo$|EY?BrC!>r*(e0-#N0XtGzin=d{kR@H>Z| z!@eas=d{kR^gD;1!@e~+=d{kR@;ir~!@ey!=d{kR_B)4G9B)s~Ij!?+{LZ20uvVd8vgy((=%A*jpuMNGOf- z8=TH_N0*15!yb|P8<0>M=Ql<;2eyPKBxgt{jq{tF&hw<4BhO*yCuc|~jq{sBoL3eb z2$&z3oFSn!&Tnx#OT7_#4*PELq+gfQ)^%@f;@nDK6z9NnuDvTc=d{jmb2>}C5qb`L zK&tB?p)|Si_9o8qQY-ay=sE1XXt%ER9r2{z$Z3zkcQ30w2yQ`$_+>;O*y}(iL<=a!ZCPuXdmg; z$r%z#fUav91g4BfTd%=d{irb~;PF z5!y#OFx7RCP@3HMNE2sysg?RUw2w4DIYUBeoImP!4(%fyk(?o+G|nG$I!j#_+DAG) z)fWyILk{d9E0bC z_K{9c&X7Be+DAGn&O3si_8t2bBox4WQ3GE|&O+2aVa@xA?^G%#vtm{JiNMB9PIj!>- zoX%2jg!Yk^q`D3gN|PI3Y~n00wNgKa_K_AOXGkcG^OyY2p?#zylQSfg#`()mXQ}H# z`$%V`dIJ(lUmcCh|F_&5dt1ac(W2NBjF^8&UC8SrN`Tt@F2>&K;xUQM$UGXC&vG*7@5`=g!gb z^^wvaOwKv2^LO0NvA;Qfb8^mUoxkgM4m?Y#)t;H0b6V%`Ih_}bu3xjX-ZwTDlpxzv ze*+RqQ`ddJiL<;^xqjZSbY9Iu{@9V6A)z$RKZtT3F1F#F?@Z2+P#WhSI-QH$SaCsA zZd{+7A)z$RKXN)R)ZFOr9~_H06gMSjNGOf-kHef}Zo!;P&X7QuL&yW%ab!C zl*aj|Va_q-ydgP5LTQ|T7UmpttLqiX84^n4{PQs9m|I;pCTB<}jq@*@&PAKj-yf9D zwcW`X5=!IzOQ&;L*NrWWX$bF?oFSn!&c6zCj%f(@Bxgt{jq|Ua&W+rNsWxg;$r%z# z6ynP#WidhByyI9fGy{CTB<} zjq|@koCjA0RU5T>a)yM`IR87wd1P&|3HSW&$r%z#<6N6xtNrWW|Nb{qc{h~&8zXTN@j5!OU{r`8s~XV z=c1fP$NPg4dRuaagwi0Goaao3J- zO3si_8s{UO&ShN}b?x}6$r%z#<9t+@b4)|{wB!s4rExym>DD(P3CTB<} zjq|OX&c%6m+_mHTCuc|~jq|O8oP)YZwHuN%B$USa^bqH`YsW80&X7IILTQ|D6XP6q?f8Mo84^n4e3sL>sGsAm9Zw`@NGOf-ZJo|V zT^D!l_(91T5=!HIJEwC|&T-d{*C%I4D2?;&oz6vnBktPq3zIV>l*YN+>CCm`o_gH1 z;|r5BB$UQ^snfYA=eTRfk4w&wP#WhRr*o0dao3I?pPV6~G|s(Y&N2PECnRS`D2?+n zr*l!)#a%moN^*vT(l{@7Iv4pIckTEA$r%z#<9xQ$xhUtjYsU{x&X7!Pk5eJ?PJLq5=!H| z(&^mDji77CA5YGZP#Wh|Va_qR@rmRN38isf?R0MBMojfw`($#4gwi+UweI_|WLTQ|boz9Ki2)cIs+2jlfrEy*p z<{Xn7pG(e=P#WhEr*q1UuxrQfOwN!{8t1i6=ad^^*N)$noFSn!&ZA+@F}d;X%2_BsoJuX`C;NaSpq7{JP`}38isf?{qHe=eTRfFHX*oP#WipoX$mE z7kBOW^~o6$O5=R7)43?;xNFBROU{r`8s|%#&P9JC?%MGelQSfg#`zvjXRaOh1ztOT zX>x{y(l}r0bS}y{?%MHtk~1Wf#`&I3=OUlut{uNOIYUBeoG%M=j_KFEFF8X(X`Jg$ z=c2BQyLSAcKt_K_~*$P5=!Gd8RZ;P)zyBHoFSn!&YPXi z9D^$YuO0s_IYUBeoVPfgX$MyXUOWC?a)yM`IByMej;T4mpPV6~G|tOU{r`8s`T)or`jgyLSAl}ckTGc$r%z#MqtEGk>|=La|kHYv5|Bx-Oi!uT)Qke=d{i*ayoa8 z5BAGu!s4!}?S_QXwB0Xm;@nEVZr=Fds=<-f#RdZA=XDfqHzbtC`6VIF!^H*y=66fZ zkWd=umpYw0$JcZhYmb@NWi|AXa@up)mo;&2rH>@eq345_C+D2j`Q?7+z)_@HZ9{U- zX`Nr;bnX}*m950Z9b{GHMowGTz0&DCcYL&eBJL2Zy+1kUw9c>cI}h|t#Fg_0l5fa?WX; z-{5u*`qHda&Yw-rIj!>>{m!A~{JG?u(>lM&={$d;cVgM-P}r!D)Q7 zvU_IF`X8-G&N*#4zsv6&dOmnwa?WX;-|co@9a_#8B;R!PUp^v;n3Wm1aQu2%lZ9&=g{0ZKRM^L&L40(&z)G)6ZdOC zwc7cqUk3^0lHzeW|6mj6R{C|~+#Bh9L2`zK(l~#}@4PJ1c{n*kLTQ{o>~!v$ShIGZ zSbfNRwXB6>FsIGuk2G^XkEou!7!{ zoFSn!&Yz5N4lC%%X$K}SZ(^-x|Dd)Ija4I=NLTQ}8>U1u0V`*4!OebeZ zD2?;iVw}TrV{dYXgwi;F-RWH9MqFKYb#jJ;(l~#^>0IPS+_l(ik~1Wf#`&8u&SAN6 zZE}W$(l~$1>0IPS%=a4NcwKUa<@1_x{0IPS z&=+-z;c>J-OEBxgt{jq|T#oWpYC#^ekMrE&g^)49kE?!J$SMr*n}TapR&lCuc|~jdNFwb69RXJ2^u_X`JUeoh3KcubbeG)R@?soFSn! z&hxy^>&92~1%9E-PsDSPOgT?SK8yKHoLjkIj41A>~x-YQE$%$fnUh@@8k>#rKz6}XyV*Tzi!?|YsVwM zMDp+ANp3(wX`ByqI(J<>*f&WN&NGOf-Az5y;lN^B$USa&>-h~ z?F~uiTDN%O3<;%iJ}k(2YI@i1Vk^G+?PYPCA)z$RhdZ6iV{jtq7`&}`;tUC;aX!N7 zd_Y;(1yvk%@x&Pt8<-jABbzu=A6BjFqU+};%C>0-p$r!(PZQ>GR1@dL@`kF;jdBi3 zj*Dg6lrtpm!OWEN(M_CNE9ah~QMqF8R6vuW-=~K29dMOU8s}r2&Ib=CXFUe%yRM$x zQ*5lwIU|2Kmm`2m<9zHa&Q(7TyRdYg+}Wn(zKbzth;uo1s5H*U&Ei}&pBI(RoA*pc zwB2`1&X7X zEY2Mj`=Yt?<_*(ZorhqJ?@*?kA)z$RC(Ytq^%y)LE9a?Q{^OAEs>T@-O5=R;EY9te zb40VUQ9N;mgqDJFKE><v^Uj*KC{KxV64%a`T40+o$W>+Uzr}5Ko*Tq34>$`P5mQ ztLDa%hI3txLVtGLUp#S!gwi;lHj8s-#bfY*;ohR{o~nnm-i#mN3<;%izSS(w)!USY zb4W}00P(~b5=!HI>sg$u9)npqhqQzb5>K2Vp)}5?&*I!hIft}__Y+T?A)z$RXUyW< zMmbMSPwp-@WDPNAdVUK4#=?3w{84@=zGtRe} z#kp!ZFQ`xSjbGsZ{#Mk8LuFc+SU$JTXEkwdWgJPaX=+`^`Xk~bS;-ukj!rA%Ipv?|$YwwG-tT$5T$mIr3O4z8>d}sjd0y z+>eiwHBinuZ8`Tio##(&t?!(?)>9?#^M4+noO2$v&pT?hUZ?Xsao)Wr;*7fxJ0Use zJkmHXb2=}ckS`6XPjE$La_1(q@;076T9y%|8YCXW%(R1LE^{oFb=@4^SMeCkoHy?c zI36D>o5mRuk7H(>&z3io*Hm)ns{M@vX39C_^2EbL5obu;$jmsOGmCT8a?YGX`gM;K zMVuk=C}zg_+*zEfl=Gcr+0MQzrdVxMoFOZs?*NHznaI^SIvUL@GkHON@c)%j#re*% z!2FH7_U@dn2V`=wW$I=6b&$5?)-n~&yjsK^vvSUztMoHfHxlfjzC7;!~oqQfh&X7lsK8|)h>BwCy^riinSEtWLp%>HfHc}SK$zPa=IzM+Zw@Y?k)8q4>` zBxgt{jWheVUFY*<*`v!b#toY`);Dh5uyg0+_WIO@9lN);caC_2c+Qmx67QCY)b6UC z&QlHcuXW}RRr;bA$g+p$&YQPwpPt-P-*EMoV&!eje$ejJ#uJamM_Q)pXJhgS(=60=*NY0Qrui<=h@q*0R zzwJ7Y$g+pz&XUfXw)?Ig-;|soadUDm&RUAs*uU*Mua#w&n^VHT|*96??$_X*f<%u!(3l+|K_9V~b_oHTUt}<3|cUks888WAu zyJGuZUxlGIa(oC6l_{tFCL{K*Eoc7ED$Zlp*;8S#O$o;Lan5O-*}v^NkIS+L<>l$ z)tO~@ZpZ6NU&vS!QFTmay{!D`CeG_d+P5YzaE64^^y}8i8%pn1oiCDQ53Ki%juzKq zv0q(msr~r@vMA1wP#S0UZ@bPH%d-2g>AQ%tlKRNHHN{qZbLtJ8A)z$R?B8~sFOg*r zkqZ-C@TQPg46oDC#bRsi&AB&?cCR-r&U5PPJlMb1nepE$ZOT1l*+c8arQ@i^5Ld1@ zlq~-Tl*+)DeGJQdmSeTjwc|@~A?MOJcdmNv_@3fCPfkj%-mtwa0ypmS%TIp-|v>T(0@ z-*%lZmt{M5Y`C^uR|L67n{v)6o7pGWzwJ72kY%IqE1(aDbIzIGexc6(ZP)n#DYclj8iJ?ck1Wo6`2$0j{)zCCmRIUl*?I-*%n1$+FRH z3Zq4ob57aJKEeKN*ZE3WcAgw^k$t4wiXG*g)Ao_rzwJ6-CCf&)gSQi3$~hvI`5Qa|Dzpj`zo7=N?a@x z?cfMcBzSJy!O}Oc>#DYcyTtiF+d*Ha30K;|lI8y(FEs*J_Hpi9wH@4j3ptm*xpUQa z@Lu8^-45PeN|SmcXR~&YeVjX2Z3p+ra&xvec3H@SiR7Hq)^+UPcAckW+32==Oq_Ad zxxXn5_HVn+)3R)In{rVq=bW~j*}v^N@0Dfe?VP-3=iVKrB-(#^VRFuC%bES#uJhH& z*;l*m`~PuOpK{G<`y1@vcAc-mdDr$$k>$KDm2*y8&g|cIov)Q;qucILai;CgY1?l0 zZ@bRd$+G)RZ{0H~*E6?!P6EZTjB$BD{hU+l-trAX_HVn+_m*W3v*XWt_f)ol79U<9 z@29_Ux3nD3ZNIMc&D)f!{f+yG^Wpz7{_ML*h%5b#lI8!9{sjfD?Bm?IYJcPUTgbWe z&7G_EH|{IW(fy4TQj+9z&Sw1$_Hpi9wZCycSuVQ2F_4^d+IEor+phEdDd*s^f>q*- zV@}!3KEeKN*ZBrnHoCvTbz*WOr!8mpZ@bP9kY%IKVb2#|9CIEe&+}maw(I;rS$2U| zZF?rS*+c)cztP5>ts9qDRgb~Pi1R$T!8NYsme1%&fpQGywCy0S?Bm?I z>M{6OSuXlK<#_R>kCfA%r?7w9b$*;I8{L0CDLLn)-1A`nw(I&)k@quaq_#g}$4r)>w>zwJ6dS(ZK2eBNqcaK$>#ncEH85?O7d?b9~UoLo`I zmDA~ILwcNc{@+`DimZHb`MHTrlUM8wI4R`*a&iL_TtlWUFFswb4{A@6?OJF4Qswhj zH_5UG@8j(Mum{&KafZZ^G8N9+qtMsbzs;Ph+~c~AaxVKDLFG()M*im1{7~Cs#{RX= z{GU~vpC-#5G;`0krgD9Cw(>R}9w5ueYX9p!+odl&BW0gk~wAqmR zeDZjzY`63-o!K{4^7$FEY;-=82RK8V;i)p^!TxRLTqQT2Da$TOeSU8pS31#7bIcu* zUf{W{pV`0GxoV&PS+Z>OF^DUD{*vYYkp2Y)zU*UI=7zkl(tYMP-$Kr%Z|+>R&;M+3 zj&8ddf1&NpX>$Wt_Hpi9wa-s`6rCHiA+#qsPm28jWgtn+hH zUbO4H|8RHxs>$p89St=s>I|HzI|$kooQqmpAJm@fbZ)dMh!>wbE>_&;e5EXhGbFB; z3Fn24Zws&0o;Qngm3EMPJ}7+*C`eiR8Ppl{J4)V49_R7=CeHkym5;&thTXf1Zze{2 zb-wO)9#gN0QlstDdhWmU`In`QRP7^C&e8cyy+MBi(%*ngdAu+y=h9jKw~F;fbUrf{ zgEPb#o-I=zFPg=(ctJ zt7g{dd&F_a@syKt&x3mTCCR&VuG)5&&OL$7^y6^OX`NpxzFz0vK<6Wpb5860GN*HN zzwS_RreBxS_Um5mbe_vMRhOLu*_Jox&ygEB?RecQBAk1?rZdZP4*||Ot@A4*oO@@s z>3zgGE6zEs^Q)ZB(ftj^7VUIfQxIjHL7i9Db<25A#dfgqT|+x|ZIT~CNL{-~6Ze)dTjRolTOjgS7X>l>3Zmeu77+9ZDX7JcT#|I$aI9w%Dq zBSn`p+onE-wBb74m-#una~m2*4J$CkOVdva%e z>*R(_^*zkmJ~JE?CmbPhsZ1P?bF#a0-_*pJ_g2m4#&^N(>)iG?QgJNdT=p^OV-|JD z%sBs>XK}7tKOgrW<$TSaZPSx&7j)jw5M8~Oswn4~3hynmI9Dy_V`gz~x1gyjC}&7e zhZN<^t3|wZ7U!zvd|(hF)E4 zuB|zB1kOcWk!YOrw);+LE3M>4bUVoLNBst=@1Wgf@5#!!bZ(_z7u^ohrr->5hNsJv z$9rdSu3A4ww}YI!;tX+yD`m>#eX}^pT)UqIUiJxF*c4s*@z>! zj|bP1)X(MdSg!U1$@vq)GM`%+W9-_zcl-8oWdWogM?0L8aiu({H$IrWOK09+wVV&! zzF}&*Ui9S{Qp(re&SS1gP;cdAj5LoAiLb}`fSvMHsBy}Ay$WZpTb0!IJCpvf)46MB zY;G`CPHyD1x$zOF^W5FLw(XqG3c>l1wwkf7oaME`a@8MoI!BM?(w!-rSyg6c^COqwM{uBIjweKMC+DvU%iL(`+$#9HI;k`0*X6YRI*!4wB=6F>m2<1|GrUr1T-Y~U zA08T?7#uPCvX!Uwji`@x%uC2~{PQS%zn+z|*4`Dza&L*;pq#&E%31!mO7{|TpUk5A z#%;T&kw1d=qMdbDK?aLR1Rom`G^1EC0^+PL%>O&*r z+4Ai^9FzrVA0R=V70xqfh2KbJjC<}}wXQpM)tcVr_3^=xfqMVYX!=nBxmR~^OwwDo z+S=^L@^(?GK|*QT!EZKkZlxVOV#b*vektv?b=C2QGRGMbO5^-3r}L3B&Z`II&H}IW zkHiyaNGOf-x1G-WZ`(Ol9)`tMd~@1vs;r!6m{oqKiSu0EQ?ahwUk<(c#L${S=XXbz zT0f8nlrtohrkuaq#JQDxK61FHxGQ(d4mlP#Zw*4N^!**5+9KX=i;nIAJl&2bUsXSWABDN(>?XcYj?}9yziRcwbAq8=`qp5 z84@p%3FjsHjdr{uZKKn9$?)JvebwlgRCxWP_0bDf6{~G~&iRQb>3Iq(;kg}0`biV# zR_eO)+^UfpY{LEaEY8#-{cA@?>ip_zvH42#Z^^rG zhJ?~M|H|n+TW)Z=Rcy7j`B&xbI732doPX_fK4X@0)>A}1bCL6{77F{@;)ydPl*ait zPUr02o~*8$7`*$1#Wq`=e@Yg>84^n4{9C7U)B1V5l?*Q2%K4||0nU(68t30Rolj_% z8{=|eMe66Z1B2bgmaEUdByYtT5=!Iz`~SDjEjKEk7f+lap)}5aa5^__2U9t(yQt-2 zu6U2J~Svk|$V4SAdY)kWR z$h&cdgwi73;Tx-zOuAGF>-ymq`T_wR}) z&X7R3YNGMG?=hsuZi?_9Oy?ehthRMf0r`l<&1x^y+ z3<;%i<^p2r-H!7?4d=E`wF|j4KShW$B$UQ^j??*o8Rxe87lql(oUuim%P~f!aqe(B zFUg(TJJp^MmPe;1XGkcGbEnh!aO>QD)vS)UmO14N38iuFaylP8crMcDqG|T$-OO#2FGw<2=vlynk8F6Rn^76;}JsxqlyLNGOf-e5Z3+KRZsf z3%N9BycuUmD2?+1r*oOlj#KSIF3q{u5@$##jq`rt&Mlv67jkLNJrFoULTQ{AI-SdQ z&~d6=$fY@B{5V5GX`J^Db@n%f$B8G-kWd=uMNa3%sos!sZuhjckV|v!0mK;+O5?oP z={$eMx|Q`ceHRs5@Xs%nRp1N>rExyM>AV2v@u5owi%q!a{PQ@Mg`hOf2Rfaj?$_mbRsXr!gza7$@15D3 zW_idxfzi&F%C;C+%xTZoj%(^X=N5CmB01-@&c`=(?x^g1aQWGPz42?y?mbiWS@ue` zmv1L;qx~znRvt?U?h_{@=Q|0z(_h56vh#us8?Tbval<~tyGAxWSEiiwjq_ma`NZU1 zIv>OvD(3UT4ZG_bckSF6^>v+R%cgP8X|GM3B)(o}?#7LBzEg6}X`N4YI`1dtyk~M_ zlydEyV&dgJae=R1lOxslU4pXzj;ADPVJ+LxSj(x1-bG^g`^n#@zv zJ9g)5ZU6E4vM7DwoHn0t<#aws>*YO@SM1s~UFW+CoEJAo#FyO2dAK~!e%Zd>86uwoUKDyT}SC=bWOrPn_j+ z-cOwOZl4TGkMqP1=bW~jZ|ijKV$4gn5f${6an5PW`F2j{{dAme`>u^w#aQ1hIp?(H ze0#U^wkU7>uzU@msEgfK6 zh@G39bJ}w5aXK%=Iq*D%bAFD&oVJhD>vUcq&Xarg?AlWllY4&W}v zOiyW*_|iwpY3sUkoz9EZnTjK(bGI@%=R8DS%i|7C=Yw&MJ5AB=gP@!TWh!}OE-a7l z=yc}yfb>Supg!rD;zYes^0xBWj@OlANOu+Ya_oySzN%wi^Vf4{tK);2Y%7biEzbLYE=uiyE9Th67gDd!e*<9}Pu zcT0KEuJfYdr7{#FW6-Wo&(G}n!{i~yASAfAr#J?wMT)?+oc0+oT zvN%KHb~52Sr*Y@GjOk_N+>Z0Ysrt@c@_qL)#>Mq{%2?_FEo)f%%R`M7O`Q2ZtJZY~ z4ak=i$Tzw2`xtwsubA90U97j=`DR&=>w}Qk%50y)oVhQa{LpI>@)pgXin(#be>fMt z4>r|KTp~hM9p|I|(|OajsSQ`O`wOOwJK$W7KPZj!pws!7|8(9tdF^!D zqq-ZCGbEJ8d8N}?evjVdv+s0vqj*xzkWd=uRZiz61NEuvrs|s}w{N(vzGG^#+*Yy0 z*5}l1I75Q-6?+V>p2fN9JyiP@&hl;BtlS^;GjN84(v>cqq=0P#Wj+1D$tl+gWVLF&~y?afXD_IA7p&UYwP4Kr!nW0nX+9 zX-eZf>~vm~Ir}rCR$DE;I732doY%xTFOP5@5>K2Vp)}4TPUkE)Hf^}B*p6pDA`9aT z38isf>vZ0KCO5VgTk*};$l^FdLTQ{woz7V~M^qa%ZrsEf5=!HIcc*h!&JpRX*Vu6G zSL5ctVKnA+o@rBhLfVwOiYv~LP?~ZccRJ7HMo&aDsP}E)%>5gL(l}2zoo8~RCnPrp z#1m&oD2?+vr}Ip1^oHaH*Vu4|gwi-)=yaYb=iZQV9u!ZUA)z$R>z&Rs<-9DUoX-Ria5=!HIvD0~`oR^1`bDwzP3<;%izQpM~Q`apIsq45G z5NAjzjq^R6&NF?{5A&LADp=cL@15(J)O=oxv|E7 z(k+hM+ln(Jl*ak8CeCx@y;aYR38itaJDodLUs9|*Xnv}!N0b`h zz0Px6KVRO&xs|bkXy;ocXUP7B)_FryXL)zU@r`Kb(?yYThB!m(d__~|j>^vS&mUU3 za%gazRYwHZ1<7YfC`~?ZZ0am;u2{}T4tF;O`j<+pBG*->C-+>vVY_az^%?&>&SfDe zjq|1^&aKoNhgoO2KWUF+te?-Z;jEu$D`}i3oz92n&hAn!J}-##g)$LJ#&j)5%=`h#gTl5gwo{ml}((fH>#HNVWqSF4xzK6lg-{kCY&LmG|pGe z;#~D}^at@RG3FF2RI7^QLEK8thJejT5q*WBF`I3dj@AdM! z^pGk$&%bip=FQu@pQK@fMR5Iko=iEl?oEFOT$|sWyvys|%8K>#;_0PRQTG(!bBIjb z*O2pI{*c9#_loZ$}?&Wk|P%o;D)%&cq{U`g&qSPCZP?~z9 zEaUwC4gSxn#~|n3@{O(XjiPJUjZCnhFF4+CE{{8u3V^ zbk~P=ZgX^;)3(Xwa^fY9t-_yPND+I}@s~U6Us`ou8smIh**MOSV9eY)U+r{0s4VBD z^08QV@45J_BhKd|EJ44na4zp&tJSV?IyZ7-sr2l2?bhvhW}HXj3<=g)ICtrDX4g8M z8|B;^Q_lAiC!8ViK$!~XnFH}Ur*os6dt=J^LE?xrBpxAC;jFcpzIJb?^MPePFQeD* zIpbEH+KmF7A@O9H3g@!MuGQ}2bZ(S0&H?#+lQ`lGiKoj{IL}mM*E^k;q{?~Q)SlIz z-)2@pnQ96=j=fobR8Nb34wBd=6^6=|9j)L$U#$C{rFcG;wZaeB#L%O`OT4s^{H{ zrJN_|*DVd{*6H~P<;-~sTR5NCLzOnE%g>Ds>Aq0Q$+y70bEvioF3n(3w)C?@1ZwJZa|7`iOFVk|}52U)6c; z#tlo1M-bQ@g#I`z)W2#gNZDx6aRYI(JU(?%8Lf z&L{cUBF;Rw$KZ3k&ez4=Z^FNu_e04Mp4)PMuGhJ5#W>rFiWSn~Czm0iq_WN;KTj#! z8{S^^UbW6E0&XVAeC{QWafXD_I6q&?x%4ib*(X)|qVrd*T{}GJ`+Ze5SH@O(fCnTX zIi1G~nmD&|Zq>Eo;)%h0h0e!U%JMiv0-9p3z0m1==oQyZPu90j%6DIG+q_Gz#qQa= z(KDcXtRyD6d3efap3|4k<3-8&CBiZ{S}EtF@3Ud&uAR-q@0)L?@?%`d=aS|BkgtGT zesS_Hom)AF-G5+Z{pt;S>YH|5vol|ByN}l-XGlyylN_Zl?xizt>#BGTyI*qNyPGZe ze?YzuNxsfWHxMwpyR3s_5E4q`{E8;dt+Xlg2I`ySF4tlM z0rOR|4xAyOG|sPdI?H{G{HjO2f5XmoQvqW$uN6<6A)z$RuW~xe=Lgj}DnVW&o;X87 zX`El}be7MSs&mx0R=-+2afXD_IKRf}Ja?cTI$F>to;X87X`El{cV4@4WwHK<`Gl+l zXGkcG^XvY<;?4t3s`}dF1Iq#m0kOoc*fp`xF)>BJT|jCmqG=-n3K5Y23!0|sz4!87 zOz%~VCTgNl)0;I$qb5d;J;rEa)aX0kGv~5@PUgM0chC8R-^aP%*_FNX-5+P}o%u66 z8+0CYOmp7c*6vfbJb}QudLp58&gTZ5<@mf#R_qeq{igLTA8F2zD4p|pLFb|7ob^PO z_o}96NR-a`{GhYk2iNtaJfdqkP7vS>iPAZLC+@sH{;G|ZAKO`S!5I>zbG{(xEc3j6 z^@dnXkC9Sdx6v|e zy*Dz>W9$=3=ls2(v%F7W&$8yqRi~`1ZZ*c2$OB=VAyGQ#i`qEz$NT!4KsnZl^Xja( zHf+4qoFP#<=Zk~R^t@W0sbu{#(2LC(5~Xv#B*A$-&NEuK5#1hV&X6db^Y^oyXSZ%6 zx?N(duh>-mRmoa^+wZMQswUASTChNK0K^ThQaxj+KP>b2g@ z<>q{)Q2UktRcDQHJ6&V!74P55Vy_R5^jwnfp$zMESD1I@TxX4OaQEyf)0^|lU52iI zP`-L6xj+J|pZm~H$foiw*BI;cJg9sA_^ikKIGrVzosHGU-uXvu=DDWxqzUXiDQC-m zaE9b;xp?Ov2c1WD_pDjAVb$qtmagWW7+y&_UmOpY3nWnAn^-?;ZGK|TKND8-T&L%q zTKB;%#RGRl9Jvpc1*+(lz2wf3K}y;OF>eGrmM**NE41)T@0bG5q0 z4aD+h`EriWkib3lTJPr9ZJg^I>sro>dv_ST_9ppyoFReU`8Pr5PU$)GR6 z-E3Ud#(6M*xR3wVM$hBN<;})><)-Nw66kxrx{Y()*%&`AZ#Lc{jyOXCz4J9e=Rwl5 zt`X}k#5X^XT`(JvDBWya+s3)hY%tG9=8Z<;|(H* zGbGSEUmtX4HWHQfXa08*&krLkfxGIp-py}=&O>J|N_+;}dLB4l^msl<;8A+5cXNX| z-zcmei`JQqt@RxCcjjF=*LnP`KM#B6+7(S+-qTw}zptGrkBvBPK%#WVjmo!t{LCNk z>sszM^1f<4tC}aRIz?|HyjdwXPIqvK(fO3x*GboMUZ3ZDiaA4^p+BemKIq&r zd)^Y+by_BiBeMaC(#^)rZJg_zQwGglJbQL)_bJ(AGYR-QYR>zGx$GYuxt)LWtb-DZ6*Kwuiiq-c}?ug^XAI!UQ zu5+yGn7=UdAyVTsk=tJ`kidiVTJNUvEsu3|dhVFNIMsQTs4)wWKsU~f+pOdMIuBd7 zVp-xiH^$3sFv^Fqk??W#_uu+VqwyzmzC&33zdAjS(s?e#W8 zLZWm7eP^3_u5(V=(mDPN{7Uh}84{&){&UcI#1=ir4P84_1p&`QM&u!{cW7< z9P5T|=#l4E6MB}lZX&$BUiQFg`zqTLAB*A^dBB_>6jtZKI`_d5dhV{ogC}k=!-Za9r`8z=Z5zT=~$e5PI;x=BF>ON z@BFv6&hiKQ=sYm@X^Q^7Zn-~g@%y{|dGO(=b5Hznktl8s$4s27V<+^^kF<5}`)mx( zdDy(!`C_@oaRU;iJ8t~FjdPvj#?T&F-WWTnS>4ZDx77dbyX8yi6%sg_D@Fd%#<|XM zLwioV8(t!A^bCp8_55fX=h{7wm)}Ryx{2`iZL$ZB8<4=g^;+-dpKYA$^xVljC*BP& z5;b~;MCp2dtc`P>o`*2cN2b->c&m6a&yYah^W$xt>-0Qi@mzhtp*N7Qxj^{-N9dd8KWE8=WpBG+1>-+{rNGw1n! z(ZcaI^W$URbLHC^?Kx?lai!;q)%RfEf`Xn01$)kXVeTVhMb8hIBp>^pE8ii}o+nL6 znP*(-xnlJ_*tejd=fQ!V2W`w<7(GL*c9IJu(7%48@-2^bbO8+n9C3yOdgtLm=Z=lJi!#f_aYwm80(pK|=4nCa z9XFl6Zh7MSBkeCI6wWDov61jGy_Xqb&f5ux+yAI@tZThLQakbLXjR_Y|9>4<&M6hE z@1gukj&UQ+yK=7cSah2gp3s~-Z&7pJta7jYzy2xtQam70x&ue$TOObF{NBek#vRm| zpZ7SX*}Zt~v_&&xZxitu@x&PtrE?zDW}fRfk1Cw!O+B`2+M?EN^>_Pu`9ho_Q99@C zgU-WS&U3ov%v*3m>t;gR&&pTh42jY??+|qE6z8m2#_=4v;0(z*Y@G9sLFetndH$3I zQ|5Fnl3$$IwO|3a5y+?IYjK7|>6~{8Iu8?Pe!*39-s0dSw;Vqwz!?&ybAEczd276X z-OlE`hmh}&4CGYQ$79`Kc|Y@$SFCG&VZwG7Ij6`HQKRHYw_lFSyO?+7Jc>WlN9T@Z zYqFM})ogch<~&%E$EIa=72lBay0xj!yP0!I@4Q>oc~h?QuI60QJMSKJ-WsosujZnB zydkfZ?(=bhA-@Mf-e)N95IxR%F4^upxNl%K zIybFazF}o}BsTA0tT~tDb-HEt6W@q)_I>aOb1o^0TV(&JbMk#~j5(L|&IbgYx5jJL zs=0WExL5Zu>*Y0j?#z^P%#Im~-x(@GQnBh=KD9ZM&H35FYBp+} zQxc!QB6YJ|@F?kfW+s^B{?5jL)!b5EZjoK#T+%x~OMD~Fn~xhw=ak#Tm&f=O@0aU5 z{wPz;^7D$>sD0d+Q0_5y{XY3}jvFOKZHq7yM+Ii1bNQ0g1IO)R$8n>iUz2%`_(q(2 zj~h9!Rl8GsIc`*}`j$^^&U4Lqs*u?yb&eaIypPP7*4Jfh?~6znmNsfJGxbIC9-~QeQJCJ`=B zUw?@o$LGqEV}^Vi5;<#FI4)P0!>Uih-ak@)c8lx$O!|n*dBvIxWqr>&oO$m$B9;D| z^KAKK#Cdq-ylPF#FXWYDmi7z@{=VlqLFa9!E}Y+-K4<*Iq+g(dAI}F{o3dEafW-yrOf=GbM`!QKEWB{ z40n@DnHNNzmvErV`z5i=CG)KFS<%h&f;P@N|9zZ|Vd|Xs%WCKrXGoOJd126bxH=y< zb;_b<*WA|4gti>paE3(boENomu5;WNvPRzXa_MPnTelG3^0O%1eo4Pxw@!w9tz0

JYA|P!ueu= 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Ξ03~`2hwkFR#YdF_?ZBO((Qk%%(3~`2cl_k%; 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�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 U*BF~&MzNp?^PUdOb;phW0KgCm5dZ)H diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 7f04d0bea1c741a080b57b1dbaeabb6d870c2498..d9a92872357445d8249f00ad9c82339a8b6ff3dd 100644 GIT binary patch literal 176128 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%0AoG}81pZ{7!L%0OWXgB{8#eI-gqIKUaOPW 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 Po&)t9sOP|6IS2j(i^aQ& diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index 7b602f672ee29fb86de16c1b3db3217585e8e129..08f3aef77d8de7a2b2515692940b44df8ee3ab09 100644 GIT binary patch literal 2048 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 delta 6902 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 N@@%5$)@WAf{{dViREz)s diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xf b/si4/ps5ws.si4project/soft_ps5ws.sip_xf index 5139dad770f143cb1e0fcbba26f6a6d0acb6d10c..a6d90189bdf753a833288bcf983d0236d03ea460 100644 GIT binary patch delta 9715 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 b4j%K-XaAbWKL)Xp!*4sjl2T)@03`nhx%$G& delta 5989 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 literal 244 zcmWl|0}cZL006L?ZQHh!>Hp7K*QAvo2+BUa`S#`5ktyd!JeqUj(uHX=Hf`Cp<6p?I tGvoFgxN>OTf=Lsu-T3fs%!Xe-ZryqEY|)ZcYfjBtx9`QPZKEFC`vYtJ2QdHu diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr index fecb06fa6b8d0f1977558678d8387c2369b58e83..400a3bf84909b87759a9c4d3f300c4f3b8749a95 100644 GIT binary patch delta 15036 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 mV59YXKD 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 literal 65536 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd index bef1f5c8dc68f4c3a170008078a1c81a0fbd1a13..1930fc0876e5dd922b5b68e77f72413de5dd71da 100644 GIT binary patch literal 1128 zcmc&yJxjw-6ute_B0@w5H|rqOEmb>-kkkkYl?ECR2T65t5iD3&jiTZrl!CJbQ5P%y z37y5k#l5qoP|(rAd){lB=TO%kcqb?49&X;vd(|nT9ik|OXsFQm`_GY~Zb5upW5!DH z`sO`p=SHmbvm8V5KGFY6o|!GcqDR5EfBxP~h~mO#%IfJfv2(#Njr#`!C8t^$5!dkt&u1c6c1Wy9VFGsMJ?DLaEP>mP>O>T1nKP5 zMG$m|gL~Z^`v=qt4uXr{n=`%S7xaaD@6Go;z0@+g%nXea@wvZ3h3Ox1aksGsYd!c zT(7l{>NTvvTmwOA*&-{2vvjzn#11=S1Kkhvj((yu-bS#itTs6NAd=6nRD zVp_k?t2z}_18&6J=pW)~DXF>Yu2@Is12$%Ej1U(t8SY&6t84ZrT|5#^0*_h9NwaPG HJkb0DNBc>R diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj b/si4/ps5ws.si4project/soft_ps5ws.siproj index 5d040f06eb68f3f0adb46fb11719adc5176058b9..299319edf668639f4be807d6813dc23b447e949f 100644 GIT binary patch literal 23144 zcmeI4S!`5g6vw}zD2pqgsH`ng*`#)%SQVwE7zpBqR7DEI^mb@RXgf})(Yg?g2oENT z5!^+CeUJxYiKvJ%Mq|_$O^Yt(2|Vq6k;ssI0-bB8;px5nolPx#-N@1D!U{pFnR zeA~2qm~*R~8#>Q9cOg^NybV~`m5-k|;m{n`pRwra1D_KnMXd))`I*?_hPuRLC~`>5#mr(YX6X476{ zTSs$KSEtd4+%kDe)#3fI^TF{40Gc5B8DCDu_iYLq{o2T}sWaUO#l4R9wW*dedr^7U zMf0n&05nJR3E~s~+;IvT{n~=O&UDVHskRx7&I!kn zs4GC}ripq4mM%B+YvcdpxW|vjM6+kGcXYS@zNv(D<}hkS3wWF*IxtMr%C+g&b_#A3 za5OlE40GIpI#UKF)V1Zgdh@A*MxQq3wYNUi)Yz2DT8u@XhvfCAV7LuJdGU2HDuKl} zAVi32wB_T`=V))}=<^VcJHYW~+~C-o zDnG&Z_PfxhEzdFAolaU!?B7RBxC-&O2nl^HVy_O6sAP$zm21LYqY;QPeAhVX*QPky zjK`uWZ;)da9Mb@FzUYJj>NWk^$dU6I$n3h=1M|MyH6QEYO9AI5h%rc&9FI$c(Wfnf zqoK3;HO4(; z@g>?^lcjnm;u2x>Y4h_sw9jP{+7w4~V@IEd)S0p1$n_r94C*1|HS5lUP}u0xMvm+s zbNhuRv)Z})mn~g^csw2(gWO}CF8W5pk~aO?$k9u8HD0m2ZrSpN%gXAiEA%6Szb)~| zI`bOdc7~`lD)7Xop#*u2IZeDPk;#^q)$2zFfBUOf-`|CJTz!mlFW_w_iP9*{+`CRF z0`zMmN3Mq_vgOU?38QsJ;_(T<;h2VfA~nAVmk6Uzo8oA?&TIpmSXw0wotjGAV3ye4&q)JhDqAY5pnv528prE>ZALrF=+~w=+KWX3 zk#SE0xN&Wf+tySm@|@#GJ)f3sZFr6tIdWg&$T-|!NWS^}qTR^ryTNS*&`cJ6qYvT= zHu|-34Jd#9u{qh))nacgH@uF^{cHAz)Jg^;Ob>r_f5~U2LyDuhfDCgi1`n<qR3Nj1fk^wgQfx_8MtRJYE8hC*qZv+tdzu zeZ9UzpSFPGk@*a#HJ!H3+)v!~>vD{Ho*v@dE&$?i#~#FnV>JdqMqRyaNj*5$B7rxeeV*vYsK65+ zJ_;+B5wOezqWv* z&v0F`+Z;mz5stm6GbLzpj!oSg1x$SSD6oDUEhe^b>;cCOpi?P&7HzJPwGyGGf^nE_O(B)q_8i~uld-g25 z6!FM209QiTUhp*;c}}K!-IjiB0Y`t_lTNnBTayWMvl@xVx4;cQadl^l-iS(I@%=ZB zMglQ_A?x8Ufnyx^=88TkG;w}1R7 zIPyGhFWOT?85D2sOJ4(pjec$XjaMN@d+}Iz`56~79?6koNKRv@?g8SFK5ezQ5#~6@ zVE-82zupNRQ$^zuk45;-SPL8d+I0VjLy(?+X3)1!{dK`Jh{s0ka~;CVmWuuwmpe~- zy8=MJwg`^)5_{seo5*nl2HkA{#4~5q8g3p&7=7Bvk?Ry*bw#`_;bl7Ptx{lcQ!%#Z Z)%RnoFqxi>x!^)TqUxd!M2Syx{0FXs?oa># literal 21176 zcmeI4d2Ccw6vpo$1r#@gR*lahOR*r8vP#s5N{b4GcKSNDBeb2&Ol4CjDnXHm z7)cb2QiUiGlY$Tk;1abeOHhJj;)V){iXw}Mi3s?8@7-5sPTv^+=K3XH-@G|9f4pDL zJ$IdEw^eGQQmqS=QbXW;c(f0H{+AI1PMtthXHn3<7yJEu8GPdg`jJf&%5Yv!ui+b4#*Gu4dd8Mh_uEUZ3 z`FUoRNA<+mAMAXb18yjh>MHHk8lLQK7?(=OM}LK7V#|JOK}Bup@tE%gDu3QbZDVuCWvtggWNMk?Y~GvFm1Y(}$hOLqGE_+VwO5Vh+;dFO{^Md&Z=gkAkCdGsC{ySACZc zj$dHhvnLMFDlFmxt(qS9Ub2_u$o0o)usUF7Z>?0*hF|RddOq6qGJv{CJO2uYT8VRM z{>!*j0!JgOqf(ppIvigDNACAxdBXP7a=@eEF)rnDEFOAqQFhjF88+g+a7O)l&I?zg zU9ZCv->m&AHnh0*DD#nVDYrhxuZNqKmIDs#v)lD&D270(uGjuq!qWGQOOYe@xva=d zIk`DzR>&7qob~Xn*hJU|KrD;&RxIpv#kB^G7h_U_qiLyV<5-yKa7@F#!U4R)=^*`V zl649_U9`XJ{&DN0-Y+z6%tH>1Db9Z3VKnO9xW7evQx|8Q;$eO$PK-;r90P$+xVGBN zg|ky94%zi_H1d(>vbgt8C+n{nlM)<_%*T$eI~@Ci<6Z#be43tycFlh0ML1q^zRj3h zADw+yBg>^bADY9IDKI*PtZJ9%4-H3FTN+`a%|o&G_b3gUACpo z2k2++LYs~P5c_O;P?G&?dH#${U5;qmrXGL981Xl|pE=u3DNJEhp7v~T^%CP!E=Rq4 zZD2MkbZr3x>j;{qEmPLAHlK$GOYzmIXUxUXuFAxKskiaG)|6i3Y-krR2OzM;-qZ?Rq~r4g(<0Y3OoHT+qzz-!I_O zEXJg~IhvJ{-E#KZ{q-T8kC}i(uSt@Rj7gCr$B$D7WM`W>>cQTBV^iu*{GO{T#*3_l zw`!*`89l_fR02m!M$NbnH8|_xoxqW2=y|4sUZWphj=LF?ayg#+ohFZ+MU46lNZr?^ zyLzKO4#D`b0f0Ciq#L-1<{`$U66&MfxXnw-CBN@lxB&C(4(;%}La^)yNc7J*P(K{k zm7;w!Ce@OoS$zz7w7MsE;3mwk?*+#vaG#}p*lU4I$8bpyIr7{d_qlQmJtvh?UGxoq z?^=jl+yFWQwNIzwACBPl-3i2;xOmH6e>}(0yj&!YH;)Xs{{e7Zg?yZZ`$5`2$cYR; z3^6X{wrieiw&#XXD`eXEXUh6dhO|e!4ge1KusCd_kBPd7w`?&c<#MzcP7X{rjUjoY z7d6bf?PSci1>^9ZxaZm#z0M1mj^UD^796dFun{+fACCB9G4iny9B1K)uhH(0fg{i8 zRSF7>OR=VM-ZO+$m*RH?N8>WGY3Kd+xfHT^ z9)P%ZMyDbfiIRH_@nTHMZPy9?jA0~u6@S%g1b+815pe2Z41a8=;&(`#6BfboVqD6L zBWH%uaP1UR`kamX8#=T>eS8FP(qJy%(o2){*NjR1D@Q}}vdg|daz`Q`SsOX#=GdD) zhJJ_4d$Z=)Q9xr{>K~NC=bZom diff --git a/source/app/app_config.c b/source/app/app_config.c index b7c64be..7081bfd 100644 --- a/source/app/app_config.c +++ b/source/app/app_config.c @@ -1,5 +1,5 @@ #include "app_config.h" -#include "../bsp/cs1232.h" +///#include "../bsp/cs1232.h" #include "../bsp/chipid.h" #include "../msp/eeprom.h" #include "../clib/clib.h" @@ -134,8 +134,17 @@ void L3_reg_reset(void) G.ccmd_slaver_info[2].bytes = 0; G.ccmd_slaver_info[2].buf = (U8*)&R.pack_order; G.ccmd_slaver_info[2].mask = 0; - G.ccmd_slaver_info[2].extra_num = 0; - + G.ccmd_slaver_info[2].extra_num = 5; + //普通码 + G.ccmd_slaver_info[3].slaver = SLAVER_TCP_SERVER_ID; + G.ccmd_slaver_info[3].oper = MODBUS_OPER_WRITE_M; + G.ccmd_slaver_info[3].reg = 0x05; + G.ccmd_slaver_info[3].regnum = 0x02;//基础数量,程序每次应动态添加点数 + G.ccmd_slaver_info[3].bytes = 0; + G.ccmd_slaver_info[3].buf = (U8*)&R.oid3_order; + G.ccmd_slaver_info[3].mask = 0; + G.ccmd_slaver_info[3].extra_num = 0; + G.modbusstmp = 0; G.authed = 0; G.flowStartVal = 1; diff --git a/source/app/app_config.h b/source/app/app_config.h index beb6e7a..6b8aff8 100644 --- a/source/app/app_config.h +++ b/source/app/app_config.h @@ -13,7 +13,7 @@ #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) -#define POINT_LEN 48 +#define POINT_LEN 32///cc fixme //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG @@ -22,12 +22,13 @@ //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) -#define CCMD_SLAVER_INFO_MAX 3 +#define CCMD_SLAVER_INFO_MAX 4 typedef struct pen_point { U16 x_axis;//横坐标 U16 y_axis;//纵坐标 U32 time;//时间 + U8 angle;//角度 }PenPoint; typedef struct global_register { @@ -90,8 +91,10 @@ typedef struct global_param U8 mcu_id[7]; U8 pen_up; - - CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; + + U8 oid_p; + U8 oid_x; + CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX];///16*3 }GlobalParam; extern GlobalParam G; @@ -104,7 +107,7 @@ typedef struct vU8 maxsize;//数组最大长度 vU8 readdr;//缓冲区读写结束新地址 vU8 relen;//从缓冲区头开始的新长度 - PenPoint buf[POINT_LEN * 2]; + PenPoint buf[POINT_LEN * 2];//8*48*2 }WR_Buf; extern WR_Buf wr_buf; extern void L3_param_init(void); diff --git a/source/app/app_task_tcp.c b/source/app/app_task_tcp.c index 9e8c5db..655f383 100644 --- a/source/app/app_task_tcp.c +++ b/source/app/app_task_tcp.c @@ -1,6 +1,6 @@ #include "app_task_tcp.h" -#include "../msp/uart0.h" -#include "../msp/uart2.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart2.h" #include "../app/task_w600.h" #include "../app/app_config.h" @@ -53,65 +53,71 @@ void L3_task_tcp_handle(TS_tcp *s) L2_task_go(D_task_tcp_wait_modbus_ack); TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack //L0_uart0_uc(s_uart2_tcp_rec.ok + '0'); - if(s_uart2_tcp_rec.ok) + if(s->slaverIndex != 2 && s->slaverIndex != 3) { - s_uart2_tcp_rec.ok = 0; - s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; - s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); - L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); - if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) + if(s_uart2_tcp_rec.ok) { - s->ackFlag = 1; - - switch(s->slaverIndex) + s_uart2_tcp_rec.ok = 0; + s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; + s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); + //L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); + if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) { - case 0://如果oper == 90:成功,91 == 不成功 - switch(G.ccmd_slaver_info[s->slaverIndex].oper) + s->ackFlag = 1; + + switch(s->slaverIndex) + { + case 0://如果oper == 90:成功,91 == 不成功 + switch(G.ccmd_slaver_info[s->slaverIndex].oper) + { + case 0x90: + //L0_uart0_sendstr("11111"); + G.authed = 1; + break; + case 0x91: + G.authed = 0; + break; + } + #if 0 + if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90) { - case 0x90: - //L0_uart0_sendstr("11111"); + L0_uart0_sendstr("111"); G.authed = 1; - break; - case 0x91: + G.au_succ = 1; + } + else + { + L0_uart0_sendstr("222"); G.authed = 0; - break; + G.au_fail = 1; } - #if 0 - if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90) - { - L0_uart0_sendstr("111"); - G.authed = 1; - G.au_succ = 1; + #endif + break; + case 1: + break; + default: + break; } - else - { - L0_uart0_sendstr("222"); - G.authed = 0; - G.au_fail = 1; - } - #endif - break; - case 2: - break; - default: - break; } - } - + L2_task_go(D_task_tcp_switch_next_slaver); - } - else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 - { - if(++s->retryTimes < 3) - { - L2_task_go(D_task_tcp_send_modbus_pkg); } - else - { - L2_task_go(D_task_tcp_switch_next_slaver); + else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 + { + if(++s->retryTimes < 3) + { + L2_task_go(D_task_tcp_send_modbus_pkg); + } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } } } - + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } //L0_uart0_uc(s->ackFlag); TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个 diff --git a/source/app/app_task_tcp_control.c b/source/app/app_task_tcp_control.c index 59437ba..a70c4c1 100644 --- a/source/app/app_task_tcp_control.c +++ b/source/app/app_task_tcp_control.c @@ -1,5 +1,5 @@ #include "app_task_tcp_control.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" #include "../app/task_w600.h" #include "../app/app_task_tcp.h" @@ -34,7 +34,7 @@ void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区 if(s_task_gm35_flow.conn_ok) { //3s一次发送数据包 - if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) + if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 1) { if(!G.authed)//authed == 0 { @@ -42,9 +42,15 @@ void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区 //发送认证包 G.ccmd_slaver_info[0].mask = 1; } - else //authed == 1 + else if(G.oid_x) { - G.ccmd_slaver_info[2].mask = 1; + G.oid_x = 0; + G.ccmd_slaver_in` fo[2].mask = 1; + } + else if(G.oid_p) + { + G.oid_p = 0; + G.ccmd_slaver_info[3].mask = 1; } ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; } diff --git a/source/app/main.c b/source/app/main.c index ff8cd22..8f6358e 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -85,6 +85,13 @@ void L0_main_init(void) //开启全局中断 EA = 1; + L0_uart0_sendstr("\r\nasV1.a"); + #if 0 + L1_oid_init(); + printf(" ok\r\n"); + while(9) + {L1_Oid_readoid();} + #endif //系统时钟初始化 L0_timer0_Init(); //L0_key_init(); @@ -101,6 +108,7 @@ void L0_main_init(void) //w600任务初始化 L3_task_gm35_flow_init(W600_ST); //笔头任务初始化 + L1_oid_init(); L3_task_pen_head_write_init(); L3_task_pen_head_read_init(); @@ -123,19 +131,62 @@ void main(void) while(1) { - if(1 == s_nos_tick.t1s_heatbeart) + L1_Oid_readoid(); + + if(1 == s_nos_tick.t1s_heartbeat)//1s + { + s_nos_tick.t1s_heartbeat = 0;//置0清空 + + D_print_heartbeat() + {///这个地方可以放置心跳的打印信息 + ///如果其他的打印存在,并且关闭了这个打印的话,这个打印会临时被关闭,下一次打开 + + L0_uart0_uc('.'); + + } + } + + if(L3_tick_interval(100L))/////10ms + {L2_tick_stamp(); + D_print_heartbeat_close(); + + /// L1_as_readA(0);//读取倾角传感器数据 + /// Lc_buf_copy_uc(s_uart1_rec.buf,s_as[0].d,8); + // s_uart1_rec.buf= 传感器数据 + /// ff 08 xh xl yh yl zh zl + /// s_uart1_rec.ok =1; + } + /// L2_sd_save(); +///////////////////////////////////////// + #if 0 + if(s_uart0_rec.ok) { - s_nos_tick.t1s_heatbeart = 0; - //LED0 ^= 1; + //// buf 0 1 2 3 4 5 6 7 + //// FA 0D 36 20 10 55 05 06 + s_uart0_rec.ok = 0; + L1_uart0_uchexArray(s_uart0_rec.buf,s_uart0_rec.num); + + switch(s_uart0_rec.buf[1]) + { + case 0x0d: + /// L1_sd_debug(&s_uart0_rec.buf[2]); + break; + case 0x00: + L1_oid_debug(&s_uart0_rec.buf[2]); + break; + default: + break; + } } + #endif //WIFI - //L3_uart2_exp_protocol(&s_uart2_at); - //L2_task_gm35_flow_handle(&s_task_gm35_flow); + L3_uart2_exp_protocol(&s_uart2_at); + L2_task_gm35_flow_handle(&s_task_gm35_flow); //笔头数据采集 - L3_task_pen_head_write_handle(&s_task_pen_write); - L3_task_pen_head_read_handle(&s_task_pen_read); + /// L3_task_pen_head_write_handle(&s_task_pen_write); + // L3_task_pen_head_read_handle(&s_task_pen_read); //寄存器值监控 //L3_task_reglisten_handle(&s_task_reglisten); @@ -147,10 +198,10 @@ void main(void) //L3_task_modbus_handler2(&s_uart2_rec); //tcp发送 - //L3_task_tcp_handle(&ts_tcp); + L3_task_tcp_handle(&ts_tcp); //tcp master->slaver发送逻辑控制 - //L3_task_tcp_control_handle(&ts_tcp_control); + L3_task_tcp_control_handle(&ts_tcp_control); } } //end main diff --git a/source/app/main.h b/source/app/main.h index 6038f04..5b2493b 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -37,20 +37,20 @@ #ifndef _MAIN_H #define _MAIN_H -#include "../msp/uart0.h" -#include "../msp/uart2.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart2.h" #include "../msp/eeprom.h" #include "../bsp/bsp_config.h" #include "../bsp/chipid.h" -#include "../bsp/cs1232.h" +///#include "../bsp/cs1232.h" #include "../bsp/rs485.h" #include "../app/app_config.h" #include "../app/task_modbus.h" -#include "../app/task_adc.h" -#include "../app/task_debug.h" +///#include "../app/task_adc.h" +///#include "../app/task_debug.h" #include "../app/task_register.h" #include "../app/task_encrypt.h" #include "../app/task_w600.h" @@ -59,6 +59,10 @@ #include "../app/app_task_tcp.h" #include "../app/app_task_tcp_control.h" +#include "asp_oid.h" +#include "tick.h" +#include + ////////////////////////////////////////////////////////////////// diff --git a/source/app/task_adc.c b/source/app/nouse/task_adc.c similarity index 100% rename from source/app/task_adc.c rename to source/app/nouse/task_adc.c diff --git a/source/app/task_adc.h b/source/app/nouse/task_adc.h similarity index 100% rename from source/app/task_adc.h rename to source/app/nouse/task_adc.h diff --git a/source/app/task_debug.c b/source/app/nouse/task_debug.c similarity index 100% rename from source/app/task_debug.c rename to source/app/nouse/task_debug.c diff --git a/source/app/task_debug.h b/source/app/nouse/task_debug.h similarity index 100% rename from source/app/task_debug.h rename to source/app/nouse/task_debug.h diff --git a/source/app/task_key b/source/app/nouse/task_key similarity index 100% rename from source/app/task_key rename to source/app/nouse/task_key diff --git a/source/app/task_pen_head.c b/source/app/task_pen_head.c index b4a287c..afa477f 100644 --- a/source/app/task_pen_head.c +++ b/source/app/task_pen_head.c @@ -1,5 +1,5 @@ #include "task_pen_head.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" struct _s_task_pen_head_ s_task_pen_write; struct _s_task_pen_head_ s_task_pen_read; diff --git a/source/app/task_register.c b/source/app/task_register.c index 1499c64..7abb600 100644 --- a/source/app/task_register.c +++ b/source/app/task_register.c @@ -13,7 +13,7 @@ #include "task_register.h" #include "../app/app_config.h" #include "../bsp/bsp_config.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" #include "task_w600.h" //============================================= diff --git a/source/app/task_w600.c b/source/app/task_w600.c index d3871a4..c43c793 100644 --- a/source/app/task_w600.c +++ b/source/app/task_w600.c @@ -13,8 +13,8 @@ #include "task_w600.h" #include "app_config.h" -#include "../msp/uart2.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart2.h" +#include "../msp/msp_uart0.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; //TS_tcp_control ts_tcp_control; @@ -41,7 +41,7 @@ void L3_gm35_send_str(U8 *str) L0_uart2_sendstr(str); if(G.debug) { - L0_uart0_sendstr(str); + //L0_uart0_sendstr(str); } } @@ -52,7 +52,7 @@ void L3_gm35_send_data(U8 *buf , U8 len) L0_uart2_sendArray(buf,len); if(G.debug) { - L0_uart0_sendArray(buf,len); + //L0_uart0_sendArray(buf,len); } } diff --git a/source/app/task_w600.h b/source/app/task_w600.h index 20c869d..385b419 100644 --- a/source/app/task_w600.h +++ b/source/app/task_w600.h @@ -1,4 +1,4 @@ -//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_gc6133.c.h @@ -25,7 +25,7 @@ #define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 //#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令 #define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令 -#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.83\",4001\r\n" //连接服务器 +#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"test.tall.wiki\",38195\r\n" //连接服务器 #define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据 #define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接 #define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态 diff --git a/source/asp/asp readme.txt b/source/asp/asp readme.txt new file mode 100644 index 0000000..1d99412 --- /dev/null +++ b/source/asp/asp readme.txt @@ -0,0 +1,16 @@ +板级到app还有对芯片功能应用配置的一层 + +20210124 发现传统的TTSS架构中总是欠缺点 +例如一个外设芯片,因为不是mcu固有的外设,所以应该归到BSP(板级支持里面) +其读写寄存器等基本功能放在BSP中,但是其和app应用相关的模式却发现并不适合 +直接放到BSP中,也不适合放到APP中,因为实际的应用只是使用外设获得IO数据 +而已。故而修正 + +main: +app: +asp:基于mcu外设或者板级外设芯片的功能,这些功能为app服务,但是功能配置复杂,单独列出,方便移植。 +bsp:外设芯片自身功能,如果芯片为app服务的函数功能比较单一,不像无线芯片一样配置复杂的话那么也可以放在bsp中 +msp:mcu自身的外设功能,如果特别复杂,比如类似MAC驱动等,可以把一部分接近app的功能放到asp中 +clib: +ctask: +tpc:协议相关 \ No newline at end of file diff --git a/source/asp/asp_SDX1.H b/source/asp/asp_SDX1.H new file mode 100644 index 0000000..4e24cee --- /dev/null +++ b/source/asp/asp_SDX1.H @@ -0,0 +1,82 @@ +#ifndef __SDX1_H__ +#define __SDX1_H__ + +/*★★★★★★★★★★★★★★★★★★★★★★★★ + 《振南的znFAT--嵌入式FAT32文件系统设计与实现》 + 一书[上下册]已经由北航出版社正式出版发行。 + 此书是振南历经3年多时间潜心编著,是现今市面上唯 + 一一套讲述FAT32文件系统、SD卡等嵌入式存储技术的 + 专著。书中还介绍了大量的编程技巧与振南的开发经验。 + 请在各大网络销售平台搜索“znFAT”,即可购买。 + 在全国各大书店也有售。 + 振南的ZN-X开发板,支持51、AVR、STM32(M0/M3/M4)等 + CPU。此板可与书配套,板上各种精彩的实验实例请详见 + 振南网站www.znmcu.cn + ★★★★★★★★★★★★★★★★★★★★★★★★*/ + +/*************************************************************************************** + ★程序模块:【振南ZN-X开发板】上『SD卡1』驱动程序 〖STC51部分:STC15L2K60S2〗 + ★功能描述:实现了SD卡的扇区读写、多扇区读写、扇区擦除、读取总物理扇区数等功能 + 此驱动可支持几乎所有的SD卡,包括MMC/SD/SDHC + ★配套教程与参考资料: + ●《振南的znFAT--嵌入式FAT32文件系统设计与实验》一书 下册 第11章《SD卡物理驱动》 + ●《振南的单片机高级外设系列视频教程》之《SD卡专辑》 +****************************************************************************************/ + + +#include "../bsp/bsp_config.h"///#include "sd_type.h" +#include "znfat.h"///#include "sd_type.h" + +////#include + +sbit SD1_CS =P5^5; //SD卡片选 输入 + + +#define D_FILE_SECTOR 65544 + + +#define SET_SD1_CS_PIN(val) (SD1_CS =val) + +#define TRY_TIME 200 //向SD卡写入命令之后,读取SD卡的回应次数,即读TRY_TIME次,如果在TRY_TIME次中读不到回应,产生超时错误,命令写入失败 + +#define TRY_TIME2 200 //add by cc +//相关宏定义 +//------------------------------------------------------------- +#define SD_VER_ERR 0X00 +#define SD_VER_MMC 0X01 +#define SD_VER_V1 0X02 +#define SD_VER_V2 0X03 +#define SD_VER_V2HC 0X04 + +#define INIT_ERROR 0x01 //初始化错误 +#define INIT_CMD0_ERROR 0x02 //CMD0错误 +#define INIT_CMD1_ERROR 0x03 //CMD1错误 +#define INIT_SDV2_ACMD41_ERROR 0x04 //ACMD41错误 +#define INIT_SDV1_ACMD41_ERROR 0x05 //ACMD41错误 + +#define WRITE_CMD24_ERROR 0x06 //写块时产生CMD24错误 +#define WRITE_BLOCK_ERROR 0x07 //写块错误 + +#define READ_BLOCK_ERROR 0x08 //读块错误 + +#define WRITE_CMD25_ERROR 0x09 //在连续多块写时产生CMD25错误 +#define WRITE_NBLOCK_ERROR 0x0A //连续多块写失败 + +#define READ_CMD18_ERROR 0x0B //在连续多块读时产生CMD18错误 + +#define GET_CSD_ERROR 0x0C //读CSD失败 + +//------------------------------------------------------------- +UINT8 SD1_Init(); //SD卡初始化 + +UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入地址为addr的扇区中 +UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer); //从地址为addr的扇区中读取数据到buffer数据缓冲区中 +UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中 +UINT8 SD1_Read_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中 +UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end); +UINT32 SD1_GetTotalSec(void); //获取SD卡的总扇区数 +UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer);////从 +UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer); +UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end); + +#endif diff --git a/source/asp/asp_oid.c b/source/asp/asp_oid.c new file mode 100644 index 0000000..5ebb2e7 --- /dev/null +++ b/source/asp/asp_oid.c @@ -0,0 +1,135 @@ +#include "asp_oid.h" +///#include "myfun.h" +////#include "sd_type.h" asp_oid.c + + + +void L1_oid_init(void) +{ + + L0_Oid_Init(); + LD_Oid_SCK_LOW(); +} + + + +void L1_oid_main(void) +{ + +} + +#ifdef doc2342342 + 命令1个字节 + + //// fa 00 |00 04 00 03 46 A9 + //// buf 0 1 |2 3 4 5 6 7 + + //// fa 00 |35 20 10 55 05 06 + | | |cmd + |-filter | dat + oid cmd -| + + ////读取2010 fa 0d |36 20 10 55 05 06 + +#endif + + + + +void L1_oid_debug(u8 *para) +{ + uint32_t r; + TS_oid_cmd *t =(TS_oid_cmd *)para; +// ET0 = 0; + L0_uart0_sendArray("\r\noid debug:",13); + //// fa 00 |00 04 00 03 46 A9 + //// buf 0 1 |2 3 4 5 6 7 + + //// fa 00 |11 20 10 55 05 06 + //// UDCMD_wakeup + + //// fa 00 |22 20 42 53 64 75 + //// cmd=20 + switch(t->cmd) + { + case UDCMD_wakeup: + L0_uart0_sendstr("\r\nL1_OID_WakeUp "); + L1_OID_WakeUp(); + break; + case UDCMD_cmdsend: + ///fa 00 22 cmd 42 53 64 75 + ///fa 00 |22 cmd 42 53 64 75 + L0_uart0_sendstr("\r\ncmd:"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + L1_oid_TransCmd(t->dat); + break; + case UDCMD_log: + L0_uart0_sendstr("\r\nLogRegister"); + /// LogRegister(); + break; + case UDCMD_CheckVersion: + L0_uart0_sendstr("\r\n CheckVersion"); +/// L1_oid_CheckVersionAndInit(eAppDevice); + // while(1) + { + // OidTaskLoop(); + } + break; + case UDCMD_get: + L0_uart0_sendstr("\r\n UDCMD_get"); + while(9) + { + L1_Oid_readoid(); + + } + + break; + case UDCMD_readreg: + + ///fa 00 22 cmd 42 53 64 75 + ///fa 00 |22 cmd 42 53 64 75 + r = L1_oidReadRegister (t->reg); + + L0_uart0_sendstr("\r\n read reg:"); + L0_uart0_ushex(t->reg); + Lc_delay_ms(1); + L0_uart0_sendstr(" = "); + L0_uart0_ulhex(r); + + L0_uart0_uc(0x09); + break; + #if 0 + case UDCMD_testtime_us: + L0_uart0_sendstr("\r\nUDCMD_testtime_us"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + while(9) + { + /// delay_us(t->dat); + D_IO_LEDkey1_ON(); + // delay_us(t->dat); + D_IO_LEDkey1_OFF(); + } + break; + + case UDCMD_testtime_ms: + L0_uart0_sendstr("\r\nUDCMD_testtime_ms"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + + while(9) + { + /// delay_ms(t->dat); + D_IO_LEDkey1_ON(); + // delay_ms(t->dat); + D_IO_LEDkey1_OFF(); + } + break; + #endif + default: + L0_uart0_sendstr("\r\ncmd error!!"); + L0_uart0_0d0a(); + break; + } + ET0 = 1; +} + + diff --git a/source/asp/asp_oid.h b/source/asp/asp_oid.h new file mode 100644 index 0000000..96b0c3e --- /dev/null +++ b/source/asp/asp_oid.h @@ -0,0 +1,38 @@ +#ifndef __asp_oid_H__ +#define __asp_oid_H__ + +/************************************************************************************** + asp_oid.c +****************************************************************************************/ + +#include "bsp_oid.h" + +#include "msp_uart0.h" + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>for debug +typedef struct _ts_debug_oid_cmd_ +{///6bytes 去掉了filter和命令字 + U8 cmd; + /// U8 rw; /// 写还是读: =1 读,=0写 + U8 dat; ///数据 + U16 reg; /// + U16 end; /// +}TS_oid_cmd; + +#define UDCMD_wakeup 0x11 /// +#define UDCMD_cmdsend 0x22 /// +#define UDCMD_readreg 0x23 /// +#define UDCMD_log 0x33 /// +#define UDCMD_get 0x44 /// +#define UDCMD_CheckVersion 0x45 /// +#define UDCMD_testtime_us 0x55 /// +#define UDCMD_testtime_ms 0x66 /// + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=200) + { + L0_uart0_uc('E'); + L0_uart0_0d0a(); + SET_SD1_CS_PIN(1); + return(INIT_CMD0_ERROR);//CMD0写入失败 + } + } + //将6字节的命令序列写入SD卡 + SD1_SPI_WByte(pcmd[0]); + SD1_SPI_WByte(pcmd[1]); + SD1_SPI_WByte(pcmd[2]); + SD1_SPI_WByte(pcmd[3]); + SD1_SPI_WByte(pcmd[4]); + SD1_SPI_WByte(pcmd[5]); + + if(pcmd[0]==0X1C) SD1_SPI_RByte(); //如果是停止命令,跳过多余的字节 + + do + { + r=SD1_SPI_RByte(); + time++; + }while((r&0X80)&&(time= TRY_TIME2) + { + L0_uart0_uc(0x09); + L0_uart0_uc('R'); + L0_uart0_uc(0x09); + return(INIT_CMD0_ERROR);//CMD0写入失败 + } + }while(r!=0x01); + L0_uart0_uc(0x09); + L0_uart0_uc('6'); + L0_uart0_uc(0x09); + + if(1==SD1_Write_Cmd(pCMD8))//写入CMD8,如果返回值为1,则SD卡版本为2.0 + { + L0_uart0_sendstr("SDver:2.0\r\n");/////4g卡 + rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的R7回应,通过它可知此SD卡是否支持2.7~3.6V的工作电压 + rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); + + if(rbuf[2]==0X01 && rbuf[3]==0XAA)//SD卡是否支持2.7~3.6V + { + L0_uart0_sendstr("2.7~3.6V=");/////4g卡 + + time=0; + do + { + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41H);//写入ACMD41,针对SD2.0 + time++; + if(time>=TRY_TIME) + { + return(INIT_SDV2_ACMD41_ERROR);//对SD2.0使用ACMD41进行初始化时产生错误 + } + }while(r!=0); + + if(0==SD1_Write_Cmd(pCMD58)) //写入CMD58,开始鉴别SD2.0 + { + rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的OCR,其中CCS指明了是SDHC还是普通的SD + rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); + + if(rbuf[0]&0x40) + { + SD1_Ver=SD_VER_V2HC; //SDHC卡 + SD1_Addr_Mode=1; //SDHC卡的扇区寻址方式是扇区地址 + } + else SD1_Ver=SD_VER_V2; //普通的SD卡,2.0的卡包含SDHC和一些普通的卡 + + } + + if(!SD1_Addr_Mode) + { + //addr = addr * 512 将块地址(扇区地址)转为字节地址 + L0_uart0_uc(0x30+SD1_Addr_Mode); + L0_uart0_sendstr("<<9 \r\n");/////4g卡 + } + else + { + L0_uart0_uc(0x30+SD1_Addr_Mode); + L0_uart0_sendstr("1 mass adr \r\n");/////4g卡 + } + + } + } + else //SD V1.0或MMC + { + L0_uart0_sendstr("SD V1.0 or MMC \r\n"); + //SD卡使用ACMD41进行初始化,而MMC使用CMD1来进行初始化,依此来进一步判断是SD还是MMC + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0 + + if(r<=1) //检查返回值是否正确,如果正确,说明ACMD41命令被接受,即为SD卡 + { + SD1_Ver=SD_VER_V1; //普通的SD1.0卡,一般来说容量不会超过2G + + time=0; + do + { + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0 + time++; + if(time>=TRY_TIME) + { + return(INIT_SDV1_ACMD41_ERROR);//对SD1.0使用ACMD41进行初始化时产生错误 + } + }while(r!=0); + } + else //否则为MMC + { + SD1_Ver=SD_VER_MMC; //MMC卡,它不支持ACMD41命令,而是使用CMD1进行初始化 + + time=0; + do + { + r=SD1_Write_Cmd(pCMD1);//写入CMD1 + time++; + if(time>=TRY_TIME) + { + return(INIT_CMD1_ERROR);//MMC卡使用CMD1命令进行初始化中产生错误 + } + }while(r!=0); + } + } + + if(0!=SD1_Write_Cmd(pCMD16)) //SD卡的块大小必须为512字节 + { + SD1_Ver=SD_VER_ERR; //如果不成功,则此卡为无法识别的卡 + return INIT_ERROR; + } + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟 + + SD1_SPI_SPEED_HIGH(); //SPI切到高速 + + return 0;//返回0,说明复位操作成功 +} + +/****************************************************************** + - 功能描述:对SD卡若干个扇区进行擦除,擦除后扇区中的数据大部分情况 + 下为全0(有些卡擦除后为全0XFF,如要使用此函数,请确认) + - 参数说明:addr_sta:开始扇区地址 addr_end:结束扇区地址 + - 返回说明:调用成功,返回0x00,否则返回错误码 + + add by cc 如果addr_sta=addr_end 命令无效,一次至少擦除两个扇区 + CMD32 ERASE_WR_BLK_START Mandatory + +CMD33 ERASE_WR_BLK_END Mandatory + +CMD38 ERASE Mandatory + + Class5 (擦除卡命令集): + + CMD32:设置擦除块的起始地址. + + CMD33:设置擦除块的终止地址. + + CMD38: 擦除所选择的块. + + + ******************************************************************/ + +UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end) +{ + UINT8 r,time; + UINT8 i=0; + UINT8 pCMD32[]={0x60,0x00,0x00,0x00,0x00,0xff}; //设置擦除的开始扇区地址 + UINT8 pCMD33[]={0x61,0x00,0x00,0x00,0x00,0xff}; //设置擦除的结束扇区地址 + UINT8 pCMD38[]={0x66,0x00,0x00,0x00,0x00,0xff}; //擦除扇区 + + if(!SD1_Addr_Mode) + { + addr_sta<<=9;addr_end<<=9; + //addr = addr * 512 将块地址(扇区地址)转为字节地址 + + } + + pCMD32[1]=addr_sta>>24; //将开始地址写入到CMD32字节序列中 + pCMD32[2]=addr_sta>>16; + pCMD32[3]=addr_sta>>8; + pCMD32[4]=addr_sta; + + pCMD33[1]=addr_end>>24; //将开始地址写入到CMD32字节序列中 + pCMD33[2]=addr_end>>16; + pCMD33[3]=addr_end>>8; + pCMD33[4]=addr_end; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD32); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD33); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD38); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + return 0; + +} + +/**************************************************************************** + - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中 + - 参数说明:addr:扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + +cc modify :tf卡的读写次数是10W次,就按1万次来算,3600s 一个小时36000十个小时 + ****************************************************************************/ + +UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令) +{ + UINT8 r,time; + UINT16 i=0; + UINT8 pCMD24[]={0x58,0x00,0x00,0x00,0x00,0xff}; //向SD卡中单个块(512字节,一个扇区)写入数据,用CMD24 + + if(!SD1_Addr_Mode) + { + addr<<=9; //addr = addr * 512 将块地址(扇区地址)转为字节地址 + } + + pCMD24[1]=addr>>24; //将字节地址写入到CMD24字节序列中 + pCMD24[2]=addr>>16; + pCMD24[3]=addr>>8; + pCMD24[4]=addr; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD24); + time++; + if(time==TRY_TIME) + { + + SET_SD1_CS_PIN(1); + return(r); //命令写入失败 + } + }while(r!=0); + + while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据 + + SD1_SPI_WByte(0xFE);//写入开始字节 0xfe,后面就是要写入的512个字节的数据 + + for(i=0;i<512;i++) //将缓冲区中要写入的512个字节写入SD1卡,减少循环次数,提高数据写入速度 + { + SD1_SPI_WByte(*(buffer++)); + + /**SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));**/ + } + + SD1_SPI_WByte(0xFF); + SD1_SPI_WByte(0xFF); //两个字节的CRC校验码,不用关心 + + r=SD1_SPI_RByte(); //读取返回值 + if((r & 0x1F)!=0x05) //如果返回值是 XXX00101 说明数据已经被SD卡接受了 + { + return(WRITE_BLOCK_ERROR); //写块数据失败 + } + + while(0xFF!=SD1_SPI_RByte());//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间) + //忙时,读回来的值为0x00,不忙时,为0xff + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟 + + return(0); //返回0,说明写扇区操作成功 +} + + +UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令) +{ + UINT32 addr32 = D_FILE_SECTOR; + addr32 += (UINT32)addr; + return L1_SD_Rsector(addr32,buffer); +} +UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令) +{ + UINT32 addr32 = D_FILE_SECTOR; + addr32 += (UINT32)addr; + return L1_SD_Wsector(addr32,buffer); + +} +UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end) +{ + UINT32 addr32= D_FILE_SECTOR,addr32end= D_FILE_SECTOR; + addr32 += (UINT32)addr_sta; + addr32end += (UINT32)addr_end; + return SD1_Erase_nSector(addr32,addr32end); + +} + + + +/**************************************************************************** + - 功能描述:读取addr扇区的512个字节到buffer指向的数据缓冲区 + - 参数说明:addr:扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + ****************************************************************************/ + +UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令) +{ + UINT16 i; + UINT8 time,r; + + UINT8 pCMD17[]={0x51,0x00,0x00,0x00,0x00,0x01}; //CMD17的字节序列 + + if(!SD1_Addr_Mode) + { + addr<<=9; //sector = sector * 512 将块地址(扇区地址)转为字节地址 + } + + pCMD17[1]=addr>>24; //将字节地址写入到CMD17字节序列中 + pCMD17[2]=addr>>16; + pCMD17[3]=addr>>8; + pCMD17[4]=addr; + + L0_uart0_uc('Q'); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD17); //写入CMD17 + time++; + ///L0_uart0_uc(0x30+time); + if(time==TRY_TIME) + { + L0_uart0_uc('T'); + SET_SD1_CS_PIN(1); + return(READ_BLOCK_ERROR); //读块失败 + } + }while(r!=0); + + L0_uart0_uc('A'); + time = 0; + while(SD1_SPI_RByte()!= 0xFE) + { //一直读,当读到0xfe时,说明后面的是512字节的数据了 + time++; + ///L0_uart0_uc(0x30+time); + if(time==TRY_TIME) + { + L0_uart0_uc('F'); + SET_SD1_CS_PIN(1); + return(READ_BLOCK_ERROR); //读块失败 + } + } + + //L0_uart0_uc('i'); + + for(i=0;i<512;i++) //将数据写入到数据缓冲区中 + { + *(buffer++)=SD1_SPI_RByte(); + /** + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + + + **/ + } + + SD1_SPI_RByte(); + SD1_SPI_RByte();//读取两个字节的CRC校验码,不用关心它们 + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD1卡的操作时序在这里补8个时钟 + + return 0; +} + + +#if 0 + +/**************************************************************************** + - 功能描述:向addr扇区开始的nsec个扇区写入数据(★硬件多扇区写入) + - 参数说明:nsec:扇区数 + addr:开始扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + ****************************************************************************/ + +UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer) +{ + UINT8 r,time; + UINT32 i=0,j=0,m=0; + + UINT8 pCMD25[6]={0x59,0x00,0x00,0x00,0x00,0x01}; //CMD25用于完成多块连续写 + UINT8 pCMD55[6]={0x77,0x00,0x00,0x00,0x00,0x01}; //CMD55,用于告知SD卡后面是ACMD,CMD55+ACMD23 + UINT8 pACMD23[6]={0x57,0x00,0x00,0x00,0x00,0x01};//CMD23,多块连续预擦除 + + if(!SD1_Addr_Mode) addr<<=9; + + pCMD25[1]=addr>>24; + pCMD25[2]=addr>>16; + pCMD25[3]=addr>>8; + pCMD25[4]=addr; + + pACMD23[1]=nsec>>24; + pACMD23[2]=nsec>>16; + pACMD23[3]=nsec>>8; + pACMD23[4]=nsec; + + if(SD1_Ver!=SD_VER_MMC) //如果不是MMC卡,则首先写入预擦除命令,CMD55+ACMD23,这样后面的连续块写的速度会更快 + { + SD1_Write_Cmd(pCMD55); + SD1_Write_Cmd(pACMD23); + } + + time=0; + do + { + r=SD1_Write_Cmd(pCMD25); + time++; + if(time==TRY_TIME) + { + return(WRITE_CMD25_ERROR); //命令写入失败 + } + }while(r!=0); + + while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据 + + for(j=0;j>24; //将字节地址写入到CMD17字节序列中 + pCMD18[2]=addr>>16; + pCMD18[3]=addr>>8; + pCMD18[4]=addr; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD18); //写入CMD18 + time++; + if(time==TRY_TIME) + { + return(READ_CMD18_ERROR); //写入CMD18失败 + } + }while(r!=0); + + for(j=0;j>7)+((pCSD[9]&0x03)<<1)+2; + csize=(pCSD[8]>>6)+((UINT16)pCSD[7]<<2)+((UINT16)(pCSD[6]&0x03)<<0x0A)+1; + Capacity=(UINT32)csize<<(n-9);//得到扇区数 + } + return Capacity; +} + +#endif + + + diff --git a/source/asp/nouse/asp_SI24R1m.c b/source/asp/nouse/asp_SI24R1m.c new file mode 100644 index 0000000..fb4e8da --- /dev/null +++ b/source/asp/nouse/asp_SI24R1m.c @@ -0,0 +1,1041 @@ +#include "asp_SI24R1m.h" + +TS_2g4_ ts_2g4 = +{ + + 0,0,0,////ts_task_init, ///TS_task task; + + 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a, ///u8 Rbuf[32]; + 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a, + 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a, + 0x0d,0x0a, + + 0x31,0x36,0x37,0x38,0x39,0x32,0x33,0x34,0x35,0x3a, ///u8 Rbuf[32]; + 0x46,0x47,0x48,0x49,0x41,0x42,0x43,0x44,0x45,0x4a, + 0x61,0x65,0x66,0x67,0x62,0x63,0x64,0x68,0x69,0x6a, + 0x0d,0x0a, + 0,///u8 Tbuf_change; + 0, ///U8 val; + 0, ///U8 con; ///config + 0, ///U8 sta; + 0, ///U8 sta_show; + 0, ///U8 fifo_sta; + 0, ///U8 id; + 0, ///U32 sendStamp; + 0, ///U32 over; + 0, ///U8 rx_en; + 0, ///U8 rx_ch;///有接收数据的通道号 + 0, ///U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量 + /// + 0, ///U8 ok; + 0, ///U8 tx_en; + 0 ///U8 rs_mode;///发送或接收的模式 + /// U8 ackFlag; + + + }; + + + +#if 0 +1:前导码 +2: 地址 +3: ---------------- 包控制字---------------------- + |-数据包长度(6bit) PID(1bit) NO_ACK(1bit)-| +4: DDDDDDD负载数据(0-32Bytes)DDDD +5: CRC + + +比较别扭的地方: + + 发送的地址寄存器只有一个,但是接收的寄存器共分6个 P0实际上就是最常用的接收地址 + +总共三种模式: + +模式一 没有ACK +没有ack , 也就是NO_ACK 子字段为1, +发射方:FEATURE/EN_DYN_ACK = 1; +W_TX_PAYLOAD_NOACK--> FIFO + +模式二 单纯ack 发送 +EN_AA设置自动回复 + + W_TX_PAYLOAD命令写TX FIFO +发送: 地址等于接收的P0 +接收: ack返回给发送(发送地址等于发送端的接收地址P0) + +发送端发送数据后,没有收到对应地址返回的ACK(在ARD时间内),则重新发送上一帧数据 +ARC累加 重发次数达到最大后,产生MAX_RT 中断 (SETUP_RETR设置) + +模式三 ACK带返回数据 + +发送: +接收: W_ACK_PAYLOA命令写TX FIFO 返回的数据 + + + +发送数据长度的问题: +3.1 动态PAYLOAD长度 FEATURE.EN_DPL 1bit DYNPD.DPL_P0-5 此时包控制字段中的前六位是发送的数据长度 +R_RX_PL_WID命令读取数据长度 + +3.2 静态PAYLAOD长度 + +发送的数据长度应该一致,并且于接收方的RX_PW_PX寄存器值相同 +/******************************************************** +函数功能:L2_SI24R1_RX_Mode(PRIM_RX_SEND ); +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_RX_Mode(U8 rev) +{ + D_SI24_CE_OFF(); + ts_2g4.con = L1_SI24R1_RReg(CONFIG); + if(PRIM_RX_SEND == rev) + { + BITN_1(ts_2g4.con,PRIM_RX); ///1:发射模式 + }else + { + BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式 + } + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_CE_ON(); // 拉高CE启动接收设备 +} + +#endif + +void L3_task_2g4_reg(void) +{ + + for(ts_2g4.id = 0;ts_2g4.id <= 0x1d; ts_2g4.id ++) + { + ts_2g4.tx_en = L1_SI24R1_RReg(ts_2g4.id); + L0_uart0_sendArray("reg(",4); + L0_uart0_uchex(ts_2g4.id ); + L0_uart0_sendArray(") = ",4); + L0_uart0_uchex(ts_2g4.tx_en); + L0_uart0_uc(' '); + } + + + + L1_SI24R1_RAddr(TX_ADDR,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nTX_ADDR = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + + L1_SI24R1_RAddr(RX_ADDR_P0,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nRX_ADDR_P0 = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + L1_SI24R1_RAddr(RX_ADDR_P1,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nRX_ADDR_P1 = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + + + + + L0_uart0_0d0a(); +} + + + +#if 0 + +void L2_SI24R1_RX_Mode2(U8 rev) +{ +/// D_SI24_CE_OFF(); + ts_2g4.con = L1_SI24R1_RReg(CONFIG); + + BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式 + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_CE_ON(); // 拉高CE启动接收设备 +} + +TS_addr_2g4_ ts_addr_2g4={ + 0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 TX[5]; ///发送基地址 + 0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 RX_P0[5]; ///接收P0基地址 + 0xCC,0xa2,0xB3,0xC4, D_MSC_1V6_P1,///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址 + ///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + D_MSC_1V6_P2,///P2 //P[0] //u8 P[4]; + D_MSC_1V6_P3,///P3 //P[1] + D_MSC_1V6_P5,///P4 //P[2] + D_MSC_1V6_P5 ///P5 //P[3] +}; + +#else +TS_addr_2g4_ ts_addr_2g4={ + D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 TX[5]; ///发送基地址 + D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 RX_P0[5]; ///接收P0基地址 + D_MSC_1V6_P1,0xC4,0xB3,0xa2,0xCC, ///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址 + ///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + D_MSC_1V6_P2,///P2 //P[0] //u8 P[4]; + D_MSC_1V6_P3,///P3 //P[1] + D_MSC_1V6_P4,///P4 //P[2] + D_MSC_1V6_P5 ///P5 //P[3] +}; + + +#endif +#if 0 +rev +reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 37 +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 20 reg(0B) = 21 reg(0C) = 22 reg(0D) = 23 reg(0E) = 24 +reg(0F) = 25 reg(10) = 20 reg(11) = 00 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06 +TX_ADDR =\020C4B3A2CC +RX_ADDR_P1 =\021C4B3A2CC +RX_ADDR_P0 =\020C4B3A2CC + +#endif +///void *L2_SI24R1_init(TS_2g4_ *s);///() + +void (*L3_task_2g4_handle)(TS_2g4_ *s); + +void L2_SI24R1_init_config(void) +{ + L1_SI24R1_Init(); + L3_task_2g4_handle = L2_task_2g4_handle_NOACK; +} +/*********** + + +// 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + + ts_2g4.Tbuf[0]=0xaa; + ts_2g4.Tbuf[1]++; + ts_2g4.Tbuf[2]++; + ts_2g4.Tbuf[3]++; + ts_2g4.Tbuf[4]++; + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据 + + **********/ + + +////L2_SI24R1_TRmode(PRIM_RX_SEND); +////L2_SI24R1_TRmode(PRIM_RX_REV); + +void L2_SI24R1_TRmode(u8 mode) +{ + if (PRIM_RX_SEND == mode) + { + BITN_0(ts_2g4.con,PRIM_RX); + }else + { + BITN_1(ts_2g4.con,PRIM_RX); + } + D_SI24_Register(); + L1_SI24R1_WReg(CONFIG,ts_2g4.con); +//// D_SI24_Work(); +} + +////////最简单的接收和发送模式 无ACK +void L2_SI24R1_init_NOACK_slave(void) +{ + L1_SI24R1_Init(); +///step 1: addr +//// L1_SI24R1_WReg(SETUP_AW, B0000_0011); // 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + +///step 3: RF config + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + + L1_SI24R1_WReg(RX_PW_P0, 32); + + L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL); + L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 + + ts_2g4.con = MASK_RX_DR_ON ///接收中断打开 + |MASK_TX_DS_ON ///发射中断关闭,在ack模式下 + |MASK_MAX_RT_ON + |EN_CRC_ON + |EN_CRC_2Byte + |PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式 + |PRIM_RX_REV; + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_Work(); + /// L3_task_2g4_reg(); // 拉高CE启动接收设备 +} + +void L2_SI24R1_init_NOACK_master(void) +{ + D_SI24_Register(); + // 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + + L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + + + L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL); ///使能动态负载长度 + L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 + + L1_SI24R1_WReg(SETUP_AW, B0000_0011); ///5 byte addr width +///step 3: RF config + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm + + ts_2g4.con = MASK_RX_DR_ON ///接收中断打开 + |MASK_TX_DS_ON ///发射中断 + |MASK_MAX_RT_ON + |EN_CRC_ON + |EN_CRC_2Byte + |PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式 + |PRIM_RX_SEND; + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + /// L3_task_2g4_reg(); +/// D_SI24_Work(); // 拉高CE启动接收设备 +} + +void L3_SI24R1_init_NOACK_master(void) +{ + L2_SI24R1_init_NOACK_master(); + L2_SI24R1_TRmode(PRIM_RX_SEND); +} + + +void L2_task_2g4_init(void) +{ + L1_task_init(&ts_2g4.task); + L3_task_s_go(ts_2g4,D_task_init); + L2_SI24R1_init_NOACK_slave(); + L2_SI24R1_init_NOACK_master(); +} + +#define L0_uart0_sendstr(x) ; +///L3_task_2g4_handle_NOACK(&ts_2g4); +////目前使用的no ack 标准应用,发送和接收 +void L2_task_2g4_handle_NOACK(TS_2g4_ *s) +{ + TTSS_Task_init(): + + L0_uart0_sendstr(" 2g4:NOACK /r/n"); + ////打印reg寄存器的信息 + L3_task_2g4_reg(); + ///D_SI24_CE_ON(); + L2_task_exit(); + TTSS_Task_step(D_task_2g4_send): + L0_uart0_sendstr("\r\n 2g4:send-"); + D_SI24_Register(); + + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + ts_2g4.val = 8; + ts_2g4.Tbuf[0]='a'; + ts_2g4.Tbuf[1]='b'; + ts_2g4.Tbuf[2]='n'; + ts_2g4.Tbuf[3]='m'; + ts_2g4.Tbuf[4]='k'; + ts_2g4.Tbuf[5]='3'; + ts_2g4.Tbuf[6]='l'; + ts_2g4.Tbuf[7]='q'; + ts_2g4.Tbuf[8]='7'; + + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + TTSS_overtime_init(s->over,D_Tdelay_3s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_send_over); + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ///(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + ///L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_sendstr(" 2g4: ok\r\n"); + ///L0_uart0_uc('s'); + ts_2g4.ok = D_SI24R1_SENDOK; + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + ts_2g4.ok = D_SI24R1_MAX_RT; + }else + { + L0_uart0_uc('E'); + ts_2g4.ok = D_SI24R1_ER; + L1_SI24R1_WReg(FLUSH_TX,0xff); + } + L2_task_exit(); + }else + {///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败 + ////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + ts_2g4.ok = D_SI24R1_TIMEOVER; + L2_task_exit(); + TTSS_overtime_end + } +////////////////////////////////////////////////////////////////////// + TTSS_Task_step(D_task_2g4_REV): + L0_uart0_sendstr(" 2g4:rec mode\r\n"); + L2_task_go(D_task_2g4_REV_start); + + TTSS_Task_step(D_task_2g4_REV_start): + L0_uart0_sendstr("\r\n 2g4:rec S"); + //// L2_SI24R1_init_NOACK_slave(); +// D_SI24_Register(); + L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式 + ////TTSS_overtime_init(s->over,D_Tdelay_5s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_listen); + TTSS_Task_step(D_task_2g4_listen): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + ts_2g4.ok = D_SI24R1_RX_DR; + /// L2_task_go(D_task_2g4_rev_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_REV); + } + }else + {////侦听的过程中,每1s打印信息 + TTSS_AreUok(s->over,D_Tdelay_1s,'L'); + } + TTSS_Task_end(); +} +#undef L0_uart0_sendstr + + + + +#if 0 + + + + + ///L3_task_2g4_handle_NOACK(&ts_2g4); + ////目前使用的no ack 标准应用,发送和接收 + void L2_task_2g4_handle_NOACK3333(TS_2g4_ *s) + { + TTSS_Task_init(): + L3_SI24R1_init_NOACK_master(); + L3_task_2g4_reg(); + L2_SI24R1_TRmode(PRIM_RX_SEND); + L0_uart0_sendstr(" 2g4:NOACK /r/n"); + ////打印reg寄存器的信息 + ///D_SI24_CE_ON(); + L2_task_exit(); + TTSS_Task_step(D_task_2g4_send): + L0_uart0_sendstr("\r\n 2g4:send-"); + D_SI24_Register(); + L3_SI24R1_init_NOACK_master(); + ts_2g4.val = 5; + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + ts_2g4.Tbuf[0]='a'; + ts_2g4.Tbuf[1]='b'; + ts_2g4.Tbuf[2]='n'; + ts_2g4.Tbuf[3]='m'; + ts_2g4.Tbuf[4]='k'; + ts_2g4.Tbuf[5]='3'; + ts_2g4.Tbuf[6]='l'; + ts_2g4.Tbuf[7]='q'; + ts_2g4.Tbuf[8]='7'; + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + TTSS_overtime_init(s->over,D_Tdelay_3s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_send_over); + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ///(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + ///L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_sendstr(" 2g4: ok\r\n"); + ///L0_uart0_uc('s'); + ts_2g4.ok = D_SI24R1_SENDOK; + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + ts_2g4.ok = D_SI24R1_MAX_RT; + }else + { + L0_uart0_uc('E'); + ts_2g4.ok = D_SI24R1_ER; + L1_SI24R1_WReg(FLUSH_TX,0xff); + } + L2_task_exit(); + }else + {///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败 + ////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + ts_2g4.ok = D_SI24R1_TIMEOVER; + L2_task_exit(); + TTSS_overtime_end + } + ////////////////////////////////////////////////////////////////////// + TTSS_Task_step(D_task_2g4_REV): + L0_uart0_sendstr(" 2g4:rec mode\r\n"); + L2_SI24R1_init_NOACK_slave(); + + L3_task_2g4_reg(); + TTSS_Task_step(D_task_2g4_REV_start): + L0_uart0_sendstr("\r\n 2g4:rec S"); + L2_SI24R1_init_NOACK_slave(); + D_SI24_Register(); + L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式 + ////TTSS_overtime_init(s->over,D_Tdelay_5s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_listen); + TTSS_Task_step(D_task_2g4_listen): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + L0_uart0_sendstr("\r\n 2g4:ok"); + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + ts_2g4.ok = D_SI24R1_RX_DR; + /// L2_task_go(D_task_2g4_rev_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_REV); + } + }else + {////侦听的过程中,每1s打印信息 + TTSS_AreUok(s->over,D_Tdelay_1s,'L'); + } + TTSS_Task_end(); + } + + + TTSS_Task_step(D_task_2g4_rev_what): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf; + L0_uart0_uc(' '); + L0_uart0_uc('R'); + L0_uart0_uchex(ts_2g4.m->reg); + switch(ts_2g4.m->reg) + { + case 1: + + + break; + default: + + break; + + }; + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send_next): + ////L2_SI24R1_TRmode(PRIM_RX_SEND); + L2_task_go(D_task_2g4_send); + + ///L2_task_go(D_task_2g4_send); + ///L2_task_go(D_task_2g4_send); + ///TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟 + // L2_task_exit(); + // L2_task_exit(); +else + {///没有在闹钟规定的时间收到数据 + TTSS_overtime_get(s->over) + L0_uart0_uc('e'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + +///L3_task_2g4_handle(&ts_2g4); +////目前使用的no ack +void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s) +{ + TTSS_Task_init(): + L2_SI24R1_init_NOACK_master(); + L0_uart0_sendArray("master /r/n",9); + ////打印reg寄存器的信息 + L3_task_2g4_reg(); + ///D_SI24_CE_ON(); + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send): + if(ts_2g4.sta_show) + {ts_2g4.sta_show = 0; + L0_uart0_sendArray("send --\r\n",9); + D_SI24_Register(); + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + TTSS_overtime_init(s->over,D_Tdelay_5s); + L2_task_go(D_task_2g4_send_over); + } + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_uc('s'); + TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟 + ///delay 130us + L2_task_go(D_task_2g4_ack); + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + L2_task_go(D_task_2g4_send); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_send); + } + }else + {///发送闹钟如果溢出,说明发送失败 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + TTSS_Task_step(D_task_2g4_ack): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + L2_task_go(D_task_2g4_ack_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_send); + } + }else + {///没有在闹钟规定的时间收到数据 + TTSS_overtime_get(s->over) + L0_uart0_uc('e'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + TTSS_Task_step(D_task_2g4_ack_what): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf; + L0_uart0_uc(' '); + L0_uart0_uc('R'); + L0_uart0_uchex(ts_2g4.m->reg); + switch(ts_2g4.m->reg) + { + case 1: + + + break; + default: + + break; + + }; + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send_next): + ////L2_SI24R1_TRmode(PRIM_RX_SEND); + L2_task_go(D_task_2g4_send); + TTSS_Task_end(); +} + +/***** + + +///L1_SI24R1_TxData(WR_TX_PLOAD,ts_2g4.Tbuf,6);///需要发送的数据 +L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据 + +///step 2: ch config + /// L1_SI24R1_WReg(FEATURE,EN_DPL| ///使能动态负载长度 +/// EN_ACK_PAYd); ///使能ACK负载(带负载数据的ACK包) + + +/// L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 +/// L1_SI24R1_WReg(EN_AA, B0000_0001); ///使能数据管道0自动确认 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + + +//// L1_SI24R1_WReg(SETUP_RETR, B0011_0111); ///使能数据管道0-5 + +///step + *******/ + +/// L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + +///L0_uart0_uc('S'); +///L0_uart0_uchex(ts_2g4.sta); +///L0_uart0_uc(' '); +/**L0_uart0_uc('C'); +L0_uart0_uc(' '); +ts_2g4.sta = L1_SI24R1_RReg(FIFO_STATUS); +L0_uart0_uchex(ts_2g4.sta); +ts_2g4.sta = L1_SI24R1_RReg(OBSERVE_TX); +L0_uart0_uchex(ts_2g4.sta); +ts_2g4.sta = L1_SI24R1_RReg(STATUS); +L0_uart0_uchex(ts_2g4.sta); +L0_uart0_uc(' '); + +**/ + +void L3_task_2g4_handle_NOACK_slave(TS_2g4_ *s) +{ + TTSS_Task_init(): + L2_SI24R1_init_NOACK_slave(); + L2_task_go(D_task_2g4_REV); + TTSS_Task_step(D_task_2g4_REV): + ////打印reg寄存器的信息 + /// L3_task_2g4_reg(); + L0_uart0_sendArray("\r\nPRIM_RX_REV \r\n",17); + L2_task_go(D_task_2g4_ack); + TTSS_Task_step(D_task_2g4_ack): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + /// L0_uart0_uc('R'); + // L0_uart0_uchex(ts_2g4.sta); + /// L0_uart0_uc(' '); + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ///ts_2g4.rx_ch = (ts_2g4.sta&B0000_1110)>>1; + /// ts_2g4.rx_fifo_num = L1_SI24R1_RReg(RX_PW_P0);///?读出的数据一直是 + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + /// L0_uart0_sendArray("\r\nR_RX_PL_WID =",15); + // L0_uart0_uchex(ts_2g4.rx_fifo_num); + /// L0_uart0_uc(' '); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + + L2_task_go(D_task_2g4_ackPayload_UPDATE); + + + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + L2_task_go(D_task_2g4_ack); + }else + { + L0_uart0_uc('E'); + L2_task_go(D_task_2g4_ack); + } + + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + } + TTSS_Task_step(D_task_2g4_ackPayload_UPDATE): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + TS_d32_ + ts_2g4.Rbuf + + L2_task_go(D_task_2g4_ack); + TTSS_Task_end(); +} + + +#endif + + +/******************************************************* +模式二:NOACK 通信 +发射方配置: + spi_write_buf( TX_ADDR, TX_ADDRESS, 5); // 写入发送地址 + spi_rw_reg( FEATURE, 0x01); // 使能 W_TX_PAYLOAD_NOACK 命令 + spi_write_buf(W_TX_PAYLOAD_NOACK, buf, TX_PLOAD_WIDTH); // 写 FIFO + spi_rw_reg(SETUP_AW, 0x03); // 5 byte Address width + spi_rw_reg( RF_CH, 0x40); // 选择射频通道 0x40 + spi_rw_reg(RF_SETUP, 0x08); // 数据传输率 2Mbps + spi_rw_reg( CONFIG, 0x0e); //配置为发射模式、CRC 为 2Bytes + CE = 1; +接收方配置: +spi_write_buf( RX_ADDR_P0, TX_ADDRESS, 5); // 接收地址 + spi_rw_reg( EN_RXADDR, 0x01); // 使能接收通道 0 + Preliminary Si24R1 + spi_rw_reg( RF_CH, 0x40); // 选择射频信道 + spi_rw_reg( RX_PW_P0, TX_PLOAD_WIDTH); //设置接收通道 0 负载数据宽度 + spi_rw_reg( RF_SETUP, 0x08); // 数据传输率 2Mbps,-18dbm TX power + spi_rw_reg( CONFIG, 0x0f); // 配置为接收方、CRC 为 2Bytes + CE = 1; + + +*****************************************************/ + +/******************************************************** +函数功能:读取接收数据 +入口参数:rxbuf:接收数据存放首地址 +返回 值:0:接收到数据 + 1:没有接收到数据 +07 +STATUS 状态寄存器(SPI操作开始,状态寄存器值通过 +MISO串行输出)。 + +Reserved +7 ----------------------------------------- +0 R/W 保留 + +RX_DR +6 ---------------------------------------- +0 R/W RX FIFO有值标志位,写’1’清除。 + +TX_DS +5 ---------------------------------------- +0 R/W 发射端发射完成中断位,如果是ACK模式,则收到 +ACK确认信号后TX_DS位置1,写’1’清除。 + +MAX_RT +4 ---------------------------------------- +0 R/W 达到最大重发次数中断位,写’1’清除。 + +RX_P_NO +3:1 ---------------------------------------------- +111 R 收到数据的接收管道PPP号,可以通过SPI读出。 +000-101:数据管道0-5 +110:不可用 +111:RX FIFO为空 + +TX_FULL +0 ---------------------------------------------- +0 R +TX FIFO满标志位。 + + + +*********************************************************/ + /************************* + + void main2(void) + { + KEY1 = 1; + KEY2 = 1; + L1_SI24R1_Init(); + L2_SI24R1_RX_Mode(); + while(1) + { + u8 buf[32] = {0}; + KEY1 = 1; + KEY2 = 1; + if(!KEY1 || !KEY2) + { + Lc_delay_ms(10); + if(!KEY1) + { + buf[0] = 0x55; + L2_SI24R1_TX_Mode(); + L2_SI24R1_TxPacket(buf); + Lc_delay_ms(200); + } + if(!KEY2) + { + buf[0] = 0xAA; + L2_SI24R1_TX_Mode(); + L2_SI24R1_TxPacket(buf); + Lc_delay_ms(200); + } + buf[0] = 0; + L2_SI24R1_RX_Mode(); + } + + if(!L2_SI24R1_RxPacket(buf)) + { + switch(buf[0]) + { + case 0x55: + LED3 = 0; + Lc_delay_ms(100); + LED3 = 1; + Lc_delay_ms(100); + break; + case 0xAA: + LED4 = 0; + Lc_delay_ms(100); + LED4 = 1; + Lc_delay_ms(100); + break; + default: + break; + } + buf[0] = 0; + } + + } + } + + ***************/ + + +/******** + +L0_uart0_sendArray("\r\nS = ",6); +///while(9) +{ + L0_uart0_uchex(0xaa); + L0_uart0_uchex(0x55); +} +L0_uart0_uchex(state); + Lc_delay_ms(600); +L0_uart0_0d0a(); + +第一次没有读取数据 把所有的寄存器给读取出来 然后对比 + + +reg02 使能管道 01 管道1 +reg00 b xxx10 关闭crc 1byte 开机 接收 + b 1011 开启crc 1byte 开机 发送 +rev +reg(00) = 02 reg(01) = 00 reg(02) = 01 reg(03) = 03 reg(04) = 03 +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5 +reg(0F) = C6 reg(10) = E7 reg(11) = 20 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01 +send +reg(00) = 0B reg(01) = 00 reg(02) = 03 reg(03) = 03 reg(04) = 0A +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5 +reg(0F) = C6 reg(10) = 0A reg(11) = 00 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01 + +.over + +0a 39:0 E7E7E 7E7E7 + E7 E7 E7 E7 E7 + 5X7 =35 + +.... +reg(17) = 11 + +reg(10) = E7 TX_ADDRESS +reg(10) = 0A TX_ADDRESS +reg(17) = 01 + +u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x0A,0x01,0x07,0x0E,0x01}; // 定义一个静态发送地址 + + +**********/ + +#if 0 +/******************************************************** +函数功能:SI24R1接收模式初始化 +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_RX_Mode(void) +{ + CE = 0; + L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 + L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答 + L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0 + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 + L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + CE = 1; // 拉高CE启动接收设备 +} + + +/******************************************************** +函数功能:SI24R1发送模式初始化 +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_TX_Mode(void) +{ + CE = 0; + L1_SI24R1_WBuf(TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址 + L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + + L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答 + L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0 + L1_SI24R1_WReg(SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 + //CE = 1; +} + +v3.2XF6420136C06938`- +sendmaster /r +reg(00) = 0F reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F +reg(07) = 0E reg(08) = 00 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3 +reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00 +reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00 +reg(1C) = 3F reg(1D) = 06 + +.0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E abcdefg麻 over + +v3.2XF642C5E203A72A`- +rev C 0F 11 0E S +reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F +reg(07) = 1E reg(08) = 13 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3 +reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00 +reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06 + + +PRIM_RX_REV +.0E11130E .0E11130E + + + +#endif + + + diff --git a/source/asp/nouse/asp_SI24R1m.h b/source/asp/nouse/asp_SI24R1m.h new file mode 100644 index 0000000..2bb31eb --- /dev/null +++ b/source/asp/nouse/asp_SI24R1m.h @@ -0,0 +1,113 @@ +#ifndef asp_SI24R1m_ +#define asp_SI24R1m_ + + +#include "bsp_SI24R1.h" +typedef struct +{ + u8 TX[5]; ///发送基地址 + u8 RX_P0[5]; ///接收P0基地址 + u8 P1_base[5]; ///P1地址 (前4字节)P2-P5基地址 + u8 P[4]; ///P2-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + ///u8 d32[] +}TS_addr_2g4_; + +///// 默认所有的地址的基地址是一样的,这样策略比较简单 +typedef struct +{ + u8 x;/// + u8 y;/// + u8 z;/// +/// U8 ackFlag; +}TS_xyz_; + +///// 默认所有的地址的基地址是一样的,这样策略比较简单 +typedef struct +{ + u8 filter0;/// + u8 filter1;/// + TS_xyz_ xyz[30];/// +/// U8 ackFlag; +}TS_d32_; + + +typedef struct +{ + TS_task task; + u8 Rbuf[32]; + u8 Tbuf[32]; + u8 Tbuf_change; + U8 val; + U8 con; ///config + U8 sta; + U8 sta_show; + U8 fifo_sta; + U8 id; + U32 sendStamp; + U32 over; + U8 rx_en; + U8 rx_ch;///有接收数据的通道号 + U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量 + + U8 ok; + U8 tx_en; + U8 rs_mode;///发送或接收的模式 + Modbus03 *m; +/// U8 ackFlag; +}TS_2g4_; +extern TS_2g4_ ts_2g4; +void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s); +///void (*L3_task_2g4_handle)(TS_2g4_ *s); +void L2_SI24R1_init_config(void); +extern void (*L3_task_2g4_handle)(TS_2g4_ *s); + + + + +#define D_MSC_1V6_P0 0x20/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P1 0x21/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P2 0x22/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P3 0x23/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P4 0x24/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P5 0x25/// master slave communication 1v6 通讯地址配置 + + + +#define D_SI24_Standby(); D_SI24_CE_OFF(); +#define D_SI24_Work(); D_SI24_CE_ON(); +#define D_SI24_Register(); D_SI24_CE_OFF(); + + +#define D_task_2g4_send 0x51 +#define D_task_2g4_listen 0x61 +#define D_task_2g4_REV 0x62 +#define D_task_2g4_REV_start 0x82 + +#define D_task_2g4_rev_what 0x72 + +#define D_task_2g4_send_over 0x63 +#define D_task_2g4_send_next 0x64 + +#define D_task_2g4_rx 0x52 +#define D_task_2g4_wait 0x53 +#define D_task_2g4_ackPayload_UPDATE 0x54 + + + +#define D_SI24R1_SENDOK 1 +#define D_SI24R1_MAX_RT 2 +#define D_SI24R1_ER 3 +#define D_SI24R1_TIMEOVER 4 + +#define D_SI24R1_RX_DR 6 + + +extern void L2_task_2g4_init(void); +void L2_task_2g4_handle_NOACK(TS_2g4_ *s); + + +#endif + + + + diff --git a/source/asp/nouse/asp_task_WC.c b/source/asp/nouse/asp_task_WC.c new file mode 100644 index 0000000..d08e5db --- /dev/null +++ b/source/asp/nouse/asp_task_WC.c @@ -0,0 +1,123 @@ +#include "asp_task_WC.h" + +TS_WCapp_ ts_WCapp; + + +#define D_task_WC_send 0x51 + +#define D_task_WC_rx 0x52 +#define D_task_WC_wait 0x53 +#define D_task_WC_ack 0x54 + + +#define D_task_WC_listen 0x61 +#define D_task_WC_REV 0x62 + +#define D_task_WC_send_over 0x63 +#define D_task_WC_send_next 0x64 + +#define D_task_WC_REC_ACK 0x65 +#define D_task_WC_rev_what 0x72 + +#define D_task_WC_END 0x74 + + +void L2_task_WC_init(void) +{ + L1_task_init(&ts_WCapp.task); + L3_task_s_go(ts_WCapp,D_task_init); +} + + +////对应文字版流程图 +#ifdef doc909809 +从机流程图: 文本版,将来甚至可以直接生成流程图及代码。20210409 +step 1;进入接收模式 +step 2 判断: + 接收到数据进入解析step 3 + 未接收到一直等待 +step 3:解析 + 如果是本机需要响应的命令 进入step4 +step 4:应答发送 + 返回主机从机的信息 +step 5;显示信息 + + +测试步骤 + 1,验证流程的逻辑完整性 + 2,验证流程中每一步骤的时间合理性 + 3,验证流程中每一步骤的功能分配的合理性 + 4,验证流程和程序对应的正确性 + 5,检查handdle调用入口的有效性(是否会被执行,以及分配时间的合理性) + 6,检查任务初始化init的调用有效性,确保在handle执行前被调用 + 7,检查init的打印是否正确 + 8,分步骤检查,及打印 + 9,模拟关键 + +#endif + +///L3_task_WC_handle_NOACK(&ts_WCapp); +////目前使用的no ack 标准应用,发送和接收 +void L3_task_WC_master_handle(TS_WCapp_ *s) +{ + //---------------------------------------------------------------// + TTSS_Task_init(): + L0_uart0_sendstr("mC:init\r\n"); + L2_SI24R1_init_config(); + L2_task_2g4_init(); + L2_task_go(D_task_WC_send); + TTSS_Task_step(D_task_WC_send): + L0_uart0_sendstr("\r\nmC:send "); + L3_task_s_go(ts_2g4,D_task_2g4_send); + TTSS_overtime_init(s->over,D_Tdelay_5s); + + L2_task_go(D_task_WC_send_over); + TTSS_Task_step(D_task_WC_send_over): + if (D_SI24R1_SENDOK == ts_2g4.ok) + { + L0_uart0_sendstr("mC:ok rec ack\r\n"); + ts_2g4.ok = 0; + L3_task_s_go(ts_2g4,D_task_2g4_REV_start); + TTSS_overtime_init(s->over,D_Tdelay_10s); + L2_task_go(D_task_WC_REC_ACK); + }else + { + TTSS_overtime_get(s->over) + L0_uart0_uc('v'); + L2_task_go(D_task_WC_END); + TTSS_overtime_end + } + TTSS_Task_step(D_task_WC_REC_ACK): + if(D_SI24R1_RX_DR == ts_2g4.ok) + { + ts_2g4.ok = 0; + L0_uart0_sendstr("mC:recok \r\n"); + L0_uart0_sendArray(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L2_task_go(D_task_WC_END); + }else + { + TTSS_overtime_get(s->over) + ///L0_uart0_uc('r'); + L0_uart0_sendstr("\r\nmC:!overtime \r\n"); + L2_task_go(D_task_WC_END); + L3_task_s_go(ts_2g4,D_task_close); + TTSS_overtime_end + } + TTSS_Task_step(D_task_WC_END): + L2_task_go(D_task_WC_send); + L1_task_Tdelay(D_Tdelay_2s); + TTSS_Task_end(); + (*L3_task_2g4_handle)(&ts_2g4); + +} + + + + + + + + + + + diff --git a/source/asp/nouse/asp_task_WC.h b/source/asp/nouse/asp_task_WC.h new file mode 100644 index 0000000..a57b846 --- /dev/null +++ b/source/asp/nouse/asp_task_WC.h @@ -0,0 +1,39 @@ +#ifndef asp_task_WC_ +#define asp_task_WC_ + + +#define D_ID_0 0 +#define D_ID_1 1 +#define D_ID_2 2 +#define D_ID D_ID_0 + +#include "bsp_para2flash.h" +#include "../ctask/task.h" +#include "bsp_SI24R1.h" +#include "msp_UART0.h" +#include "asp_SI24R1m.h" + + + +typedef struct +{ + TS_task task; + U32 sendStamp; + U32 over; + + U8 ok; + Modbus03 *m; +/// U8 ackFlag; +}TS_WCapp_; +extern TS_WCapp_ ts_WCapp; + +///L3_task_handle_NOACK_master(&ts_WCapp); +void L2_task_WC_init(void); + +void L3_task_WC_master_handle(TS_WCapp_ *s); + +#endif + + + + diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c index d6942b5..63d5f8a 100644 --- a/source/bsp/bsp_config.c +++ b/source/bsp/bsp_config.c @@ -1,5 +1,5 @@ #include "bsp_config.h" -#include "../msp/UART0.h" +#include "../msp/msp_UART0.h" #include "../msp/eeprom.h" //////////////////////////////////////////////////////////////////////////// diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index e915041..db5bade 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -51,7 +51,7 @@ //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT -#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0B +#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0C //STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG -#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0B) +#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0C) #include - #include "../cpu/stc_stc8hxx.h" - #include "../cpu/stc_macro.h" +// #include "../cpu/stc_stc8hxx.h" +// #include "../cpu/stc_macro.h" //基本配置(工作频率、时钟、看门狗、字节序) #define TYPE_MCU TYPE_MCU_STC_8H @@ -79,6 +79,54 @@ //存储器特殊参数地址配置 #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 //...其他参数 + #if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) + + #include "../cpu/STC_stc8h3k.h" + #include "../cpu/STC_only.h" + #include "../cpu/c51_macro.h" + #endif + + //Step3: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) + + +#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 4 +#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 + + + + +#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 interrupt 4 +#define D_SERVE_UART1 interrupt 8 +#define D_ISR_int4 16 /////只有下降沿 + //串口配置 #define D_uart0_BRT BRT_115200 @@ -136,42 +184,60 @@ #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 //#define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 #endif -#elif - xxx -#endif + //STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config -#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) -#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 4 -#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 -//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>MCU TYPE #define TYPE_MCU_VENDOR_MSK 0xF0 #define TYPE_MCU_VENDOR_STC 0x10 diff --git a/source/bsp/bsp_oid.c b/source/bsp/bsp_oid.c new file mode 100644 index 0000000..dc2f4f8 --- /dev/null +++ b/source/bsp/bsp_oid.c @@ -0,0 +1,739 @@ +#include "bsp_oid.h" +#include "intrins.h" +#include "msp_UART0.h" +#include +#include "../app/app_config.h" +#include "../ctask/task.h" + + +/****************************************************************************************************** + 变量定义 +*******************************************************************************************************/ +AppDevice eAppDevice = ePointRead_2000A; +///volatile uint32_t RecvData[3]; +Ts_OID_ ts_oid; + +uint8_t TransCmd[7]; +///#define MAIN_Fosc 11059260L +#if 0 +#define MAIN_Fosc (12459260L/4) +#define D_DELAY_10US 10 +#define D_DELAY_ROD_80US 80 + + +#else +#define MAIN_Fosc (12459260L/2) +#define D_DELAY_10US 20 +#define D_DELAY_ROD_80US 160 + + +#endif + + +//======================================================================== +// 函数: void delay_ms(uint8_t ms) +// 描述: 延时函数。 +// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. +// 返回: none. +// 版本: VER1.0 +// 日期: 2021-3-9 +// 备注: +//======================================================================== +void delay_ms(uint8_t ms) +{ + uint16_t i; + do{ + i = MAIN_Fosc / 10000L; + while(--i); //10T per loop + }while(--ms); +} + +void delay_us(uint8_t us) +{ + uint16_t i; + do{ + // i = MAIN_Fosc / 10000000L; + // i = 1;///5 10 150u 1---50us + /// while(--i); //10T per loop + }while(--us); +} + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +void L0_oid_SendCmd(uint8_t Cmd) +{ + uint8_t i; + LD_Oid_SDIO_OUT(); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_HIGH(); // Write control bit + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + delay_us(D_DELAY_10US); + + for(i=0;i<8;i++) + { + LD_Oid_SCK_HIGH(); + if(Cmd & 0x80) + { + LD_Oid_SDIO_HIGH(); + } + else + { + LD_Oid_SDIO_LOW(); + } + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + if(i == 7) + { + LD_Oid_SDIO_IN(); + } + delay_us(D_DELAY_10US); + Cmd <<= 1; + } + delay_us(D_DELAY_ROD_80US); + // LD_Oid_SDIO_IN(); +} + +uint16_t L0_oid_RecvAck16(void) +{ + uint8_t i; + uint16_t AckValue; + AckValue = 0; +/// +LD_Oid_SDIO_OUT(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_LOW(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + delay_us(D_DELAY_10US); + + for(i = 0; i < 16; i++) + { + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_IN() + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + if(OID_DET) + { + AckValue +=1; + } + + if(i < 15) + { + AckValue <<= 1; + } + + delay_us(D_DELAY_10US); + } + delay_us(D_DELAY_ROD_80US); + + return AckValue; +} + + +void L0_oid_Recv64(void) +{ + uint8_t i; + Lc_memset8bits(ts_oid.rec.d, 0, 8); + LD_Oid_SDIO_OUT(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_LOW(); + + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + delay_us(D_DELAY_10US); + LD_Oid_SDIO_IN() + + for(i = 0; i < 64; i++) + { + LD_Oid_SCK_HIGH(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + + #if 0 + if(OID_DET) + { + if(i < 32) + { + RecvData[0] += 1; + } + if(i>=32 && i<64) + { + RecvData[1] += 1; + } + + } + + if(i < 31) + { + RecvData[0] <<= 1; + } + if( i >31 && i < 63) + { + RecvData[1] <<= 1; + } + #endif + + ///#else + + ts_oid.rec.d[i/8] <<= 1; + + if(OID_DET) + { + ts_oid.rec.d[i/8] |= 1; + // RecvData[1] += 1; + } + else + { + ts_oid.rec.d[i/8] &= 0xfe; + } + // RecvData[1] <<= 1; + + + + delay_us(D_DELAY_10US); + } + delay_us(D_DELAY_ROD_80US); + + return; +} + +uint8_t L1_oid_TransCmd(uint8_t Cmd) +{ + uint8_t TxCmd;///,det_busy; + uint32_t RxAckCnt = 0; + +// L0_uart0_sendstr("\r\n w cmd="); +/// L0_uart0_uchex(Cmd); +// + while(!OID_DET) + { + L0_oid_Recv64(); + L1_print_rcv("\r\n busy: RD="); + } + TxCmd = Cmd; + L0_oid_SendCmd(TxCmd); + LD_Oid_SCK_LOW(); + delay_us(10); + #define D_oid_waitrcv_delay 100000 + while(OID_DET) + { + /// L1_oid_RecvOptData(); + RxAckCnt ++; + if(RxAckCnt > D_oid_waitrcv_delay) + { + + L0_uart0_sendstr("\r\nno rec"); + L0_uart0_uchex(Cmd); + break; + } + } + + if(RxAckCnt <= D_oid_waitrcv_delay) + { + TxCmd = (uint8_t)L0_oid_RecvAck16(); + TxCmd -= 1; + if(TxCmd == Cmd) + { + + L0_uart0_sendstr("\r\nCmd="); + L0_uart0_uchex(Cmd);L0_uart0_uc('-'); + L0_uart0_uchex(TxCmd); + return 1; + } + } +} + +uint32_t L1_oidReadRegister (uint16_t Data1) +{ + uint8_t i,Ret; + uint32_t uxReturn; + + TransCmd[0] = 0x74; + TransCmd[1] = 3; + TransCmd[2] = Data1 >> 8; + TransCmd[3] = Data1 & 0x00FF; + TransCmd[4] = (TransCmd[1] + TransCmd[2] + TransCmd[3]) & 0xFF; + + for(i=0;i<5;i++) + { + Ret = L1_oid_TransCmd(TransCmd[i]); + if(Ret == 0) + { + return 0x5FFFFFFF; + } + } + + i = 0; + while(1) + { + if(!OID_DET) + { + L0_oid_Recv64(); + + /// uxReturn = RecvData[1]; + uxReturn = ts_oid.rec.d32[1]; + uxReturn &= 0xFFFF; + return uxReturn; + } + + delay_us(100); + i += 1; + if(i >= 20) // check 100ms + { + return 0x2FFFFFFF; + } + } +} + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +uint8_t Write_Register(uint16_t Data1,uint16_t Data2) +{ + uint8_t Ret,i; + uint16_t j; + Ret = 1; + + TransCmd[0] = 0X73; + TransCmd[1] = 0x05; + j = Data1>>8; + TransCmd[2] = (uint8_t)j; + j = Data1; + TransCmd[3] = (uint8_t)j; + j = Data2>>8; + TransCmd[4] = (uint8_t)j; + j = Data2; + TransCmd[5] = (uint8_t)j; + TransCmd[6] = (TransCmd[1] + TransCmd[2] + TransCmd[3] + TransCmd[4] + TransCmd[5]); + + for(i=0;i<7;i++) + { + Ret = L1_oid_TransCmd(TransCmd[i]); + if(Ret == 0) + { + break; + } + } + return Ret; +} + +void L1_print_rcv(char *str) +{ + L0_uart0_sendstr(str); + /******** +// Lc_delay_ms(1); + L0_uart0_ulhex(RecvData[0]); +// Lc_delay_ms(1); + L0_uart0_uc(0x09); + L0_uart0_ulhex(RecvData[1]); + + L0_uart0_uc(0x09); + **********/ + +/// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09); + /// + +// L0_uart0_sendArrayHex(ts_oid.rec.d,8); + ///L2_oid_ParseF1(); + +} +/****************************************************************************************************** +Function: +Input: +Output: + +BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 +76543210 76543210 76543210 76543210 + 76543210 76543210 76543210 76543210 +BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 + + +U16[0] U16[1] U16[2] U16[3] +111111 111111 111111 111111 +5432109876543210543210987654321054321098765432105432109876543210 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 + +u32[0] u32[1] +3322222222221111111111 3322222222221111111111 +1098765432109876543210987654321010987654321098765432109876543210 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 + +U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45 +U8 Ydec; //小数部分43–36 1111 0010b (Y decimal) +U8 Xdec; //小数部分35–28 0111 0100b (X decimal) +U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) +U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) + +*******************************************************************************************************/ + + +void L2_oid_ParseF1(void) +{ +/// static uint8_t ucLogNum = 0; + uint16_t u16i = 0; + uint32_t u32t[2] = 0; +/// L1_print_rcv("\r\n F1="); + + if(ts_oid.rec.d[0] == 0x60) + {/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分 + ///组成,整数部分 14bit,小数部分 8bit + + + ts_oid.Xint = ts_oid.rec.d16[3]&0x3fff; + if(ts_oid.Xint < 300)///取决于图片 fixme: cc + { + G.oid_x = 1; + u32t[0] = ts_oid.rec.d32[0]; + u32t[1] = ts_oid.rec.d32[1]; + + ts_oid.angle = (vU16)(u32t[0]>>13); //45-32= 13 + ts_oid.angle &= 0x01ff; //53-45+1=8 + ///36-43 + ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4); + ///28 35 + ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4); +#ifdef docsdfads + C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105 + C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103 + C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106 + C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105 + C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105 + + A0 23 80 57 (12800.4500,142.5156) 105 + A0 23 80 57 + C0 23 40 5A + A0 23 00 5D + 30 22 C0 61 + E0 22 80 64 + 1010 0000 0010 0011 1000 0000 0101 0111 + 3322 2222 2222 1111 1111 11 + 1098 7654 3210 9876 5432 1098 7654 3210 + +#endif + u32t[1] >>= 14; + ts_oid.Yint = (vU16)u32t[1]; + ts_oid.Yint &= 0x3fff; + + ts_oid.Xdec&=0x7f; + ts_oid.x = (float)ts_oid.Xdec; + ts_oid.x /= 128.0; + if(ts_oid.Xdec&0x80) + { + ts_oid.x -= 1.0; + } + ts_oid.x += ts_oid.Xint; + + ts_oid.Ydec&=0x7f; + ts_oid.y = (float)ts_oid.Ydec; + ts_oid.y /= 128.0; + if(ts_oid.Ydec&0x80) + { + ts_oid.y -= 1.0; + } + ts_oid.y += ts_oid.Yint; + //数据存储到寄存器 + R.points[0].x_axis = ts_oid.x; + R.points[0].y_axis = ts_oid.y; + R.points[0].time = D_sys_now; + R.points[0].angle = (U8)ts_oid.angle>>1; + printf(" %3.2f %3.2f %d ", + ts_oid.x,ts_oid.y, + (int)ts_oid.angle); + } + else + { + L0_uart0_uc(';'); + } + } + else if(ts_oid.rec.d[0] == 0x40)///手写 + { +//// 普通码(bit61=0) +//// Bit60:码是否有效(1:无效码;0:有效码) +//// Bit59~Bit28:保留 +/// Bit27~Bit0:有效数据 + G.oid_p = 1; + ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF; + R.oid3_order = (int)ts_oid.gCode *100; + printf(" %ld %x ",ts_oid.gCode,(int)ts_oid.gCode); + + L0_uart0_ulhex(ts_oid.gCode); + }else + { + L0_uart0_uc(','); + } +} + +uint8_t L1_OID_WakeUp(void) +{ + uint32_t i = 0; + LD_Oid_SCK_LOW(); + delay_ms(2); + LD_Oid_SCK_HIGH(); + delay_ms(30); + LD_Oid_SCK_LOW(); + + L0_uart0_sendstr(" 44 "); + + while(1) + { + delay_ms(10); + i += 1; + if(i >= 400) // 400*5ms = 2s + { + L0_uart0_sendstr(" !!out!! "); + return 0; + } + if(!OID_DET) + { + L0_oid_Recv64(); + L1_print_rcv("\r\n WakeUpOID get="); + if(ts_oid.rec.d[7] == 0xf8) + { + ///use + L0_uart0_sendstr(" ok\r\n"); + return 1;//ucCheckVersionAndInit(eAppDevice); + + } + else + { + L0_uart0_sendstr("\r\nno?? OIDCMD_POWER_ON \r\n"); + return 0; + } + } + } +} + + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +void L0_Oid_Init(void) +{ + LD_Oid_DIO_INIT(); + /****************************************************************************************************** + 5430C2000A/3000A点读应用初始化设置 + 顺序 命令设置 备注 + 1 single command 0x4D 关闭解码 + 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4 + 3 single command 0x36 关闭手写码侦测 + 4 "REG(0x0DAD) = 4250 //设置AE Target + REG(0x0DB1) = 4000 //设置AE LOW + REG(0x0DAF) = 4000 //设置AE LOW + REG(0x0DB0) = 4500 //设置AE HIGH + REG(0x0DAE) = 4500 //设置AE HIGH + + REG(0x1641) = 0xA0 //设置dot filter + REG(0x0D6A) = 0x3F //此项不要改动 + REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。 + + 设置AE Range和dot filter。 + AE_LOW < AE_Target =32 && i<64) + { + RecvData[1] += 1; + } + + } + if(i < 31) + { + RecvData[0] <<= 1; + } + if( i >31 && i < 63) + { + RecvData[1] <<= 1; + } + + + } + + for(i = 0; i < 64; i++) + { + ts_oid.d[i/8] <<= 1; + if(s[63-i]) + { + ts_oid.d[i/8] |= 1; + } + else + { + ts_oid.d[i/8] &= 0xfe; + } + } +i =5; + +} + + +#endif + diff --git a/source/bsp/bsp_oid.h b/source/bsp/bsp_oid.h new file mode 100644 index 0000000..a5d6284 --- /dev/null +++ b/source/bsp/bsp_oid.h @@ -0,0 +1,164 @@ +#ifndef __OPTICALDATA__ +#define __OPTICALDATA__ + +#include "bsp_config.h" + +/****************************************************************************************************** + 配置参数 +*******************************************************************************************************/ +#define ROM009_HANDWRITE 0 +#define DATA_FORMAT_2 0 +#define OID_4C 0 +#define DEBOUNCE_FUNC 0 +#define LOG_REGISTER 0 + +#if DEBOUNCE_FUNC +#define DEBOUNCE_TIMES 3 // 连续三笔相同,才触发,debounce时,可设置。去抖动时间 +#define DEBOUNCE_RELESE_TIME 20 //5ms * 20 = 100ms,100ms无任何码,认为抬笔。 +#endif +/****************************************************************************************************** + 2-wire GPIO + +#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 LD_oid_io_init() LD_Oid_SCK_INIT() +////#define LD_Oid_SCK_INIT() D_stdIO_P3(BITN4); + +#define LD_Oid_SCK_LOW() D_P34_OFF(); +#define LD_Oid_SCK_HIGH() D_P34_ON(); + +#define LD_Oid_SCK_INIT(); D_HighI_P3(BITN4);LD_Oid_SCK_LOW(); + + +#define LD_Oid_SDIO_INIT() D_HighR_P5(BITN0) +#define LD_Oid_SDIO_LOW() D_P50_OFF() +#define LD_Oid_SDIO_HIGH() D_P50_ON() +#define LD_Oid_SDIO_IN() D_HighR_P5(BITN0)//高阻输入 +#define LD_Oid_SDIO_OUT() D_HighI_P5(BITN0)//推挽输出 + +#define LD_Oid_SDIO_AT() D_P50_AT() + + +#define LD_Oid_DIO_INIT(); LD_Oid_SCK_INIT();LD_Oid_SDIO_INIT(); + + +#define OID_DET P50 + +/****************************************************************************************************** + OID命令 +*******************************************************************************************************/ + + +////20211229依据53xx和54xx系列操作 +#define USERCMD_20FPS 0x24 +#define USERCMD_30FPS 0x25 +#define USERCMD_40FPS 0x26 +#define USERCMD_50FPS 0x27 +#define USERCMD_80FPS 0x3C +#define USERCMD_80FPS_EXIT 0x3B +#define USERCMD_DECODE_SHUT 0x4D +#define USERCMD_LIANCHUAN 0x40 +#define USERCMD_SUSPEND 0x57 +#define USERCMD_EN_ANGLE 0x10 +#define USERCMD_EN_POSITION 0x35 +#define USERCMD_SW_POSITION 0x43 +#define USERCMD_DATA_FORMAT_2 0x2C +#define USERCMD_LOU_GUANG 0xD7 +#define USERCMD_POWER_DOWN 0x56 + + + +#define OIDCMD_POWER_ON 0x0000FFF8 +#define OIDCMD_POWER_OFF 0x0000FFF7 +/****************************************************************************************************** + OID版本 +*******************************************************************************************************/ +#define OID_VER_D 0x1169 +#define OID_VER_REG 0x1670 +#define OID_VER_F 0x1168 +#define REG_READOID_SET 0xD40 +#define REG_EN_DECODE 0xD63 +#define REG_ROM008 0xDA5 +#define REG_ROM009 0xDA6 +#define ROM_009 0x09 +#define ROM_008 0x00 +/****************************************************************************************************** + Dataformat 2定义 +*******************************************************************************************************/ +#define CHECK_INVALID_DF2 0x40000000 +#define CHECK_OID_VERSION_DF2 0xFC000000 +#define OID_2_GENERAL_DF2 0x00000000 +#define OID_3_GENERAL_DF2 0x08000000 +#define OID_3_POSITION_DF2 0x04000000 +#define OID_3S_GENERAL_DF2 0x10000000 +#define OID_3S_POSITION_DF2 0x0C000000 +#define OID_35_GENERAL_DF2 0x14000000 +#define OID_4_GENERAL_DF2 0x1C000000 +#define OID_4_POSITION_DF2 0x18000000 +#define OID_4C_POSITION_DF2 0x20000000 +/****************************************************************************************************** + 函数声明 +*******************************************************************************************************/ +typedef enum +{ + eHandWrite = 0, + ePointRead_2000A = 1, + ePointRead_3000A = 2, + ePointRead_LightGuide = 3, + eCar_LightGuide = 4, +}AppDevice; +extern AppDevice eAppDevice; +/***************** + +void OidTaskLoop(void); +uint8_t L1_oid_TransCmd(uint8_t Cmd); +uint8_t WakeUpOID(void); + + +void L1_oid_RecvOptData(void); + +void LogRegister(void); +uint8_t L1_oid_CheckVersionAndInit(AppDevice eAppDevice); + +/*****************************/ +/********************************************************** + Bit Indication +63–60 0110b +59–54 Reserved +53–45 Angle +44 Reserved +43–36 1111 0010b (Y decimal) +35–28 0111 0100b (X decimal) +27–14 00 0000 0000 0100b (Y integer) +13–0 00 0000 0000 0100b (X integer) 变量定义 +******************************************************/ +typedef struct _ts_OID +{//8byte +/// u8 d[8]; + U_U64 rec; + U8 oid_type; //类型63–60 0110b + U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45 + U8 Ydec; //小数部分43–36 1111 0010b (Y decimal) + U8 Xdec; //小数部分35–28 0111 0100b (X decimal) + U16 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) + U16 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) + float x,y;// + + U32 gCode; // +}Ts_OID_; +extern Ts_OID_ ts_oid; +///extern volatile uint32_t RecvData[3]; + +void L0_Oid_Init(void); + +uint8_t L1_oid_TransCmd(uint8_t Cmd); +void L1_print_rcv(char *str); +uint32_t L1_oidReadRegister (uint16_t Data1); +void L1_Oid_readoid(void); +uint8_t L1_OID_WakeUp(void); +void L2_oid_ParseF1(void); +#endif // __OPTICALDATA__ + diff --git a/source/bsp/chipid.h b/source/bsp/chipid.h index ba48a30..ca448c3 100644 --- a/source/bsp/chipid.h +++ b/source/bsp/chipid.h @@ -26,7 +26,7 @@ ///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #include "../bsp/bsp_config.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" extern void L0_id_get(U8 *id); extern void L0_id_get_rom(U8 *id); diff --git a/source/bsp/868.c b/source/bsp/nouse/868.c similarity index 100% rename from source/bsp/868.c rename to source/bsp/nouse/868.c diff --git a/source/bsp/868.h b/source/bsp/nouse/868.h similarity index 100% rename from source/bsp/868.h rename to source/bsp/nouse/868.h diff --git a/source/bsp/nouse/bsp_config.h.bak b/source/bsp/nouse/bsp_config.h.bak new file mode 100644 index 0000000..e915041 --- /dev/null +++ b/source/bsp/nouse/bsp_config.h.bak @@ -0,0 +1,240 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序 +/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +////////////////////////////////////////////////////////////////////////////// +/// @version 5.1 +/// @author CC +/// @date 20200301 +/// @note +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +///存储器中的特殊参数 +///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节 +///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前) +///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前) +///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H - +///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H - +///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H +///固件版本为7.3.12U +///以及后续版本有效 +///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H +///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H +///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH +///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH +///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH +///保留 7FECH BFECH EFECH FDECH +///保留 7FEBH BFEBH EFEBH FDEBH +///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH +///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H +////////////////////////////////////////////////////////////////////////// + +#ifndef _BSP_CONFIG_H +#define _BSP_CONFIG_H + +#include +#include "../bsp/bsp_config_const.h" +#include "../clib/type.h" +#include "../clib/bit.h" + + +//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT +#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0B +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG +#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0B) + #include + #include "../cpu/stc_stc8hxx.h" + #include "../cpu/stc_macro.h" + + //基本配置(工作频率、时钟、看门狗、字节序) + #define TYPE_MCU TYPE_MCU_STC_8H + #define TYPE_IDE TYPE_IDE_KEIL + #define D_CPUfamily_type D_CPUfamily_8bits + #define D_sys_MainFre MainFre_22M + #define D_sys_Jiffies TYPE_JIFFIES_10MS + #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_MCU_NAME "STC8H3K64S4" + //存储器特殊参数地址配置 + #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 + //...其他参数 + + //串口配置 + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 + #define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 + #define D_uart2_BRT BRT_115200 + #define D_uart2_SBIT SBIT_1 + #define D_PIN_UART2 PIN_UART2_Rxd_10_Txd_11 //wifi模块 + #define D_uart3_BRT BRT_115200 + #define D_PIN_UART3 PIN_UART3_Rxd_43_Txd_44 //声音模块 + #define D_uart4_BRT BRT_115200 + + //485配置 + #define D_UART0_485_TYPE TYPE_485_NONE //UART0启用485 + #define D_UART0_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息 + #define D_UART0_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId + #define D_UART0_485_TX() P32 = 1; + #define D_UART0_485_RX() P32 = 0; + #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 LED1 P27 //D4 + #define LED2 P26 //D4 + #define LED3 P2 //D4 + #define LED4 P55 //D4 + //笔头 + #define SCK P34 + #define SDIO P50 + //按键 + #define key1 P32 + #define key2 P33 + #define key3 P40 + //EEP存储地址定义 + #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes + #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 + #define D_EEP_SECTOR_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + #define D_EEP_BLOCK_FILTER0 0xAA //扇区中每个数据块的Filter字段值 + #define D_EEP_BLOCK_FILTER1 0x55 + //EEP User Defined 参数区存储配置 + #define D_EEP_PARAM_IN_SECTOR 1 //eeprom参数区扇区地址,从0开始 + #define D_EEP_PARAM_IN_BLOCK 0 //eeprom参数区数据块地址,从0开始 + //#define D_EEP_PARAM_BLOCK_SIZE (D_EEP_SECTOR_BLOCK_SIZE) //参数区每个块大小,必须:D_EEP_PARAM_BLOCK_SIZE<=D_EEP_SECTOR_BLOCK_SIZE!!!,因为eeprom.h中是按照D_EEP_SECTOR_BLOCK_SIZE分配的buf + //#define D_EEP_PARAM_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + //EEP 加密区存储配置 + #if(D_CODE_ENCRYPTION_TYPE == TYPE_ENCRYPTION_ENABLE) + #define D_EEP_ENC_IN_SECTOR 0 //eeprom加密区扇区地址,从0开始 + #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 + //#define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 + #endif +#elif + xxx +#endif +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) +#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 4 +#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 +//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cdelay CONFIG +#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 +#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 + //xx +#endif//D_sys_MainFre) +//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#include "../clib/type.h" +#include "../clib/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 //点读笔 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>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_5MS 5 +#define TYPE_JIFFIES_10MS 10 +#define TYPE_JIFFIES_25MS 25 +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.WDT TYPE +#define TYPE_WDT_DISABLE 1 +#define TYPE_WDT_ENABLE 2 +//#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_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 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>UART0 PIN +#define PIN_UART0_Rxd_30_Txd_31 1 +#define PIN_UART0_Rxd_36_Txd_37 2 +#define PIN_UART0_Rxd_16_Txd_17 3 +#define PIN_UART0_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 +//<<<<<<<<<<<<<<<<<<<<< 0x31 0x31 0x32 0x32 '1' '1' '2' '2' -void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +void Lc_hex2ascii(U8 *buf,U8 *ascii,U16 len) { vU16 t = 0,m = 0; for(t = 0;t < len;t ++) @@ -414,6 +414,15 @@ int Lc_memset(U8 *buf,U8 c,U16 len) } return 0; } +void Lc_memset8bits (void *s,unsigned char c,unsigned char n) +{ + const unsigned char uc = c; + unsigned char *su; + for(su = s;0 < n;++su,--n) + *su = uc; + } + + #if 0 diff --git a/source/clib/clib.h b/source/clib/clib.h index 41bc041..ae634cc 100644 --- a/source/clib/clib.h +++ b/source/clib/clib.h @@ -97,7 +97,7 @@ 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 Lc_hex2ascii(U8 *buf,U8 *ascii,U16 len); 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 int isBigEndianOrder(void); @@ -115,6 +115,8 @@ extern int Lc_memset(U8 *buf,U8 c,U16 len); extern void Lc_buf_copy_uc(U8 *dst,U8 *src,U16 len); extern U8 Lc_strStartsWith(U8 *s1,U8 *s2); +void Lc_memset8bits (void *s,unsigned char c,unsigned char n); + #endif /* end __UART_H */ /***************************************************************************** diff --git a/source/clib/type.h b/source/clib/type.h index 439b662..d33c557 100644 --- a/source/clib/type.h +++ b/source/clib/type.h @@ -1,23 +1,34 @@ ////////////////////////////////////////////////////////////////////////// /// COPYRIGHT NOTICE -/// Copyright (c) 2020, ؿƼ +/// 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 +/// Modified by: cc +/// Modified date: 20211222 +/// Version: +/// Descriptions: add uint32_t +#if 0 +abs(x) +{ + y = x<<31; +  return(x^y)-y;//也可写作 (x+y)^y +} +#endif ////////////////////////////////////////////////////////////////////////// @@ -82,7 +93,7 @@ #endif /********************************************************************************************************* - ޹ص + 定义与编译器无关的数据类型 *********************************************************************************************************/ typedef unsigned char U8; @@ -91,7 +102,7 @@ typedef volatile U8 vU8; -typedef U8 BOOLEAN; /* */ +typedef U8 BOOLEAN; /* 布尔变量 */ typedef U8 *PU8; typedef U8 BYTE; typedef signed char S8; @@ -104,52 +115,59 @@ typedef signed char *PS8; //#define code typedef unsigned short u16; -typedef unsigned short U16; /* ޷16λͱ */ -typedef volatile U16 vU16; /* ޷16λͱ */ +typedef unsigned short U16; /* 无符号16位整型变量 */ +typedef volatile U16 vU16; /* 无符号16位整型变量 */ typedef signed short S16; -typedef volatile S16 vS16; /* з16λͱ */ +typedef volatile S16 vS16; /* 有符号16位整型变量 */ typedef signed long S32; -typedef unsigned long U32; /* ޷32λͱ */ -typedef volatile U32 vU32; /* з32λͱ */ +typedef unsigned long U32; /* 无符号32位整型变量 */ +typedef volatile U32 vU32; /* 有符号32位整型变量 */ typedef volatile signed long vS32; -typedef float FP32; /* ȸ32λȣ */ -typedef double FP64; /* ˫ȸ64λȣ */ +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 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 unsigned char uint8_t; +typedef unsigned long uint32_t;////51 +///typedef unsigned long long uint64_t;////51 -typedef signed long INT32S; // з32λͱ -//typedef float FP32; // ȸ32λȣ -//typedef double FP64; // ˫ȸ64λȣ +///typedef volatile uint64_t vU64; -typedef unsigned int FLAG_P; // ׼ -//typedef unsigned char INTU; // ׼8BIT MCU -typedef unsigned int INTU; // ׼32BIT MCU +typedef unsigned short uint16_t; ///// + +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 /* ûзֶ */ +#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Ҫӵͷļ + realView编译器需要添加的头文件 *********************************************************************************************************/ #include #include @@ -166,6 +184,20 @@ typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; typedef U8 UN_TYPE; typedef U8 vtype; +/// >>>>>>>>>>>>>>>>>>>cc: sd znfat +#define UINT8 unsigned char +#define UINT16 unsigned int +#define UINT32 unsigned long + +#define INT8 char +#define INT16 int +#define INT32 long + +#define ROM_TYPE_UINT8 unsigned char code +#define ROM_TYPE_UINT16 unsigned int code +#define ROM_TYPE_UINT32 unsigned long code + +///<<<<<<<<<<<<<<<<<<<<<>4) #define D_uc_low(ww) ((ww)&0x0f) diff --git a/source/clib/type.h.bak b/source/clib/type.h.bak new file mode 100644 index 0000000..af6bfec --- /dev/null +++ b/source/clib/type.h.bak @@ -0,0 +1,355 @@ +////////////////////////////////////////////////////////////////////////// +/// 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 +/// Modified by: cc +/// Modified date: 20211222 +/// Version: +/// Descriptions: add uint32_t +#if 0 +abs(x) +{ + y = x<<31; +  return(x^y)-y;//也可写作 (x+y)^y +} +#endif +////////////////////////////////////////////////////////////////////////// + + +//#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; + +/// >>>>>>>>>>>>>>>>>>>cc: sd znfat +#define UINT8 unsigned char +#define UINT16 unsigned int +#define UINT32 unsigned long + +#define INT8 char +#define INT16 int +#define INT32 long + +#define ROM_TYPE_UINT8 unsigned char code +#define ROM_TYPE_UINT16 unsigned int code +#define ROM_TYPE_UINT32 unsigned long code + +///<<<<<<<<<<<<<<<<<<<<<>>>> + + +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 +{ + vU32 d32[2]; + + vU16 d16[4]; + + vU8 d[8]; +}U_U64; + + +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_2uc2_us(H,L) ((((U16)H)<<8)|((U16)L)) + +#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/STC_stc8h3k.H b/source/cpu/STC_stc8h3k.H new file mode 100644 index 0000000..41d5dee --- /dev/null +++ b/source/cpu/STC_stc8h3k.H @@ -0,0 +1,1394 @@ +#ifndef __STC_stc8h3k_H_ +#define __STC_stc8h3k_H_ +// STC_stc8a8k.h +#include + +#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 "../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_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/c51_macro.H b/source/cpu/c51_macro.H new file mode 100644 index 0000000..5bbfab9 --- /dev/null +++ b/source/cpu/c51_macro.H @@ -0,0 +1,301 @@ +////////////////////////////////////////////////////////////////////////// +/// 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 __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/STC_stc8a8k.H b/source/cpu/nouse/STC_stc8a8k.H similarity index 100% rename from source/cpu/STC_stc8a8k.H rename to source/cpu/nouse/STC_stc8a8k.H diff --git a/source/cpu/stc_macro.H b/source/cpu/nouse/stc_macro.H similarity index 100% rename from source/cpu/stc_macro.H rename to source/cpu/nouse/stc_macro.H diff --git a/source/cpu/stc_stc15w.H b/source/cpu/nouse/stc_stc15w.H similarity index 100% rename from source/cpu/stc_stc15w.H rename to source/cpu/nouse/stc_stc15w.H diff --git a/source/cpu/stc_stc8G1k.H b/source/cpu/nouse/stc_stc8G1k.H similarity index 100% rename from source/cpu/stc_stc8G1k.H rename to source/cpu/nouse/stc_stc8G1k.H diff --git a/source/cpu/stc_stc8f.h b/source/cpu/nouse/stc_stc8f.h similarity index 100% rename from source/cpu/stc_stc8f.h rename to source/cpu/nouse/stc_stc8f.h diff --git a/source/cpu/stc_stc8hxx.h b/source/cpu/nouse/stc_stc8hxx.h similarity index 100% rename from source/cpu/stc_stc8hxx.h rename to source/cpu/nouse/stc_stc8hxx.h diff --git a/source/cpu/stc_only.H b/source/cpu/stc_only.H new file mode 100644 index 0000000..aa5c378 --- /dev/null +++ b/source/cpu/stc_only.H @@ -0,0 +1,258 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2022, 传控科技 +/// All rights reserved. +/// +/// @file __STC_ONLY_H_ +/// @brief macro define 和cpu相关,STC独有的 使用stc系列单片机是使用 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.0 CCsens technology +/// @author CC +/// @date 20211226 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __STC_ONLY_H_ +#define __STC_ONLY_H_ + +#include + +#define ET3 0x20 +#define T3IF 0x02 + +///#define ES2 0x01 +///#define ES3 0x08 + +#define S2TI 0x02 +#define S2RI 0x01 +#define S3TI 0x02 +#define S3RI 0x01 +#define ET4 0x40 + + + + +///#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 + +///////////////////////////////////////////////// + +#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 "../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(BITNx) BITN_0(P0M1,BITNx);BITN_0(P0M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(BITNx) BITN_0(P0M1,BITNx);BITN_1(P0M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(BITNx) BITN_1(P0M1,BITNx);BITN_0(P0M0,BITNx); /////////10 高阻 +#define D_OpenD_P0(BITNx) BITN_1(P0M1,BITNx);BITN_1(P0M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(BITNx) BITN_0(P1M1,BITNx);BITN_0(P1M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(BITNx) BITN_0(P1M1,BITNx);BITN_1(P1M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(BITNx) BITN_1(P1M1,BITNx);BITN_0(P1M0,BITNx); /////////10 高阻 +#define D_OpenD_P1(BITNx) BITN_1(P1M1,BITNx);BITN_1(P1M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(BITNx) BITN_0(P2M1,BITNx);BITN_0(P2M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(BITNx) BITN_0(P2M1,BITNx);BITN_1(P2M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(BITNx) BITN_1(P2M1,BITNx);BITN_0(P2M0,BITNx); /////////10 高阻 +#define D_OpenD_P2(BITNx) BITN_1(P2M1,BITNx);BITN_1(P2M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(BITNx) BITN_0(P3M1,BITNx);BITN_0(P3M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(BITNx) BITN_0(P3M1,BITNx);BITN_1(P3M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(BITNx) BITN_1(P3M1,BITNx);BITN_0(P3M0,BITNx); /////////10 高阻 +#define D_OpenD_P3(BITNx) BITN_1(P3M1,BITNx);BITN_1(P3M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(BITNx) BITN_0(P4M1,BITNx);BITN_0(P4M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(BITNx) BITN_0(P4M1,BITNx);BITN_1(P4M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(BITNx) BITN_1(P4M1,BITNx);BITN_0(P4M0,BITNx); /////////10 高阻 +#define D_OpenD_P4(BITNx) BITN_1(P4M1,BITNx);BITN_1(P4M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(BITNx) BITN_0(P5M1,BITNx);BITN_0(P5M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(BITNx) BITN_0(P5M1,BITNx);BITN_1(P5M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(BITNx) BITN_1(P5M1,BITNx);BITN_0(P5M0,BITNx); /////////10 高阻 +#define D_OpenD_P5(BITNx) BITN_1(P5M1,BITNx);BITN_1(P5M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(BITNx) BITN_0(P6M1,BITNx);BITN_0(P6M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(BITNx) BITN_0(P6M1,BITNx);BITN_1(P6M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(BITNx) BITN_1(P6M1,BITNx);BITN_0(P6M0,BITNx); /////////10 高阻 +#define D_OpenD_P6(BITNx) BITN_1(P6M1,BITNx);BITN_1(P6M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(BITNx) BITN_0(P7M1,BITNx);BITN_0(P7M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(BITNx) BITN_0(P7M1,BITNx);BITN_1(P7M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(BITNx) BITN_1(P7M1,BITNx);BITN_0(P7M0,BITNx); /////////10 高阻 +#define D_OpenD_P7(BITNx) 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); + + + + + + + + + +#endif //__STC_ONLY_H_ + + + + + + + diff --git a/source/ctask/tick.c b/source/ctask/tick.c index fa4ee64..50ad02c 100644 --- a/source/ctask/tick.c +++ b/source/ctask/tick.c @@ -23,7 +23,7 @@ void L1_tick_init(void) { s_nos_tick.jiffies = 0; s_nos_tick.t_1s = 0; - s_nos_tick.t1s_heatbeart= 0; + s_nos_tick.t1s_heartbeat= 0; //s_nos_tick.t_10ms = 0; } @@ -41,7 +41,7 @@ void L1_tick_tick (void) { // 65535*65535/24/60/60/356/10 =12.7年 s_nos_tick.t_1s ++; - s_nos_tick.t1s_heatbeart = 1; + s_nos_tick.t1s_heartbeat = 1; } } diff --git a/source/ctask/tick.h b/source/ctask/tick.h index 42f156a..4e9c819 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -17,7 +17,18 @@ struct _s_nos_tick_ { vU32 jiffies; // noos系统定时器最小计时单元 vU32 t_1s; - vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 + vU8 t1s_heartbeat; //noos 系统定时器整秒时刻标志,需要软件清除 + + vU8 print_heartbeat; + + vU32 n_stamp; + vU32 t_10ms; + vU32 t_50ms; // noos 系统定时器10m技术 +// vU32 t1s_flag[6]; //fixme: INT32U 根据不同的系统来决定 + //volatile unsigned char t1s_flag; +/// vU8 ts_flag; + vU32 n_stamp3; + // vU8 t_10ms; }; extern struct _s_nos_tick_ s_nos_tick; @@ -72,7 +83,6 @@ extern struct _s_nos_tick_ s_nos_tick; #define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms #define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) - #define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s #define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) @@ -85,6 +95,14 @@ extern struct _s_nos_tick_ s_nos_tick; #define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) #define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); +#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 extern void L1_tick_init(void); extern void L1_tick_tick (void); diff --git a/source/ctask/tick.h.bak b/source/ctask/tick.h.bak new file mode 100644 index 0000000..42f156a --- /dev/null +++ b/source/ctask/tick.h.bak @@ -0,0 +1,94 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2017,SensorControl + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename tick.h tick.c +******************************************************************************/ +#ifndef __tick_H +#define __tick_H +#include "../clib/Type.h" +#include "../msp/time.h" + +struct _s_nos_tick_ +{ + vU32 jiffies; // noos系统定时器最小计时单元 + vU32 t_1s; + vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 +// vU8 t_10ms; +}; +extern struct _s_nos_tick_ s_nos_tick; + +#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) + #define HZ 200 +#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) + #define HZ 100 +#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) + #define HZ 40 +#endif +#define JIFFIES (1000/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) + +#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_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) + + +//必须配对 +#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms +#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) + + +#define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s +#define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) + + +//>>>//必须配对 +#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_50ms; +#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_50ms - time_stamp) > time_overflow) + + +#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) +#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); + +extern void L1_tick_init(void); +extern void L1_tick_tick (void); + +#endif /* end __tick_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/msp/eeprom.h b/source/msp/eeprom.h index e8bbf92..c2310cb 100644 --- a/source/msp/eeprom.h +++ b/source/msp/eeprom.h @@ -21,7 +21,7 @@ #include "../clib/type.h" #include "../clib/clib.h" #include "../ctask/tick.h" -#include "uart0.h" +#include "msp_uart0.h" /** * EEPROM 存储结构 diff --git a/source/msp/UART0.C b/source/msp/mcu support/UART0.C similarity index 99% rename from source/msp/UART0.C rename to source/msp/mcu support/UART0.C index c158a2f..7b6e115 100644 --- a/source/msp/UART0.C +++ b/source/msp/mcu support/UART0.C @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart0.h" +#include "msp_uart0.h" #include "../msp/time.h" //#define _USE_485 diff --git a/source/msp/UART2.C b/source/msp/mcu support/UART2.C similarity index 96% rename from source/msp/UART2.C rename to source/msp/mcu support/UART2.C index e746df4..ae3cde6 100644 --- a/source/msp/UART2.C +++ b/source/msp/mcu support/UART2.C @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart2.h" +#include "msp_uart2.h" #include "../app/app_config.h" #include "../msp/time.h" @@ -135,8 +135,11 @@ void L1_uart_tpc_config(void) /************************************************* UART 中断 *************************************************/ -#define D_SERVE_uart2 interrupt 8 -void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 +///#define D_SERVE_uart2 interrupt 8 +// using 2 +#define D_SERVE_UART2 interrupt 8 +///void INTERRUPT_uart2(void) D_SERVE_uart2 +void INTERRUPT_uart2(void) interrupt 8 { //NOP(); NOP(); NOP(); if(L0_uart2_IntRI()) //如果是U2接收中断 diff --git a/source/msp/UART2.h b/source/msp/mcu support/UART2.h similarity index 99% rename from source/msp/UART2.h rename to source/msp/mcu support/UART2.h index cf66fe8..d3bb23c 100644 --- a/source/msp/UART2.h +++ b/source/msp/mcu support/UART2.h @@ -57,7 +57,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../tpc/at0d0a.h" #include "../tpc/modbus.h" -#include "uart_x.h" +#include "msp_uart_x.h" #include "../tpc/ccmodbus.h" #define uNum2 1 diff --git a/source/msp/UART4.h b/source/msp/mcu support/UART4.h similarity index 100% rename from source/msp/UART4.h rename to source/msp/mcu support/UART4.h diff --git a/source/msp/uart_x.c b/source/msp/mcu support/uart_x.c similarity index 99% rename from source/msp/uart_x.c rename to source/msp/mcu support/uart_x.c index bdda560..57210d8 100644 --- a/source/msp/uart_x.c +++ b/source/msp/mcu support/uart_x.c @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart_x.h" +#include "msp_uart_x.h" TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0}; diff --git a/source/msp/msp_uart0.C b/source/msp/msp_uart0.C new file mode 100644 index 0000000..1f9d02b --- /dev/null +++ b/source/msp/msp_uart0.C @@ -0,0 +1,187 @@ +////////////////////////////////////////////////////////////////////////// +/// 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_uart0.h" +#include "../msp/time.h" +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart_send_shop; + +TP_Handler_X s_uart0_rec; +TS_PH4_modbus s_uart0_ack; + +void L0_uart0_init(void) +{ +// U16 val1= D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT); +// SCON = 0x50; //8位数据,可变波特率 +// AUXR |= 0x01; //串口1选择定时器2为波特率发生器 +// AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T +// T2L = val1; +// T2H = val1 >> 8; +// AUXR |= 0x10; //启动定时器2 + SCON = 0x50; //8位数据,可变波特率 + AUXR &= 0xBF; //定时器时钟12T模式 + AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 + TMOD &= 0x0F; //设置定时器模式 + TL1 = 0xFC; //设置定时初始值 + TH1 = 0xFF; //设置定时初始值 +//// TL1 = val1; //设置定时初始值 +//// TH1 = val1 >> 8; //设置定时初始值 + ET1 = 0; //禁止定时器%d中断 + TR1 = 1; //定时器1开始计时 +// SCON = 0x50; //8位数据,可变波特率 +// AUXR |= 0x01; //串口1选择定时器2为波特率发生器 +// AUXR &= 0xFB; //定时器时钟12T模式 +// T2L = 0xE8; //设置定时初始值 +// T2H = 0xFF; //设置定时初始值 +// AUXR |= 0x10; //定时器2开始计时 +} + +void L0_uart0_buf_init(void) +{ + ts_uart[uNum0].p = &ts_uart_send_shop; + ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; + ts_uart[uNum0].p->ok = D_ready; + ts_uart[uNum0].t = &s_uart0_rec; + ts_uart[uNum0].t->head = 0; + ts_uart[uNum0].t->ok = 0; + //ts_uart[uNum0].tp_handler = L1_s2b_PH4; + ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误 + ts_uart[uNum0].ack = (U8*)&s_uart0_ack; + L0_uart0_init(); + D_uart0_ES_INT(1); //打开串口中断 + +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart0_sendArray(U8 * buf, U16 len) +{ +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum0,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +void INTERRUPT_UART(void) D_SERVE_UART +{ + //NOP(); NOP(); NOP(); + if(L0_uart0_IntRI()) //如果是U0接收中断 + { + // LED0 ^= 1; + L0_uart0_IntRIClear(); //清除接收中断标志 + ts_uart[uNum0].t->reg = SBUF; + //ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); + L1_s2b_PH4(ts_uart[uNum0].t); + L0_timer3_restart(); + } + if(L0_uart0_IntTI()) //如果是U0发送中断 + { + //LED0 ^= 1; + L0_uart0_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) + { + SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]; + //L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]); + ts_uart[uNum0].p->now ++; + } + else + { + ts_uart[uNum0].p->ok = D_ready; + ts_uart[uNum0].p->max = 0; + ts_uart[uNum0].p->now = 0;//可以发送下一个数据 +#if (D_UART0_485_TYPE != TYPE_485_NONE) + D_UART0_485_RX() //切换到接收状态 +#endif + } + } + //NOP(); NOP(); NOP(); +} + +void timer3_isrHanddle(void) D_SERVE_TIMER3 +{ + struct _tp_handler_x *p1 = &s_uart0_rec; + if((p1->head == 1) && (p1->num >= D_s_modbus_min)) + { + p1->head = 0; + crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC + if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) + { + p1->ok = 1; +// LED0 ^= 1; + } + else + { + p1->yes = 1; + } + } + + L0_timer3_stop(); +} + +//putchar字符发送函数重定向 +extern char putchar(char c) +{ + ///PrintData1(c); + L0_uart0_sendArray(&c,1); + return c; +} + + diff --git a/source/msp/UART0.h b/source/msp/msp_uart0.h similarity index 95% rename from source/msp/UART0.h rename to source/msp/msp_uart0.h index 29caea2..4a8af1c 100644 --- a/source/msp/UART0.h +++ b/source/msp/msp_uart0.h @@ -54,9 +54,9 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #define _uart0_H #include "../bsp/bsp_config.h" #include "../tpc/modbus.h" -#include "uart_x.h" -#include "../msp/uart2.h" -#include "../msp/uart3.h" +#include "msp_uart_x.h" +#include "../msp/msp_uart2.h" +///#include "../msp/msp_uart3.h" //#include "../tpc/tpc_x.h" #define uNum0 0 @@ -80,7 +80,7 @@ void L0_uart0_sendArray(U8 * buf, U16 len); #define L0_uart0_ushex(X) L0_uartN_ushex(uNum0,X) #define L0_uart0_ulhex(X) L0_uartN_ulhex(uNum0,X) #define L0_uart0_sendstr(buf) L0_uartN_sendstr(uNum0,buf) -#define L1_uart0_uchexArray(buf) L1_uartN_uchexArray(uNum0,buf) +#define L1_uart0_uchexArray(buf,n) L1_uartN_uchexArray(uNum0,buf,n) extern TP_Handler_X s_uart0_rec; extern TS_PH4_modbus s_uart0_ack; diff --git a/source/msp/msp_uart2.C b/source/msp/msp_uart2.C new file mode 100644 index 0000000..3a6232e --- /dev/null +++ b/source/msp/msp_uart2.C @@ -0,0 +1,183 @@ +////////////////////////////////////////////////////////////////////////// +/// 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 "../app/app_config.h" +#include "../msp/time.h" + +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart2_send_shop; +//TP_Handler_X s_uart2_rec; +//TS_PH4_modbus s_uart2_ack; +struct _s_PC1_0D0A_ s_uart2_at; +TS_Handle_PH3 s_uart2_tcp_rec; +void (*Lp0_uart2_fun)(unsigned char sbufreg); + +void L0_uart2_init(void) +{ + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFC; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} + +void L0_uart2_buf_init(void) +{ + s_uart2_at.head = 0; + s_uart2_at.ok = 0; + s_uart2_at.num = 0; + + ts_uart[uNum2].p = &ts_uart2_send_shop; + ts_uart[uNum2].p->now = 0; + ts_uart[uNum2].p->ok = D_ready; + //ts_uart[uNum2].t = &s_uart2_rec; + ts_uart[uNum2].t->head = 0; + ts_uart[uNum2].t->ok = 0; + ts_uart[uNum2].tp_handler = NULL; + //ts_uart[uNum2].ack = (U8*)&s_uart2_ack; + L0_uart2_init(); + D_uart2_ES_INT(1); //打开串口中断 + + + //配置串口对应的操作协议 + L1_uart_tpc_config(); + +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //默认处于接收状态 +#endif +} + +void L0_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 L1_s2b_gm35(unsigned char sbufreg) +{ + s_uart2_tcp_rec.reg = sbufreg; + L1_s2b_PH3(&s_uart2_tcp_rec); + if(0 == s_uart2_tcp_rec.head) + { + s_uart2_at.reg = sbufreg; + L1_s2b_0d0a(&s_uart2_at); + } + else + { + s_uart2_at.head = 0; + } +} +void L1_uart_tpc_config(void) +{ + s_uart2_tcp_rec.head = 0; + s_uart2_tcp_rec.ok = 0; + s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff; + s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe; + s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus); +} + +/************************************************* +UART 中断 +*************************************************/ +///#define D_SERVE_uart2 interrupt 8 +void INTERRUPT_uart2(void) interrupt 8 ///D_SERVE_uart2// using 2 +{ + //NOP(); NOP(); NOP(); + if(L0_uart2_IntRI()) //如果是U2接收中断 + { + //LED1 ^= 1; + L0_uart2_IntRIClear(); //清除接收中断标志 + //ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); + //ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); + //s_uart2_at.reg = L0_uartN_get(uNum2); + //L1_s2b_0d0a(&s_uart2_at); + L1_s2b_gm35(L0_uart2_get()); + } + if(L0_uart2_IntTI()) //如果是U0发送中断 + { + L0_uart2_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) + { + S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]; + //L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + ts_uart[uNum2].p->now ++; + } + else + { + ts_uart[uNum2].p->ok = D_ready; + ts_uart[uNum2].p->max = 0; + ts_uart[uNum2].p->now = 0;//可以发送下一个数据 +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +} + + + + + + + + + + diff --git a/source/msp/msp_uart2.h b/source/msp/msp_uart2.h new file mode 100644 index 0000000..d3bb23c --- /dev/null +++ b/source/msp/msp_uart2.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////// +/// 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/bsp_config.h" + +#include "../tpc/at0d0a.h" +#include "../tpc/modbus.h" +#include "msp_uart_x.h" +#include "../tpc/ccmodbus.h" + +#define uNum2 1 + +#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) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart2_buf_init(void); +void L0_uart2_sendArray(U8 * buf, U16 len); +void uart2_Handdle(void); +#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) +//extern TP_Handler_X s_uart2_rec; +//extern TS_PH4_modbus s_uart2_ack; +extern TS_Handle_0d0a s_uart2_at; +extern TS_Handle_PH3 s_uart2_tcp_rec; +extern void (*Lp0_uart2_fun)(unsigned char sbufreg); + +extern void L1_uart_tpc_config(void); + +#endif //#ifndef _uart2_H + diff --git a/source/msp/msp_uart_x.c b/source/msp/msp_uart_x.c new file mode 100644 index 0000000..c4cc12e --- /dev/null +++ b/source/msp/msp_uart_x.c @@ -0,0 +1,236 @@ +////////////////////////////////////////////////////////////////////////// +/// 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相关 缓存发送也放在里面idata + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart_x.h" + +TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; + +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; + } +} + +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 10 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_uart[uartx].p->over ++ > 6000000) + { + 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_UART_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,Lc_strlen(str)); +} + +void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) +{ + int i; + for(i=0;i= D_UART_send_buf_max) + { + len = D_UART_send_buf_max - 1; + + } + Lc_hex2ascii(ts_uart[uartx].p->bufhex,buf,len); + L0_uartN_sendArray(uartx,ts_uart[uartx].p->bufhex,len*3); +} + +#endif + diff --git a/source/msp/uart_x.h b/source/msp/msp_uart_x.h similarity index 95% rename from source/msp/uart_x.h rename to source/msp/msp_uart_x.h index 4c060e3..dda113f 100644 --- a/source/msp/uart_x.h +++ b/source/msp/msp_uart_x.h @@ -55,6 +55,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../clib/clib.h" #include "../tpc/tpc_x.h" #include "../bsp/bsp_config.h" +#include "rs485.h" #define D_uartN_free() (0 == ts_uart_send_shop[uartx].max) #define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max) @@ -70,6 +71,7 @@ typedef struct _ts_uart0_send_buf_ vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 vU8 ok; /// 发送完成标志 vU8 buf[D_UART_send_buf_max + 1]; + /// U8 bufhex[D_UART_send_buf_max*3]; /// U8 buf2[D_send_buf2_max]; vU8 buf3[D_UART_send_buf2_max]; //// U8 buf4[D_send_buf_max]; @@ -78,6 +80,7 @@ typedef struct _ts_uart0_send_buf_ typedef struct _TS_uart_reg { + ////Ts_uart_send_buf *p; Ts_uart_send_buf idata *p; TP_Handler_X *t; void (*tp_handler)(TP_Handler_X *); @@ -85,7 +88,7 @@ typedef struct _TS_uart_reg }TS_uart_reg; -extern TS_uart_reg idata ts_uart[SERIAL_MAX_NUM]; +extern TS_uart_reg ts_uart[SERIAL_MAX_NUM];///cc:fixme idata不要过多的使用 extern void L0_uartN_init(U8 uartx); extern void L0_uartN_set(U8 uartx,U8 x); diff --git a/source/msp/UART3.c b/source/msp/nouse/msp_uart3.c similarity index 98% rename from source/msp/UART3.c rename to source/msp/nouse/msp_uart3.c index 383bf45..8976c69 100644 --- a/source/msp/UART3.c +++ b/source/msp/nouse/msp_uart3.c @@ -58,7 +58,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../msp/time.h" #include -static volatile Ts_uart_send_buf idata ts_uart_send_shop; +static volatile Ts_uart_send_buf idata ts_uart3_send_shop; struct _tp_handler_x s_uart3_rec; TS_PH4_modbus s_uart3_ack; @@ -91,7 +91,7 @@ void L0_uart3_init(void) void L0_uart3_buf_init(void) { - ts_uart[uNum3].p = &ts_uart_send_shop; + ts_uart[uNum3].p = &ts_uart3_send_shop; ts_uart[uNum3].p->now = 0; ts_uart[uNum3].p->ok = D_ready; ts_uart[uNum3].t = &s_uart3_rec; diff --git a/source/msp/UART3.h b/source/msp/nouse/msp_uart3.h similarity index 99% rename from source/msp/UART3.h rename to source/msp/nouse/msp_uart3.h index eb4bb28..a888118 100644 --- a/source/msp/UART3.h +++ b/source/msp/nouse/msp_uart3.h @@ -55,7 +55,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../bsp/bsp_config.h" #include "../tpc/modbus.h" -#include "uart_x.h" +#include "msp_uart_x.h" #define uNum3 2 diff --git a/source/msp/UART4.C b/source/msp/nouse/msp_uart4.C similarity index 100% rename from source/msp/UART4.C rename to source/msp/nouse/msp_uart4.C diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 9130a0a..8d3373b 100644 --- a/source/tpc/ccmodbus.h +++ b/source/tpc/ccmodbus.h @@ -62,7 +62,7 @@ msp/uartx.c 底层代码 和cpu相关 /// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F /// 校验码的范围为 -#define D_s_PH3_ccmodbus_max 128 +#define D_s_PH3_ccmodbus_max 32////cc fixme #define D_s_ccmodbus_min (D_s_modbus_min + 3) #define D_CMD_Filter1_ff 0xFF #define D_CMD_Filter2_fe 0xFE