From c7f6718d2e65cacaedb72b271b1097ccb64b00b9 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Sat, 4 Oct 2025 00:23:18 +0300 Subject: [PATCH] SPI works --- F3:F303/BME280/BMP280.c | 83 ++++++++++++++------- F3:F303/BME280/bme280.bin | Bin 16920 -> 11472 bytes F3:F303/BME280/bme280.creator.user | 2 +- F3:F303/BME280/hardware.c | 5 +- F3:F303/BME280/hardware.h | 4 ++ F3:F303/BME280/main.c | 45 ++++++++---- F3:F303/BME280/proto.c | 111 ++++++++++++++++++++++++++--- F3:F303/BME280/proto.h | 1 + F3:F303/BME280/spi.c | 16 ++--- F3:F303/BME280/spi.h | 6 +- F3:F303/BME280/usb_dev.h | 4 +- F3:F303/BME280/version.inc | 4 +- 12 files changed, 212 insertions(+), 69 deletions(-) diff --git a/F3:F303/BME280/BMP280.c b/F3:F303/BME280/BMP280.c index a1bd6ba..bad50a7 100644 --- a/F3:F303/BME280/BMP280.c +++ b/F3:F303/BME280/BMP280.c @@ -42,16 +42,18 @@ * along with this program. If not, see . */ +#include "hardware.h" #include "i2c.h" #include "spi.h" #include "BMP280.h" +#include "usb_dev.h" // DBG #ifdef EBUG #include "strfunc.h" -#include "usb_dev.h" extern volatile uint32_t Tms; #endif +#include #include #define BMP280_I2C_ADDRESS_MASK (0x76) @@ -87,6 +89,8 @@ extern volatile uint32_t Tms; #define BMP280_MODE_FORSED (1) // force single measurement #define BMP280_MODE_NORMAL (3) // run continuosly +#define BMP280_STATUS_IMCOPY (1<<0) // im-copy (sensor busy) +#define BME280_STATUS_MSRGOOD (1<<2) // measurement is good (undocumented bit) #define BMP280_STATUS_MSRNG (1<<3) // measuring in process static uint8_t curaddress = BMP280_I2C_ADDRESS_0<<1; @@ -165,17 +169,27 @@ BMP280_status BMP280_get_status(){ static uint8_t SPIbuf[SPI_BUFSIZE]; // these functions for -static uint8_t *spi_readregs(uint8_t address, uint8_t reg, uint8_t len){ +static uint8_t *spi_readregs(uint8_t _U_ address, uint8_t reg, uint8_t len){ if(len > SPI_BUFSIZE-2) return NULL; - SPIbuf[0] = address | 0x80; - SPIbuf[1] = reg; - if(!spi_writeread(SPIbuf, len+2)) return NULL; - return SPIbuf + 2; + SPI_CS_0(); + bzero(SPIbuf, sizeof(SPIbuf)); + SPIbuf[0] = reg | 0x80; + int r = spi_writeread(SPIbuf, len+1); + SPI_CS_1(); + if(!r) return NULL; +#ifdef EBUG + USB_sendstr("Register "); USB_sendstr(uhex2str(reg)); USB_sendstr(": "); + hexdump(USB_sendstr, SPIbuf + 1, len); +#endif + return SPIbuf + 1; } -static uint8_t spi_write(uint8_t address, uint8_t *data, uint8_t n){ - SPIbuf[0] = address; - memcpy(SPIbuf + 1, data, n); - return spi_writeread(SPIbuf, n+1); +static uint8_t spi_write(uint8_t _U_ address, uint8_t *data, uint8_t n){ + SPI_CS_0(); + memcpy(SPIbuf, data, n); + SPIbuf[0] &= 0x7F; // clear MSbit + uint8_t r = spi_writeread(SPIbuf, n); + SPI_CS_1(); + return r; } // address: 0 or 1 @@ -185,14 +199,13 @@ void BMP280_setup(uint8_t address, uint8_t isI2C){ curaddress = (BMP280_I2C_ADDRESS_MASK | (address & 1))<<1; read_regs = i2c_read_regs; write_data = i2c_write; - i2c_setup(I2C_SPEED_10K); + i2c_setup(I2C_SPEED_400K); }else{ curaddress = BMP280_I2C_ADDRESS_MASK | (address & 1); read_regs = spi_readregs; write_data = spi_write; spi_setup(); } - BMP280_init(); } // setters for `params` @@ -233,43 +246,49 @@ static int readcompdata(){ // read compensation data & write registers int BMP280_init(){ IWDG->KR = IWDG_REFRESH; - DBG("INI:\n"); + DBG("INI:"); if(!read_reg(BMP280_REG_ID, ¶ms.ID)){ - DBG("Can't get ID\n"); + DBG("Can't get ID"); return 0; } if(params.ID != BMP280_CHIP_ID && params.ID != BME280_CHIP_ID){ - DBG("Not BMP/BME\n"); + DBG("Not BMP/BME"); return 0; } if(!write_reg(BMP280_REG_RESET, BMP280_RESET_VALUE)){ - DBG("Can't reset\n"); + DBG("Can't reset"); return 0; } uint8_t reg = 1; - while(reg & 1){ + int ntries = 100; + while((reg & BMP280_STATUS_IMCOPY) && --ntries){ + IWDG->KR = IWDG_REFRESH; if(!read_reg(BMP280_REG_STATUS, ®)){ - DBG("can't get status\n"); + DBG("can't get status"); return 0; } } + if(ntries < 0){ + DBG("Timeout getting status"); + return 0; + } if(!readcompdata()){ - DBG("Can't read calibration data\n"); + DBG("Can't read calibration data"); return 0; } // write filter configuration reg = params.filter << 2; - if(!write_reg(BMP280_REG_CONFIG, reg)){DBG("Can't save filter settings\n");} + if(!write_reg(BMP280_REG_CONFIG, reg)){DBG("Can't save filter settings");} reg = (params.t_os << 5) | (params.p_os << 2); // oversampling for P/T, sleep mode if(!write_reg(BMP280_REG_CTRL, reg)){ - DBG("Can't write settings for P/T\n"); + DBG("Can't write settings for P/T"); return 0; } params.regctl = reg; if(params.ID == BME280_CHIP_ID){ // write CTRL_HUM only AFTER CTRL! reg = params.h_os; if(!write_reg(BMP280_REG_CTRL_HUM, reg)){ - DBG("Can't write settings for H\n"); + DBG("Can't write settings for H"); return 0; } } @@ -296,7 +315,7 @@ int BMP280_start(){ } uint8_t reg = params.regctl | BMP280_MODE_FORSED; if(!write_reg(BMP280_REG_CTRL, reg)){ - DBG("Can't write CTRL reg\n"); + DBG("Can't write CTRL reg"); return 0; } bmpstatus = BMP280_BUSY; @@ -311,7 +330,13 @@ void BMP280_process(){ // BUSY state: poll data ready uint8_t reg; if(!read_reg(BMP280_REG_STATUS, ®)) return; - if(reg & BMP280_STATUS_MSRNG) return; // still busy + if(reg & (BMP280_STATUS_MSRNG | BMP280_STATUS_IMCOPY)) return; // still busy + /* if(params.ID == BME280_CHIP_ID && !(reg & BME280_STATUS_MSRGOOD)){ // check if data is good + DBG("Wrong data!"); + bmpstatus = BMP280_RELAX; + read_regs(curaddress, BMP280_REG_ALLDATA, 8); + return; + }*/ bmpstatus = BMP280_RDY; // data ready } @@ -382,8 +407,10 @@ int BMP280_getdata(float *T, float *P, float *H){ int32_t p = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4); int32_t t = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4); int32_t t_fine; - int32_t Temp = compTemp(t, &t_fine); - if(T) *T = ((float)Temp)/100.f; + if(T){ + int32_t Temp = compTemp(t, &t_fine); + *T = ((float)Temp)/100.f; + } if(P) *P = ((float)compPres(p, t_fine)) / 256.f; if(H){ int32_t h = (data[6] << 8) | data[7]; @@ -394,6 +421,8 @@ int BMP280_getdata(float *T, float *P, float *H){ // dewpoint calculation (T in degrC, H in percents) float Tdew(float T, float H){ + if(H < 1e-3) return -300.f; float gamma = 17.27f * T / (237.7f + T) + logf(H/100.f); - return (237.7f * gamma)/(17.27 - gamma); + if(fabsf(17.27f - gamma) < 1e-3) return -300.f; + return (237.7f * gamma)/(17.27f - gamma); } diff --git a/F3:F303/BME280/bme280.bin b/F3:F303/BME280/bme280.bin index 20a2ef03e5564574707bfb6039263a3ddbfce496..f05986b5f2b1437f442deec293102f7a6f239777 100755 GIT binary patch literal 11472 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 literal 16920 zcmeHue|%HNmG4|#*^*`BUos#|Cdd{E5J3=_25hB?u*}7_NX&!mCb6?y$=Dz{7>sQa zNtYB6XfdSSrI1$wWFP6Tq}%Oo69JoGm37+eF70mKdopwvu#=72Zc8z>EAu0kbqU(< zxmU6cX?Ne}eLnBM2cPksA7{>-IdkUBIcG-fb!I;MFwjVM<+P8OTO^7k1Wr$C9z62Sm!c!<}^eC8#={+s&Xh?DrDDjarK?4@pzX((8^T*7C1+z;ib6~&AJ9DpzqYx zMFK{l%FD-BCnEt)#-#?XfBTddhQiZvj7-CknYYo!DvX_x0JF}FN`Yq99OmOHzB#-x zuE*cOupV^kT_p`hcZvKL+>6itv^aKTLSy6O9AKRB=Vizonvp9Hkjh^!zVK5P|5AeW zE3;5|L%gRo=qO@Z;^UVJnRc;?X}^RNI!%0Ah80+b6);xxmcP2j?-tXmx;|#C2zVFO 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 JwEaK+_aA-nvWfrz diff --git a/F3:F303/BME280/bme280.creator.user b/F3:F303/BME280/bme280.creator.user index 9a72567..c00d1f5 100644 --- a/F3:F303/BME280/bme280.creator.user +++ b/F3:F303/BME280/bme280.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/F3:F303/BME280/hardware.c b/F3:F303/BME280/hardware.c index 3579757..f5a729c 100644 --- a/F3:F303/BME280/hardware.c +++ b/F3:F303/BME280/hardware.c @@ -24,8 +24,9 @@ static inline void gpio_setup(){ // USB - alternate function 14 @ pins PA11/PA12; SWD - AF0 @PA13/14 GPIOA->AFR[1] = AFRf(14, 11) | AFRf(14, 12); GPIOA->MODER = MODER_AF(11) | MODER_AF(12) | MODER_AF(13) | MODER_AF(14) | MODER_O(15); - GPIOB->MODER = MODER_O(0) | MODER_O(1); - GPIOB->ODR = 1; + GPIOB->MODER = MODER_O(0) | MODER_O(1) | MODER_O(2); + pin_set(GPIOB, 1<<1); + SPI_CS_1(); } void hw_setup(){ diff --git a/F3:F303/BME280/hardware.h b/F3:F303/BME280/hardware.h index fc241df..2b50da6 100644 --- a/F3:F303/BME280/hardware.h +++ b/F3:F303/BME280/hardware.h @@ -25,6 +25,10 @@ #define USBPU_ON() pin_clear(USBPU_port, USBPU_pin) #define USBPU_OFF() pin_set(USBPU_port, USBPU_pin) +// SPI_CS - PB2 (pin 20) +#define SPI_CS_1() pin_set(GPIOB, 1<<2) +#define SPI_CS_0() pin_clear(GPIOB, 1<<2) + extern volatile uint32_t Tms; void hw_setup(); diff --git a/F3:F303/BME280/main.c b/F3:F303/BME280/main.c index 82b790e..c9a1374 100644 --- a/F3:F303/BME280/main.c +++ b/F3:F303/BME280/main.c @@ -43,7 +43,7 @@ int main(void){ hw_setup(); USBPU_OFF(); USB_setup(); - BMP280_setup(0, 1); + //BMP280_setup(0, 1); uint32_t ctr = Tms, Tmeas = 0; USBPU_ON(); while(1){ @@ -57,20 +57,35 @@ int main(void){ const char *ans = parse_cmd(inbuff); if(ans) USB_sendstr(ans); } - BMP280_process(); - if(Tms - Tmeas > 9999){ - BMP280_status s = BMP280_get_status(); - float Temperature, Pressure, Humidity, Dewpoint; - if(s == BMP280_NOTINIT || s == BMP280_ERR) BMP280_init(); - else if(s == BMP280_RDY && BMP280_getdata(&Temperature, &Pressure, &Humidity)){ - Dewpoint = Tdew(Temperature, Humidity); - USB_sendstr("Tdeg="); USB_sendstr(float2str(Temperature, 2)); USB_sendstr("\nPpa="); - USB_sendstr(float2str(Pressure, 1)); - USB_sendstr("\nPmm="); USB_sendstr(float2str(Pressure * 0.00750062f, 1)); - USB_sendstr("\nH="); USB_sendstr(float2str(Humidity, 1)); - USB_sendstr("\nTdew="); USB_sendstr(float2str(Dewpoint, 1)); - newline(); - Tmeas += 10000; + BMP280_status s = BMP280_get_status(); + if(s != BMP280_NOTINIT){ + if(s == BMP280_ERR) BMP280_init(); + else{ + BMP280_process(); + s = BMP280_get_status(); // refresh status after processing + float Temperature, Pressure, Humidity, Dewpoint; + if(s == BMP280_RDY && BMP280_getdata(&Temperature, &Pressure, &Humidity)){ + Dewpoint = Tdew(Temperature, Humidity); + USB_sendstr("Tdeg="); USB_sendstr(float2str(Temperature, 2)); USB_sendstr("\nPpa="); + USB_sendstr(float2str(Pressure, 3)); + USB_sendstr("\nPmm="); USB_sendstr(float2str(Pressure * 0.00750062f, 2)); + USB_sendstr("\nH="); USB_sendstr(float2str(Humidity, 2)); + USB_sendstr("\nTdew="); USB_sendstr(float2str(Dewpoint, 1)); + newline(); + } + if(contmeas && (Tms - Tmeas > 999)){ + if(BMP280_start()) Tmeas = Tms; + } + } + } + if(i2c_scanmode){ + uint8_t addr; + int ok = i2c_scan_next_addr(&addr); + if(addr == I2C_ADDREND) USND("End scan"); + else if(ok){ + USB_sendstr(uhex2str(addr)); + USB_sendstr(" ("); USB_sendstr(u2str(addr)); + USB_sendstr(") - found device\n"); } } } diff --git a/F3:F303/BME280/proto.c b/F3:F303/BME280/proto.c index bc4207a..5169c26 100644 --- a/F3:F303/BME280/proto.c +++ b/F3:F303/BME280/proto.c @@ -19,6 +19,8 @@ #include #include +#include "BMP280.h" +#include "i2c.h" #include "spi.h" #include "strfunc.h" #include "usb_dev.h" @@ -29,11 +31,19 @@ static uint8_t locBuffer[LOCBUFFSZ]; static const char *ERR = "ERR\n", *OK = "OK\n"; extern volatile uint32_t Tms; +int contmeas = 0; // continuous measurements each 1s const char *helpstring = "https://github.com/eddyem/stm32samples/tree/master/F3:F303/xxx build#" BUILD_NUMBER " @ " BUILD_DATE "\n" - "i - [re]init SPI1\n" - "s - send up to 32 bytes of data and read answer\n" + "c - set/reset continuous measurements\n" + "s - send up to 32 bytes of data over SPI and read answer\n" + "Axi - init BME280 with address x (0/1) and interface i (I/S - I2C/SPI)\n" + "Fx- set filter to x (0..4)\n" + "I - [re]init I2C\n" + "Is - scan I2C bus\n" + "M - start measurement\n" + "Ovx - set oversampling of v(t, h or p) to x(0..5)\n" + "S - [re]init SPI1\n" "T - print current Tms\n" ; @@ -46,9 +56,9 @@ TRUE_INLINE uint16_t readNnumbers(const char *buf){ if(D > 0xff){ USND("Each number should be uint8_t"); return 0; } buf = nxt; locBuffer[N++] = (uint8_t) D&0xff; - USND("add byte: "); USND(uhex2str(D&0xff)); USND("\n"); + //USND("add byte: "); USND(uhex2str(D&0xff)); USND("\n"); } - USND("Send "); USND(u2str(N)); USND(" bytes\n"); + //USND("Send "); USND(u2str(N)); USND(" bytes\n"); return N; } @@ -62,23 +72,106 @@ TRUE_INLINE const char* spirdwr(const char *buf){ return NULL; } +TRUE_INLINE const char* bmeinint(const char *buf){ + buf = omit_spaces(buf); + char c = *buf; + if(c != '0' && c != '1') return "Wrong address\n"; + uint8_t addr = c - '0'; + buf = omit_spaces(buf + 1); + c = *buf; + uint8_t isI2C = 0; + switch(c){ + case 'i': + case 'I': + isI2C = 1; + case 's': + case 'S': + break; + default: + return "Wrong interface\n"; + } + BMP280_setup(addr, isI2C); + if(BMP280_init()){ + if(BMP280_read_ID(&addr)){ + if(addr == BMP280_CHIP_ID) return "found BMP280\n"; + else return "found BME280\n"; + }else return "Failed read ID\n"; + } + return ERR; +} + +TRUE_INLINE const char* setos(const char *buf){ + buf = omit_spaces(buf); + uint32_t U32; + void (*osfunc)(BMP280_Oversampling) = NULL; + switch(*buf){ + case 'h': // h_os + case 'H': + osfunc = BMP280_setOSh; + break; + case 'p': // p_os + case 'P': + osfunc = BMP280_setOSp; + break; + case 't': // t_os + case 'T': + osfunc = BMP280_setOSt; + break; + default: + return "Wrong OS function\n"; + } + buf = omit_spaces(buf+1); + if(!*buf) return "Need OS number\n"; + if(buf != getnum(buf, &U32) && U32 < BMP280_OVERSMAX){ + osfunc((BMP280_Oversampling)U32); + return OK; + } + return "Wrong OS number\n"; +} + const char *parse_cmd(const char *buf){ + uint32_t U32; // "long" commands if(buf[1]){ char c = *buf++; switch(c){ case 's': return spirdwr(buf); + case 'A': + return bmeinint(buf); + case 'F': + buf = omit_spaces(buf); + if(buf != getnum(buf, &U32) && U32 < BMP280_FILTERMAX){ + BMP280_setfilter((BMP280_Filter)U32); + return OK; + }else return ERR; + case 'I': + if(*buf == 's'){ + i2c_init_scan_mode(); + return "Start scan\n"; + }else return ERR; + case 'O': + return setos(buf); default: return buf; // echo input } } - /* switch(*buf){ - case '': - break; - }*/ // "short" commands switch(*buf){ - case 'i': + case 'c': + contmeas = !contmeas; + if(contmeas){ + if(BMP280_start()) return OK; + return ERR; + } + return OK; + case 'I': + i2c_setup(I2C_SPEED_400K); + return OK; + case 'M': + if(!BMP280_start()) return ERR; + else return OK; + break; + case 'S': spi_setup(); return OK; case 'T': diff --git a/F3:F303/BME280/proto.h b/F3:F303/BME280/proto.h index 3ee30ab..d1d28b5 100644 --- a/F3:F303/BME280/proto.h +++ b/F3:F303/BME280/proto.h @@ -18,5 +18,6 @@ #pragma once +extern int contmeas; char *parse_cmd(char *buf); diff --git a/F3:F303/BME280/spi.c b/F3:F303/BME280/spi.c index 56fa8f8..3c99255 100644 --- a/F3:F303/BME280/spi.c +++ b/F3:F303/BME280/spi.c @@ -20,15 +20,15 @@ #include "spi.h" #include // memcpy -#ifdef EBUG #include "usb_dev.h" +#ifdef EBUG #include "strfunc.h" #endif spiStatus spi_status = SPI_NOTREADY; #define WAITX(x) do{volatile uint32_t wctr = 0; while((x) && (++wctr < 360000)) IWDG->KR = IWDG_REFRESH; if(wctr==360000){ DBG("timeout"); return 0;}}while(0) -// init SPI +// init SPI @ ~280kHz (36MHz/128) void spi_setup(){ SPI1->CR1 = 0; // clear EN SPI1->CR2 = 0; @@ -65,7 +65,7 @@ void spi_deinit(){ spi_status = SPI_NOTREADY; } -int spi_waitbsy(){ +uint8_t spi_waitbsy(){ WAITX(SPI1->SR & SPI_SR_BSY); return 1; } @@ -76,12 +76,13 @@ int spi_waitbsy(){ * @param n - length of data * @return 0 if failed */ -int spi_writeread(uint8_t *data, uint8_t n){ +uint8_t spi_writeread(uint8_t *data, uint8_t n){ if(spi_status != SPI_READY || !data || !n){ DBG("not ready"); return 0; } // clear SPI Rx FIFO + spi_onoff(TRUE); for(int i = 0; i < 4; ++i) (void) SPI1->DR; for(int x = 0; x < n; ++x){ WAITX(!(SPI1->SR & SPI_SR_TXE)); @@ -89,11 +90,12 @@ int spi_writeread(uint8_t *data, uint8_t n){ WAITX(!(SPI1->SR & SPI_SR_RXNE)); data[x] = *((volatile uint8_t*)&SPI1->DR); } + spi_onoff(FALSE); // turn off SPI return 1; } -// read data through SPI in read-only mode -int spi_read(uint8_t *data, uint8_t n){ +// read data through SPI +uint8_t spi_read(uint8_t *data, uint8_t n){ if(spi_status != SPI_READY || !data || !n){ DBG("not ready"); return 0; @@ -102,12 +104,10 @@ int spi_read(uint8_t *data, uint8_t n){ for(int i = 0; i < 4; ++i) (void) SPI1->DR; spi_onoff(TRUE); for(int x = 0; x < n; ++x){ - if(x == n - 1) SPI1->CR1 &= ~SPI_CR1_RXONLY; // clear RXonly bit to stop CLK generation after next byte WAITX(!(SPI1->SR & SPI_SR_RXNE)); data[x] = *((volatile uint8_t*)&SPI1->DR); } spi_onoff(FALSE); // turn off SPI - SPI1->CR1 |= SPI_CR1_RXONLY; // and return RXonly bit return 1; } diff --git a/F3:F303/BME280/spi.h b/F3:F303/BME280/spi.h index 52e9f17..ecef67b 100644 --- a/F3:F303/BME280/spi.h +++ b/F3:F303/BME280/spi.h @@ -30,6 +30,6 @@ extern spiStatus spi_status; void spi_onoff(uint8_t on); void spi_deinit(); void spi_setup(); -int spi_waitbsy(); -int spi_writeread(uint8_t *data, uint8_t n); -int spi_read(uint8_t *data, uint8_t n); +uint8_t spi_waitbsy(); +uint8_t spi_writeread(uint8_t *data, uint8_t n); +uint8_t spi_read(uint8_t *data, uint8_t n); diff --git a/F3:F303/BME280/usb_dev.h b/F3:F303/BME280/usb_dev.h index b7bd929..605d34e 100644 --- a/F3:F303/BME280/usb_dev.h +++ b/F3:F303/BME280/usb_dev.h @@ -47,9 +47,9 @@ void linecoding_handler(usb_LineCoding *lc); #define RBINSZ (1024) #ifdef EBUG -#define DBG(x) USB_sendstr(x) +#define DBG(s) do{USB_sendstr(s); USB_putbyte('\n');}while(0) #else -#define DBG() +#define DBG(s) #endif #define newline() USB_putbyte('\n') diff --git a/F3:F303/BME280/version.inc b/F3:F303/BME280/version.inc index 691b49d..9d5676c 100644 --- a/F3:F303/BME280/version.inc +++ b/F3:F303/BME280/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "13" -#define BUILD_DATE "2025-10-02" +#define BUILD_NUMBER "33" +#define BUILD_DATE "2025-10-04"