From 91626c09075e4f6b2cf5ce549dc32cf538ae0133 Mon Sep 17 00:00:00 2001 From: liyating Date: Mon, 17 Jan 2022 17:56:37 +0800 Subject: [PATCH] =?UTF-8?q?TCP=E7=AC=94=E5=A4=B4=E6=95=B0=E6=8D=AEok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keilp/cc_as_stc02_ps5ws.uvprojx | 32 +- si4/ps5ws.si4project/soft_ps5ws.sip_sym | Bin 466352 -> 1329452 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xab | Bin 151552 -> 352256 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xad | Bin 1808 -> 3768 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xc | Bin 128024 -> 231248 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xf | Bin 128024 -> 231248 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xm | Bin 244 -> 456 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xr | Bin 128024 -> 231248 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsb | Bin 65536 -> 163840 bytes si4/ps5ws.si4project/soft_ps5ws.sip_xsd | Bin 968 -> 1928 bytes si4/ps5ws.si4project/soft_ps5ws.siproj | Bin 21176 -> 37904 bytes source/app/app_config.c | 56 +- source/app/app_config.h | 29 +- source/app/app_task_speech.c | 55 + source/app/app_task_speech.h | 47 + source/app/app_task_tcp.c | 111 +- source/app/app_task_tcp.h | 6 +- source/app/app_task_tcp_control.c | 49 +- source/app/main.c | 86 +- source/app/main.h | 16 +- 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_key.c | 12 +- source/app/task_key.h | 2 + source/app/task_pen_head.c | 102 +- source/app/task_pen_head.h | 10 +- source/app/task_register.c | 2 +- source/app/task_w600.c | 11 +- source/app/task_w600.h | 4 +- source/asp/asp readme.txt | 16 + source/asp/asp_SDX1.H | 82 ++ source/asp/asp_oid.c | 278 ++++ source/asp/asp_oid.h | 139 ++ 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 | 826 ++++++++++++ source/bsp/bsp_oid.h | 183 +++ 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 | 45 +- source/clib/clib.h | 7 +- source/clib/type.h | 112 +- 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/task.h | 56 + source/ctask/tick.c | 8 +- source/ctask/tick.h | 24 +- source/ctask/tick.h.bak | 94 ++ source/msp/eeprom.h | 2 +- source/msp/{ => mcu support}/UART0.C | 6 +- 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/{UART3.c => msp_uart3.c} | 17 +- source/msp/{UART3.h => msp_uart3.h} | 6 +- source/msp/msp_uart_x.c | 236 ++++ source/msp/{uart_x.h => msp_uart_x.h} | 5 +- source/msp/nouse/msp_uart3.c | 184 +++ source/msp/nouse/msp_uart3.h | 93 ++ source/msp/{UART4.C => nouse/msp_uart4.C} | 0 source/tpc/ccmodbus.c | 4 +- source/tpc/ccmodbus.h | 2 +- 91 files changed, 8314 insertions(+), 300 deletions(-) create mode 100644 source/app/app_task_speech.c create mode 100644 source/app/app_task_speech.h 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 rename source/msp/{UART3.c => msp_uart3.c} (93%) rename source/msp/{UART3.h => msp_uart3.h} (96%) create mode 100644 source/msp/msp_uart_x.c rename source/msp/{uart_x.h => msp_uart_x.h} (96%) create mode 100644 source/msp/nouse/msp_uart3.c create mode 100644 source/msp/nouse/msp_uart3.h 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..69341ff 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -387,6 +387,11 @@ 1 ..\source\bsp\w600.c + + bsp_oid.c + 1 + ..\source\bsp\bsp_oid.c + @@ -403,19 +408,24 @@ ..\source\msp\eeprom.c - uart_x.c + msp_uart2.C 1 - ..\source\msp\uart_x.c + ..\source\msp\msp_uart2.C - uart0.c + msp_uart0.C 1 - ..\source\msp\uart0.c + ..\source\msp\msp_uart0.C - uart2.c + msp_uart_x.c 1 - ..\source\msp\uart2.c + ..\source\msp\msp_uart_x.c + + + msp_uart3.c + 1 + ..\source\msp\nouse\msp_uart3.c @@ -474,6 +484,16 @@ + + asp + + + asp_oid.c + 1 + ..\source\asp\asp_oid.c + + + diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index bd5b0ed472d8d8d5b38ecf6079f05c1c84643ebd..606a81cc75d11dbefdbc9f887b9da87368431026 100644 GIT binary patch literal 1329452 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 VF)@Mr6Cj`YJ_VU3pTFmD{$CS|&87eV delta 13835 zcma)D4|r6?wcoqBcmI%Ga+BS#5kWVyYE%k~Mui$-!B7GQSpHN|kZd3zXdoL1f`Bz( zsHj`rFqngt>c*f_8|xxysGtT#ixqvFmMUtLV6jpRx>QtDK7GG4_a-qu`@Y`q+sw?F zbLN~mGjrz5nMw18Dal;}a&zq#%MBKb`nuC%8PLaK+3v7dc5KT(q=?8CeYANyi zaU?_E-r)#B5i6|$QP>9^I-mr^QDnl;XaTV~GcGz@0TFh^8)n-BLUqR*@~o=cgH|K> z$yDTD?h&aOs@Uz0QSvgI>gIlp!jHe%qI!@=M8c|w_Ki_!qNXde#kL_n5y*;B z0wSFqr{JraDu#P>u`wq>;hjL%2kLa-A)78{c;Xbw_PQuiqUDM7I8=Fy=)iIodKgFfSqec}A1hnN40t)jJiBRH8VY7i;)L!K~e(7+t4C5m+V9 zh*9g)P%?`!)1;dzrj&cONBS2lr03YZqUdbB;S#SZ_MaJ}RE^au0+;L5Is$sE9S{?( z0|O#BFfRN{R5uoyWgLDo6>S5XDEJyyj_$MRRI?MDc_E3-XT>P79PMnGs8eDKAmOv2 zk^ei^7~Bp1kS%lmlJZ6K#FP0GC|Zd==)p{L`21O_sLU^-j{ z6&@nHfOYa?#*SSJfTdW)?lWW{O{ON{T-%CQJ_fc z!_{DUHMd2xhIWyUg3`Fe5*MRiwPHcto@S+*))4wn$`O&_t2PGmPS510__b ziuMbzq@FX;s_F3UHc!J6j7J7Wo)3Se5+Mnl37Gbt3? zid0aSD^F}1Rz%Ht-f+W5b{7Rdwdc{^8q_B<2a6ewut;X9+5Ny_7=B%;kJc=-dNy1V zqxA1#0h5=YUpvw5NU`D<6@_u3_X&u+OXHNza5$WEK*`_DRNe-;;~!%9QkTYfpKxi| ze=IjkOICLoY~MYY3w;5q#80L$q)k7>*=E))GJ=%;B+2Yp?GZ-i;67dnJy4CF!Cr2cxcCOP!p{dJsyJ8_6SboPqSlG6aActfj&g|u zR~C!?BLkvnWSo*y9k9d5$em=%D3}TiPUteLD|0nuX7lQ_l#0or2Sj2fCUJ%fyuS`j z-hhp{zfi{bM8)V$C~O#$#NX{Z#;6K(jRp0o%}>ExNN{qbzCC>vb}yJ$W2T-VhK+>^ z+stAfZL85dl-z<*I6W3B$BrR4Cmsp@JaU+LOB2ao#Ed=BKf^@@XL|EQ#W?PuN(F^h zm(outB~2ncCLs2eVD|FnX(D>5;}}Y{f@!FN|?C92^jMO7^ZA+$;3~lqHRJG zca{olIWEOThmW(JZU^_xSI4l?8upmy0^8-jY>!EQ7uDg?7;mA{T=R~^)w*b$=-Dta z&RZ`f7ibO_>)!?`r<8|4b}D;VDC)4ZZ|%3x~$gO+J889TbTtavn4 zf0i|pLbEdh*0U@$vQ8T*I;KW4uSWYk<{6fA>3;^2&0FSXZ_++gqpmKNqQsR41G`%Wd2SRbPN@SS?XtjXuXjPwviiC<<-6&F-U} zfQs;Dn5bEbpDM=#Cq7dNkbeSl!PZO{5c5x3eRO~U@wh{!{Vy=NsHQx+>uTjbimz7; zW^$5>#*IEIDg|<)Ml;~6q!8t2p_Mc$M29foD|FEGT;?c<}G zFq-1^D=T>YDpY?ankty0#5YVdzzYq0yVFPQ08@Oe9fFG~t9%rn3XYN647?c<@9<2A zkBX-;-qWg4aXnXv{9pN6PEAuzDbh=o4B0#>V$U5u@?N7zS5AT>vY}y%6d&yaTrL<{ zQ6?)I--m#!uLbA0-(XNK;mSe4gEN=_ULOT_dsvevYJGGBK#`bgAhYFCsLc;CH(ke# ztTf=$CA@wkxRzcIcsSR9&z0~KxmI7pObA(TD(e~v-d1Jv(GI{Vy%>7}&x&hh#h!Y! zvtSk~csa_73RzM8Jt_v=00wZBB%B>3g|e@MKq-c&)*0}5Mnn72tGd}}NP0-jfjuOi zyE8?8A5Y8hGNoAAaDhQ{i==5=iMA3ENV_o8fG=mbXsh?p^l~&6yw~i-3Wb)FWVf>dl-n{F)Du>7NPd;EF3E4C@~Se2ZsC|#i3+SzK&TRoeOc({S6jXlEtu? zj{+3{cZ^WoENs+lEXu;tK~zyk1YRfCRhxCyvMx3cb-ag5tt{m_q1@-A(0sso^+|XQ z!>PI!^ZMj`%xmr<)&2&%A1ptm7Akezy8x}YiG>gW8hkUz)8pNNmX4dDDU5f3N*1vg z=Qsj%nsX@ug5+WlBpU)$Q3VhdV}SCa$hF>X572(j1#`3j)m9^yEI_Vs3B$g$2Iwf~ z(zmz+w0S8S32zSIgauG&5GvJWTzL$+otz81oB^u51!#IbEWvVsf*17(z}v@g4MAr8 z3VeO`F{f*O01MWsK^fEenS3cn*j!(&{v9KG%29L#cn62CzX_BcS(?}ebP z%LC-N4yO0aiBM09gKnIZ%>6!q=HULyR9|R!*kbg;lP9j6C zt-#v45mG4V;;j2oms%Gfy#aN}L)Jjc-Ug-h!rTfRICxv^N>`u^WBFE}Gikv~N+BKH zqlB|pnn+#gy)^zM1?S@Lj3eOyOkzF~4xv4B`PB2W63-q765i3eQ`+{j(nS74nJ(UP zETuGWuhNt~9%x+Vl)t%j#w(0=9xVK4Nf`~!3O z6F7@UX6O_=SBJ-cM1gyb{eZ%M)E$bQ@}E^<+m8Sby9Xuf><()EL~&5fM@oW{x0-^N zQCl4D;qZTgWy)sv(vAsMy`}S?*fP5;uhCz}zktDpQl8z|P;w`h!rAoDZq&(RKMy7! z`?=}{8ul*q96biQ*32A3yHhFq6P`_d&GIyP+@gb@paC}C+yEPIZXin4AE5#LGW0Iq ziJbsOUm~#4XM`$ocm~dm$H9OdNLhEIS$88lmQ56XTk#rmZ|kRE!3T97gK;L-xR&vs zDOGba7olvdgL6ccHJ1)fvDP)LbG!IZX8EmInPJJlbNN&&ei<#xr>gfq+wiS9XM`Ai zo~I?~)IyPNzrK&<(w0>VHN}bpno8|{bA$&P9ZuY=!FGL|<)YRXFeb&7T7vZ1n8Ot( zAh2T*YLo4n;gROb=n+nL)VfH6r|QKC1czygE(TWTZ*dTBUZm+1sM6vhIL+APypWkU zJFgK3Ify!r>KF~?NvAp%)#43RIQikML!oLACx+mt8bE+ybrkKL1V{#D+yl^1_m58O z!;x(35)c>S2v~9r{IZ*9{8FuneF#cy&2~_7m*!}w(GoviczhD!2`_32ye;iDTCvre zH+}lFX=T$#PrJIz^qr@VrbvagNQA2b*8Ya`Y(}NJPdF`?uF!TVe9jZ`iC(H$kC@e_ zU*k_O=vCeQAuby)nacT@w+dZJ2h2LFS!XpS=zgx;ztvn1K1oo!T8nS+tL}WDveA<% z<=>`ZNk5Ja?dWY#f)=HT0X#(4qfrpZnZ9asz5aiWta zP%5d@3i%XpvGeNsAe^Ss`9kk>1xUcm?T);l$a_6EvVa(E&utFnA) zP1*7#3v1?;)ht{j4xcre4|vo(3lqI~l%{jYLTamT-^EqSdtr`|(bV=bog;4QdtGY9 zDF#7gKHTx_=A|rCW0uG7){N$C4zQb7CiaY?)&e>safQAPRz&?Pn@mzs(lfVbjf`0*E@(GO@%4X=S`;x)UfjG-y7!QeT5 z%WWfmMjaPt8k_!bqh>ePbVa~i%Fk$99Rg?32U&t=uy)H_2KqkA-i)b=5QWjjt@H|) zIS4_q-(hNBW2_R6&hjeBF;+t8A+1O~4ONT8xG%-_o=|dWPq=$Kc+Tdj+Agq4^{4Ko^#^T8g>`d49@zY+EMEl?1EI-0Z zc?dEMZbB|y3e*nH1sh$6MZD#wjayJ^?VkbP`B4!0_rrBYh9bWNYVtAU^d~@G@i=nf z9H8ZG1zP$|xX#GnSO&D(-y>I>h04Mwkn`svcN94hKLF494**5{0EL?wtsP^fK8ec6 z+whz@18XHmwis&S5iaI9LQCZzwMdYoojT2!;_y=X15hWQf-GAOA%{?AfM#?c*U^Za z>o9T%d&2GETqFy4H6J2}kY0ca{sA^HcGQjxy9oh`A7QjMNd5g!4574ocf` zd`vMMd!K|4l<@kW;}}|(MnkF5;5YmPa?&;LL{56^iGL%*p8WLBQ74^y$4TV69UJMw zU2FJ-ySXN{#&i~ENXISu1z_@!75EZ4c@{W`oIFp&zCwnNVxd#Wuz}-kjSZYk>F_CS zyOPVM%)JWd05;3FBh8k<)}vo*J8&k_92qrp=24@=K9)i&p_skjVlN1PtJP4!U0SF` zJ*`E&>O&x-_%E$t3J=lr%-?YL@ymc^fPbNkfUzH%^)QgKN{5v#y?9PpxTKKsCppK; zzz8LN52wJt9X6p_S||7KOmSEwNvtNAL)3@hKSCit98QRU1!BsInW4bj^&2&jc0#}5@$pD;o@-CP>P-d zuekIE3sFZ5gNqcrMG}sUs|?EN?0~;NyCS>5H@2zJ4nXd05hH}89(zw##uX2%9=R2c+4-S zm5rS`RfN4`;os;~SAmV2J0XMMk{7L+Z5^ur2?Tw62+C;6%Sy5I0eSq{2b8H~#ex~6 zQ_8JFv!3fsN>%T8#`eU9`2fqL9=R4+uHNK1y8z1m0q4nKF~vKET_z@Dmr16QoTcnd zuJ7*6{XYuME3u2z&~deWXx8(+ssBIOY3q4%8h|Y4h5ue=nst5`nffBg8fIhiaKM|| zSHQ*LO*~8XjYVO>dIm*p1&BK5Si>@y&1&GIzf5UcTFG;mB-qn25b7RAPs{~6yc#E? zu~(yr`s;jdX3bLfjGOurqYsDx9U*Lu(fiOI)#eei><%}x{t^DmjK6yx#FsuB6R^)F zQ`rON|09~cOcR|C9*EOR9xiGd?J;<;06)Tih4Fv7$C5=CdiMybuQJ6?cbZNQ?pFPu z8SN)JOS7JKI$fyjR=vOgtNR%J|LZHW?M?C;ll+ISQr^%mNo;=sUglEj$g`Ey2W@;k zDOdBkP$jSC3%Q@P-@tF2Jyd;Nw)?aaZnzwWE)*;mP<5r%=VXS49=7ESRrjMLTIYuO zD%e0P5aqcZH?!-7>3RbY$I{C3TjnhpPs#*)iE+7m`hB~+S#>kRUKHw^fY9peG4gzK ztg)DbsqISbOm`QaAqR{5KaAV47`XB^0_?VBD1I`fdKab_Jas3_&?9?_X=-b@ecb3$ z?JIBJ5DG1{hWUn9>SQ>*|Dfkgs=QQ=H7n!q zz>&P+KpDJ$Zt!MqJ-pvS$>1%XT$m-fULmsx`v9seUSI(c2 zP%;n9RdW8Uzr0HZ$3akNbE}roo)gNr`k-d)pu8jU4k}YR@s8$mvJ~AisqdgfQA|5_ zJQ1i}2@hhl6pBUYjr%SjvYT);jc$e{CbRC1`5w3WpY~5S(Ou|0nI4J@1>xHO)0LXv0tFkyXXv3JU!BNphPPcS;Ksomd1bU2+bwR!kW0CPbS4j+FZ1Al0BGx7>Mra z)5=Q97gtoygDXdE%haokm=qgYKKk=_Bi~lisZny2;Vk$*1fgeD`Qoa@Kcp_C`jz%8 z`Fht-%8hdWW@!xB;G?MjVA%%qg5_s3av~3)DKB6mH;1|=k$QxYp`y4Th?nj3jj_A3Fu` zILOINx;3aCXAEf%<*Ot_)!f{2Z=_EFX?Q}xjL*XxAiwVBc6+0I#wbu6-w{%Hyi2D| z%dEPao9~U72835n!vvSt7zJ*wfCxW(K{n{>@maW|$56=!u7(8}EhW z`y7z}X0q}M?4mSAL@Mwk^I!#Xn9$Ad{pR5(QyN``osos;)~4eNl)C0)*IN$1n`P*Y z_az`2RyKt<+lygaSo@(2~Gh* zp%IAX@jD7yy$dhuc=VWiZ_KY5QyM;g7AgBV$83C#X!LvB%)2+qH%yZHn;jz#|Cz-o zHz~?x;Lgq5dy{+%h_v1EsUefhHc4hnCM-p7ir+Dl)*JXN##h6!tM- zKujlez}6scR5TC8+Lh*mp(fC>U)>~aYMSdJuR_Ev^O*=S44QExgdK*kh-(2r$>kh= z;aqzF0g{@9$jR_W!A(rSH;e6@li`T?&B)1+NO2`{(RM^aP9X zE4)7=dI1Ua+h%KnZ>)BdPhF41c$o z0m@on;+cx9TWM5TR?6LwX01WXxU4rSZ#64#H7fPB%pzjwYn@rQj<&5uf2GbZ0jx*o z^X>q=x4Q8@q|O$jcmrlYM;%!Co#wq!5v^GV^u!EIfv6+PxC6X`F8wut!7!qdr+>}p zJ24fKciQ4^KDMz#ahk=Tww-teQn4Nwt>1D3xAZZ5Ukl$nBQAFrm`WoQ05%&T{^sxm zz)|HckV)ggr%g5<{LMC&Z|&WvOgH1IkC|ogAAC;AzlY^Yn^VbYu<5)9Y@{N1IkF;T zDwpNv7#iXyR!*L5mH1g`%582Rg@3~<2X8nSUM1lt)&j2HizUF1s|NuVVK}}B->%V4 zR2h6Y_Q-r>YP=t-ybta1ivfQenb0mn@@-6w?^)Utw>33gZ$(gaxps*|?r5uYVjVj}*Ax}tts>I(-R4=fI_`Z_Cd|$~Qo`^EdjE$^4T*SIL zuz0PkLW*~9xIDQZ;vrr~r7@>NvCy`enLcU-a6{6#zI@a~f0W7_pzPX(rVV}5guhMO z#(_rxfd>NP#-e^(cBq5UA$iBZ1NMu6TQ_y zKlK1B`!e(B)hh9mzeW4;fu=w&nFMbb1d#_pppU}Vz()NIQZ_?D$s%LbEHZHy8H2TN zGmp`|s{1U!`3j7`CB`$w)xSd>Z-avYE0;A$Y1;(c&;%a>kNCGxEJrXNGbF(ge8i({T=!T_=HLxzV;&7?0!C{}$Kl}L);vmaG3CVLg_2_^)@@<> zclx^M=w~Pne-y>qw@_SAt>jTBiVb$)uJ@uc@fb?DV-|T^@@V?w!0g#JrGx6&3YcDq zA>muFPw|r}Us151ORZaBdlMfTgK~n;Ruug`NTNf`nUj{Vz!QLlhMBO>BW~X^cW*2uE>@+%K8_KO8V{$W%4GTi1 z^akKPc7WDA4Yc48JHmSVaqWHb9mH8nxAQdjISo&22b1HsLkf9%JLCy{hh`bJ-K^Vg zT(2f~upWBWBu9iQo&gNERmQ#FTOeT9=`BMY1D@q+GXyVXaaN%H&vIXL&9O`YjYUq$ z!KiIP9qzEyzPz;miXW$MS?HXdwnuQ^#kZb)b=ruwsBsMsxg#`s41W2990a%&QQGB|eIuOr;uj?gH%(tOK`Kxtn1HP#fdD zXyU(U^fd518cTd(&W7h`&-2iG?RW5lTz|oP)E8;l3joM}^@;pTH#-t~5%%d=HXakp z|DJde?f<~Q)VG2HH+KfV{U*Qt2ESQ*z_0Z=bNKh7l6ARP?n$nfxS{i)pS%~qdp|w- z5?azN>x$SDN7xP1>Vc=ZGL^n96qCB1*tGnvv~c>*m3Cv58n|1SfmCXoOD diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 7f04d0bea1c741a080b57b1dbaeabb6d870c2498..cf2857c8d264b39ac11a2d77e9a949eab7650b41 100644 GIT binary patch literal 352256 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 z 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 delta 29815 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index 7b602f672ee29fb86de16c1b3db3217585e8e129..b7cef3cf769822060f0547f06ec38ea680aa367d 100644 GIT binary patch literal 3768 zcmc&%TWefZ6kg4xZQ7(xYqVZ!8Kr_1gp;JT1yQG&r0rlPIb>qvi#TJG)M73}nmi~% zPi<+{wlY|(7eogIwV*hNRA0mq`r_M2p_KMz6hYJ~BX~o!_K1uaq)nE|HEjv_e`C!x4MCmnf#v^Q`2P(tZU6an+xE4`+xYP77U|*@ zl0`cL_C&r?yQ*C;-n6zlHStokV<4@gFVH4{OL!12e|G*KcbJd!tJ@{7E){&n^QqsV zAszdYHVM9@-l}<0WGy@DcXn=;{a0v`oxruSr)}LzS2!9KqbF!0@I}V=jNzhmdh}jGzN4u^m#XQqv0b!&s9!oeK!p53 zQ-t3lJFa00bl#A!q~~T2aP)7Q8u)6)ciiVezJY)Mk&84D_#$>(`*me=-eh2My1>zh zCI!Bf@jbA6P?6N;kjsyKAOzD@R|aNv=WNFJn*Jr4{CP z_hey$g9mA<;H$FZ+LbP+3o?s#@873&p!HIRE_Ku8hIZ2>(<>^>+oUK%m$K>dZfxJk zO!TOee`ss)Thm)-V(UCJoWXR9oTRBhmx}2!;p3xznb`#*ek9QA!}8sv-PJ-}h60%+B%*16ufdLMn{}65v4qpQ zI>Sd*#8e$P)3HarK<=gF6r!q4)@i>PoG)4F= zn%{k~eQ0=bh6uNg0`LXK*XXo!W@M*^C$AD5Vm?BfkEd6;`s2KfWCn)oO_-LD$( z+c3Wy{Q0K1KDREvAUcmc@|H(`?3@m_ILAK_7r}32ei!0=TT!)WpU@P+S2Vth@jSN4 zAR)R9l)zUqzRg}|=qF)ezChd&nh1Q6@pZM>J``r$#GN2ckgr(2pWf807YTD|J+}@i z?mFP`=iBe`_{On9(9Y46;J0LcH~RBU^&8KsFc*kRfG=Tu2d|ICH=flM94QX*B`m%N zZ*1Zu9M9^+={}hRE@`->^Vj?BCzbA#0{z7FyBb>`qdlU0M+r_MzNE!>zu!byr=x?r zh>)@xNRMhE$oh!2gWyL^>>=j0}5CkRnp@>m~vTOarM@49Y;mCIxalV@qF;Hw(nhZ~xFk_!h12{}R& zf-f{aM6|TdqufG)2>F1f2ELl{-PzHcH{j-qg#1NQhAw5(WhCKn)OoB|tPWDpC1twY z?CZeebl&v4F2KA6HgBi=d5$-uvBCj-{)$|ssUyC+#rOTKE)QfDEqI*fkpf@J_>iFn zp?>#j8uA(W8sKXf-wCfXa59$3s(xDc0{z7F!?%U%r+hil14;ME1aJw%-O?Jz<>=9! z=ON+?Exxwccl+2_PJwR`9Dy$~zS}$>M;7~fA0y-!nj~;Z!=3LCO^SIuT$o=Vq)w9p zE@ikjzrQGMs-Oqgx5QO2zZIL`ZsUvg6y}L=zdr)-1;&RRs;SHPsM7^nq5e<@q16G0 U*f_%9Vvk%o-S+-Z_*H`TA4^X{_W%F@ literal 1808 zcmc(f%WG3n5XQ&m##U5Fq01^kx~PJ9+aS6T(w7=AX)r52YKc3&n>Fuw1=heq$hm-F+WINwznLp&x6M3pyUDv%($aE7w z@`px8lz2>yfQ#r*<$_2z9p$DjPSJltiGqvLF?KgNoo!q%Yhtr}x!{64IQ$`^9b~e@ z?tqzLW^r(FyaT(@Y4&9u!^KLO;blr1T$+wC?4kK}V3_x&&ola(k^`5cV{B(w!t|Km zNODwz52z(@B^|2F1?!O;4f0;#j1SINL}gEiuduE+HenWc$xszsm5#BL&CfquDHa+1 zOR0gY(J{8#Y0j+|I~|?y3XI;Q)WOy17<<%qzKOzs2H#N|;2MUZehr&GvyMb6dzi6B zN)ud@jPtRw49<9ZPJNoj&>S`I4!G5@!0-uyqVG0+0n zvfQm8Khz=FL~@MC0!5Yp=~geT7E^Ea{mThet|TZoH9Z@wqITiK&flK60wJV)bKW}eW`9xY> z7pdF2#!61P8#1as zojT3m{6(28<~in!-~3$+(@sZi1Cxz_=@-JmpXyA1z@N1fxlcTkRQE=!)Yz7&@82w| z{L+u*sl~jB`b1~9|MDP)c3fsYr)ID_p}b62l+6fR9XzoCNtU{|H7jjjre&>4S!b(L z?WAEC$nC+%BM}c}9d&)Q6-e$V=3^j-jN1Q2OTBGZt8Z7$1vcX9=g-I0S06~I55=?U z^6YSNb{W4>qLYDASv|H68iP&Ze-Sj@+fwnAfSXZ8JC*UVA*p*mc(g#9=G&N_3E z(BiMClpsu7-B^1pd*0t#k7OIqwExvxWXxaq6bG9?TX8i|_pV>~iA)vqCjq3W`h5K% zWmlW(xT)P3Wi6?dL>=|txlt0mjc6)|oJ#5W4{ejniuu|-+Z#tLxv`kbp~Z+_sFzLt zl&s7m3k5%>w)b0V<(DlsGp(4fMgwbcor%0oTyuTzD{|K4K{R6^otj#~YKl@LN2VtZf;nNaw@@tka zj;(SnwdgZi;cj=7S5aT#30Lh%b|5VhF@*;*imh&&+8|7pzm2zY$d5AyFr-?xy0x+c zMC@6lVOL$hx_1V=^{2x3nE2W`wvs$F9_Mg(K+>sjPMIx&D%;|dde&q|5=t>Af zjnvhVr$k&dQlVaKubV4fdlXqUxF!O}Q7XSNHw+%1Oa1HXCHUdyg!!3n{tL$Fg)NT^>gk3r!AH?|{K&EF4P~U&fa>F&% zTjwm`d?eIoA~ou*%}K*F{B4u6EUH0no-&8xMP6M?z`rbFBnYLX49#legM|c}l?|IW*Z=xxV7eE_)7A8_%yoo{H z7+iht)pvc9{_g2=hVnj{Qac+hOiDF)ml=N#0+RW8Rf0$XcKip^GVXUjAv0>uny6ZS z{)Ni%O@C~Ytn_DmovS(n(uk?woj*r?zG+&O_juIT&~I)G}Y#db87oiQ+@5?U(1LZ*;E7B3z?j52B_wqpB3gx)g4Lt-|il<_achI zO7+(Is5-FRRF8jpv8vpdONTTO(jP=elR9hTLr^B;@Mmq*q1o~k{IZ(S)TIxjs^3w97w zrBC0C1#seRUqK(gy=|^aWD@EG(^9iGe^ezOnY-u5o1c+T3-0?&i|W0n0UR^3=ck{! z+(Ca`rUMdFSMS2w={;V(v}=*tzrI!3ZAn%7m8HJ?ktYBA5m^tkuEJ2G>Ib`*q2K~c zenv|mHQ18GlzC+X1~7zOkDv`Jg)XvXYNd*0QzQWMlg z(K)l2Cp5^0sum~$Nq`PT5cJBbzkc-Z!11zQkPwj_F=?rT*_m4nYtMnbtCp!p=eMeX zBWeG+r{w%9EHM|%2lEhycD4OGBpj+6kjV+nnO7u}s&`$JT5@e%eXcR3&dETKL!Ub3 zdReVjJZMva0OE5P5$ZwW|79;5LRudoY3a5(&TAlvRMK8YsfTeO$I^ob5_Oz^}3V$4t2p zaMfrM%o`C^IjGgH3b1hh`SZYa-h_6uCL)`F=6ZH}G9YaNf+K$NKJXRmm$Ht-J#U)U zWK&>!0W7vK9M$(=r`({POSCE{9^JYwskZf`z`tsuj%Gbj!>IFAVV3reM`aRRED_f_ zvnst4^Yhc?m6|ZWWYw#moi^9sKS#by80L~>mSG?rz<5qAzLkyk;+;&T%Kys@F#C9Y zrEhnGPvwUke@(X>1$JZV!A3hPW1osL#d03I}Bg8G;C3olCO`JmCE)BXE8rR85R z6QXOygDG{*lw|?>0zD~(>L(G5(-5KJLS`3NkKfUO_j;%}S??kaZSUZ0`8Jo>2>=yp z5;QLi>pE@(^1Tfq9pB5X$Mq;QGfcRYqnt-|M{U|z7cP*G>8HQ4C`V9t30hx-=XoK_ z$M~DR2)Zmi0x|Rzd44gUW%1Q)Lz;WdGvplXqv`>iUOXqE_B^~?2B?$Ry{ra#v;u%u zq^11vMY5%spBJ`#1OD^adeRazNtTjoG3WoOqSakXDKB#QupyQn@& z96&_$umIW1O5mXt6aMHqve%ZCdr!DbZZXt>eQ~vGzqR*gSI8|ALOSig^a~Jiek7sZ zxjVb}3s=bsDF^oc{ngS=3Zyq9t(kbA>3hTSD*x4;vX-hnw+CQ%{vuCq0|(5tQL@fe+Z&_OQ>!vfzPCj- zlL;?DLs|a;a%1dMsjgu5)3)!u0(JgCd(5A?0h9ZskJfW|XfjP+P=}WW49D~z*dT92 z>P&y&6Ie1>=^Uhbts%=?m3biL-}X5P^*N+K=>8G)rGwSQeAK^squiv3&! zcB^x%r*TydZj#Sr5Rogn5#OEPKXDcFV@yBJ-!}rtAdyoJFy-QMLqsx8Rc$^V#TYBsx9{FWA?3`4P&7hSvu|@}P98Q8@gTHpY1i%a=!L?RKQ-0)xcDew(NgnIPg z(+Pjd!*acfWVz6yO(>%2ZQ>D37It0!u7~9V>Wa>ZWft>4vP+&M4gVi@$r-7MSwSDJ zdU0{9pV=*=aR;v+E~pSa4gP}Nat&uxePjkCdNphnz~AG$<)s*&<#&D!6E%7n20tAe z*wzIRu+M!}J;+PUAW$RQ*_2^%bAsULds$eAh_=<#S24PTKR5(z{QKABeD(JFdjGkX zWYRxlkL*gImab??CAT#DckhvlsVNfkY5%?^8QuHV9y!AW-u+KpDLW?f3&xB28#yKY z{{=5OS?zuRdw`ZmifgGHOuzVjZ4HR}g$Jc6BYrk1tEnYes$p}snydtPCJH_7sj#I{ z2a|OclwS`ohW}!RT!57om3?X*P(za6zb@P1a__?uI+zm}DW|j{VktK{1DgfU?|DTw zV3amgf4{Mmv zPM&mI$%k9jP_`Z=s?@C?OsLeQF|cRqm>Cy^5jcx{sH{c$PpS0XQMJEl1C}Wm71v(U z-?m9k&=~A;iCB%JYw7M>Gl;|1a9soBv!znMj;ZT9q54=DMe`l|Wg^1zw%YO0sc18i z&_MD=jS}mAO{CTZnR7AV?&79{tK?P9;D=Qp%81IZHr4#wY%I{McLu-%r|nHf2UyZm zFW=n)(`*7(wfYKEV0H(gTwd~JZFRt!YKi&}UkCA&??^=qgKX&Fj;Z9%TKh6xLNZcC z0cWKl1p+|WGDtGp96`P#)jrtLuISWUf+?_4W<7}B-kATyJ(SGk>SSWITi3;_?D9;M zH`J#DEF+0E0MeU{A(=+RB+km)BCEg_?`e>ed(BF|bw9H0(!~iTM`(CQ_P0{Kw5rWA z*#@29?x^RV@8Zm>zSI=;?tC5g?h)epb05O|EMXX7dLwQWNA={OpM9Gl$?sP?3l+Mu}r9{Nk^A~P`dpjOz;%7 zdSw+re6bD|@?Pi>FmnGkp)I^s=48gqTCOi=$^q1B!pu$u9x@qYyKXML*=lzW_n&D! z__4z%R~yYziz4oC2}`*cRy76C2h_SpSHRvAQMb1=aQ8aeHWRH@s^2-maY`_Q)#QmF z2ofHrXep(B%+alx>fp23!eKW+$zst$$0oEfW0^m80s6p-!_F}au&DA>lNeQFGbl*U zNW%Yzl;o*NFfH3&J_fyE`!NLbE#~>%p5>^}O0tCY1{;k)v1&kToQ7siw@^ou>iDK` zb-H4r7P zMjZ{NpKq+SL@86YK03?*p@6mD>!@#j5l23o>I@T%{Ptx8qGb}1>1aq)6xv_{&v2Gv z>cQ_&?@SvI^trWE`jYCJJ+%=Br5tr|Q=_VZb(gz!9#uX5=^AKAJEk2MmuN(kD4Ldh zkKmg$Vw7QpFxj5&$t5#)KLu1P5!$fZGS{4kTa(P@qGcHp+ z-WW)cI*>dWIG_?lRs-fWi7kOt#YNLQDmX;b3!0iVd|{P&u;JPM_FH7Ffzf3foAhM; zIHh-naV@vCdLz|)w>58V#W7N^&4JGX@HDqGEEm$jV=?bFE2*D8ihaZLl{QZ}pZ4BwLBUUq$1j7I9O6jbhIA$Ipajv}=E*UzyYv zvI(t|s!Tfod9ki0;5YkQxm!MwljNWFA=vcovw5f)Q9s&OhiSHgG{O3niQJL&FTO=H1#b;y`=xyowBu?1mX@h*ALO2^zsbz~=|T z)8A77QxtZcV^Id?ei$=B4*-~EEk*F8T>BZa$7z{iT9-*>!JhcX|nE$?v6?51D&@PFc_%T<{F6QauP>qh; zF_2?I{47CyMqsELJ3I?)pfA+C&PIG~F~1P))@c5+_!iIrjgN5Y@dxIR-SVXPAr;0-m>bg52yCYC8d(+gNElXXWt*IM8 z7DBjqO8Nzy_r+W4r0XBJT#K*N9fLBkL{ZUgX!9nsVfIEL!8Ejj7h$@7&$Y6_LfpkG zTr~_D2r>VOq?*}eS9(ZAaGAHmqB2uYdqtC0=59*G)s~G(##;jD2%N;lc|@HcfP-xe zjuXHtxsSx*^0sEKBV1`{DvhAzp6bR5m%G<5q8G~-Om=!C<(Oz~#-IPBY-pH_5ENi8Z#9q_H8UDq#sPnjbM%hb zM&!6b3Q*Bg(+G8fW>?Gdg3)d#!>zgXK-#fVHix3Dn?hJN=7UG75UDt&j;MGV4 zsbZ1S_r#>B)u^RoOa%R7S`QvaPlYICDx}ZdWd7L5!)#R3yaD;}1mHak0a#GM{XvOjU|iNp2TCe6^oY7^HPt}4t9UAF)cW@GGEpsAPX{-AI_l85(6MT3d4`;>a9!;D z63qr4*RP>lN5p^c12SdQm}=JzJn2lTQ}ZD2Dcpb zbV7gF4A5pW!IqB3U>*Wa7htNVV_~l<_WChYEObC8jymym7lRyreQ^iVq=Os6*VyyX;QS*4+K6PE}$BrE@<`?kP>bVEy zBaq!gT-Db?k!B&f8DejZttHO>i}^ez)JWIt;-99R#a!gNDs#QmSdB($HQKCEn0z3Qc)_t2Lz zscuSe_Zq5w+UnCnQNA4gxLOBT@Z72i!8Y|v&u?0Jwk0 za#~7o08gBp5zZdnL#Sb5mz{vi-cKZ4MH@rCBtw72thW};@k|Gfe_9!BBTgVTWlf*i-N5{r3O`7D`1LPJISt85y zUwb_8G=!svziTf}6!R@`%G5{Q^y2FRIJ7OIQs6KEd$5T{sq;tuuRJEdsy;lsipo3< z3=L(Bp$1Q^bo0<V6)S!F2^b0+uw|g1Qjc2Q zxP&_iSR?_BfANbFD)~IWbOLmu(j`!QwU*!3K+me>@?zLAiQ{tsXM8UX0RASXA_F`# zgb@%vMdem`{iYiS*)PPL?AHRds&Uqi?9)do$wCqr3akr6H_gp|56oqa# zD%JV9@5#sf(mXEZDy&DGL}&b-XXGE%y)A6f@{f5Du$10`O7yHOV#wqhBwzX>1wJW< z@3;1Dc~0(-{_J01fCJBC80%<`#m>$zER(UlrRQZSCa)~!xW|AcDyQ96Vfj3xq6K@u zl;83lT9#l{|IA%j4U59zB>X3;WSYip?EH4m=Yg87x*nR&)0=Z1#jz}C=|qgI4L#9z zMdLGpMto?h>PWT2sv98Py%rm;aSVH~duEMsRDhsm&8Qu%@C9~V?$J|nteETaZ+lF_ zfLO^1hMoN2)soh}wvaaHpca7{abLW~-*p9vk5)dqNl-&gVsyLbb6qE}ecQd0id~JG zd(m9f$i{21<8vTga%-vM(IW`!iM{0s*rk8xTpKPrBxe{8v8SE+OW7{33Z}tSk9=$%a#}$;JgVe^fMu(94y;^Y z;%dsJO*Dydq5}-K8Qea$u0*}0x-tni)XOR6jt;(fJemR0xrL;e zbD$31=F_=JhnJ1%@BTK<`h&$*8;3-4JxnUht7|&cegB;GKgaz6TqfYEmc()4O)uea z!Tkvj^FKdbjo+22a9qbfc)MJrR@cn-ulyIttS4^>rdE5+t})dgqO|nI{JWmQBoU&( z-z*Nu5-|MI<$$J6qO~hvWpe>Mo%4dCkKWOV`cd`k>ju>-_DMWG9SGQPo-1If-gZcdQ0REqFmg9IIm2j0y{cvk!QG{Zp0x zKjzRyzL%t9MQmUe)K#2@i5l5NW0{HVMLF31?gkjy^S$tk3HIBh)r>!OJx-$BCi*)y z2F9)!I_jzBuxA{l&JVz&1Aav}Tt0~?mylo5U9pi!(XNeEC1+xJX~hk|W*Z$cxAuT0 z*9SDI9YBKK{l|WYlcHB{DRZ}s|Cb-iFGzRqeLs@*5za7=Uw-hC{3n9rfAL@C)AEv_ z6>hsT{*s%pUNDp8qbnNA$}F7mmXM*e?ES>g<@clVoIR^veKjV}D(0}shSf&nRz%^SDT)& zEp^91?D`>25-_hOvl31y%@ZChFiFPxSpGn(e`uDhZXXxgiI_<`c0qfK5>8ra0v~|1y!Sx1H+g?a z7MhLMH#)(jVRx&04sMq8pd)^^X1W*bSln`+^n#chr0XpMXY9bEj$2~ZK#V?gV!7#-Y17;XamkZ&khbLr6E1D6RoPu(76zSgJ;;zHHu(jHv zzdTYGYXSY^+#rG4)maz`le+DLdAp&MG>a^;Ne%_DhXqj?#65#q$n5sc^ zK|sPSPo~CEnB6VJGeNX~2Zk7os0>q(g=80Yu#qiwv4~EofNZNC243;c5U`vxPr>MJ z^SFvMCUjQNAX=CR)4U++Ic{hRvx4G8S_w@~E-Yx@#I(9X%=H+Xm_wo7O5!Vl*2*(k z&t(p3>kuF*q#mYtMv#HK8^&DJB3&W01P_dvkv3fYu;OqFnOH@1c*4Ow2$AOX1H zyLMM9gfASz(ZLBiI`qI8i7zoQ4F}Z0`kJM#u8KkjTG_q_Wb1+F#W>3RX@Y(PCk}k= zeGL+&C2-^^8AGFo3&TNMa73u;>Oyml21-fN5NYdLsCOut5)D0yghIh=-t1ARbOC@ogYX!h=(SV7^~G=)?eS z1G7FM9?-q*`Y%p_q8QtPZ9;D}YJ$BL95r(0R1-|!@n5Zw@T^H;hC_O^K?##lSI`}b z`Fwad`#d-#Yb#wxr{XTvij|Fq=fR~0J|>CiFzW`m%j+^nZS|1|Y$iIq5$VH5fFZtt%e#CAT;9dYV9+s=G?#bL z%3pK&vPQ6iRZS053V_OCg3BAA>c8UhLR?y_x5rPY}{54ZY#$=|hOBPrh!B)id>YnAyp zYkEWv+17u;$E^}}S@7Q&VYUvo{cZj9{Hec`ZA$>B6V%r2PT*O9o1e&nT2Yb(M$v)3 z1PHF9bP{ zw2&x6GV+kBIW4mt#t{kVW-`|wKA%~WLjq8-4mvFaI03yd!G^@tp;Q5mjZzYCfglL_ zz}AdCIigXIOqO(MqzKDJ2^I<{1$D(#4&4%`BZ`1@$_6|@%xqT&5BCj0)CCm=#e#Rl z@vej6lxx8}J+*Gw!8=yd(MiOsV~7Je!XPzEEq&RuG;8R0mQzZYb|@tbeC!1f=ugSX zBodr)J~i|JEv{cS>U(%Yvt9u7faw+-NO4C46lRaQ$mMu3GK9`H+=vDpTpSO?A9MGsV`R=(6j5Zp!z965;E+BFF zk3k^M^Y|6ChE6AxAw_Z+Mlm!Gtzu`gRFrf}UFE#sIgC~4xVldvgI4-$0K5anpd3z`xECY&G-P+*;f;AvT5m|jfpU4VZ`7Tyll$IdP z4WwGm5yM)nwWGkFVrV^(6ur9YXeieDi9xjDa_np>V88%dex8X84lWnRq1e0xB|;)# z9_y5Bj%JdW^Kk6kAcYg`oLrPLu>@>Wz4CNjMMU)aFQ1A{pNj+FuswogidEs(#WC7% zLxzE#Q4d0`i}krk`tT6*a3K%N(bW^?3F{%|3;DM~?88&PlpkFVCey@Hv*wNp4}T1v zA-FiglI$H5#86@2{8-0$hx7^+PMxH0s2UU%q*#;1n83+Hpr9jclXfv0MN212AP@Tk z43GUgxODJ%_rjeR7JcZzijnjqV^oMPibKZ;33IA9vBfzFs@X=And;((Vc|{)fGh-! zUXT5tb{PZ*0ON9n4xT=ShkRtO=7gtVkO^2hhlAl;o*Zj^_)_y(7vAD4eQI)DT17`>V*ZE|mv)q#jD3Gr0$ zrte@L?$K9QV^VBIhaZ!|bs!(V&D=n9$GG+GMS~Dl8k?vL{5pYP@t9_b0X&&q;i4h} zCfgHz1sxY&@X&QQi~8Mh5|~LBE!i8(`Q_)GP%aMl9o=I60pmK*Y9vdj;c@=MEmnol z-{p%sU6HcLrA*<_%ZNbxuG+!*l0awE5%d5u<-ToH(;sO#Tt=m= z6BZGp0W-DxnczuH=Zv=D`ZET_CxQi%(@{KG*+Y|ALD9%4p|iZ<(Exp}DaIfarE7X_ zR7f1}3U{L=0Ej4@WTFosVrjo1a_pP|by5%9b69|xhUe-$>7XX^vhG+8&rw9R$PcVE z%p0wO)InDS{x%!q|FAF|#2YlI#!N&(hFUC0NO$5H!Q=uaN;Nj1V&Kg~YQ;w8!Z3i5 zi9(g*!EiBFqyR_X08+Tj2Y{olewOE#hCv4@5NW{-N@IB#g9U;vVmSXC){VQmNJ$rS zH4<$H?bZkm7}V?Gj>ZTcXn{}mi_dv<5_$=i_(q`}SCRD$i|YZ3(wJ^UjOGIwd)DDV zGa=#v;^+s)*mS?(beAOH##0AGgD1oVBU!_ork|p}7EjD^Tb4`36vbe=ktD^_fXxLu z(Q&~wJrlDnoTa)rD@NmO=H-;^m?6-ywODttf*%2;JPn3qGX*m@R zM76t0dhUT%@6#5Vlr9PdXb;z)!*|pX6^_O}75{JH6{YnR)&N`{z{d?x;c_ur+*pcX zIDp#KFX2t+afo4%d;&iVbQ0E~5I#k=AMc~0Nn<7}v0TWXyizdapfE%Ksr%>5bqpZg?^%E6masm8P-g_W0P3*C1m0S(1FstfDeo! z2`ToSs0mh&R6K(rBIY6ok02RU24u*b*ghaYM{RiW>gNT;WmMO|OOWaUSS}4LD!ocA z#6N{sCgE;i=%(l&Xy=$9$Ji{!1uf1&eHSqX1DBO2E`@}FmJD47_IW2RJ)Iz3CNgal zPD-QFvj!p}%e>i!@PZy4Vg@a_D8;*1?qid!x4KA_4o1LH3t*htfhfnu0ZDBf|9V9F zMM8L(4&mye_;%UBOF7t1l`veBb%iwoXoGYTk?IV^CC?kBuETBa!wh+k<3lrmP-!X>aWCt^>YhtdE7z_+Kkh$1S8Dbiy6BOaC;e+g{|r60o@8GO%648(h@S;=L1> zKHEU2mY3C+Zq}HKCeOx&a2UOLDCh(rwBy4KkfZmQfMz2gOArWv#-xkIfh+G>j>9xy zW&_FrhYsRgqzJ=!c#JT}a4d#M;?2-$MjIZ%z)a5AQ3)S{q)Uaj681q}0whonZp;<) z)8rX5MTot&xjF>kwxAX=i#0ehJyzJ=C**x@wlYB z5qGakI7A*YszyIxk~6!eYoc-;x0)Dq)I(Z^D+^Q&bYKRM&wz7-L)DFr zgBAq))8T-}2TBywMTdGn*w$v}@NNjnWZ=T=(wJ;xrL1AFU2nP0A_y2M;ND;tM7Cg7 zRRrmyczC$_!%pS}$xfDX&VvE-y+aMdu0ER3IS%_f1xtvar2#Ub14LT(;L+geejY-u zI4TqI;B?`w62 z&g6}Y(r}LGsG#~KtT9q7IHWh)|1qXJZ3Wz2!s%)UV{l)P7}A2^0uBUM4}k*+1BN3E zZ$!U^$>3McA`v1CO?Z0HmV283r5>o%GeNWG`PlY7272WPmE(d5>36D5z$so zlD{j&I=nNmq0th&cE?Z;zQQ^TfTlf5rToA0HGTT(+ACpr`;!s$cL;!T+=6FGmu3GxXX_a17xUQMa z;IK^%{;{sv6{3ke8ijc~jA|v*6kp~H?)YQfa7Dp$P2Cc@qP}w$T0}t?7q+aF{hs4O zodRY`h%;S>17w>fIYYm3TUi^ir)?bLm5IEe=mkU zjEnHZcR&2;DEf=jZS>uqIs>2GjrXiW62IW$v1}jOkEl6cfR}O?J(%ZnJaAPyfj-B# zqanJQUJ?$BUk)!L0@yGH4@a%{1K)cT@C9rQ-re{rjo*#T*p@5i2N2~4y&7TwaT48f z=O8iWzj_0l@%U@CC4BKkh{q21vzO~aIO$9aU+BMv^@IQ49hW%}PJ{lLv;Quy<(G>2 z-v7!)`O;v>@V8tO+xzFICC<1n`%m0`FGm_tcn(lVAL@v@aRxo>@dJ6m=b^x}{wcVm zI_LZr6TAW6uD?7Vh&~N-g!AE{Srx8Fuexb)vjyW+tDfZ#Yw^1{IG=)IJ6@0%qQRv9 z;FJ6^phn*=;+Mf@5&bGx0?;WwWn+L*kP>g-V<2= zI6ad+xf3xf+F2YQSx!fsKai4A+v=;}Ov%q5>5$ujXJ^=H9-Yzml%DMTPAzS?KvoOZ z7bbzf^6bRph%bah#`zvTRIDLaxGo?&e*9L(5q*&3>ilQV1d8Cx9De=jk9`%N1ml}o zo2QupYCdw~MZ|^r!*y_Lgjc%$F5r^)AtT_y^opmmuJ#J{_dg|P`)d!$?{L`u{vG&M zZXm{=Dd8_f&cQQbm~i49>qY0pKwsbxJJ{Wg3hm)=`Kt)!INiX3U$ED`wRC~t4-;DW mbqtc|Lj6tik5l^R8wUT!S^mG&|;7lgvz#nam_1@7E2Fm_!JJVzE5K%K`>TWPN~C#<;W|>SLm? zMKqAfzwoz*SJZl1P$W3i$YHH|z-y(c&K zo9}+#|MB}jzdN?W``pL&P{408tu~n~GfXDaOx#m(e{4Tm`hm(Au0buIE;}N-H!3Gx zZq6ga8Ka$fKHig64th-c8X3I}G_E!9&~X*hEJ-@;iBM;yi{~HGTr?00(y-Tu9d1gy zytL8kqW8DidG8c+fQ&9Dop2S?VVh3pTyg3+rkgD$oia^98n5tBwL6h9EMO1=!468* zCh@EWy%2RD4&WJtG(s~(72haf|3b}9hpeTTv?`rWTMI0j$>gWL&?Fj*`;>=0{E%@aif}%~}{c9X#Vr<)hJi^1-(Z`y3RvSMg9ttHzHI1aMOO zlMQCwr0CMl1f{J7gFP0S`b<8#bRTW*sKYW3wfp_lUsi?JvE4hhN%Wpx&+{GxVx3(< z8o1iboo6&Z%{-=aVO$IH;mHtvb--x_@`(h^3Mat50vbY!E*FgjbQ*W87Th73PJiPp zqPI3R4E8wa_-+BmNoSn5@X!g(rX~H9=_{i(<`^CE`fmX5(*ea-SCZfUfhqy`{Wk!9 zbDoQgU&jEfoA$YjGKQ$D(}lKbfMVmb|E)P_jb`V|ztePT@GMe_9`mfEt)T?g`S=yD z<}OGlzv2Lwk_%{8dcRJ_Ue{kid)Qn5|3E&If{(TOriwzmdAnAXF>EdXZIVB+*SVGpxL-fIPbAFMyBIY)dN*+blG@F9F~yGKL-QgPP!SMn`tu*XinItV}N^<$5hlL5`i@6A{9GlmtLVgAr%YI-p*V{||S8y~0w zoyV&@+*za&bSC@;{I;*4LA)yG+8xJi^hqR-4ptR|W+^+$HJ6@-=0G;R%df&9lpQMU z)A?UsQ?UsqR_+d~B%)=Sc zcy&~Rje`)!rXHci!P{VvAYJHl`TZ7<&TW-{e^fkNWX`8Am)G&d7PFli?r6*y5pg#k zlCLaDnp6T0xME(2->A_%l)a-JlGDXIT4=ljaQD0D#JdtfPX2NPo*?QL-7RU>%jf=H zIbHW-|HPH1OZFlQ(od2~-bOz6K(3hApETJ_rcuOo!jw+a^c7XpupENQB_@Ilxo5Xb ze08O643oJ*Yo>H6rN8T;!{+#)ro*vD<4BzdG}n(ETzdkUys67Zx39btX7zE+k5zfb z@IhQVeY&!V4yD7j0;>j| zeG~2mI(z33e-=g_GP*2$?Ol}*_wmw5*GIJGX*ZqscqnPH(uD((TgvbbxosYjuitVBW&7Zbp`U_^v7V5z7%dRiN{pbDEnzylcVkld712u6RcJAF@XtW_Fh1-?wzUP}!GhB$Ce<2Fr zSV#w&8fek>bjBzgeCqj(QJgdF#k*~E{&ou;f2N&WTS~dDLi18`Dbm&V5XZ~5yh4qr z+|I2vT=#FPh!$+!2n45Q$G4tTbncWVV@OS~(#PM;v!%sMIyb+hmIBKH*eILYcAJ9O zuRpzEFdoUaZ(oEiqnJjI74Yy1a}+);k?yC@pP9pBS>>YJpB>8a`{T1UG`eX5%!dAN z)4rxD*?;Z-N1=6KXOu2Zj|`Suv%lGSUxHn31(U(2yKK8}He2YSVYv9s>_4Vi>4RaZ zFZtY{t1uXqfniv(4mY-FHXi#2g{1+&V53t<=VXi(F!5BlLK)Ub%TXw{??C(Dr(|n0 zK($aRi}c=&YEBw|Jw*#DD?mYVo}KpGUjRJ?)$=2Z=kU(+ z%0{D)6jJ9kFO_7biQ}m>FAjtD%Rlprh?Ug6-c47oAuGATCjx$|Mlq6c)h!vL1>DL9du%jwv7Nr}FU%O=+hylpexemZ04Ja6*DA1nW=?By=CQa?)cMyI z6_eh^N5f{TkZ!Ebc-=v|Zdbu*E z=V@nzx(jWCJ#IetF&dimNfnjeRSIk#kQ^DeDd{_#Af1)RzNR+96k$3$Z}P}klWK#r zmOw%Yw^C}~p3@h)lw%IzXU*d;YtS=%;dFDLR@DiDsCV1Yg7Dt0$P5#0Ry~}m3MA*` z@Bze)V7`D4R4ScU)uSaCb$T$fcCg$(2pv+jw~FJ;!$1_1-o(N0c{ONVrc#+w@u<9! zRHOP6`hgjctR^SBQKcfBdP7?a1ttnAUE5=$b?;PXj47ana*Twv&!b@%*iFAz?1xk_ z8|$ZnN~y1ji{>@SpgYIn>l)_6T(=eM52HUTPLy6=cp8b2ZA8)3E%1jhX zzVenrzf*#r4MK1;xLE0*-=1{cM3U(I;1yJYcf zaF~mQ%_H5HltT%sBHZ1Wo=O8R#7F*jxti@)j*%JnsvR1=>~xI$)BS3<(h?Rv^`9zA zMxT@ZyeBa7;(BFPbRn#dy!wD@bBd4n;Um=$WU^31YTd!$@hD6k6!xEIjCC?`Nd8@s zT+V;~j=D|6+yo7pMd&@8eoQUObv8(vk{1J1RO3UBn#a=~m)=TRsR(_zL0ZlH8@%Rl z`U$n3KiiMiAo+Je02<)7wAxE+MiFbhlYxSbK6;`)V>qe%D6Ed|p<)sr?2|qc@mx_3 zL=v3-K;`pjk=f4mPpTl#eF5#4A?A_#9)ZLbKKP{iPR6L`&ZpEmaek>tpF{%kj(i6_ zY}um9>5aAM7f~n{-C4*FY*AZz=obL4v)RYRTU9NOS8C;AZ#Bwvx z5VN(oQ@N-(qA3R(+odIsVXK`uf?C|`lf>d7&pS>Uez1U(^UO~A+n=Ia&?nplo=w01 zX{7`*lta~?1wcwgfEi$u4|dKQ?kP|;BZmg?#2MlNZ8{z7^3t<)_fqqH3vs3aJ28%v zwr_0U?hWQ;_)!7l1hfQ>q36vuR&#GFnX8%i6Z z(8ot7e%?nXAHE5Y>0Gv5t@;YB5Jc0dwdAiOR!7}ln-zVXNz70S4i5U+FM?V^(X8gO z>)7eAVH=b#g&C7o7 zT{&6Jp#>^P$&{3aIz*uydaaHt*L`wQ4tgGbPFo4e`pDjw)Khlq@fK1dYT@@cC>PH; ztn!tKyAG>W{8o`!r+pV3^hHa8KY0R`Pzs2&#-*>S6H<32l*IK??>ISj1X*WBNm#yB zD0JKfO5@=p>L9hZ#`s&q>Q?$y+|HxJ2&kWIlGB(M4XJzvu=CUBm3#NiT7X-QsxHal z;uUhNJbqN&!>La-FW0|@6XoUQ4t(RVaNMKWs8J60x`yu)Z|5}wET>zHl^zlY!hxsx zd(oVI_s3(L>Qxs0pV!pXK^+NWy@%iXcXX8tv#OdCO4+$$rdA@~f!gVO$c6~;@_`~{ L8@ZTOHOc=220j~v diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xf b/si4/ps5ws.si4project/soft_ps5ws.sip_xf index 5139dad770f143cb1e0fcbba26f6a6d0acb6d10c..c8f5940b718d22c268cc83d64a0b68c7fcba2189 100644 GIT binary patch delta 22043 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 delta 4828 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 diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xm b/si4/ps5ws.si4project/soft_ps5ws.sip_xm index 53c354ec7fd1457adf816a849c7ca66ce700fbbd..87a6aa3e1f8a82d06888c568dd9723099e384726 100644 GIT binary patch literal 456 zcmWl|007WWGi}D?ba!{xx|jyu}M!n^~`gRZ1BP&i_LYx92f0!$!?dObl!2t%(BusXYH}qL5D1{)N&)X WSYU+@);sK@BR=_TwJ&DcZ=Zj1H5n=Z 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..37940e219e556c36860e1c8f614196d56af5ee58 100644 GIT binary patch delta 33757 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 delta 7292 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� zh1$z5Jsyv*)8p~@9X%e8pV#B@_%1yjk2~t|cznItU$Mx$W`By88vEy^!bQc)h|Bcv z2V_vMsv%G7-|OTC_3AAp?sgjg_?HTI%HG#Vzg}^=|1_sru{{DL`Oitje(OYsHfd?}7KkiXx&UL8{^oDR=4^CKd=&3wgwHS-m}Z{{n0 z(acwTkD0IdLNj0S81wiOF>5Sxb{uisT(3kdn;=dS&oYlEt?ut)9*^R`na88}1M_$k zFEo!w@xA8pD89%%9>udEPu<@I@@%;g@@)AK^3?vXkf(m{0(t8GE|910@1pZ0mCiVO zbe_jA>;60*sr&Odr2F%Dj`8@M$~ewmvihVNJ(7({pZqlf#i(G=d_*9d~7_PyZowd zFD^f9tVh}xD*w?~50`J&;}MrX(c|&>HDkTp`Y2<)T<&D7m&=bpo|E_q@|?sikmn>m zg*+$mI^;Qt(U9jPN+Hil+-lB;FBSUCoDaosnDe3dHuS@vqaS_~{qUoDy>n?_DsqM1 z&(Y)Cb$=c&(fxUR@Ye;#*+`N>39fuBt$%;z8K{?Lz`kMI6a`OoI#yW)Gz$9Ki6&Bu4e@0pM9 zipQ9b?~2RJ$9Kg~K%SHM1@fH4eURrQ)d!=5+n8eN!p(Zt=044 z@dtYTJRXI9cpduT577_LGuO|bigY#CPw{BoUryym*6aQ}{z&)dam-vl<&V+r)%en} z4Z6L@AM5rWk0pO2`Ja$K4*kp*=x07fKQkWuOz2DSGojDG&xD?Y`N>4O!Te+*6Lf#- z_%o5ObblUyuKV*i4)c?Vd<}j!J>NXP0-^F>&GSp~MDzSoyvaPj6fZH)FU8}`^Gk8U zJiin_1$j>5H^_4mlOWGYY=%51u@v&0#CXVa5=qE&5|j0ONji`UZPCZ?@iIMM9^a3C zcq{th<>-f}Xg{a=k8IPv$1Ak&@l@@rymV~4_B~#yeUGP+zk~c$CuVY&vOPPuq(uFwcjg;^N=U^Fi?}^L$YJ zt$98uUT2;UiYJ)ogW`+L^Fi^`m>2#7^TM++FZ>{pgb9_!BzTX_5;<>s%jvlg;rd&Y0s<{A$BP?^jB?*v>8|eogJC zSU!mLoo5uc=E-xZpO#Bw{ z+cf@nRR4A4xI^PvL-}4I|3CQ|$j?B22J$nIpMn3&8JJQ}S{!VW9h@D~vK{hNs<)#0 zG^)3z`gE$dq52G}x25__svk!6SyVrq>W|d>$Ahyv$aFSSbZk51x%Kq(2lx0NttV~G z`FO0J+P?cA|J?c$^(1I=yLQXS@j~L4h+igth4@wDe0R^c1#~{%+YryM=?(Gxzpo*l zZ)55FzK3`u`RXHoxIP_2Jc|6$#AArp(tNI?<6YMP^EOa@4b8{3f9Q~zD4|AEwhocgb#{;#L@W2pUW)P5PY zzk%A1rS`8=`{mSrIPnzfZv@q+QaxT@y&Tq$XTuZq_4h~AgfJGZg#|>_Xj<0tlKLdVK)KJI!#RuIMH{^;|r8ZbMyEVzo_$b z8O3#VzQ@hX<5Tqq&Er#irFndco9lelK2q{7o5qw_p&p#MH4Q&j96X67kAocIXhgO6qT|NrmJKxe(5k`%{^ zvSq|k;uvw9I6<5wuF~tBD^8?}_t(~sf5pjCx!BmB%H`XQ$9tE*)8~86<(~R{_qeNZ z{<-y8#`)>;0nD>gm}mFG{_JkppFJD|B~t}ss0t! zS5f_Is;{Q{CaSNY`ev%HrTP}CucP`_s;{T|HmYx+`gW>sr1}o3e?j$~RR5CdyQuyZ z)xV+o*Hqt4^-Wa&mg<|S{vFk~P<;>8w^DsC)wfZ7AJw;0{d=nKp!yF~|B?Qle2%adx9wA|Z)Kl;^^Di|F~#+X8xS`nZbUr5 z`2BLMC=xHLb?EpdtNz0W#&}{y8S6u2`y*uE$H@Mk#(KqyF3oPxp9hG`OPcAwkG|^r z!%K;m5no`OFEJ-tHqtm>T>jj6zt!b0jPu83pYi#b%YNbjvCsJaO{{8Y*l&Darf=2I zY{2-wjLSje`vEQ&5El}+H}=$6xB>^Y|k0Z5a)|Enk7J ze%}qgPsV`nldr+|NeFzuj0N8>o51&r1Aaipfgg~~;0L4_{Gf~nKPX$k4@$b0{(e-f zIGgTh+%F*(j%CAUf04LsHQOtmVD=x0N6O9q`uFTnL3|nUJbk|g>8t!JYU$6bV~OHW zmsimKJ^_u;0EJ*mQ_65;8;4DT>|aX(WStd)G~wP zk+3WWPRqNs4_%*f@kCNC)7K-9n-MQ3UeX%dzhXRJ=r^SQRsSsiZ+@Hqlt)EXQ&Q@jh>)l+^ma_T! z^{&U8jL+{?y((mU|4p&I+4y{1artKb`q*us5_7+E)qi)$v*anrvt%>mS>iyRC0ig* zG2~fN1M)1XggkZsJIJ$T3*^~S40*O}g*?TOXG=}Uv!w^*`Q&NH^T}4o^GO);e6kJl z6hod*YC)b)svyrV&p@7Ewn3g>N+8cK+aXUeH{3LD>m;iXks3bs;Y(S3+KaJP&yVvJ>(OBm#K_ zvJ3JQLtcT@gS-Oi4S9v~0^}9SF32mC&X89q-$0&X$Saikkf-XpKS|m}=`!7)$5-j= ziTe93PQ9qFCm!!MuScrhK;IwTtM`HSk?=xj9|?a8?IYoa&^{8rTDMo@iNs#g?LBU! zeUGmp|7G$UlYcGx@mJ7~H$gw%m;6`BZ%TeYSkIXC8mwo`+O6kb%~#Bd>iPG0H>_vO z`VQ7JW;KKLj9L9L&wd^A>~As8j$xktE#}#KFwbs|dG-L9kGS&&%tze$PCx#s^@%%s z^?G~U0_H334AlLp<4=~qsr&PIkM7UoeY!u7Tk8Hi9t8cRQ;VR#bn1I(pH8)c_UY7M z-CmM*McHEA-s9HV_xL;W@zl;%4KdflCuMJ$>!Em$xgP5B9XHp*C-z=*J$zFBgSj3) zNwqQ8L-jWl@+^59@+{d4d6py~&yszRXUUI{XGvSgvt$_L+42tL*|HDvY)L|%E#E_) zEk8k?Er&s#EyE$tC+|X@?|Z-y8D;UGaug-H`c#T za_@g{UqSwpB>!3R zTan*`{O8DTO@0;m&y(MV{GQ~$Kz>{Ddy)Sl`GfWE8*}P>@I6ZVjXp;FIPnw2^N61$ zo=^M~@dDzfiJu|P?|-bnkKnFfe*a^fkNp0}I3L6H-@AML_x-Eye|#lg-+T-4`u2b9 zkKCL5m&oV+ldmHGW%7A{h@_B>y(@SCU^q{_W(iBA@p^zk~eMaCXU)_Gm$CG~x_0Rh!pFn*u!;UXu*;iZJekt7VLX}A+h9DI(#_4Hmi%+cA5H#ull)ThXOh34{0RB8$Ui`SXYyy0ukLOgd9qM*aij*C0Pi z{v7gak{=^~F8Q^{kCXo(`L)SUkpB?*b;wVW|1kM=$-kKVN64>7ev14@$*)g-n*7Je zZ$N&A{Kv^}NPao_Pmte;{7cB6M}A}SE69J6{3hgIO8$KEo05MS`A?DGjQq>VUqF6y z@~Tt#SO7ZIOG9HTMTn z2Qb;(A4u^ybAKMicqJd$`6@o3^^#{J%U^cf;!bUmkT zM`n#hw#Om+#v}VDAO|KQ2PYvHOhzueU$dxuXA1FD;%UUwiDwYcB%Vb)8#(>}@f_m0 z#19fbMEo%EBgBu^ICQ@x_xR(F5kF4+1af*F@sq^!iJu}~V2mf54Mm#k{k$cVNJI}9 z^-wC4RX2k?^nBOl8pJh;Z!zv)6;k)7s%6x(>OXvJ^zZVARDaXBpTApgW8A;b?eDny z#(2t0vd0tm)4%tWPFjC?-xgb&!Fu5>NGSRrdR#oMYs-Rg9 zMN0Y`$L}~r$(6?OyIf!#zsn{1_pajd0BXOA+80v$PSk!NwO>u`+f(~eYCnkDuc7wm zQu_$CA587nQv36$eP?Pvgxas8_UBXkGHTy}>K%!PQvd6z{|m^EQvbuK{RV1(A+?WD z`{C4nBelPX+Q+GV5!FNb{PWHqhq#zHOk6_TiMW(FLOenrPtI{ltS|KOc-&c!*W-jf z9*?iX_V$<9-Y&!Tb`sm$*JFF%SJ>Vc#rD37vAr*bb^kxh|BBCf@?*}=Kz;`DGmxKw L{0#i3&%l2H5Zpg{ 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..2dd9b561c7946ec72f3fddf3410e5fbab2c558f8 100644 GIT binary patch literal 1928 zcmc&#O=uHQ5T5)s)ly9T!FZ8a1U+tBi}aSXX))T?hp9vb-PBwZv@Irr;$`tBDuyCO zL9w8S9)zfPQ-}vIijac`528g81Pcc1K~T{7<~5lO;<*F+?d-g7znS-D*qvQZbeJei z0a{UuasG64MN5$6+Zb_e=j#X8)V??uj&HdW#^MOq7a%FpOC2pDM85^Y5xFfxM}XQI z&x1}+kN7y>81rI{6{3eeUSa6ODXcsLB$$_gW9?dyIvalBR6+DS1e~@AIS{tCd!yz} zkEL8h&jVsn&Kra$_A{v6PP?fzf{y_X=XKy%`_k#>?K+O=S3r{UCN=Ndke_FyzN+w8 zFA2w5+&5)u*YqJ;1sK*ds&}B3*AL1c;jx~9W9>mJZzrNPK#cV;P|KDh-?_M@NrZ0$ z@~oGKvus^Wo;RG`A;Is!8P=Ooz3vD#`<+P{Ip+_;W4#%9O`w~*7NFJQk2-D!&Md%V zJx}#6v?CY-5c5j7zXa4-uMWrBU6}%zKk!Z?dIgYYy}as~kj~3!pL-INivW-HJUG_M zJQATseFawr`ZAUhJTD2Im#4n@n<`Bo1LYE+%z9-w);_Lno*x-!d;?wKP?E&Q-V4ivN%6p+a&-9!9pu83y*EbKx+GpjF$&5?i zr2Go&RaCFI!Iw8TCi8p?5>@6^m3JuqFYgU_N#1W#_dC$m!jlb4TPs{&1us~8r1M86 zHzsrMVX4M>Ynt~+t6mC}djP|Ejpm(e;k!jU&x;b^`bg^=h&J<*JCVwQBK@ebUag@(v~`p6 zCbB~#SdnwivtC~Hu6C%nTPjL_pMad;eI#@rn}a^RgJu|%Pk;r^y8y@9*;V#qkEe5! lQ`5M=2N3I#>Pd(JKMDLZ;{4Az!8 literal 968 zcmc(dF-yZh7>2(#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..487857672a6bf90554037b2873a0dd92a7681d63 100644 GIT binary patch literal 37904 zcmeI5dvsLg6~*re2v(?oLX}7i2C5>&BqSuh$}38Eh)NQ97z|-DB!N7}%tVM#zz4-w z)s|(esI9eFMWu@(C`1$&OJ&)rtZMNms?=|iM@-+OMHIk~s1e{;GQduF~l zGk?sF^S!@&liSmA<~UCG7RPbuFOMEQS{lKN|H}k{Bl!QWj>jt-tLvL`q9%TFmmj(P zn#s#=I&n{AayQ3$2hoAzqHI(Qysl8+U|cJWW1WuLC}(f4DY+3Gr-0)`{N!(lxAzGC z{fujoV=^ACY;3NX*P1Yzk$0bQ=BO__A{%=-&SwC0s`#&`JI(;SzDGf0T#Fp%CE}HE zRkXQjetm6@y{x=*O8abQPbB+mjx!m38lGHt&)2lPGUHn0*a(iT)h)@Y#ReGy$Ri^T zjCl26N2DJBEkOAq@#TFrEw9YDmft=ms}l>WtX6KR*Dqnrbq)ZXC4T2P$H70RkAlXy zmS3-15(UMDMw>@RINpGM22G?hNW4~H>F$Pct+afsu8CT#*-zb3(_D3^BXTeDu@->N z6ptm;05PuBg=18I;@B@Q+5Mi|KF$Tlhtbar!B3`pqo3)G=RYb0jA@Z$w4r`p<-Gc& z#awiGNWK0g7~TUj4e8$nHG~p#znAjR$&oOPwvR_o9I|5u#^FE0cyaUbj>B%69{3%{ zDaLagY*Q7~ji+<0OZ~W+*WZ2qle_^aGipE3q2h9$&`E$ zP8DNXZa#7lUdace4W#rlnc%n|fX)#Ay}w5bO=g-H*HRo!HjsTkJb2HIJ@-VGpkD6* zpe*s(8JdqeTss{xR&B*G9Mk`I0^a4y^LJ( zwITgA<67j%^>Enix>=8dJ@a#W?TKth`*;HYF$d{2U)Qv}GGkf+9L>!PKY#qeYsvAg z6C7t>3ZM>bAduN5Der~7BuB14ChHqxMtf_=U+=jM?c+lLl_$Pe2Hcej9^+bR9BsCa zog5zk$BO}o%i#1hJ>U^|jA{8CE5=PP&&`>j!zRjOuV1lw?iU@ACs409;TIQ)AI63j z*B*5~GOp#fkE!e7=F(Ee;lDvY1C-9$;&(MHDKoA`j@;*pCi3z}<=bo_@9Xh_yZ-nJ zHWBs$P=E0&SlHoEyh%Z0TuX5@mx|CG@b6??%jcL#MyufBy2bVm`8-?np*wyYjB)ra z7(;TnLyx>u)AGte!y$6y{!Dc;wHc~J;G7F{ zxI<@wqx+24sp5NDKF7}eLW5n+Z8zS!V?Wj(r=dDzy(^@j(dW;|)aQu0ZT0wL z=epU^UXFt)j8iC{53WICT+8PuyVnM@5k#bY+<}I#6-Bb7hnqy*6@P z`!3E4e}zqis{x2>XY>I+Kzd(G-u8m>=yQzL)yL~=jP}{7rD-HX*$#q`wZ@ zMpPW_h&UUWZTE?g&u~BXSg1&>v2%`Lynx!a2(!P9c^jODaAK!X-hooqSp_1 zM0SGP3e;^ZPq@A~s6&yMCPa?hzjpT(YGU(RYwfLx*ACh1&S!p#eun2Mvc-2Y86lm2 zjB5pOG}mWWmUaXbKVPD2mH#D(Vo z^z{jhX$5mMmXgxX?3a8T0Z8=sLi%gQw8)X;$3>%abB&IAI{WJkoReZ(_$~1XOvV5) zu9e2o=BTHW<0;^XtycF;1s&d}bs#t_L7a z2k9;iBj1DEnD?^tF|B=cE4RI*e4}*hs*kYV)2|oKQeZ4T5_IU@1&%WT&+AnEW=yLq zM`L{qfIL0+!@sP=bsy8g@n)2B#Gmxhw7fFoTI9%cd)(*BH+oL0M`QUPs&GzfEOPM~ z06JfMWPo>Hg)0;^#$2HsA7g-%1#{R)A5!fi-g3p5me0{;xG>gcjUjmq>br6ELbQ+DFb>Z~ znQLeCuY-U|3{Pq5!ZDf_Hc?0}d;jZkaNGcnx8N5K6K})7k!Q=URTLQ4B1eBcycr9* z1~EFr7G&P_0IowyVElLiauCBE*V{_Gdn`PO{wGz8Yo+C5tSQ>k7EhXkDf8>IaZq9! z0M&|jB0sTI;jaIra${V}=a|;d7)#38qfYuQ?}Ic4a2CN#Kl(G|C+9Bue7H(ae8Ssz z8}~n3d+Y$jz;ow>hj?kb20AWo-4=L z-Nlar7;{heD~xOT9NlqGJl0fI7ppe6ZTQ3uZBKQ>zAM^8=Hqbjc0q;Px-2bOvN9{zZG0S;2|9t!&YJwb3nI0hlt|1HN(SvdAXK5}eW zBYq3*Wsn%x3gBpO7h5=<4vyTvj)||90ghhwVO%Seqos@#jzhsQ3xMW}YrAP$UYT(% zmm}73s}u3877TfC6?SrQQh(|gFYm}d-1E?z5uUT>KG#_BlOY@#*Gl17Wp$lm#8VAN zI4@+K9*BNs9G>ZoxL$!npRI7J7}L@mEmdcq#n9|`kLUfGFT)$R!{fz&3)!DxTq~7h zym=AMq!=Xm`>9JZBOQ^=7>9E{GeLZQNWErUE0trSW^taek)wxW#q|5$KF|?)2^=fH zt_1JWk79DeGbkmf>#1T)E0tqe$;>>1#~-mly?*X4aQqWEP6wb%#5V^Wyp>oOM{hoZ zUc0JnQhveoyhcljIeyc&7xOwIhrqF4cgMLDkmyy*yfw7f6g0-P{Cw=n(NH_tyS%7m zWJjb3i?-a0nJCTy*B~*j)s>^Wf;MA69MZ>|8P^Ku zXeb{a*tc^-en+GX+|B}^N#b)u)*l(yBFEJILPPXAQ9Sbf#V7N=h0lN^&!tQj56}m3 zBpkP6(RMEYO%?wc<44|$qDetxTq}^HwUk_X>l?hjus7z@`v8dZYWI{xhWq1UFQFQc=)9hQ z8X(5Be2(6@$LQ6X($DloKCS>dUV}|P$H7m47}M&?5iIix7nw>*;rJ>x6?TCm&r8uS zU9M?)WyZA9Ir_D`y4Y0h7LJ2)W5>%d_~sdLdS6iDN$kIKWW9!q=i6Ep7mgR6;y71= zV-+CLAD3!cUYRki^nCO=PRz5IkL}o0*bk0#0g0}?9}fYV8}ME*M`L&Al6-tV!@Don zJaD2Pxjg`w#B_ulc^y)HJ!*8lsa5c=Pzc8y%x9wLXL#Ka{m)GA?@QhE)hFFojA?0( z)~19m58*f(9LM5~E5%>*a-&@y7}xSSA}6bOk6erQ5Kp|(C#Mzy7uBCR=F6uZ9={nJ9|y++ z__3_p^cUEl>4#_CUo)l^z|mYnF5Nq8<;(cHd#{6IBLK}7Ps4mWNQ`TBa*VcSC0gV0 z=9Z*;O}nLjyS*)|mi=`J&XH~cpnCBU%x~CV>-|B-wZb@>>TlkDt`FC7F9*kV09qhk z6VlHxt`*MFQ1yQAs!zE;Ganq;&ny&&^)rlXg>fvfwBjT4nd`xECIB^vH>14_660Dy z9L@dh56Q<{z;QPKv9F;&#<^xJkvrGHsbWma=jiP#__M=NrUpO#R~O8gf_~=P$iFQB zbd~rgm>2RA8oiv$xK49sIlYo6uhufk~6N6dXC984jn4 zajh_pmNIkU^2h#B2aa37@jL)(7B^zgD@crMkt6qKY>s$58uQ1k{n=7*d;uJ{;;p!N mO~|;1ajmW#EoGudqrK?qSGZ2`COC53!)q4kuyGG#TK@sjxCpfX delta 1791 zcmXw)3s6*L7>56|7w$r^yRdtJT{c240&*X)xU))1DfX#{Iozj2%OKbNpv%~&VYV9px>jNypo%TelR zK^)eWUR2+62`g|`h~p4Wm)2nomg_V|LCiZnd#v)lOX&4tYznfGGZrp?u1yrg*=&bd zg%ERsTlaxZOh!`(KTo?#tlBVTrw~q*9SbR%(DN>v6y3%4}~m7txxIC-@WS+8X;pHSQ4kok0RVRqMa5?!CX3OJ&PneAfqFN z_5Nfj64B10{-akjVY!5khao@s95pb8U$NI5)=0TMR3nJa6E~EOT9L0EN-`%iNInyW zj!uob^@Gr9HB&fmdr-14vt4D#xPDCu@gpK5AB!QR{FqSr(}*dJcyDGxk&CejwA3g; z!5v{B3LWV_aa+=08HKFp>@dr73$aYQcDk3T1^NPLp`2-lHAF6t*{CwH-<2G5^YioH zLJZ^FFjAE_)T+KU>=#ii?5M^qz)Ft3*K6doB(keCLcoD$TDXfq`OT^VQ z*!w)b##2$MVr)Aks)SggY?@yZ8u4a-DRs_nr4pdc^`@TakCpB(NKv(A9*kpchWg}UCFWwg)GE5EhuqBX(c`#t#qGo zTV92Qity*Gmn$+nwWdA(OK<=1k4qRs5e1N_TVj*E`%!cnmNKR!n1CFC<9JSwl3?U9 z)R^7vGz{YT4#j(cg6D981#07w9Mn+L;l4FJEcD>g`Vc+RFR3ANbuOaRj#LgsqK;gY z*#XIy(-A^Zj_1L$|L>u9_hMdw7-=+Y39t}q*^|3}a^iue)uj7Q;}m$IK51sT zK8TbDKY3|O)u!5QlEZO3+&TF4Gv3HY@;>~CUKWG_$-JbEujr)e=Z(@$TcEVLWHS8W zbw8_$@Wj(QqY+?I3I@E%yrtxNo!tBc`aC(-5$J)Sb&%=*hn90d8O1=UQ3y9(yOU}| zBr0|#&~T>Fw^kam>16#%L|S5BdbtAkav8@IDUM@MR=s=`CRP@=we|ok!>~j`j^&)D M;_%T)ZL1^y2eJdhB>(^b diff --git a/source/app/app_config.c b/source/app/app_config.c index b7c64be..d6264ec 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" @@ -12,7 +12,7 @@ WR_Buf wr_buf; void L3_param_init(void) { - U8 i; + //U8 i; G.debug = 1; //station模式状态 G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok @@ -26,13 +26,15 @@ void L3_param_init(void) Lc_strcpy(G.ap_sid,"cc_pen_ap"); //ap模式pwd Lc_strcpy(G.ap_pwd,"ccsens123"); - - wr_buf.wIndex = wr_buf.rIndex = 0; + + #if 0 + wr_buf.wIndex = wr_buf.rIndex = 0; wr_buf.maxsize = sizeof(wr_buf.buf)/sizeof(PenPoint); for(i=0;irIndex+1)%(p->maxsize) == p->wIndex) @@ -183,6 +195,7 @@ U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen) else { //L0_uart0_sendstr("X"); + wp->full = 1; return 0; } @@ -208,7 +221,8 @@ U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen) } else { + rp->null = 1; return 0; } } - +#endif diff --git a/source/app/app_config.h b/source/app/app_config.h index beb6e7a..a667af1 100644 --- a/source/app/app_config.h +++ b/source/app/app_config.h @@ -5,6 +5,7 @@ #include "../bsp/bsp_config.h" #include "../tpc/ccmodbus.h" #include "../tpc/modbus.h" +//#include "../asp/asp_oid.h" #define APP_VERSION 0x10 @@ -13,7 +14,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 + //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG @@ -22,12 +23,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 2 typedef struct pen_point { U16 x_axis;//横坐标 U16 y_axis;//纵坐标 U32 time;//时间 + U16 angle;//角度 }PenPoint; typedef struct global_register { @@ -41,10 +43,10 @@ typedef struct global_register U16 null[25]; - U16 pack_order;//包序号 - U16 frame_order;//帧序号 - U16 pack_mask;//包标志 - PenPoint points[POINT_LEN]; + //U16 pack_order;//包序号 + //U16 frame_order;//帧序号 + //U16 pack_mask;//包标志 + //Ts_OID_frame_xy_ points[POINT_LEN]; }GlobalRegister; extern GlobalRegister R; @@ -86,12 +88,17 @@ typedef struct global_param vU32 modbusstmp; U16 authed; U16 flowStartVal; - U16 datapack; U8 mcu_id[7]; U8 pen_up; - - CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; + U8 pen_down; + U8 pen_hold; + U8 pen_end; + U8 pen_t; + U8 oid_p; + U8 oid_x; + U8 datapkg; + CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX];///16*3 }GlobalParam; extern GlobalParam G; @@ -99,12 +106,14 @@ extern GlobalParam G; typedef struct { vU8 rIndex;//读标志 + vU8 Index;//读标志 vU8 wIndex;//写标志 vU8 full;//缓冲区满标志位 + vU8 null;//缓冲区空标志位 vU8 maxsize;//数组最大长度 vU8 readdr;//缓冲区读写结束新地址 vU8 relen;//从缓冲区头开始的新长度 - PenPoint buf[POINT_LEN * 2]; + //PenPoint buf[POINT_LEN+6];//8*48*2 }WR_Buf; extern WR_Buf wr_buf; extern void L3_param_init(void); diff --git a/source/app/app_task_speech.c b/source/app/app_task_speech.c new file mode 100644 index 0000000..04c4b18 --- /dev/null +++ b/source/app/app_task_speech.c @@ -0,0 +1,55 @@ +#include "app_task_speech.h" +#define START_CODE 0x7E +#define END_CODE 0xEF +TS_TASK_SPEECH ts_speech; + +void L3_task_speech_init(void) +{ + U8 i; + L1_task_init(&ts_speech.task); + L3_task_s_go(ts_speech,D_task_init); + for(i=0;istart = START_CODE; + pspeech->num = 0x07; + pspeech->oper = SPEECH_NAME_PLAY; + pspeech->title = 0x43; + name = hexToDec(&tcp_buf); + tcp_buf[0] = (int)(name/100); + tcp_buf[1] = (int)((name%100)/10); + tcp_buf[2] = (int)(name%10); + Lc_hex2ascii(&tcp_buf,&pspeech->buf,3); + pspeech->crc = (pspeech->num + pspeech->oper + pspeech->buf[0] + pspeech->buf[1] + pspeech->buf[2] + pspeech->buf[3])>> 0 & 0xFF//累加和校验 + pspeech->end = END_CODE; + + return bufsize; +} +U8 L3_pack_ccmodbus(TS_SPEECH *pspeech , CC_SPEECH_INFO *speech_info) +{ + U16 pkglen = 0; + switch(speech_info->oper) + { + case SPEECH_NAME_PLAY: + pkglen = L3_pack_ccmodbus_03(pspeech,tcp_buf,speech_info->buf); + break; + default: + break; + } + pccmodbus->num = pkglen; + return pkglen + 3; +} + diff --git a/source/app/app_task_speech.h b/source/app/app_task_speech.h new file mode 100644 index 0000000..db8dab6 --- /dev/null +++ b/source/app/app_task_speech.h @@ -0,0 +1,47 @@ +#ifndef _APP_TASK_SPEECH_H +#define _APP_TASK_SPEECH_H +#define CC_SPEECH_INFO_MAX 1 +#define D_s_TS_speech_max 32 + +enum SPEECH_OPER +{ + SPEECH_NAME_PLAY 0xA3; +}; + +typedef struct +{ + vU8 start; + vU8 num; + vU8 oper; + vU8 title; + vU8 buf[D_s_TS_speech_max - 3]; + vU8 crc; + vU8 end; +}TS_SPEECH; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}CC_SPEECH_INFO; + +typedef struct +{ + TS_task task; + U16 slaverIndex; + U16 pkglen; + CC_SPEECH_INFO cc_speech_info[CC_SPEECH_INFO_MAX]; +}TS_TASK_SPEECH; + +extern TS_TASK_SPEECH ts_speech; + + + + +#endif + diff --git a/source/app/app_task_tcp.c b/source/app/app_task_tcp.c index 9e8c5db..183420c 100644 --- a/source/app/app_task_tcp.c +++ b/source/app/app_task_tcp.c @@ -1,12 +1,10 @@ #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" -#define MODBUS_SLAVER_DW20_REG_START 0x02 -#define MODBUS_SLAVER_DW20_REG_NUM 0x02 -#define MODBUS_SLAVER_RETRY_MAX_TIME 1 + TS_tcp ts_tcp; @@ -28,8 +26,7 @@ void L3_task_tcp_init(void) void L3_task_tcp_handle(TS_tcp *s) { TTSS_Task_init() - L2_task_go(D_task_tcp_constructor_modbus_pkg); - + L2_task_go(D_task_tcp_constructor_modbus_pkg); TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包 if(G.ccmd_slaver_info[s->slaverIndex].mask > 0) { @@ -44,74 +41,68 @@ void L3_task_tcp_handle(TS_tcp *s) } TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包 - L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); - s->sendStamp = s_nos_tick.t_1s; if(G.ccmd_slaver_info[s->slaverIndex].mask == 1) { G.ccmd_slaver_info[s->slaverIndex].mask = 0; + L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); + //L0_uart2_sendArray((U8*)&s->loopPkg,s->pkglen); + //L0_uart2_sendArray((U8 *)&points,ts_task_oid.extra); + s->sendStamp = s_nos_tick.t_1s; + L2_task_go(D_task_tcp_wait_modbus_ack); } - 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) == 0) { - 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) - { - 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) + s->ackFlag = 1; + + switch(s->slaverIndex) { - L0_uart0_sendstr("111"); - G.authed = 1; - G.au_succ = 1; - } - else - { - L0_uart0_sendstr("222"); - G.authed = 0; - G.au_fail = 1; + 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; + } + break; + case 1: + break; + default: + break; } - #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.h b/source/app/app_task_tcp.h index 429e097..3471da4 100644 --- a/source/app/app_task_tcp.h +++ b/source/app/app_task_tcp.h @@ -4,6 +4,8 @@ #include "../ctask/task.h" #include "../tpc/ccmodbus.h" #include "../app/app_config.h" +#include "../asp/asp_oid.h" + #define U485_TIMEOUT 3 //3 x 100ms = 300ms typedef struct @@ -11,8 +13,8 @@ typedef struct TS_task task; TS_PH3_ccmodbus loopPkg; TS_PH3_ccmodbus *pAckPkg; - U8 slaverIndex; - U8 pkglen; + U16 slaverIndex; + U16 pkglen; U32 sendStamp; U8 retryTimes; U8 ackFlag; diff --git a/source/app/app_task_tcp_control.c b/source/app/app_task_tcp_control.c index 59437ba..6b66ab9 100644 --- a/source/app/app_task_tcp_control.c +++ b/source/app/app_task_tcp_control.c @@ -1,7 +1,8 @@ #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" +#include "../asp/asp_oid.h" TS_tcp_control ts_tcp_control; @@ -15,7 +16,6 @@ void L3_task_tcp_control_init(void) #define D_task_tcp_control_01 0x51 #define D_task_tcp_control_02 0x52 -#define D_task_tcp_control_03 0x53 void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区满,调用读函数读取一段,从G->R, R.extra num 动态修改数量 @@ -33,45 +33,22 @@ void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区 TTSS_Task_step(D_task_tcp_control_02)//是否发认证包 if(s_task_gm35_flow.conn_ok) { - //3s一次发送数据包 - if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) - { - if(!G.authed)//authed == 0 - { - //L0_uart0_sendstr("111"); - //发送认证包 - G.ccmd_slaver_info[0].mask = 1; - } - else //authed == 1 - { - G.ccmd_slaver_info[2].mask = 1; - } - ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; - } - else if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 60) + if(!G.authed)//authed == 0 { + //发送认证包 + G.ccmd_slaver_info[0].mask = 1; + } + else if(ts_task_oid.can_send) + { + ts_task_oid.can_send = 0; + G.ccmd_slaver_info[1].buf = (U8*)&points; + G.ccmd_slaver_info[1].extra_num = (ts_task_oid.extra)*5; + //L0_uart2_sendArray((U8 *)&points,ts_task_oid.extra*10); + ts_task_oid.extra = 0; G.ccmd_slaver_info[1].mask = 1; - ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; } - } L2_task_go(D_task_tcp_control_01); - #if 0 - TTSS_Task_step(D_task_tcp_control_03) - if(wr_buf.full == 1) - { - wr_buf.full = 0; - Lc_read_cyc_buf(&R.points ,&wr_buf ,POINT_LEN); - G.ccmd_slaver_info[2].mask = 1; - L2_task_go(D_task_tcp_control_01); - } - else if(G.pen_up == 1) - { - Lc_read_cyc_buf(&R.points ,&wr_buf ,sizeof(wr_buf.buf)/2); - G.ccmd_slaver_info[2].mask = 1; - L2_task_go(D_task_tcp_control_01); - } - #endif TTSS_Task_end(); } diff --git a/source/app/main.c b/source/app/main.c index ff8cd22..99a5313 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -22,7 +22,7 @@ // //20170608 cc_as_stc01_main // -//20180903 cc_gsm_PD03SM_vh03_m10_debug01 +//20180903 cc_gsm_PD03SM_vh03_m10_debug01 // // /// @version 1.3 CCsens technology @@ -85,8 +85,15 @@ 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_timer0_Init(); //L0_key_init(); //G初始化 L3_param_init(); @@ -96,13 +103,14 @@ void L0_main_init(void) L2_485_init(); //寄存器监听任务初始化 - L3_task_reglisten_init(); + //L3_task_reglisten_init(); //w600任务初始化 L3_task_gm35_flow_init(W600_ST); + //按键任务初始化 + //L0_key_init(); //笔头任务初始化 - L3_task_pen_head_write_init(); - L3_task_pen_head_read_init(); + L1_oid_init(); //tcp轮询任务初始化 L3_task_tcp_init(); @@ -123,34 +131,82 @@ 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_oid_handle(&ts_task_oid); //寄存器值监控 //L3_task_reglisten_handle(&s_task_reglisten); //输出,响应485协议 //L3_task_modbus_handler(&s_uart0_rec); + //语音模块 + + //按键处理 //L3_task_key_handle(&s_task_key_handle); //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..a4f449c 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -37,28 +37,32 @@ #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/msp_uart3.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" #include "../app/task_key.h" -#include "../app/task_pen_head.h" #include "../app/app_task_tcp.h" #include "../app/app_task_tcp_control.h" +#include "../asp/asp_oid.h" +#include "../ctask/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_key.c b/source/app/task_key.c index 7c97085..e6ba1e3 100644 --- a/source/app/task_key.c +++ b/source/app/task_key.c @@ -78,7 +78,17 @@ void L3_task_key_handle(struct _s_task_key_ *p) } else { - LED2 = ~LED2; + //LED2 = ~LED2; + U8 i; + U8 mu[9]; + U16 music[9] = {0x7E,0x07,0xA3,0x43,0x30,0x30,0x39,0x86,0xEF}; + //7E 07 A3 43 30 30 39 86 EF + for(i = 0;i<9;i++) + { + mu[i] = music[i]>> 0 & 0xFF; + } + L0_uart3_sendArray((U8 *)&mu, 9); + L0_uart0_sendArray((U8 *)&mu, 9); } p->key1_ok = 0; p->time1=0; diff --git a/source/app/task_key.h b/source/app/task_key.h index 7635f4e..4b14944 100644 --- a/source/app/task_key.h +++ b/source/app/task_key.h @@ -14,7 +14,9 @@ #define _app_task_key_H #include "../bsp/bsp_config.h" #include "../ctask/task.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart3.h" struct _s_task_key_ { diff --git a/source/app/task_pen_head.c b/source/app/task_pen_head.c index b4a287c..551706e 100644 --- a/source/app/task_pen_head.c +++ b/source/app/task_pen_head.c @@ -1,5 +1,7 @@ #include "task_pen_head.h" -#include "../msp/uart0.h" +#include "../clib/clib.h" +#include "../bsp/bsp_oid.h" +#include "../msp/msp_uart2.h" struct _s_task_pen_head_ s_task_pen_write; struct _s_task_pen_head_ s_task_pen_read; @@ -9,7 +11,6 @@ void L3_task_pen_head_write_init(void) { L1_task_init(&s_task_pen_write.task); L3_task_s_go(s_task_pen_write,D_task_init); - s_task_pen_write.full = 0; } void L3_task_pen_head_read_init(void) { @@ -17,16 +18,72 @@ void L3_task_pen_head_read_init(void) L3_task_s_go(s_task_pen_read,D_task_init); } -#define TTSS_TASK_HEAD_DATA_WRITE 0x01 -#define TTSS_TASK_HEAD_DATA 0x02 +#define TTSS_TASK_HEAD_DATA_GET 0x01 +#define TTSS_TASK_HEAD_DATA_WRITE 0x02 +#define TTSS_TASK_HEAD_DATA_END 0x03 +#define TTSS_TASK_HEAD_DATA_WRITE_TO 0x04 -U8 i = 0; + +#if 0 + +///U8 i = 0; U8 j ; void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,0); - TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE) + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + TTSS_Task_step(TTSS_TASK_HEAD_DATA_GET) + if(G.oid_x) + { + G.oid_x = 0; + s->point.x_axis = (U16)(U32)ts_oid.x *10.0; + s->point.y_axis = (U16)(U32)ts_oid.y *10.0; + s->point.time = ts_oid.time; + s->point.angle = (U16)ts_oid.angle>>1; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE); + } + else + { + L2_task_go(TTSS_TASK_HEAD_DATA_END); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE)////判断 + if(G.pen_down) + { + G.pen_down= 0; + s->point.x_axis += (U16)16384; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + else if(G.pen_hold) + { + G.pen_hold = 0; + s->point.x_axis += (U16)32768; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_END) + if(G.pen_up && G.pen_t) + { + G.pen_up = 0; + G.pen_end = 1; + s->point.x_axis += (U16)16384; + s->point.time = D_sys_now; + ts_oid.x = 0; + ts_oid.y = 0; + ts_oid.time = 0; + ts_oid.angle = 0; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + else + { + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE_TO) + L0_uart2_ushex(s->point.x_axis); + //Lc_buf_copy_uc((U8 *)&wr_buf.buf[i],(U8 *)&s->point,(U16)10); + Lc_buf_copy_uc((U8 *)&wr_buf.buf[wr_buf.Index],(U8 *)&s->point,10); + wr_buf.Index ++; + ////L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_GET,D_Tdelay_40ms); + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + #if 0 s->point.x_axis = i; s->point.y_axis = i; s->point.time = D_sys_now; @@ -55,14 +112,17 @@ void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) L0_uart0_ushex(R.points[j].x_axis); L0_uart0_uc(' '); L0_uart0_ushex(R.points[j].y_axis); - L0_uart0_uc(' '); + L0_uart0_ulhex(R.points[j].time); L0_uart0_0d0a(); }//Lc_buf_full(&wr_buf); } #endif L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,D_Tdelay_100ms); + #endif + TTSS_Task_end(); + } #define TTSS_TASK_HEAD_DATA_READ 0x21 @@ -70,26 +130,18 @@ void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) void L3_task_pen_head_read_handle(struct _s_task_pen_head_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,0); + L2_task_go(TTSS_TASK_HEAD_DATA_READ); TTSS_Task_step(TTSS_TASK_HEAD_DATA_READ) - if(s_task_pen_write.full) + if(wr_buf.Index >= POINT_LEN-1) { - s_task_pen_write.full = 0; - Lc_read_cyc_buf(R.points,&wr_buf, 10); - //G.ccmd_slaver_info[2].extra_num = sizeof(R.points)/2; - for(j = 0;j<10;j++) - { - L0_uart0_ushex(R.points[j].x_axis); - L0_uart0_uc(' '); - L0_uart0_ushex(R.points[j].y_axis); - L0_uart0_uc(' '); - L0_uart0_ulhex(R.points[j].time); - L0_uart0_0d0a(); - } + wr_buf.Index = 0; + G.datapkg = 1; + Lc_buf_copy_uc((U8 *)&R.points,(U8 *)&wr_buf.buf,(U16)POINT_LEN*10); + + //G.ccmd_slaver_info[2].extra_num = POINT_LEN *5; } - - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,D_Tdelay_50ms); + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,D_Tdelay_300ms); TTSS_Task_end(); } - +#endif diff --git a/source/app/task_pen_head.h b/source/app/task_pen_head.h index dbb391b..15bf132 100644 --- a/source/app/task_pen_head.h +++ b/source/app/task_pen_head.h @@ -2,21 +2,15 @@ #define _app_task_pen_head_H #include "../bsp/bsp_config.h" -#include "../bsp/w600.h" +//#include "../bsp/w600.h" #include "../ctask/task.h" -#include "../tpc/at0d0a.h" -#include "../tpc/ccmodbus.h" #include "../app/app_config.h" struct _s_task_pen_head_ { TS_task task; - vU32 last_write_time; - vU32 now_write_time; - vU32 time_lag; - vU8 full; - vU8 null; + U8 index; PenPoint point; }; extern struct _s_task_pen_head_ s_task_pen_write; 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..05c4ea8 100644 --- a/source/app/task_w600.c +++ b/source/app/task_w600.c @@ -13,8 +13,9 @@ #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" +#include "../asp/asp_oid.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; //TS_tcp_control ts_tcp_control; @@ -46,7 +47,7 @@ void L3_gm35_send_str(U8 *str) } //将数据放入gm35待发送缓冲区 -void L3_gm35_send_data(U8 *buf , U8 len) +void L3_gm35_send_data(U8 *buf , U16 len) { //L3_gm35_send_str(_cipsend_hex(len)); L0_uart2_sendArray(buf,len); @@ -235,7 +236,7 @@ void L3_task_gm35_flow_init(U8 mode) void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_10s);//上电等待10s + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_3s);//上电等待10s TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV) if(s->send == 0) {//发送 @@ -374,7 +375,7 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) //L0_uart2_sendstr("abcdefg"); s_task_gm35_flow.conn_ok = 1; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s); + L2_task_go(TTSS_TASK_GM35_FLOW_ST_DATA); diff --git a/source/app/task_w600.h b/source/app/task_w600.h index 20c869d..4636483 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\",\"192.168.0.81\",4001\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..cefdf51 --- /dev/null +++ b/source/asp/asp_oid.c @@ -0,0 +1,278 @@ +#include "asp_oid.h" + +TS_task_oid_ ts_task_oid; + +Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; +Ts_OID_frame_xy_ points[POINT_LEN+10]; + + + + +#define D_TASK_OID_t1 0x11 +#define D_TASK_OID_XY 0x12 +#define TTSS_TASK_OID_STA 0x13 +#define D_TASK_PEN_UP 0x14 +#define TTSS_TASK_OID_WRITE 0x15 +#define TTSS_TASK_OID_SEND 0x16 + + +void L3_task_oid_handle(TS_task_oid_ *s) +{ + + TTSS_Task_init(); + TTSS_Alarm_init(s->tts,1000); + ///(X) = s_nos_tick.t_10ms + delay; + L2_task_go(D_TASK_OID_t1); + TTSS_Task_step(D_TASK_OID_t1) + if(TTSS_Alarm_AT(s->tts)) + {///if( (X) < s_nos_tick.jiffies) + TTSS_Alarm_init(s->tts,1000); + s->p_ok = 1; + s->ts_frame.flag.sta = D_PEN_none;//超时没有数据 + s->ts_frame.cd.xy100.x100 = 0; + s->ts_frame.cd.xy100.y100 = 0; + s->ts_frame.flag.angle= 0; + s->ts_frame.time= D_sys_now; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else if(ts_oid.oid_p) + { + ts_oid.oid_p = 0; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.flag.sta = D_PEN_gcode; + s->ts_frame.cd.gcode = ts_oid.gCode; + s->ts_frame.time= D_sys_now; + //L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10); + //Lc_buf_copy_uc((U8 *)&R.points[0],(U8 *)&s->ts_frame,(U16)10); + //s->extra = 1; + //s->can_send = 1; + s->send_p = 1; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else + { + L2_task_go(D_TASK_OID_XY); + } + TTSS_Task_step(D_TASK_OID_XY) + if(ts_oid.oid_x) + { + ts_oid.oid_x = 0; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.cd.xy100.x100 = ts_oid.X100; + s->ts_frame.cd.xy100.y100 = ts_oid.Y100; + s->ts_frame.flag.packageNo = 0; + s->ts_frame.flag.angle = ts_oid.angle; + s->ts_frame.time = ts_oid.time; + L2_task_go(TTSS_TASK_OID_STA); + } + else + { + L2_task_go(D_TASK_PEN_UP); + } + TTSS_Task_step(TTSS_TASK_OID_STA) + if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0 && ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + s->ts_frame.flag.sta = D_PEN_down; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + s->ts_frame.flag.sta = D_PEN_normal; + L2_task_go(TTSS_TASK_OID_WRITE); + } + TTSS_Task_step(D_TASK_PEN_UP) + if(G.pen_up && G.pen_t) + { + G.pen_up = 0; + s->send_t =1; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.flag.sta = D_PEN_up; + s->ts_frame.time = D_sys_now; + ts_oid.X100 = 0; + ts_oid.Y100 = 0; + ts_oid.time = 0; + ts_oid.angle = 0; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else + { + L2_task_go(D_TASK_OID_t1); + } + TTSS_Task_step(TTSS_TASK_OID_WRITE) + //L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10); + Lc_buf_copy_uc((U8 *)&oid_buf[s->point],(U8 *)&s->ts_frame,(U16)10); + s->point ++; + L2_task_go(TTSS_TASK_OID_SEND); + TTSS_Task_step(TTSS_TASK_OID_SEND) + if(((s->point) > (POINT_LEN - 1))|| s->send_t||s->p_ok||s->send_p) + { + U8 j; + U16 k; + s->extra = s->point; + s->point = 0; + s->p_ok = 0; + s->send_p = 0; + s->send_t = 0; + for(j = 0;jextra;j++) + { + Lc_buf_copy_uc((U8 *)&points[j],(U8 *)&oid_buf[j],(U16)10); + //L0_uart2_sendArray((U8 *)&points[j],(U16)10); + } + //G.ccmd_slaver_info[1].buf = (U8*)&points; + //G.ccmd_slaver_info[1].extra_num = (s->extra)*5; + //L0_uart2_sendArray((U8 *)&points,(s->extra)*10); + //s->extra = 0; + s->can_send = 1; + #if 0 + for(j = 0;jcmd) + { + 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..54043bc --- /dev/null +++ b/source/asp/asp_oid.h @@ -0,0 +1,139 @@ +#ifndef __asp_oid_H__ +#define __asp_oid_H__ + +/************************************************************************************** + asp_oid.c +****************************************************************************************/ + +#include "../bsp/bsp_oid.h" + +#include "msp_uart0.h" + +#include "../ctask/task.h" +#include "../app/app_config.h" + +/********** + + ``````` `\___________________/` ` ` ` ` ` ` `````````\___________________/```````` + 222222 2 21000000000000000000032 2 2 2 2 2 2 222222221000000000000000000032222222 +package no 0 1 2 3 0 1 2 3 +package no 0 1 2 3 4 5 6 7 +packageNo 00000111112222233333xxxxx xxxxxxxxxxx00000111112222233333xxxxx + + 111111111 12222222 + 123456789012345678 901234567890 + +gcode收到固定码 +坐标码 + 按下开始, + 个数累计到了, + 或者抬起 +都要发送 + +寄存器模式: 一般指的是单个变量的保存,写入和读取按寄存器号读取即可 +缓存模式:数据连续放入某个缓存,然后进行批量读取,缓存号(地址)可以作为寄存器 + + +************/ +/*******************. + +write to uart -->send + +Layer3: app tcp + +s->ts_frame.cd->R.point + +----------------------------- +状态判断,数据缓存 + +Layer2: asp asp_oid + +ts.oid ->s->ts_frame.cd + +------------------------- + L1_Oid_readoid + +Layer1: bsp: bsp_oid 最底层的点的采样 + +*******************/ +#define POINT_LEN 20///cc fixme + +typedef struct +{///6Byte + U16 x100; + U16 y100; +}TS_xy100; +typedef union{ + TS_xy100 xy100; + U32 gcode; +}TU_code; + +#define D_PEN_normal 0 +#define D_PEN_down 1 +#define D_PEN_none 2 +#define D_PEN_up 3 +#define D_PEN_gcode 4 +typedef struct +{ + U16 angle:9;///360 + U16 packageNo:4; ///0-2^5 + U16 sta:3; /// =0 nomal =1 按下 =3 抬起 =2 没有按下 =4 gcode +}Oid_flag; +////一帧数据,也是一个点 +typedef struct +{ + Oid_flag flag; + TU_code cd; + TtimeStamp time; ///最好一个包一个时间戳 一个点(一帧)一个时间戳有点浪费 + /// 前提1 是采样的点是固定间隔而且连续 + ////时间戳甚至是相对的 甚至误差相对于采样而言也比较大 +}Ts_OID_frame_xy_;///8Bytes + +typedef struct _s_task_oid_ +{ + TS_task task; + + vU8 can_send;/// + U16 p_ok;/// + U16 send_t; + TtimeStamp tts; + U16 point; + U16 extra; + U16 send_p; + Ts_OID_frame_xy_ ts_frame; +/// Ts_OID_out_ out; + +}TS_task_oid_; +extern TS_task_oid_ ts_task_oid; +extern void L3_task_oid_handle(TS_task_oid_ *s); +extern Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; +extern Ts_OID_frame_xy_ points[POINT_LEN+10]; + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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..65bf032 --- /dev/null +++ b/source/bsp/bsp_oid.c @@ -0,0 +1,826 @@ +#include "bsp_oid.h" +#include "intrins.h" +#include "msp_UART0.h" +#include +#include "../ctask/task.h" +#include "../ctask/tick.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 0 + if(i == 7) + { + LD_Oid_SDIO_IN(); + } + #endif + 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); + } + + + ts_oid.time = D_sys_now; + 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) + +*******************************************************************************************************/ +vU16 Lc_dec_us100(vU16 pint,u8 pdec) +{ + pint *= 100; + if(pdec&0x80)///负数 + { + pdec &= 0x7f; + pint -= 100; + }else + { + + } + pdec *= 100; + pdec /= 128; + pint += (vU16)pdec; + return pint; + +} + +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="); + ts_oid.oid_type = ts_oid.rec.d[0]; + if(ts_oid.rec.d[0] == 0x60) + {/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分 + ///组成,整数部分 14bit,小数部分 8bit + G.pen_t = 0; + ts_oid.last_time = s_nos_tick.t_1s; + ts_oid.Xint = ts_oid.rec.d16[3]&0x3fff; + if(ts_oid.Xint < 300)///取决于图片 fixme: cc + { + ts_oid.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; + + + +#if 0 + if(ts_oid.Xdec&0x80) + { + ts_oid.x -= 1.0; + } + + + + 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; + +#else + ts_oid.X100 = Lc_dec_us100(ts_oid.Xint,ts_oid.Xdec); + ts_oid.Y100 = Lc_dec_us100(ts_oid.Yint,ts_oid.Ydec); + + +#endif + + //数据存储到寄存器 + + printf(" %hd %hd %hd ", + ts_oid.X100,ts_oid.Y100, + ts_oid.angle); + } + else + { + ts_oid.oid_type = 0; + 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.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 + { + ts_oid.oid_type = 0; + L0_uart0_uc(','); + } +} +void L2_oid_status(void) +{ + if(G.oid_x) + { + if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + G.pen_down = 1; + //L0_uart2_sendstr("123"); + } + else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + G.pen_hold = 1; + //L0_uart2_sendstr("456"); + } + } + +} + +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 = 2)&& (G.pen_t == 0)) + { + G.pen_up = 1; + G.pen_t =1; + //L0_uart2_sendstr("789"); + } +/// delay_us(100); +} + + +#if 0 + +step1 +if(!OID_DET) +{ + L0_oid_Recv64(); + +step2 + +L2_oid_ParseF1(); +step 3 + 状态 + + + +///#ifdef doc980808 +验证算法的正确性 +unsigned char s[64]= + { + + 1 , // 0 + 1 , // 1 + 1 , // 2 + 1 , // 3 + 1 , // 4 + 1 , // 5 + 1 , // 6 + 1 , // 7 xxxx + + 1 , // 8 + 1 , // 9 + 1 , // 10 + 1 , // 11 + 1 , // 12 + 1 , // 13 + 1 , // 14 + 1 , // 15 xxxx + + 1 , // 16 + 1 , // 17 + 1 , // 18 + 1 , // 19 + 1 , // 20 + 1 , // 21 + 1 , // 22 + 1 , // 23 xxxx + + 1 , // 24 + 1 , // 25 + 1 , // 26 + 1 , // 27 + 1 , // 28 + 1 , // 29 + 1 , // 30 + 1 , // 31 xxxx + + 1 , // 32 + 1 , // 33 + 1 , // 34 + 1 , // 35 + 1 , // 36 + 1 , // 37 + 1 , // 38 + 1 , // 39 xxxx + + 1 , // 40 + 1 , // 41 + 1 , // 42 + 1 , // 43 + 1 , // 44 + 1 , // 45 + 1 , // 46 + 1 , // 47 xxxx + + 1 , // 48 + 1 , // 49 + 1 , // 50 + 1 , // 51 + 1 , // 52 + 1 , // 53 + 1 , // 54 + 1 , // 55 xxxx + + 1 , // 56 + 1 , // 57 + 1 , // 58 + 1 , // 59 + 1 , // 60 + 1 , // 61 + 1 , // 62 + 1 // 63 xxxx + + }; + int x =0; +int i; + + +void t(void) +{RecvData[0] = 0;RecvData[1] = 0; + for(i = 0; i < 64; i++) + { + + + if(s[63-i]) + { + 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; + } + + + } + + 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..61082f8 --- /dev/null +++ b/source/bsp/bsp_oid.h @@ -0,0 +1,183 @@ +#ifndef __OPTICALDATA__ +#define __OPTICALDATA__ + +#include "bsp_config.h" +#include "../app/app_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) + vU16 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) + vU16 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) + + vU16 Y100,X100;///放大100倍的输出 + vU32 gCode; // + + vU32 time; + vU32 last_time; + + vU32 overtime; + + + float x,y;//cut + vU16 pre_x,pre_y;//cut + U8 oid_x; + U8 oid_p; + + +}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); +void L0_oid_Recv64(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 +//<<<<<<<<<<<<<<<<<<<<<=0; i--) + { + sum += t * getIndexOfSigns(*(source + i)); + t *= 16; + } + + return sum; +} +int getIndexOfSigns(char ch) +{ + if(ch >= '0' && ch <= '9') + { + return ch - '0'; + } + if(ch >= 'A' && ch <='F') + { + return ch - 'A' + 10; + } + if(ch >= 'a' && ch <= 'f') + { + return ch - 'a' + 10; + } + return -1; +} ///// 0 1 (1-0)+1 //// 把buf中的数据从[usStart]到[usEnd] 共 usEnd-usStart+1 的数据转换成ascii /// 0x11 0x22 ---> 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 +446,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..add9a20 100644 --- a/source/clib/clib.h +++ b/source/clib/clib.h @@ -30,6 +30,9 @@ typedef struct extern U8 Lc_Hex2Char(U8 CharStr); extern int Lc_strlen(const char *str); extern U8* Lc_strcpy(U8* dst,const char* str); +extern long hexToDec(const char *source); +extern int getIndexOfSigns(char ch); + //extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); // input: 123456d // output: '1' '2' '3'.... @@ -97,7 +100,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 +118,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..2db1efd 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,61 @@ 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 /****************** **************************/ +////for TTSS 2022011 cc +typedef vU32 TtimeStamp; /********************************************************************************************************* - ֵ + 返回值定义 *********************************************************************************************************/ -#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 +186,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/task.h b/source/ctask/task.h index 33cde0e..0b9f100 100644 --- a/source/ctask/task.h +++ b/source/ctask/task.h @@ -143,10 +143,66 @@ typedef struct _ts_task L2_task_switch_default_idelay();} #define TTSS_Task_fun(step); break;}\ case (step):{ + //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +/// 放在任务节点?每delay时间欿执行以下功能 x必须在对应的任务里是独一无二瘿 +#define TTSS_run_every_init(X,delay); (X) = s_nos_tick.t_10ms + delay; +#define TTSS_run_every(X,delay) if( (X) < s_nos_tick.t_10ms) { TTSS_run_every_init(X,delay); +#define TTSS_run_every0(X,delay) if(0){ +#define TTSS_run_every_end } + + + +#define TTSS_Cycle_every_init(X); (X) = 0; +#define TTSS_Cycle_every(X,delay) if( X++ > delay) { TTSS_Cycle_every_init(X); +#define TTSS_Cycle_every0(X,delay) if(0){ +#define TTSS_Cycle_every_end } + + +#define TTSS_run_times(X,n) for(X = 0;X < n;X ++) +#define TTSS_run_overflow(X,n) if(X++ > n) + + + + +////设定溢出时间 如果到了就进行执行某个操仿 和run-every的区别是执行一次,所以不需要再次初始化 +#define TTSS_overtime_init(X,delay); (X) = s_nos_tick.jiffies + delay; +#define TTSS_overtime_get(X) if( (X) < s_nos_tick.jiffies) { +#define TTSS_overtime_end } + + +//////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用), +///// timerx: 问候的时间间隔 +///// printChar 应答的内容(单字符,arccii字符可打印字符最佳) +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) \ + TTSS_overtime_get(overVal) \ + L0_uart0_uc(printChar); \ + TTSS_overtime_init(overVal,timerx);\ + TTSS_overtime_end + + +#define TTSS_Alarm_init(X,delay); (X) = s_nos_tick.jiffies + delay; +#define TTSS_Alarm_AT(X) ( (X) < s_nos_tick.jiffies) + +#define TTSS_Alarm_arrives(X) if( (X) < s_nos_tick.jiffies) { +#define TTSS_Alarm_end } + + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + extern void L1_task_init(TS_task *s); + + #endif//_TASK_H_ /***************************************************** *============================================================== diff --git a/source/ctask/tick.c b/source/ctask/tick.c index fa4ee64..4540d3b 100644 --- a/source/ctask/tick.c +++ b/source/ctask/tick.c @@ -23,8 +23,8 @@ 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.t_10ms = 0; + s_nos_tick.t1s_heartbeat= 0; + s_nos_tick.t_50ms = 0; } @@ -37,11 +37,11 @@ void L1_tick_tick (void) //s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522验证 s_nos_tick.jiffies++; //s_nos_tick.t_10ms = 1; - if(s_nos_tick.jiffies % HZ == 0) + if(s_nos_tick.jiffies % HZ == 0) ///HZ = 10ms { // 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..e37e9c8 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; @@ -46,6 +57,8 @@ extern struct _s_nos_tick_ s_nos_tick; #define D_Tdelay_5ms ((5-1) / JIFFIES + 1) #define D_Tdelay_10ms ((10-1) / JIFFIES + 1) #define D_Tdelay_20ms ((20-1) / JIFFIES + 1) +#define D_Tdelay_30ms ((30-1) / JIFFIES + 1) +#define D_Tdelay_40ms ((40-1) / JIFFIES + 1) #define D_Tdelay_50ms ((50-1) / JIFFIES + 1) #define D_Tdelay_100ms ((100-1) / JIFFIES + 1) @@ -72,7 +85,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 +97,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..9bea919 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 @@ -154,7 +154,7 @@ void INTERRUPT_UART(void) D_SERVE_UART } //NOP(); NOP(); NOP(); } - +#if 0 void timer3_isrHanddle(void) D_SERVE_TIMER3 { struct _tp_handler_x *p1 = &s_uart0_rec; @@ -175,6 +175,6 @@ void timer3_isrHanddle(void) D_SERVE_TIMER3 L0_timer3_stop(); } - +#endif 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..014d7b4 --- /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(); +} +#if 0 +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(); +} +#endif +//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/UART3.c b/source/msp/msp_uart3.c similarity index 93% rename from source/msp/UART3.c rename to source/msp/msp_uart3.c index 383bf45..3b63afe 100644 --- a/source/msp/UART3.c +++ b/source/msp/msp_uart3.c @@ -54,11 +54,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart3.h" +#include "msp_uart3.h" #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; @@ -80,18 +80,27 @@ void L0_uart3_init(void) // T3H = 0xFF; //设定定时初值 // T4T3M |= 0x08; //启动定时器3 //#endif - +#if 0 S3CON = 0x10; //8位数据,可变波特率 S3CON &= 0xBF; //串口3选择定时器2为波特率发生器 AUXR |= 0x04; //定时器时钟1T模式 T2L = 0xD0; //设置定时初始值 T2H = 0xFF; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 +#endif +//115200 + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器时钟1T模式 + T3L = 0xD0; //设置定时初始值 + T3H = 0xFF; //设置定时初始值 + T4T3M |= 0x08; //定时器3开始计时 + } 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/msp_uart3.h similarity index 96% rename from source/msp/UART3.h rename to source/msp/msp_uart3.h index eb4bb28..fd535d4 100644 --- a/source/msp/UART3.h +++ b/source/msp/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 @@ -73,8 +73,8 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -void L0_uart3_buf_init(void); -void L0_uart3_sendArray(U8 * buf, U16 len); +extern void L0_uart3_buf_init(void); +extern void L0_uart3_sendArray(U8 * buf, U16 len); #define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) #define L0_uart3_us(X) L0_uartN_us(uNum3,X) 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 96% rename from source/msp/uart_x.h rename to source/msp/msp_uart_x.h index 4c060e3..05d7713 100644 --- a/source/msp/uart_x.h +++ b/source/msp/msp_uart_x.h @@ -56,6 +56,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../tpc/tpc_x.h" #include "../bsp/bsp_config.h" + #define D_uartN_free() (0 == ts_uart_send_shop[uartx].max) #define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max) #define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) @@ -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/nouse/msp_uart3.c b/source/msp/nouse/msp_uart3.c new file mode 100644 index 0000000..4a05f9d --- /dev/null +++ b/source/msp/nouse/msp_uart3.c @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////// +/// 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/msp_uart3.h" +#include "../msp/time.h" +#include + +static volatile Ts_uart_send_buf idata ts_uart3_send_shop; +struct _tp_handler_x s_uart3_rec; +TS_PH4_modbus s_uart3_ack; + +void L0_uart3_init(void) +{ +//#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz +// S3CON = 0x10; //8位数据,可变波特率 +// S3CON |= 0x40; //串口3选择定时器3为波特率发生器 +// T4T3M |= 0x02; //定时器3时钟为Fosc,即1T +// T3L = 0xE8; //设定定时初值 +// T3H = 0xFF; //设定定时初值 +// T4T3M |= 0x08; //启动定时器3 + +//#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz +// S3CON = 0x10; //8位数据,可变波特率 +// S3CON |= 0x40; //串口3选择定时器3为波特率发生器 +// T4T3M |= 0x02; //定时器3时钟为Fosc,即1T +// T3L = 0xD0; //设定定时初值 +// T3H = 0xFF; //设定定时初值 +// T4T3M |= 0x08; //启动定时器3 +//#endif +#if 0 + S3CON = 0x10; //8位数据,可变波特率 + S3CON &= 0xBF; //串口3选择定时器2为波特率发生器 + AUXR |= 0x04; //定时器时钟1T模式 + T2L = 0xD0; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +#endif +//512000 + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M &= 0xFD; //定时器时钟12T模式 + T3L = 0xFF; //设置定时初始值 + T3H = 0xFF; //设置定时初始值 + T4T3M |= 0x08; //定时器3开始计时 +} + +void L0_uart3_buf_init(void) +{ + 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; + ts_uart[uNum3].t->head = 0; + ts_uart[uNum3].t->ok = 0; + ts_uart[uNum3].tp_handler = L1_s2b_PH4; + ts_uart[uNum3].ack = (U8*)&s_uart3_ack; + L0_uart3_init(); + //D_uart3_ES_INT_OPEN(); //打开串口中断 + D_uart3_ES_INT(1); //打开串口中断 + +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart3_sendArray(U8 * buf, U16 len) +{ +//#if (D_UART3_485_TYPE != TYPE_485_NONE) +// D_UART3_485_TX() //切换到输出状态 +//#endif + L0_uartN_sendArray(uNum3,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +#define D_SERVE_UART3 interrupt 17 +void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 +{ + NOP(); NOP(); NOP(); + if(L0_uart3_IntRI()) //如果是U0接收中断 + { + L0_uart3_IntRIClear(); //清除接收中断标志 + ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); + ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); + //L0_timer4_start(); + } + if(L0_uart3_IntTI()) + { + if(L0_uart3_IntTI()) //如果是U0发送中断 + { + L0_uart3_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now) + { + L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + ts_uart[uNum3].p->now ++; + } + else + { + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].p->max = 0; + ts_uart[uNum3].p->now = 0;//可以发送下一个数据 +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //切换到接收状态 +#endif + } + } + } + NOP(); NOP(); NOP(); +} + +void timer4_isrHanddle(void) D_SERVE_TIMER4 +{ + struct _tp_handler_x *p = &s_uart3_rec; + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + p->head = 0; + crc16(p->crc,p->buf,p->num - 2); //校验CRC + if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + //LED0 ^= 1; + } + L0_timer4_stop(); +} + + diff --git a/source/msp/nouse/msp_uart3.h b/source/msp/nouse/msp_uart3.h new file mode 100644 index 0000000..fd535d4 --- /dev/null +++ b/source/msp/nouse/msp_uart3.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2015, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: +/// Modified date: +/// Version: +/// Descriptions: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +update by cc @201700110 +针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 +个需要平衡的事情. + +clib/clib.c: +公用的函数 和硬件无关 +放置串行模式(串口等其他通讯总线类的输出)输出的函数, +一些覆盖模式输出的(lcd等固屏输出的)的也可使用 + void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) +----------------------------------------------------------------------------------------- +uartcom/Uprotocol2app + 协议到应用 + 为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 + +typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ + L3_UARTcom0_exp_protocol 解析应用协议 +----------------------------------------------------------------------------------------- +uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 +公用的串口通讯定义 + struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ + void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 +-------------------------------------------------------------------------------------------- +msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 + L0_uart3_Init + uart3_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart3_H +#define _uart3_H + +#include "../bsp/bsp_config.h" +#include "../tpc/modbus.h" +#include "msp_uart_x.h" + +#define uNum3 2 + +//#define S4SM0 BITN7 +#define D_uart3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) +//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3) +//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3) +#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI) +#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI) +#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) +#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) +#define L0_uart3_set(x) S3BUF = (x); +#define L0_uart3_get() (S3BUF) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern void L0_uart3_buf_init(void); +extern void L0_uart3_sendArray(U8 * buf, U16 len); + +#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) +#define L0_uart3_us(X) L0_uartN_us(uNum3,X) +#define L0_uart3_ul(X) L0_uartN_ul(uNum3,X) +#define L0_uart3_0d0a() L0_uartN_0d0a(uNum3) +#define L0_uart3_uchex(X) L0_uartN_uchex(uNum3,X) +#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X) +#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X) +#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) +#define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) + +extern TP_Handler_X s_uart3_rec; +extern TS_PH4_modbus s_uart3_ack; + +#endif //#ifndef _uart3_H + diff --git a/source/msp/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.c b/source/tpc/ccmodbus.c index f8ff9be..1f2f7ae 100644 --- a/source/tpc/ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -98,7 +98,7 @@ U8 L3_pack_ccmodbus_90(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) pmodbus->buf[1] = APP_VERSION_HEX >> 0 & 0xF; //minor version pmodbus->buf[2] = 0x00; //mq high pmodbus->buf[3] = 0x04; //mq low - pmodbus->buf[4] = 0x00; // + pmodbus->buf[4] = 0x00; // for(i=5;ibuf[i] = G.mcu_id[j]; @@ -124,7 +124,7 @@ U8 L3_pack_ccmodbus_92(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info) { - U8 pkglen = 0; + U16 pkglen = 0; pccmodbus->filter1 = D_CMD_Filter1_ff; pccmodbus->filter2 = D_CMD_Filter2_fe; switch(slaver_info->oper) diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 9130a0a..f10ae56 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 256////cc fixme #define D_s_ccmodbus_min (D_s_modbus_min + 3) #define D_CMD_Filter1_ff 0xFF #define D_CMD_Filter2_fe 0xFE