From 522e1e2ee3b201703d90d7322ba576dcaf1450de Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Fri, 13 Feb 2026 20:55:37 +0300 Subject: [PATCH] some USB fixes --- F1:F103/BISS_C_encoders/encoders.bin | Bin 15524 -> 15760 bytes F1:F103/BISS_C_encoders/encoders.creator.user | 2 +- F1:F103/BISS_C_encoders/flash.c | 4 +- F1:F103/BISS_C_encoders/main.c | 10 +++- F1:F103/BISS_C_encoders/spi.c | 1 + F1:F103/BISS_C_encoders/usb_dev.c | 43 ++++++++++++------ F1:F103/BISS_C_encoders/usb_dev.h | 2 +- F1:F103/BISS_C_encoders/version.inc | 4 +- F3:F303/InterfaceBoard/flash.c | 3 +- F3:F303/InterfaceBoard/usb_dev.c | 20 +++++--- F3:F303/USB_template/Readme | 1 + F3:F303/USB_template_CDC/Readme | 1 + snippets/usb_pl2303/Readme | 2 + 13 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 F3:F303/USB_template/Readme create mode 100644 F3:F303/USB_template_CDC/Readme diff --git a/F1:F103/BISS_C_encoders/encoders.bin b/F1:F103/BISS_C_encoders/encoders.bin index 758d54cbe7df9c062b8c927a4f9fb04b7f2cdeb0..efe98a1fe7def3c7b2cf625b52dd241f53a33222 100755 GIT binary patch delta 7728 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

