From d790a1610dc69f8a9b26f7ed76d50dbc24d8f80a Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sun, 14 Sep 2025 02:18:36 +0300 Subject: [PATCH] seems like I2C start works right, need some fixes for large data amount --- F3:F303/I2C_scan/i2c.c | 85 ++++++--- F3:F303/I2C_scan/i2cscan.bin | Bin 8124 -> 8076 bytes F3:F303/I2C_scan/i2cscan.creator.user | 105 +++++++---- F3:F303/I2C_scan/i2cscan.creator.user.cf63021 | 174 ++++++++++++++++++ F3:F303/I2C_scan/proto.c | 14 +- F3:F303/I2C_scan/version.inc | 4 +- F3:F303/inc/Fx/stm32f3.h | 2 + 7 files changed, 317 insertions(+), 67 deletions(-) create mode 100644 F3:F303/I2C_scan/i2cscan.creator.user.cf63021 diff --git a/F3:F303/I2C_scan/i2c.c b/F3:F303/I2C_scan/i2c.c index 27d8404..416e6e9 100644 --- a/F3:F303/I2C_scan/i2c.c +++ b/F3:F303/I2C_scan/i2c.c @@ -64,15 +64,21 @@ void i2c_setup(I2C_SPEED speed){ GPIOB->PUPDR = (GPIOB->PUPDR & !(GPIO_PUPDR_PUPDR6 | GPIO_PUPDR_PUPDR7)) | GPIO_PUPDR6_PU | GPIO_PUPDR7_PU; // pullup (what if there's no external pullup?) GPIOB->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7; // both open-drain outputs - // I2C (default timing from PCLK - 64MHz) + // I2C (default timing from sys clock - 72MHz) RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // clocking - if(speed == LOW_SPEED){ // 10kHz - // PRESC=F, SCLDEL=4, SDADEL=2, SCLH=0xC3, SCLL=0xC7 - I2C1->TIMINGR = (0xF<<28) | (4<<20) | (2<<16) | (0xC3<<8) | (0xC7); - }else if(speed == HIGH_SPEED){ // 100kHz - I2C1->TIMINGR = (0xF<<28) | (4<<20) | (2<<16) | (0xF<<8) | (0x13); - }else{ // VERYLOW_SPEED - the lowest speed by STM register: ~7.7kHz - I2C1->TIMINGR = (0xF<<28) | (4<<20) | (2<<16) | (0xff<<8) | (0xff); + if(speed == HIGH_SPEED){ + // activate "fast mode plus" + SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_FMP | SYSCFG_CFGR1_I2C_PB6_FMP | SYSCFG_CFGR1_I2C_PB7_FMP; + }else{ + SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_I2C1_FMP | SYSCFG_CFGR1_I2C_PB6_FMP | SYSCFG_CFGR1_I2C_PB7_FMP); + } + if(speed == LOW_SPEED){ // 100kHz + I2C1->TIMINGR = (0xf<<28) | (0x04<<20) | (0x03<<16) | (0x12<<8) | (0x15); + // PRESC SCLDEL SDADEL SCLH SCLL + }else if(speed == HIGH_SPEED){ // 400kHz + I2C1->TIMINGR = (0x06<<28) | (0x04<<20) | (0x03<<16) | (0x06<<8) | (0x08); + }else{ // VERYLOW_SPEED - 10kHz + I2C1->TIMINGR = (0xf<<28) | (0x04<<20) | (0x03<<16) | (0xc3<<8) | (0xc7); } I2C1->CR1 = I2CCR1; RCC->AHBENR |= RCC_AHBENR_DMA1EN; @@ -97,31 +103,37 @@ static void i2cDMAsetup(int tx, uint8_t len){ } } -static uint8_t i2c_start(uint8_t busychk){ +static uint8_t i2c_chk(uint8_t busychk){ + I2C1->CR2 = 0; if(busychk){ cntr = Tms; while(I2C1->ISR & I2C_ISR_BUSY){ IWDG->KR = IWDG_REFRESH; if(Tms - cntr > I2C_TIMEOUT){ - USND("Line busy\n"); + USND("i2c_chk: Line busy\n"); return 0; // check busy }} - } + }/* cntr = Tms; while(I2C1->CR2 & I2C_CR2_START){ IWDG->KR = IWDG_REFRESH; if(Tms - cntr > I2C_TIMEOUT){ - USND("No start\n"); + USND("i2c_chk: No start\n"); return 0; // check start - }} + }}*/ return 1; } // start writing static uint8_t i2c_startw(uint8_t addr, uint8_t nbytes, uint8_t stop){ - if(!i2c_start(1)) return 0; + if(!i2c_chk(1)) return 0; I2C1->CR2 = nbytes << 16 | addr; - if(stop) I2C1->CR2 |= I2C_CR2_AUTOEND; // autoend + if(stop){ + I2C1->CR2 |= I2C_CR2_AUTOEND; // autoend + }else{ + //I2C1->CR2 &= ~I2C_CR2_AUTOEND; + //I2C1->CR2 |= I2C_CR2_RELOAD; + } // now start transfer I2C1->CR2 |= I2C_CR2_START; return 1; @@ -143,21 +155,31 @@ static uint8_t write_i2cs(uint8_t addr, uint8_t *data, uint8_t nbytes, uint8_t s IWDG->KR = IWDG_REFRESH; if(I2C1->ISR & I2C_ISR_NACKF){ I2C1->ICR |= I2C_ICR_NACKCF; - //USND("NAK\n"); + USND("write_i2cs: NAK\n"); return 0; } if(Tms - cntr > I2C_TIMEOUT){ - //USND("Timeout\n"); + USND("write_i2cs: Timeout\n"); return 0; } } I2C1->TXDR = data[i]; // send data + USND("write_i2cs: "); USND(uhex2str(data[i])); newline(); } cntr = Tms; - // wait for data gone - while(I2C1->ISR & I2C_ISR_BUSY){ - IWDG->KR = IWDG_REFRESH; - if(Tms - cntr > I2C_TIMEOUT){break;} + if(stop){ + while(I2C1->ISR & I2C_ISR_BUSY){ + IWDG->KR = IWDG_REFRESH; + if(Tms - cntr > I2C_TIMEOUT){USND("write_i2cs: Busy timeout\n"); break;} + } + }else{ // repeated start + while(!(I2C1->ISR & I2C_ISR_TC)){ + IWDG->KR = IWDG_REFRESH; + if(Tms - cntr > I2C_TIMEOUT){ + USND("write_i2cs: TC timeout\n"); + return 0; + } + } } return 1; } @@ -181,10 +203,11 @@ uint8_t write_i2c_dma(uint8_t addr, uint8_t *data, uint8_t nbytes){ // start reading static uint8_t i2c_startr(uint8_t addr, uint8_t nbytes, uint8_t busychk){ - if(!i2c_start(busychk)) return 0; + if(!i2c_chk(busychk)) return 0; // read N bytes - I2C1->CR2 = (nbytes<<16) | addr | 1 | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN; + I2C1->CR2 = (nbytes<<16) | addr /*| I2C_CR2_AUTOEND*/ | I2C_CR2_RD_WRN; I2C1->CR2 |= I2C_CR2_START; + I2C1->CR2 |= I2C_CR2_AUTOEND; return 1; } @@ -203,18 +226,27 @@ 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("read_i2_nostart: NAK\n"); return 0; } if(Tms - cntr > I2C_TIMEOUT){ - //USND("Timeout\n"); + USND("read_i2_nostart: Timeout\n"); return 0; } } *data++ = I2C1->RXDR; + }/* + cntr = Tms; + while(!(I2C1->ISR & I2C_ISR_TC)){ + IWDG->KR = IWDG_REFRESH; + if(Tms - cntr > I2C_TIMEOUT){ + USND("read_i2cs: TC timeout\n"); + return 0; + } } + I2C1->CR2 = I2C_CR2_STOP;*/ return 1; - } +} uint8_t read_i2c(uint8_t addr, uint8_t *data, uint8_t nbytes){ if(isI2Cbusy()) return 0; @@ -243,6 +275,7 @@ uint8_t read_i2c_reg(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t nbytes){ // read 16bit register reg uint8_t read_i2c_reg16(uint8_t addr, uint16_t reg16, uint8_t *data, uint8_t nbytes){ if(isI2Cbusy()) return 0; + reg16 = __REV16(reg16); if(!write_i2cs(addr, (uint8_t*)®16, 2, 0)) return 0; return read_i2cb(addr, data, nbytes, 0); } diff --git a/F3:F303/I2C_scan/i2cscan.bin b/F3:F303/I2C_scan/i2cscan.bin index 886c4115d743f38a523dbc480f94ea28d6d8b428..e043dbc310527b01c3a55666dadb8f1a5ccf4bfd 100755 GIT binary patch literal 8076 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 H5B&cfD2fyg diff --git a/F3:F303/I2C_scan/i2cscan.creator.user b/F3:F303/I2C_scan/i2cscan.creator.user index 19feb85..69da5ac 100644 --- a/F3:F303/I2C_scan/i2cscan.creator.user +++ b/F3:F303/I2C_scan/i2cscan.creator.user @@ -1,20 +1,20 @@ - + EnvironmentId - {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} + {7bd84e39-ca37-46d3-be9d-99ebea85bc0d} ProjectExplorer.Project.ActiveTarget - 0 + 0 ProjectExplorer.Project.EditorSettings + true true - false true Cpp @@ -28,32 +28,35 @@ QmlJSGlobal - 2 + 2 KOI8-R false 4 false + 0 80 true true 1 + 0 false true false - 1 + 0 true true 0 8 true false - 2 + 1 true false true *.md, *.MD, Makefile false true + true @@ -67,17 +70,17 @@ true true + false + 0 true - - true - Builtin.BuildSystem true true Builtin.DefaultTidyAndClazy - 1 + 2 + false @@ -89,14 +92,15 @@ ProjectExplorer.Project.Target.0 Desktop + true Desktop Desktop - {91347f2c-5221-46a7-80b1-0a054ca02f79} - 0 - 0 - 0 + {65a14f9e-e008-4c1b-89df-4eaa4774b6e3} + 0 + 0 + 0 - /home/eddy/C-files/stm32samples/F3:F303/I2C_scan + /Big/Data/00__Electronics/STM32/F303-nolib/blink @@ -105,9 +109,9 @@ true GenericProjectManager.GenericMakeStep - 1 - Сборка - Сборка + 1 + Build + Build ProjectExplorer.BuildSteps.Build @@ -118,9 +122,9 @@ true GenericProjectManager.GenericMakeStep - 1 - Очистка - Очистка + 1 + Clean + Clean ProjectExplorer.BuildSteps.Clean 2 @@ -128,15 +132,47 @@ false - По умолчанию + Default GenericProjectManager.GenericBuildConfiguration + 0 + 0 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + true + + 1 - 1 + 1 - 0 - Развёртывание - Развёртывание + 0 + Deploy + Deploy ProjectExplorer.BuildSteps.Deploy 1 @@ -144,24 +180,29 @@ false ProjectExplorer.DefaultDeployConfiguration - 1 + 1 + true + true + true 2 + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + ProjectExplorer.CustomExecutableRunConfiguration - false + false true - false true - 1 + 1 ProjectExplorer.Project.TargetCount - 1 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/F3:F303/I2C_scan/i2cscan.creator.user.cf63021 b/F3:F303/I2C_scan/i2cscan.creator.user.cf63021 new file mode 100644 index 0000000..19feb85 --- /dev/null +++ b/F3:F303/I2C_scan/i2cscan.creator.user.cf63021 @@ -0,0 +1,174 @@ + + + + + + EnvironmentId + {cf63021e-ef53-49b0-b03b-2f2570cdf3b6} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + KOI8-R + false + 4 + false + 80 + true + true + 1 + false + true + false + 1 + true + true + 0 + 8 + true + false + 2 + true + false + true + *.md, *.MD, Makefile + false + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + Builtin.BuildSystem + + true + true + Builtin.DefaultTidyAndClazy + 1 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop + Desktop + {91347f2c-5221-46a7-80b1-0a054ca02f79} + 0 + 0 + 0 + + /home/eddy/C-files/stm32samples/F3:F303/I2C_scan + + + + all + + true + GenericProjectManager.GenericMakeStep + + 1 + Сборка + Сборка + ProjectExplorer.BuildSteps.Build + + + + + clean + + true + GenericProjectManager.GenericMakeStep + + 1 + Очистка + Очистка + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + По умолчанию + GenericProjectManager.GenericBuildConfiguration + + 1 + + + 0 + Развёртывание + Развёртывание + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + 2 + + ProjectExplorer.CustomExecutableRunConfiguration + + false + true + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/F3:F303/I2C_scan/proto.c b/F3:F303/I2C_scan/proto.c index c2e4452..7003a7d 100644 --- a/F3:F303/I2C_scan/proto.c +++ b/F3:F303/I2C_scan/proto.c @@ -46,19 +46,19 @@ const char *helpstring = static uint8_t i2cinited = 0; TRUE_INLINE const char *setupI2C(const char *buf){ buf = omit_spaces(buf); - if(*buf < '0' || *buf > '2') return "Wrong speed"; + if(*buf < '0' || *buf > '2') return "Wrong speed\n"; i2c_setup(*buf - '0'); i2cinited = 1; - return "OK"; + return "OK\n"; } static uint8_t I2Caddress = 0; TRUE_INLINE const char *saI2C(const char *buf){ uint32_t addr; - if(!getnum(buf, &addr) || addr > 0x7f) return "Wrong address"; + if(!getnum(buf, &addr) || addr > 0x7f) return "Wrong address\n"; I2Caddress = (uint8_t) addr << 1; USND("I2Caddr="); USND(uhex2str(addr)); newline(); - return "OK"; + return "OK\n"; } static void rdI2C(const char *buf, int is16){ uint32_t N = 0; @@ -111,7 +111,7 @@ static void rdI2C(const char *buf, int is16){ } } } - if(N == 0){ USND("OK"); return; } + if(N == 0){ USND("OK\n"); return; } if(!noreg){USND("Register "); USND(uhex2str(reg)); USND(":\n");} hexdump(USB_sendstr, locBuffer, N); } @@ -132,8 +132,8 @@ static const char *wrI2C(const char *buf, int isdma){ uint16_t N = readNnumbers(buf); int result = isdma ? write_i2c_dma(I2Caddress, locBuffer, N) : write_i2c(I2Caddress, locBuffer, N); - if(!result) return "Error writing I2C"; - return "OK"; + if(!result) return "Error writing I2C\n"; + return "OK\n"; } const char *parse_cmd(const char *buf){ diff --git a/F3:F303/I2C_scan/version.inc b/F3:F303/I2C_scan/version.inc index cde0d53..18928cb 100644 --- a/F3:F303/I2C_scan/version.inc +++ b/F3:F303/I2C_scan/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "17" -#define BUILD_DATE "2023-01-22" +#define BUILD_NUMBER "64" +#define BUILD_DATE "2025-09-13" diff --git a/F3:F303/inc/Fx/stm32f3.h b/F3:F303/inc/Fx/stm32f3.h index c50b043..79b3c61 100644 --- a/F3:F303/inc/Fx/stm32f3.h +++ b/F3:F303/inc/Fx/stm32f3.h @@ -123,6 +123,8 @@ TRUE_INLINE int StartHSE(){ // system bus 72MHz from PLL WAITWHILE(!(RCC->CR & RCC_CR_PLLRDY)); // Select PLL as system clock source RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL; + // select system clock as I2C source + RCC->CFGR3 |= RCC_CFGR3_I2C1SW_SYSCLK | RCC_CFGR3_I2C1SW_SYSCLK; // Wait till PLL is used as system clock source WAITWHILE((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); SysFreq = 72000000;