字库IC并入W25Q64 SPI总线(CLK/DI/DO=PB6/PB7/PB9共享,CS2=PC12独立),PB9恒为输入,读取纳入storage_lock;再释放PB3/PA15/PA12
This commit is contained in:
parent
1af245d43d
commit
18b970b2d9
|
|
@ -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 已删) |
|
||||
|
|
|
|||
|
|
@ -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~3(16px 行),col8 为 8 像素单位 ====*/
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
#include "main.h"
|
||||
|
||||
/* 128x64 OLED(SSD1306 兼容指令)+ 晶联讯 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,直接写中文字面量即可)。
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
6
版本说明.md
6
版本说明.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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue