From 18b970b2d9ea47aa63fc3626e6d67e147da12a7b Mon Sep 17 00:00:00 2001 From: helei Date: Sun, 20 Sep 2026 10:18:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E5=BA=93IC=E5=B9=B6=E5=85=A5W25Q64=20?= =?UTF-8?q?SPI=E6=80=BB=E7=BA=BF(CLK/DI/DO=3DPB6/PB7/PB9=E5=85=B1=E4=BA=AB?= =?UTF-8?q?,CS2=3DPC12=E7=8B=AC=E7=AB=8B),PB9=E6=81=92=E4=B8=BA=E8=BE=93?= =?UTF-8?q?=E5=85=A5,=E8=AF=BB=E5=8F=96=E7=BA=B3=E5=85=A5storage=5Flock;?= =?UTF-8?q?=E5=86=8D=E9=87=8A=E6=94=BEPB3/PA15/PA12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AI项目上下文.md | 2 +- STM32F103_App1/HardWare/OLED/oled.c | 50 ++++++------------------ STM32F103_App1/HardWare/OLED/oled.h | 2 +- STM32F103_App1/HardWare/SYSINIT/system.c | 8 ++++ 版本说明.md | 6 ++- 5 files changed, 27 insertions(+), 41 deletions(-) diff --git a/AI项目上下文.md b/AI项目上下文.md index 411153d..51b027c 100644 --- a/AI项目上下文.md +++ b/AI项目上下文.md @@ -64,7 +64,7 @@ | EEPROM I2C(SCL/SDA) | **PB5/PB4** | | W25Q64(CS/DO/CLK/DI) | **PB8/PB9/PB6/PB7** | | OLED 屏幕 | **SSD1306 I2C:SCL=PB5/SDA=PB4(与 EEPROM 共总线,地址 0x78,无 RST)** | -| 字库 IC(独立 SPI) | CLK=PB3 DI=PA15 FSO=PA12 CS2=PC12 | +| 字库 IC(独立 SPI) | **CLK/DI/DO 与 W25Q64 共线(PB6/PB7/PB9)**,CS2=PC12 独立片选 | | HR_IN 缺料检测 | **PA8 下拉输入,高=缺料→停投料关继电器1(只记日志),不接传感器不影响投料** | | KEY1~4 | **PC6/PC7/PB14/PB15 上拉输入,功能预留** | | 取消 | PA8 手动模式开关(MANUAL_MODE 已删) | diff --git a/STM32F103_App1/HardWare/OLED/oled.c b/STM32F103_App1/HardWare/OLED/oled.c index fcbcde2..86b9219 100644 --- a/STM32F103_App1/HardWare/OLED/oled.c +++ b/STM32F103_App1/HardWare/OLED/oled.c @@ -1,7 +1,8 @@ /* oled.c - 128x64 OLED(SSD1306, I2C) + Ѷ GB2312 ֿ IC(SPI) * Ļ: I2C ӿ, EEPROM I2C (SCL=PB5 SDA=PB4), RST ; * 24C02 Ŀ񻥳 storage_lock(ÿʾ) - * ֿ: SPI (CLK=PB3 DI=PA15 FSO=PA12 CS2=PC12) */ + * ֿ: SPI, W25Q64 (CLK=PB6 DI=PB7 DO=PB9), CS2=PC12 Ƭѡ; + * DO(PB9) ̶Ϊ(W25Q64_Init ), ֿȡ storage_lock Flash */ #include "oled.h" #include "qrcodegen.h" @@ -10,11 +11,11 @@ #include #define OLED_CLK_PORT GPIOB -#define OLED_CLK_PIN GPIO_PIN_3 -#define OLED_MOSI_PORT GPIOA -#define OLED_MOSI_PIN GPIO_PIN_15 -#define OLED_FSO_PORT GPIOA -#define OLED_FSO_PIN GPIO_PIN_12 +#define OLED_CLK_PIN GPIO_PIN_6 /* ֿ CLK, W25Q64 CLK */ +#define OLED_MOSI_PORT GPIOB +#define OLED_MOSI_PIN GPIO_PIN_7 /* ֿ DI, W25Q64 DI */ +#define OLED_FSO_PORT GPIOB +#define OLED_FSO_PIN GPIO_PIN_9 /* ֿ DO(FSO), W25Q64 DO , Ϊ */ #define OLED_CS2_PORT GPIOC #define OLED_CS2_PIN GPIO_PIN_12 @@ -26,26 +27,7 @@ static uint8_t s_row = 0; /* ǰҳַ16px 2 */ static uint8_t s_col = 0; /* ǰУأ */ -/*==== FSO /лֿʱΪ룩====*/ -static void fso_input(void) -{ - GPIO_InitTypeDef g = {0}; - g.Pin = OLED_FSO_PIN; - g.Mode = GPIO_MODE_INPUT; - g.Pull = GPIO_NOPULL; - HAL_GPIO_Init(OLED_FSO_PORT, &g); -} - -static void fso_output(void) -{ - GPIO_InitTypeDef g = {0}; - g.Pin = OLED_FSO_PIN; - g.Mode = GPIO_MODE_OUTPUT_PP; - g.Pull = GPIO_PULLUP; - g.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(OLED_FSO_PORT, &g); -} - +/* ע: ֿ DO(FSO) W25Q64 DO (PB9), W25Q64_Init ̶Ϊ, л */ /*==== GPIO ʼ ====*/ static void oled_gpio_init(void) { @@ -55,21 +37,13 @@ static void oled_gpio_init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); - /* ĻѸ I2C(ռ GPIO); ֻʼֿ IC SPI : CLK/DI/FSO/CS2 - * úÿеƽٿ죬ë */ - HAL_GPIO_WritePin(OLED_CLK_PORT, OLED_CLK_PIN, GPIO_PIN_SET); - HAL_GPIO_WritePin(OLED_MOSI_PORT, OLED_MOSI_PIN, GPIO_PIN_SET); + /* Ļ I2C ռ GPIO; ֿ CLK(PB6)/DI(PB7) W25Q64 ( Init Ϊ), + * DO(PB9) Ϊ( Init ), ֻֿƬѡ CS2(PC12), Ĭ߲ѡ */ HAL_GPIO_WritePin(OLED_CS2_PORT, OLED_CS2_PIN, GPIO_PIN_SET); - g.Mode = GPIO_MODE_OUTPUT_PP; g.Pull = GPIO_PULLUP; g.Speed = GPIO_SPEED_FREQ_LOW; - - g.Pin = OLED_CLK_PIN; HAL_GPIO_Init(OLED_CLK_PORT, &g); - g.Pin = OLED_MOSI_PIN; HAL_GPIO_Init(OLED_MOSI_PORT, &g); g.Pin = OLED_CS2_PIN; HAL_GPIO_Init(OLED_CS2_PORT, &g); - - fso_output(); } /*==== SSD1306 I2C ( EEPROM I2C ) ====*/ @@ -279,20 +253,19 @@ static uint8_t rom_read_byte(void) { uint8_t ret = 0; lcd_clk(1); - fso_input(); for (int i = 0; i < 8; i++) { lcd_clk(0); ret <<= 1; if (ROM_OUT) ret |= 1; lcd_clk(1); } - fso_output(); return ret; } /*==== ֿ IC DataLen ֽ ====*/ static void rom_read_n(uint8_t ah, uint8_t am, uint8_t al, uint8_t *buf, uint8_t len) { + storage_lock(); /* W25Q64 SPI , Flash д */ rom_cs2(0); lcd_clk(0); rom_write_byte(0x03); /* ָ */ @@ -301,6 +274,7 @@ static void rom_read_n(uint8_t ah, uint8_t am, uint8_t al, uint8_t *buf, uint8_t rom_write_byte(al); for (uint8_t i = 0; i < len; i++) buf[i] = rom_read_byte(); rom_cs2(1); + storage_unlock(); } /*==== λrow 0~316px Уcol8 Ϊ 8 صλ ====*/ diff --git a/STM32F103_App1/HardWare/OLED/oled.h b/STM32F103_App1/HardWare/OLED/oled.h index 8aa87fb..b6edc9a 100644 --- a/STM32F103_App1/HardWare/OLED/oled.h +++ b/STM32F103_App1/HardWare/OLED/oled.h @@ -3,7 +3,7 @@ #include "main.h" -/* 128x64 OLEDSSD1306 ָ+ Ѷ GB2312 ֿ ICȫ GPIO ģ SPI + * ֿ: SPI, W25Q64 (CLK=PB6 DI=PB7 DO=PB9), CS2=PC12 * Ļ: SSD1306 I2C(SCL=PB5 SDA=PB4, EEPROM , RST) * ֿ: SPI(CLK=PB3 DI=PA15 FSO=PA12 CS2=PC12) * ʾַ GB2312/GBK 루Դļ GBKֱдɣ diff --git a/STM32F103_App1/HardWare/SYSINIT/system.c b/STM32F103_App1/HardWare/SYSINIT/system.c index 67f4ec5..2a2807c 100644 --- a/STM32F103_App1/HardWare/SYSINIT/system.c +++ b/STM32F103_App1/HardWare/SYSINIT/system.c @@ -118,6 +118,14 @@ void MX_GPIO_Init(void) g.Pin = GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOB, &g); + /* ֿ CS2(PC12): W25Q64 SPI , ϵ缴ø߲ѡ, + * ֹ oled_init ֮ǰ Flash ʱƬѡѡֿ IC */ + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET); + g.Mode = GPIO_MODE_OUTPUT_PP; + g.Pull = GPIO_NOPULL; + g.Pin = GPIO_PIN_12; + HAL_GPIO_Init(GPIOC, &g); + /* ESP_EN(PA6): WiFi ģʹܣߵƽЧĬϹرʡ磬 * network.c ͨأ4G ʱͶϵ磬 WiFi ߣ */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); diff --git a/版本说明.md b/版本说明.md index 887d390..69733ac 100644 --- a/版本说明.md +++ b/版本说明.md @@ -24,7 +24,11 @@ - **OLED 屏幕改 I2C 接口**(SSD1306 I2C 版,无 RST 脚):与 EEPROM 共用软件 I2C 总线(SCL=PB5/SDA=PB4, 地址 0x78);显示数据流式传输(一次 START 连续写,比逐字节事务快约 3 倍);与 24C02 的跨任务互斥 用 storage_lock 包每个完整显示事务;字库 IC 仍为独立 SPI(CLK=PB3/DI=PA15/FSO=PA12/CS2=PC12,暂不动); - 释放 IO:PC8(CS1)、PC9(DC)、PA11(RST) 共 3 个(后续字库并入 Flash SPI 可再省 2 个) + 释放 IO:PC8(CS1)、PC9(DC)、PA11(RST) 共 3 个 +- **字库 IC 并入 W25Q64 SPI 总线**:CLK/DI/DO 分别并到 PB6/PB7/PB9,CS2=PC12 独立片选不变; + PB9 恒为输入(删除原 FSO 方向切换逻辑,防止与 Flash DO 对打);字库读取纳入 storage_lock 与 Flash 互斥; + 上电即在 MX_GPIO_Init 把 CS2 置高防浮空误选;再释放 IO:PB3、PA15、PA12 共 3 个 + (OLED 改造累计释放 6 个 IO:PC8/PC9/PA11/PB3/PA15/PA12) - **联网方式改为开机按键手动选择**(废除自动切换):欢迎页后 10s 倒计时,KEY1(PC6)=4G / KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;倒计时内按不同键**可反复切换选中项**, **重复按当前项=立即确认**,超时=当前选中项生效;初始选中项=EEPROM 记忆的上次选择(首次默认 4G);