-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 BiVFY$ delta 7446 zcmZu$33wAnvhJCYrI9RrVvrB;$O3%GfMl~A0b(KK!57E`c!7{z>_B$S^ z>F%oP>gww1>h`wv``5`)DdMU!5&LNSl=#M!b2MEtuK7p$3`KCC{N zD2v7kKg%9Z%}hcpDn|x{5a)NGmda_U#q@aSOR2?`$D46iO!3gVCc&6>J!MAoie?wB zR9``y`ElU)i6u-I;|ffw%~uKO^7I5*=jpqZ21Nla_I_>_1GzoFt31sL6BExMLW5Jm6^--jo;9C%wY=@@#saS6~(AgqX{GbAfvzC!QI<*qo)ReQ0Le3f#@Vp;D8Rq-7^n*@9 zJN5C_l{H3H3#BoO2&q~&;7UF1vKn&}=|`U#Yw#LsRz;$r%59iAv#jzoYI%!7oE7vO zDNIpLNoe)A^vvH{h$E~7M;9k0?!cn(wsIvU3i1J^mg4!#7%`feJG8Zl&M4}rLgI1C zWt|cA=(8C&v4l%=Ta9U=fqttgPLgv~Gd)YS1FtDR^9AFqVIrJ0bQ6BD@~a-X^ly!n z6Dd;)XDz3k7b&TWQc7~o_m?SG^vGrO1je~Vxeq9Fu_RlPyD(pk>CxE!xXJL?vUPQY zX#!#}!*i4Brkw_!H47)T4}sGLTPsK%A$2!7X;x02O(5gEu#l?=@E zo@kEXYZ_Sob)FW#!>W^rV;X>S>n*&uA<`Ma2w2o3ZI4aDYlAn)PRSYPMro%7 zqsl|*7XE`(?%W`!gieffz(98<(^{?rOa*KmwxY+MXwvw0=$pyw_<-kmKQolQ@l(zE7)p5&y9b+BRc7C4$ROkKI97t0QGCp;%#nhg7)8%0Ay#(n^0e}4 zZzS}N6z)Z*YqyL>>|Q9uB*RN;8Z;^*;Y}=y5t?OuS}}53Bd%a%y@jp9#F)ggO+G4P zs7+Jxp_653ZCuALpss5q^ZgoTi!$!n70yT|r1y{CkB3=_zMC+sNv2w$3>o=dEYm5p z*e)xcAD-dEAZ4fTXNT}v%-AAP9}iOqcnG;kKIG`SD*J;#+8?ax$ z6GVn61wY~x>VRimKmsc%o~F_l8VRj1K6VVXRahRY89-tHaey7*0D|ytY--^{^(QAO zjy)X*c5$gu7PbMx`nh3k0-mvcl<^OnLQTGt0tn~?{1AHY*l1`;hu$veCEt-kMBJ1q z{i^i&h)u{Eq=Jvf>Zm}FX8ZMmZ!us!lt;w zynZbYhSp??W`=(FF8n}0CiNEHY)vyKH%{S+Ne=ijgZQTZt>9=Ag0;OubbNwkyq;GJu^TLQ z7<8%BBentX6qI97Vvfg`ghobOEXaG_rw`6&vS0C=;Ku|%G2DOPej*l#@_jkMKCM4A z`E)-qp9#W7%xSVT=YoP$p9&rVJle3}*f7rkff}ezB*u=0-l(udw=cB*qA+n_CT$xn z{B~d(^|J8Vz~{&HuglTCkTdP{A)U-Xl@W03Iq zpb?h-v5)qKHSCkPbYPCJn*yG#VSV1{lW^ltk1nP}iW2ZLuDmBdt_JX$BOAOIrIq(g zp=$t9=HI}3{hm8MO8vECc(@OR`&w;q;CZe=-xrRQep$kT!LuwV?re{Ndd(3*IO51C zH6&<4sOk4ee0=@Wg;@ut*Y~2dwbN^1lW8|2twC(J>NLMEtOaY5B@bCMwYPuyD}h7R z>s$dEYFi(+TL~W$TdceIB{PyH?)WW&&y%@a$#QL z9E)E+2hMmZYQB+}V5~#WPX|L2ALGEMh`~vK(!sX?_|3(O7ftY80%bOo7op(eBd3$d zN2a8O5jA0R$w8k`YdW;5ydz3NhVglaoA*D8d?l?*>TDB6Cdr>VoWvXA2n7${li663 zlG*sLsOo+~B(M;&u6v?)(0cqF|)k|A(*R$uqzg@SO49gwTV-ImRN; z-3DcC+ys~?#1lCAg6B?CakKDMl4kg!8N09~?aQ7i@sxI zk+#Kl))6N?b@hy+MtCh*T}Z7wfL||&WDx5fzB#ZqkF?l^(joLx9#Ra?(ArUUYu z-i#Ai`sJ?cw3v!0NU$!&y=mw2n9-V!TX$vRkvB&ST`cq@Pqv7$C@ass=;+HNc^fyc zz@=K?-Qusp;%!LJsIwSXzJpG=P_)zbtqQi3%c_hS_Z^(6N~cV&t9akZB6-G;4w7zN z#|RNb84v9nd5R<7C0G`0Ygbtjt1H2%tIX7jC0*gZt`-Xr-NNox5ZMJHSt2qDL>>!@ z?D&PqNE4+Fv&9gsLu_sdX3#>@+_G?ca40ezU%kKk1TJlLEj#5(h|Xv+iwR1li;{iS zGeg$qY-7xg>H^BSNyeCj%_+(RRdE}Zv=YV}^*6g^nHKk|qY1)+6gBr%eS0_3=DFMI z!L~V4t;Kz|Uiyft^m|HuUv#4uA!Udvh2%6+*aK~iA)=pbto9GE{1*3n^+I1t(%8vG zv&y!0LuXnfPyhZhwjzZq zkc*sDRFo_5EMua&R_9N#)$#F|N>yZHd#j5=b4>|dvv|2vLdl#}lpT1eiL?o5pP{<; z7_)8fg{dte@=6oRNb5AFROjz=Dro5qU}R*Fn!}*FB$G8O!l^{R{-LnY@6o|ANfg{| z3@JL`hSjtgPs<6Va44(vhfsg0H!MeX4U`W~ZXWqX+C}}7)dy#L4R6t1!<#w5_-PA} zqPnE&q&gK!BgCHsDc*sL3*s)?sXAdBH*o5~U?Y)EeD$8{erZwAQ$xh$u5{F4O-lrQ z?R^I0dyr_Za=;2ugQmZRV)Sq)k}nmuatY5=l#(I(<=ijTnqCOXF`1SGdurjP^)1=H zx%J^_Od|0QBvt%@Q)R9y+1Wq~63A>r7XyQcsuv~-xPU_tVJ=ybda1bv7sMMsPI#8CPg%TE~C0G>IayZfc#gD|%VforBGzy7pt141jo4|ya$g7hYTMJ>U@g%@(fUe$i~E(MuBqpHjByfYHGK)Ur%_@m zb-@rfUZiM)c&e%(`dkq3pJUR_I<3F%4T_4yy8B~uDCCk1GV=Xj2aMkncu@lxo9fN#YTPIw7~l( z{{ru8L=syJl8A4&=MZj6Z$KI^+tVrgx~a8kZi_*r(8~P#b|u{KQ^Wu}i~pX#K_rUx zWYLt2Q%Mnh&h{8{Vf+Z69 zY6E`=yt<(;sF9k${%Xp z18Lnd-3wCPRg{tEb{zq!mS6(06GZ;85AG%J_&tk!WH6FeY=hR-eP|S^w?53SCT&}w zZE;W_sl5)hm!8%(L2Z6t2JiD6^M82?;E}3-ZGc>dkXsI@(Q)z zGs-j7AF75X$@oFm0;RiYLZk^^9 zK2=2$%rZwvVdYbW7lQ)HeIZ**oC;WToP)IMAi;m>-%?V)hwWF|!u=YUsDEQZxg?Zt zfJ}Dw|6==lFp2YfE(3iU>00UjXD3|G8l|q(p5Krkg-66eT1-GpJRY#)8 zMh6#B++hXF?VbXop6`|I5-yF1W04qLg)&#$ga;#rrM`T9z3Ta#8qBGSQ>d|znqN>6iH7{koN*C5_w}Z^0 z7G^P~m&}u-h<=Z%->lppp(h=ZW#Ul-`XhCKrdKRI>w$T($Vq3yEF0f z9H7|b{T#+Cv4y1Pxu+i;1-E0rXT5h?@V-pwvVd-NSkk=S{(H2=edfqh9l#sjK1??2 zJ5tM|4=jh@`Kf5G+-06U09!$KA?_ye05_{ ze8r!csaH1$N3-V0-lHC0Me5~3q;{lbLIC#2O0yfSS}?tA#-YU&H`Q&OHB}tK94dD% zHoL7$p+41F{z9=?6y@{ER+afY8~SL@=c(>P>1MGDo-}1qK$ikCI7)pU$262ere~^} zIRkz__)Ym{tl9SG@-`gP^(D5pLP5^OB_&hch;f!*uwX+BYN00e*+Inbpv0I(hMiiJ zKRvH-;GziEe=`GL{>ZgJdS%h36nA#$BaZ<*W#yqr- zDjZ*2w8RLfThU8Y7o=Ubq9r?J-mCc!=R8;P_@Y5yNNdL7o0vc`vO~&)2Rwu#lvt2Z{8zjgU4YgQg3$l#CO;%r;pvHXEc*u9_ignMJD-%5OoZj01%S3qAmj*I$Fj(54+tMvz*cGbS8#J7ub#=t&5yj6j28Gd)WJE?_651}-F!lxeLA0zt8u)@NfYf& z{89+;|6>C>Zl6<5?=jxEOm-Awu|3-ejoZF+l)}Mr-it=Z2ZS#OVn4A6<$_?>tu zHy=)fxz|BWMW|I7Pg;tuqY;y+1PwVjo1&le3n39Exw&6N1<(w}p?K%R{WMbY zp6j9%pSzgoR{N_CGKDfPHKG=j^Lgfb;j*tF(|F%O9sku82d$j8;QD0k6FbAl@buaX zjgzxpd^*=DAg?Vz9!mV4zu?fY-`XZa*z$Qk4P0>0YZ)G8S?<`88jaY)Q`_k-YAiSE zmhD%?Gx=F~EJETEFsj?0Q%t?XIM2gznxPk)c2A=-zOhLlfhazjUCacNw1Rk)xi2^{ z(tc}y*FjC}Y)aK0>mY`XV{DdD>^_+Ou9scr)movY&vT#hbh>_}bCNZkZskAAH1gWleJHfOceqJ)6veg+;j zp&W#g4MA=Olu9THX$*yE%0NN%+dLMr`WVD+1DuzL*xi5wVj+Nr@gU%Bu|;Q<1L6K?@NS`yl;{Y6EK`q zfTrO(d2=HD0r=B_X_a6N1K - + EnvironmentId diff --git a/F1:F103/BISS_C_encoders/flash.c b/F1:F103/BISS_C_encoders/flash.c index 8e8f9e4..da1feb3 100644 --- a/F1:F103/BISS_C_encoders/flash.c +++ b/F1:F103/BISS_C_encoders/flash.c @@ -23,7 +23,9 @@ #include "usb_dev.h" // printout #include // memcpy -extern const uint32_t __varsstart, _BLOCKSIZE; +extern const uint32_t _BLOCKSIZE; +extern const user_conf __varsstart; + static const uint32_t FLASH_blocksize = (uint32_t)&_BLOCKSIZE; static uint32_t maxCnum = 1024 / sizeof(user_conf); // can't use blocksize here diff --git a/F1:F103/BISS_C_encoders/main.c b/F1:F103/BISS_C_encoders/main.c index 2cbf7d5..5a3f87a 100644 --- a/F1:F103/BISS_C_encoders/main.c +++ b/F1:F103/BISS_C_encoders/main.c @@ -111,7 +111,13 @@ static void proc_enc(uint8_t idx){ USB_sendstr(iface, str); USB_putbyte(iface, '\n'); } - if(result.error) spi_setup(1+idx); // reinit SPI in case of error + if(result.error){ + spi_setup(1+idx); // reinit SPI in case of error + if(CDCready[I_CMD] && the_conf.flags.debug){ + CMDWR("Err, restart SPI "); USB_putbyte(I_CMD, '1'+idx); CMDn(); + } + spi_start_enc(idx); // restart measurement + } if(the_conf.flags.monit) monitT[idx] = Tms; else if(testflag) spi_start_enc(idx); } @@ -142,7 +148,7 @@ int main(){ else if(l) parse_cmd(inbuff); // check if interface connected/disconnected // (we CAN'T do much debug output in interrupt functions like linecoding_handler etc, so do it here) - for(int i = 0; i < bTotNumEndpoints; ++i){ + for(int i = 1; i < bTotNumEndpoints; ++i){ if(oldCDCready[i] != CDCready[i]){ CMDWR("Interface "); CMDWR(u2str(i)); diff --git a/F1:F103/BISS_C_encoders/spi.c b/F1:F103/BISS_C_encoders/spi.c index 0a5ba10..483e79d 100644 --- a/F1:F103/BISS_C_encoders/spi.c +++ b/F1:F103/BISS_C_encoders/spi.c @@ -127,6 +127,7 @@ uint8_t *spi_read_enc(uint8_t encno){ // @return FALSE if SPI is busy // here `encodernum` is 0 (SPI1) or 1 (SPI2), not 1/2 as SPI index! int spi_start_enc(int encodernum){ + // CMDWR("startenc: "); USB_putbyte(I_CMD, '0'+encodernum); newline(I_CMD); int spiidx = encodernum + 1; if(spiidx < 1 || spiidx > AMOUNT_OF_SPI) return FALSE; if(spi_status[spiidx] != SPI_READY) return FALSE; diff --git a/F1:F103/BISS_C_encoders/usb_dev.c b/F1:F103/BISS_C_encoders/usb_dev.c index feee2f4..b61aea8 100644 --- a/F1:F103/BISS_C_encoders/usb_dev.c +++ b/F1:F103/BISS_C_encoders/usb_dev.c @@ -69,14 +69,21 @@ static volatile ringbuffer rbin[bTotNumEndpoints] = {IBUF(0), IBUF(1), IBUF(2)}; static volatile int lastdsz[bTotNumEndpoints] = {-1, -1, -1}; static void chkin(uint8_t ifno){ + static int ovrflctr = 0; // "antistall" counter if(bufovrfl[ifno]) return; // allow user to know that previous buffer was overflowed and cleared if(!rcvbuflen[ifno]) return; int w = RB_write((ringbuffer*)&rbin[ifno], (uint8_t*)rcvbuf[ifno], rcvbuflen[ifno]); - if(w < 0){ - DBG("Can't write into buffer"); + if(w < 0){ // buffer busy + DBG("Can't write into buffer: busy"); return; + }else if(w == 0){ // no enough space or (WTF) incoming string larger than buffer size + if(rcvbuflen[ifno] > rbin[ifno].length || ++ovrflctr > 9999){ + bufovrfl[ifno] = 1; // real overflow in case if ringbuffer's size less than USB buffer + ovrflctr = 0; + }else{ + return; // not enough space + } } - if(w != rcvbuflen[ifno]) bufovrfl[ifno] = 1; DBG("Put data into buffer"); rcvbuflen[ifno] = 0; uint16_t status = KEEP_DTOG(USB->EPnR[1+ifno]); // don't change DTOG @@ -111,14 +118,14 @@ static void send_next(uint8_t ifno){ // data IN/OUT handler static void rxtx_handler(){ - uint8_t ifno = (USB->ISTR & USB_ISTR_EPID) - 1; + uint8_t epno = (USB->ISTR & USB_ISTR_EPID), ifno = epno - 1; DBG("rxtx_handler"); DBGs(uhex2str(ifno)); - if(ifno > bTotNumEndpoints-1){ + if(epno > bTotNumEndpoints){ DBG("wrong ifno"); return; } - uint16_t epstatus = KEEP_DTOG(USB->EPnR[1+ifno]); + uint16_t epstatus = KEEP_DTOG(USB->EPnR[epno]); if(RX_FLAG(epstatus)){ // receive data DBG("Got data"); if(rcvbuflen[ifno]){ @@ -126,13 +133,13 @@ static void rxtx_handler(){ rcvbuflen[ifno] = 0; DBG("OVERFULL"); } - rcvbuflen[ifno] = EP_Read(1+ifno, (uint8_t*)rcvbuf[ifno]); + rcvbuflen[ifno] = EP_Read(epno, (uint8_t*)rcvbuf[ifno]); DBGs(uhex2str(rcvbuflen[ifno])); - USB->EPnR[1+ifno] = epstatus & ~(USB_EPnR_CTR_RX | USB_EPnR_STAT_RX | USB_EPnR_STAT_TX); // keep RX in STALL state until read data + USB->EPnR[epno] = epstatus & ~(USB_EPnR_CTR_RX | USB_EPnR_STAT_RX | USB_EPnR_STAT_TX); // keep RX in STALL state until read data chkin(ifno); // try to write current data into RXbuf if it's not busy }else{ // tx successfull DBG("Tx OK"); - USB->EPnR[1+ifno] = (epstatus & ~(USB_EPnR_CTR_TX | USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX; + USB->EPnR[epno] = (epstatus & ~(USB_EPnR_CTR_TX | USB_EPnR_STAT_TX)) ^ USB_EPnR_STAT_RX; send_next(ifno); } } @@ -154,6 +161,7 @@ static void clearbufs(uint8_t ifno){ while(Tms - T0 < 10){ if(1 == RB_clearbuf((ringbuffer*)&rbout[ifno])) break; } + rcvbuflen[ifno] = 0; } // SET_CONTROL_LINE_STATE @@ -161,9 +169,9 @@ void WEAK clstate_handler(uint8_t ifno, uint16_t val){ DBG("clstate_handler"); DBGs(uhex2str(ifno)); DBGs(uhex2str(val)); + if(val) clearbufs(ifno); // clear buffers on connect CDCready[ifno] = val; // CONTROL_DTR | CONTROL_RTS -> interface connected; 0 -> disconnected lastdsz[ifno] = -1; - if(val) clearbufs(ifno); } // SEND_BREAK - disconnect interface and clear its buffers @@ -173,7 +181,6 @@ void WEAK break_handler(uint8_t ifno){ DBGs(uhex2str(ifno)); } - // USB is configured: setup endpoints void set_configuration(){ DBG("set_configuration()"); @@ -262,7 +269,15 @@ int USB_send(uint8_t ifno, const uint8_t *buf, int len){ } if(!CDCready[ifno]) return FALSE; IWDG->KR = IWDG_REFRESH; - int a = RB_write((ringbuffer*)&rbout[ifno], buf, len); + int l = RB_datalen((ringbuffer*)&rbout[ifno]); + if(l < 0) continue; + int portion = rbout[ifno].length - 1 - l; + if(portion < 1){ + if(lastdsz[ifno] < 0) send_next(ifno); + continue; + } + if(portion > len) portion = len; + int a = RB_write((ringbuffer*)&rbout[ifno], buf, portion); if(a > 0){ len -= a; buf += a; @@ -338,7 +353,9 @@ int USB_receivestr(uint8_t ifno, char *buf, int len){ } int l = RB_readto((ringbuffer*)&rbin[ifno], '\n', (uint8_t*)buf, len); if(l < 1){ - if(rbin[ifno].length == RB_datalen((ringbuffer*)&rbin[ifno])){ // buffer is full but no '\n' found + //if(rbin[ifno].length < 1 + RB_datalen((ringbuffer*)&rbin[ifno])){ // buffer is full but no '\n' found + if(RB_datalen((ringbuffer*)&rbin[ifno]) >= len){ + CMDWRn("OVERFULL!"); while(1 != RB_clearbuf((ringbuffer*)&rbin[ifno])); return -1; } diff --git a/F1:F103/BISS_C_encoders/usb_dev.h b/F1:F103/BISS_C_encoders/usb_dev.h index 5641e20..7308630 100644 --- a/F1:F103/BISS_C_encoders/usb_dev.h +++ b/F1:F103/BISS_C_encoders/usb_dev.h @@ -47,7 +47,7 @@ void clstate_handler(uint8_t ifno, uint16_t val); void linecoding_handler(uint8_t ifno, usb_LineCoding *lc); // as ugly CDC have no BREAK after disconnected client in non-canonical mode, we should use timeout - more than 2ms -#define DISCONN_TMOUT (2) +#define DISCONN_TMOUT (1000) // sizes of ringbuffers for outgoing and incoming data #define RBOUTSZ (512) diff --git a/F1:F103/BISS_C_encoders/version.inc b/F1:F103/BISS_C_encoders/version.inc index 00fd981..ebc3fa9 100644 --- a/F1:F103/BISS_C_encoders/version.inc +++ b/F1:F103/BISS_C_encoders/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "130" -#define BUILD_DATE "2026-02-09" +#define BUILD_NUMBER "144" +#define BUILD_DATE "2026-02-13" diff --git a/F3:F303/InterfaceBoard/flash.c b/F3:F303/InterfaceBoard/flash.c index 496eaf2..7f62333 100644 --- a/F3:F303/InterfaceBoard/flash.c +++ b/F3:F303/InterfaceBoard/flash.c @@ -23,7 +23,8 @@ #include "usb_descr.h" // descriptors #include // memcpy -extern const uint32_t __varsstart, _BLOCKSIZE; +extern const uint32_t _BLOCKSIZE; +extern const user_conf __varsstart; static const uint32_t FLASH_blocksize = (uint32_t)&_BLOCKSIZE; static uint32_t maxCnum = 2048 / sizeof(user_conf); // can't use blocksize here diff --git a/F3:F303/InterfaceBoard/usb_dev.c b/F3:F303/InterfaceBoard/usb_dev.c index 0c90964..7256b33 100644 --- a/F3:F303/InterfaceBoard/usb_dev.c +++ b/F3:F303/InterfaceBoard/usb_dev.c @@ -59,13 +59,20 @@ static volatile ringbuffer rbin[InterfacesAmount] = {IBUF(0), IBUF(1), IBUF(2), static volatile int lastdsz[InterfacesAmount] = {-1, -1, -1, -1, -1, -1, -1}; static void chkin(uint8_t ifno){ + static int ovrflctr = 0; // "antistall" counter if(bufovrfl[ifno]) return; // allow user to know that previous buffer was overflowed and cleared if(!rcvbuflen[ifno]) return; int w = RB_write((ringbuffer*)&rbin[ifno], (uint8_t*)rcvbuf[ifno], rcvbuflen[ifno]); - if(w < 0){ + if(w < 0){ // buffer busy return; + }else if(w == 0){ // no enough space or (WTF) incoming string larger than buffer size + if(rcvbuflen[ifno] > rbin[ifno].length || ++ovrflctr > 9999){ + bufovrfl[ifno] = 1; // real overflow in case if ringbuffer's size less than USB buffer + ovrflctr = 0; + }else{ + return; // not enough space + } } - if(w != rcvbuflen[ifno]) bufovrfl[ifno] = 1; rcvbuflen[ifno] = 0; uint16_t status = KEEP_DTOG(USB->EPnR[1+ifno]); // don't change DTOG USB->EPnR[1+ifno] = (status & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // prepare to get next data portion @@ -96,7 +103,7 @@ static void send_next(uint8_t ifno){ // data IN/OUT handler static void rxtx_handler(){ uint8_t epno = (USB->ISTR & USB_ISTR_EPID), ifno = epno - 1; - if(ifno > InterfacesAmount-1){ + if(epno > InterfacesAmount){ return; } uint16_t epstatus = KEEP_DTOG(USB->EPnR[epno]); @@ -130,6 +137,7 @@ static void clearbufs(uint8_t ifno){ while(Tms - T0 < 10){ if(1 == RB_clearbuf((ringbuffer*)&rbout[ifno])) break; } + rcvbuflen[ifno] = 0; } // SET_CONTROL_LINE_STATE @@ -200,7 +208,7 @@ int USB_sendall(uint8_t ifno){ uint32_t T0 = Tms; while(lastdsz[ifno] > 0){ if(Tms - T0 > DISCONN_TMOUT){ - //break_handler(ifno); + break_handler(ifno); return FALSE; } if(!CDCready[ifno]) return FALSE; @@ -215,7 +223,7 @@ int USB_send(uint8_t ifno, const uint8_t *buf, int len){ uint32_t T0 = Tms; while(len){ if(Tms - T0 > DISCONN_TMOUT){ - //break_handler(ifno); + break_handler(ifno); return FALSE; } if(!CDCready[ifno]) return FALSE; @@ -246,7 +254,7 @@ int USB_putbyte(uint8_t ifno, uint8_t byte){ uint32_t T0 = Tms; while((l = RB_write((ringbuffer*)&rbout[ifno], &byte, 1)) != 1){ if(Tms - T0 > DISCONN_TMOUT){ - //break_handler(ifno); + break_handler(ifno); return FALSE; } if(!CDCready[ifno]) return FALSE; diff --git a/F3:F303/USB_template/Readme b/F3:F303/USB_template/Readme new file mode 100644 index 0000000..dff4ff4 --- /dev/null +++ b/F3:F303/USB_template/Readme @@ -0,0 +1 @@ +The more fresh USB see in InterfaceBoard diff --git a/F3:F303/USB_template_CDC/Readme b/F3:F303/USB_template_CDC/Readme new file mode 100644 index 0000000..dff4ff4 --- /dev/null +++ b/F3:F303/USB_template_CDC/Readme @@ -0,0 +1 @@ +The more fresh USB see in InterfaceBoard diff --git a/snippets/usb_pl2303/Readme b/snippets/usb_pl2303/Readme index cf9dc25..7749373 100644 --- a/snippets/usb_pl2303/Readme +++ b/snippets/usb_pl2303/Readme @@ -1,3 +1,5 @@ +The more fresh USB see in F3:InterfaceBoard + Actual snipper for all MCUs (just fix usbhw.c and usbhw.h) If USB DP/DM pins need to be setting up, do it before calling USB_setup().