
一、实验目的了解 I2C 协议的基本原理和时序协议掌握 0.96 寸 OLED 屏的工作原理汉字点阵显示原理掌握开源 GUI 库 U8g2 在 STM32 上的移植编译方法以及图形界面可视化技术。二、实验器材STM32F103C8T6 核心板、0.96 寸 I2C OLED 屏、AHT20 温湿度模块、杜邦线、STLink 下载器、STM32CubeMX、Keil MDK三、实验原理I2C 协议串行同步半双工通信两根线 SDA 数据线、SCL 时钟线支持多从机OLED 和 AHT20 都使用 I2C 通信。OLEDSSD1306128 列 × 64 行单色点阵屏不需要背光汉字依靠点阵字模U8g2 内置 UTF-8 汉字字体直接支持中文显示。AHT20高精度温湿度传感器I2C 输出温湿度原始数据经过换算得到实际温度、相对湿度。U8g2 库嵌入式通用单色屏 GUI 库提供画点、字符串、字体、硬件滚动命令支持 SSD1306硬件刷屏滚动直接发送 OLED 内部滚动指令不需要 MCU 不断刷新缓冲区节省 CPU 资源。四、CubeMX 配置与硬件接线芯片选择STM32F103C8T6开启 I2C1硬件 I2CPB6(SCL)、PB7(SDA)速度 100KHzSYSDebug → Serial Wire时钟HSE 外部 8M主频 72MHz工程生成MDK-ARM生成初始化代码接线OLEDVCC-3.3VGND-GNDSCL-PB6SDA-PB7AHT20VCC-3.3VGND-GNDSCL-PB6SDA-PB7共用一条 I2C 总线任务1OLED 显示功能实现任务要求理解 OLED 屏显和汉字点阵编码原理使用 STM32F103 的 IIC 接口实现显示自己的学号和姓名显示 AHT20 的温度和湿度硬件刷屏模式滑动显示长字符Hello欢迎来到重庆交通大学物联网205实训室任务代码main.c#includemain.h#includeu8g2.h#includeaht20.h#includestdio.hu8g2_tu8g2;floattemp,hum;charbuf[32];constcharscroll_str[]Hello欢迎来到重庆交通大学物联网205实训室;uint8_tu8x8_stm32_i2c_send(u8x8_t*u8x8,uint8_tmsg,uint8_targ_int,void*arg_ptr){HAL_StatusTypeDef r;switch(msg){caseU8X8_MSG_BYTE_SEND:rHAL_I2C_Mem_Write(hi2c1,u8x8_GetI2CAddress(u8x8),0x00,I2C_MEMADD_SIZE_8BIT,(uint8_t*)arg_ptr,arg_int,100);break;caseU8X8_MSG_BYTE_SET_DC:break;caseU8X8_MSG_BYTE_START_TRANSFER:break;caseU8X8_MSG_BYTE_END_TRANSFER:break;default:return0;}return(rHAL_OK)?1:0;}voidu8g2_init(void){u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2,U8G2_R0,u8x8_stm32_i2c_send,u8x8_stm32_gpio_and_delay);u8g2_InitDisplay(u8g2);u8g2_SetPowerSave(u8g2,0);u8g2_ClearBuffer(u8g2);}//OLED硬件左滚动voidOLED_HW_ScrollLeft(uint8_tstart_page,uint8_tend_page,uint8_tspeed){uint8_tcmd[]{0x2E,0x26,0x00,start_page,speed,end_page,0x00,0xFF,0x2F};for(inti0;i9;i)u8g2_SendCommand(u8g2,cmd[i]);}intmain(void){HAL_Init();SystemClock_Config();MX_I2C1_Init();u8g2_init();AHT20_Init();OLED_HW_ScrollLeft(4,7,3);while(1){AHT20_Read(temp,hum);u8g2_ClearBuffer(u8g2);//1.学号姓名u8g2_SetFont(u8g2,u8g2_font_wqy12_t_gb2312);u8g2_DrawUTF8(u8g2,0,12,学号202XXXX 姓名XXX);//2.温湿度sprintf(buf,T:%.2f C H:%.2f %%RH,temp,hum);u8g2_DrawUTF8(u8g2,0,32,buf);//3.滚动长文本u8g2_DrawUTF8(u8g2,0,56,scroll_str);u8g2_SendBuffer(u8g2);HAL_Delay(800);}}任务1 实验现象与分析上电后 OLED 屏幕第一行固定显示学号与姓名第二行定时刷新 AHT20 采集的温湿度屏幕底部一行文字依靠 SSD1306 硬件指令向左滚动属于硬件刷屏不占用大量 MCU 资源。对着 AHT20 哈气温湿度数值会实时更新。接线错误、I2C 地址冲突会造成 OLED 黑屏或者传感器读取数据异常。任务1 小结本任务完成 U8g2 库移植掌握汉字点阵显示方法实现静态文字、传感器数据显示、硬件字幕滚动理解 I2C 多从机挂载的使用方式。任务2逻辑分析仪测量 I2C 信号任务要求使用逻辑分析仪对 I2C 总线信号进行采集测量解析 I2C 通信时序对照 OLED 驱动代码理解 I2C 协议的起始、应答、数据、停止信号验证 STM32 与 OLED 之间的 I2C 通信是否正常。实验原理I2C 是两线式串行总线由 SCL 时钟线、SDA 数据线组成。一次完整的通信过程包含起始信号 STARTSCL 为高电平时SDA 由高变低从机地址 读写位7 位地址加 1 位读写方向共 8 bitACK 应答位接收方在第 9 个时钟周期把 SDA 拉低表示应答8 bit 数据字节高位在前逐位在 SCL 高电平期间被采样停止信号 STOPSCL 为高电平时SDA 由低变高。SSD1306 OLED 的 I2C 从机地址一般为 0x78写地址。STM32 作为主机通过 I2C 向 OLED 发送控制命令与显示数据逻辑分析仪抓取 SCL、SDA 电平波形后配套解码软件自动识别 I2C 协议帧把波形解析成可读报文再和程序里OLED_WR_Reg()发送的命令一一对照。实验器材Saleae 逻辑分析仪、杜邦线、已运行 OLED 显示程序的 STM32F103 I2C OLED 实验板、Logic 软件。实验步骤接线逻辑分析仪通道 CH0 接 SCLCH1 接 SDAGND 与开发板 GND 共地打开 Logic 软件设置采样率推荐 ≥ 1 MHz协议解码器选择 I2C复位 STM32 开发板让 OLED 重新初始化、刷新屏幕同时启动采集抓取波形停止采集查看解码报文识别 START、从机地址 0x78、ACK 应答、命令字节、STOP 信号对照驱动源码OLED_WR_Reg()函数核对发送的 OLED 初始化命令分析时序是否符合 I2C 规范。实验现象与分析抓取到 OLED 初始化阶段的 I2C 通信帧主机发出起始信号发送从机写地址 0x78OLED 返回 ACK 应答之后依次发送 SSD1306 初始化寄存器命令最后发送停止信号。✅正常现象每字节后面都有 ACK 应答SCL 高低电平周期稳定SDA 只在 SCL 低电平期间变化满足 I2C 时序要求。❌异常情况分析无 ACKI2C 接线松动、OLED 地址错误、上拉电阻缺失屏幕黑屏波形畸变总线没有上拉电阻SDA 上升沿过缓通信出错花屏。任务2 小结通过逻辑分析仪实测 I2C 波形把代码层面的 I2C 函数转化成可视化电平信号直观掌握 I2C 总线 START、ACK、STOP 时序验证 STM32 驱动 OLED 的通信过程理解为什么 I2C 总线需要上拉电阻并学会排查 OLED 黑屏、通信失败类故障。五、实验总结本次实验完成 I2C 接口 SSD1306 OLED 驱动移植实现学号姓名、AHT20 温湿度显示以及硬件滚动字幕同时使用逻辑分析仪实测 I2C 总线通信波形完成协议解码。掌握纵向取模 字节倒序的点阵原理理解 I2C 总线通信机制学会使用逻辑分析仪排查 I2C 外设通信故障。