From ed5a19f8bb28a0c69b8fa0a1f4e46dfa3a357d21 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 10 Jan 2023 23:45:27 +0300 Subject: [PATCH] fixed i2c (internal pullup + right scan method) --- G0:G070/i2c/Makefile | 7 +++---- G0:G070/i2c/i2c.c | 11 +++++++---- G0:G070/i2c/i2cscan.bin | Bin 6288 -> 6272 bytes G0:G070/i2c/usart.c | 15 +++++++-------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/G0:G070/i2c/Makefile b/G0:G070/i2c/Makefile index 364a3a4..7c5a85f 100644 --- a/G0:G070/i2c/Makefile +++ b/G0:G070/i2c/Makefile @@ -64,12 +64,11 @@ CFLAGS += -O2 -MD -D__thumb2__=1 CFLAGS += -Wall -Werror -Wextra -Wshadow -Wimplicit-function-declaration CFLAGS += -Wredundant-decls $(INCLUDE) # -Wmissing-prototypes -Wstrict-prototypes -CFLAGS += -fno-common -ffunction-sections -fdata-sections +CFLAGS += -fno-common -ffunction-sections -fdata-sections ############################################################################### # Linker flags -LDFLAGS += --static -nostartfiles -#--specs=nano.specs +LDFLAGS += --static -nostartfiles --specs=nano.specs LDFLAGS += -L$(LIB_DIR) LDFLAGS += -T$(LDSCRIPT) LDFLAGS += -Wl,-Map=$(OBJDIR)/$(BINARY).map @@ -146,7 +145,7 @@ clean: @rmdir $(OBJDIR) 2>/dev/null || true size: $(ELF) - $(SIZE) $(ELF) + $(SIZE) -Ax $(ELF) flash: $(BIN) @echo " FLASH $(BIN)" diff --git a/G0:G070/i2c/i2c.c b/G0:G070/i2c/i2c.c index 63bf7df..f8b62ab 100644 --- a/G0:G070/i2c/i2c.c +++ b/G0:G070/i2c/i2c.c @@ -59,6 +59,8 @@ void i2c_setup(I2C_SPEED speed){ 6 << (6 * 4) | 6 << (7 * 4); GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODE6 | GPIO_MODER_MODE7)) | GPIO_MODER_MODER6_AF | GPIO_MODER_MODER7_AF; + GPIOB->PUPDR = (GPIOB->PUPDR & !(GPIO_PUPDR_PUPD6 | GPIO_PUPDR_PUPD7)) | + GPIO_PUPDR6_PU | GPIO_PUPDR7_PU; // pullup GPIOB->OTYPER |= GPIO_OTYPER_OT6 | GPIO_OTYPER_OT7; // both open-drain outputs // I2C (default timing from PCLK - 64MHz) RCC->APBENR1 |= RCC_APBENR1_I2C1EN; // clocking @@ -142,7 +144,7 @@ static uint8_t write_i2cs(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t s return 0; } if(Tms - cntr > I2C_TIMEOUT){ - USND("Timeout\n"); + //USND("Timeout\n"); return 0; } } @@ -198,11 +200,11 @@ static uint8_t read_i2cb(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t bu IWDG->KR = IWDG_REFRESH; if(I2C1->ISR & I2C_ISR_NACKF){ I2C1->ICR |= I2C_ICR_NACKCF; - USND("NAK\n"); + //USND("NAK\n"); return 0; } if(Tms - cntr > I2C_TIMEOUT){ - USND("Timeout\n"); + //USND("Timeout\n"); return 0; } } @@ -261,7 +263,8 @@ int i2c_scan_next_addr(uint8_t *addr){ /*while(!u3txrdy); USND("Addr: "); USND(uhex2str(i2caddr)); USND("\n"); usart3_sendbuf();*/ - if(!read_i2c_reg((i2caddr++)<<1, 0, NULL, 0)) return 0; + uint8_t byte; + if(!read_i2c((i2caddr++)<<1, &byte, 1)) return 0; return 1; } diff --git a/G0:G070/i2c/i2cscan.bin b/G0:G070/i2c/i2cscan.bin index a974399e18ad75b1df5f0fa72d750dbe880a6f34..7c289ce2007af30519eaf1ea88b92f662d8920a1 100755 GIT binary patch delta 2105 zcmaJ>e{37|6@TB0lbmZ4J9d(u&rWi&lh%$C;xwI>p+X&}J#1eMfpnXpY`d07yTDMb zfkq}FlB!7j5JI6}BuI?_A%URfkCI{_Q$3;yq^gX`CPk%L3#J9G`=i4eKkW3Jc<&q1 zZ7ma)K7Q}sy&s?V-uJ%K{ZsvRmwuqg{P6vc#r-gs^}h*v9Z$abi>|$8ke2lNC@J2B+BbR+0SR_O7(x&}bO_*h6Y$4q zKiL)hNp4hz;9w4XoHQfbH@IV-xF^wivsJ4v^r>{bEh6PDn%g}Vl;~Teb+RGq;2ILP z9i~E$YSGeY=RV#)?u?Z3L^2iZ9Sh@@;f38Gd5%rXGxCdaF-v0S^m+Me2Ib5z<(uT~ z@+Wd3QwIV(A|H^eCAkXzeq2J9D4wqt*(#Tba z3CNQ#?2_A8nTl&nZS-NT-3-z_QPT@KE%u6tPABWkUQ=I{$%2ZvAUqV|G!zUxD>NCP$7 z$)D-onxDJct01MaWT0C5WaZLY#}dx{Bt2W>BWEcwxyjeG)zn8OX~NV_PSSf!1FqLs zE=Rq4Rn(j*K&I(=Qy0;xxpn~kudhw?Z9)HoVY5c<;oa58^p)OohgRYjRbI;h)~9*>_6htgdJSLt3kIpCu+Bf zW8LM`%~2?xS!TRKS!W_JK~hrzOD^u|P6-x0;s>t`NY`Z|Smm<75_h(U>D?M$m)S)5ba7 zjq)R;eR|fZu(%-l2zf@~gt4H1HrtIv??v1B{5QG-t?w9;39L{&yadHL!-keO4RY{# z{TkF>H~yp-kWRILKMi?%b((86zS0lo(mmUk-M*mw*-Y#-fj zX&>sVfd8w!Ir>kXY>~Q7>WtKDST8C7zY}o>f{|pLHlv=()MDOqhN-PK=SQuBzGN9C zzoko-I~(7-M4rJNmZ3O*sTFHx={?o}nWax#yLz9+=K3+uD=2aItNF%I$18eu2ydg# z>h452ee@sJ_qpUjpFI=qY=|{PEoy@zY6plzIH8J~HF^LX$+&8XH|>E={8!W7b!fjO z5+4#(x0VLah&?+mdw>fUv1Ez^={^KRAuM1y`i8Bib_xv-&@XJKCd(Oi<*}QoR+z~TZ3RUw*ihtetIS%`?a7pg(qYo8I$J)pRx%K$|KvV zrS@t>9+HDd;ltzs*NKr`GK*WEW0v=m;h;NrEMi}L#~tp2v*C>j=9!svO_A$>1rrPo zYTvoiaB3t3|9el~0PpGFr}}g)6$BS^)zZIKPU*1W0)BLtdu08wp6wYNa`Ejls(3P= zsIqy~EA|Yd!{_Rhx;UFtItjr^f{FgN!W>xeh^^K4mpjM+bQ}3(Tk1xDqbX!TKW^$g$~UKKgd^-QBSI4xy!Im~{|%kPjt~F< delta 2137 zcmaJ?e{37&8GgUB-JIj3Iool1wiD-K$Eg#yjYC?AY3=IRvD&Sgzb{U`r zk!_xsWOtP|)IX-eZBklm3>cH33;}6feyBzPfriwvoe7AR0&*$at%9y*s&JA^e0#r; zimjkodh)&BckhqqeeS(4`GLa&92^GW4HvMlB1(vdoczbPY!I7NXcLiBMwPJ#BS%=hzUt_X_ zOy-L>i#Lilh#!fS;u_%LLGfYHti?@;P6jFZ)OLq$+?xb`lghFyax@5bsFCh7T=we)r zeM#SbpW@GW;*SPhOrJG58}_MA%MIi;^=8W+uLX-umdK!4d%M1fMQI@caYlW^5+Z+7 zFIxQMJ=JFIC-F~zpW2VvHunE}`DzTdh(51e6T@8-vusq1nRJs)CWi_|57bj!>>{^udRm?Y8YEHYemdSk7q21EH7o3x4W*`V5=rU^$n90EO z&?Vg_f#99IxH2ItN}${XKxjvB#m1440#SR}jv1$yS;?OAWvLxBxDp#gY{z#OjDP46Z1$OY zG@Fm|8br=&JV5pSMZ}U1^G_~CvQW+7{_dr9xL20m)Z1_!Um`ez$MjaTZ&%&+ZLX~z zU|SJ9VgrKpsQc}r)4fCr*Js|JxnAl8K5N!~puS|^ZvWI^D!mx0tE6##?lfxc)JOrM z-f}yho;E(#{kZlEXajaLN)tm+X-pH~9i;i02in*j_^=znA%+pV5plKDxIHsr zm;xzm0zMAaeVBTmF(zWi26-xmIz7H%3tTAweTK&(yA4#mI)FYq4G-=|4En9Ml-*Jv zHlD&ydq7P&I)}C`LF6*N(0}Pu zfT|fZlcHZKz~b03esR|*+7R_<@xFj|BH?`hC;s>*_%PlhiMM#E-*qre#&(#shLxyi zyalN5iok#0j$7a@9l}?1vv$xtk@)Cb?y`QBIqiZn=ZYv~_2@ip!mK@Fa@gTIDONl; zQLwbVdnn{dw~e%=I3sEJ?Z*Qu5YnU zosc2DF{W@}==yVX;)(|w)@zn5M0+#~Sh|>sFAII`8X0sX7Es!jG&gdHKa>n6TFQ9I zDvtD*J9cHquI@h9ph5;|q*3O5T*(6Gbr9&?ZPx4cyd|H{AD_Z@Y&Q-`ji8oW*E@Dk g+k5G@3Zi;bi5I delete next line -static int rbufno = 0, tbufno = 0; // current buf number -static char rbuf[2][UARTBUFSZ], tbuf[2][UARTBUFSZ]; // receive & transmit buffers -static int rxlen[2] = {0}, txlen[2] = {0}; +static volatile int bufovr = 0, wasbufovr = 0; // Rx buffer overflow or error flag -> delete next line +static volatile int rbufno = 0, tbufno = 0; // current buf number +static volatile char rbuf[2][UARTBUFSZ], tbuf[2][UARTBUFSZ]; // receive & transmit buffers +static volatile int rxlen[2] = {0}, txlen[2] = {0}; char *usart3_getline(int *wasbo){ if(wasbo) *wasbo = wasbufovr; wasbufovr = 0; if(!u3rxrdy) return NULL; u3rxrdy = 0; // clear ready flag - return rbuf[!rbufno]; // current buffer is in filling stage, return old - filled - buffer + return (char*)rbuf[!rbufno]; // current buffer is in filling stage, return old - filled - buffer } #define USART_BRR(speed) ((64000000 + speed/2) / speed) @@ -84,7 +84,7 @@ int usart3_send(const char *str, int len){ int rest = UARTBUFSZ - txlen[tbufno]; if(rest == 0 && !u3txrdy) return 0; // buffer is full while transmission in process if(len < rest) rest = len; - mymemcpy(tbuf[tbufno] + txlen[tbufno], str, rest); + mymemcpy((char*)(tbuf[tbufno] + txlen[tbufno]), str, rest); txlen[tbufno] += rest; if(!u3txrdy) return rest; if(txlen[tbufno] == UARTBUFSZ) usart3_sendbuf(); @@ -92,7 +92,7 @@ int usart3_send(const char *str, int len){ len -= rest; // now fill another - empty - buffer if(len > UARTBUFSZ) len = UARTBUFSZ; - mymemcpy(tbuf[tbufno], str + rest, len); + mymemcpy((char*)tbuf[tbufno], str + rest, len); txlen[tbufno] = len; return rest + len; } @@ -157,7 +157,6 @@ void dma1_channel2_3_isr(){ uint32_t isr = DMA1->ISR; if(isr & (DMA_ISR_TCIF2 | DMA_ISR_TEIF2)){ // transfer complete or error u3txrdy = 1; - //DMA1_Channel2->CCR = DMATXCCR; } if(isr & (DMA_ISR_TCIF3 | DMA_ISR_TEIF3)){ // receive complete or error -> buffer overflow if(rbuf[rbufno][UARTBUFSZ-1] != '\n'){ // last symbol is not a newline