字库IC并入W25Q64 SPI总线(CLK/DI/DO=PB6/PB7/PB9共享,CS2=PC12独立),PB9恒为输入,读取纳入storage_lock;再释放PB3/PA15/PA12

This commit is contained in:
helei 2026-09-20 10:18:31 +08:00
parent 1af245d43d
commit 18b970b2d9
5 changed files with 27 additions and 41 deletions

View File

@ -64,7 +64,7 @@
| EEPROM I2CSCL/SDA | **PB5/PB4** |
| W25Q64CS/DO/CLK/DI | **PB8/PB9/PB6/PB7** |
| OLED 屏幕 | **SSD1306 I2CSCL=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 已删) |

View File

@ -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 <string.h>
#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 像素单位 ====*/

View File

@ -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

View File

@ -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);

View File

@ -24,7 +24,11 @@
- **OLED 屏幕改 I2C 接口**SSD1306 I2C 版,无 RST 脚):与 EEPROM 共用软件 I2C 总线SCL=PB5/SDA=PB4
地址 0x78显示数据流式传输一次 START 连续写,比逐字节事务快约 3 倍);与 24C02 的跨任务互斥
用 storage_lock 包每个完整显示事务;字库 IC 仍为独立 SPICLK=PB3/DI=PA15/FSO=PA12/CS2=PC12暂不动
释放 IOPC8(CS1)、PC9(DC)、PA11(RST) 共 3 个(后续字库并入 Flash SPI 可再省 2 个)
释放 IOPC8(CS1)、PC9(DC)、PA11(RST) 共 3 个
- **字库 IC 并入 W25Q64 SPI 总线**CLK/DI/DO 分别并到 PB6/PB7/PB9CS2=PC12 独立片选不变;
PB9 恒为输入(删除原 FSO 方向切换逻辑,防止与 Flash DO 对打);字库读取纳入 storage_lock 与 Flash 互斥;
上电即在 MX_GPIO_Init 把 CS2 置高防浮空误选;再释放 IOPB3、PA15、PA12 共 3 个
OLED 改造累计释放 6 个 IOPC8/PC9/PA11/PB3/PA15/PA12
- **联网方式改为开机按键手动选择**(废除自动切换):欢迎页后 10s 倒计时KEY1(PC6)=4G /
KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;倒计时内按不同键**可反复切换选中项**
**重复按当前项=立即确认**,超时=当前选中项生效;初始选中项=EEPROM 记忆的上次选择(首次默认 4G