短笛君 发表于 2026-6-28 18:03:23

【Telink - TL322X 开发板测评】--使用I2C外设驱动OLED显示



## 概述

本教程演示如何在 Telink TL322X(RISC-V)平台上,通过 I2C0 驱动一块 0.96 英寸 SSD1306 OLED 显示屏(128×64 像素)。

基于 `tl_platform_sdk` 的 `I2C_Demo` 项目移植,使用 non-DMA 轮询模式,无需外部上拉电阻。


## 接线

| TL322X 引脚 | OLED 模块 | 说明 |
|:----------:|:--------:|------|
| **PE0** | SDA | I2C 数据线 |
| **PE1** | SCL | I2C 时钟线 |
| **EXT3V3** | VCC | 供电 |
| **GND** | GND | 共地 |

> 代码在 `i2c_set_pin()` 中已开启 PE0/PE1 的内部 10K 上拉电阻,**无需外接上拉电阻**即可正常通信。

## 移植步骤



### 第一步:添加源文件

将 `oled_ssd1306.h` 和 `oled_ssd1306.c` 放入 demo 源目录:

demo/vendor/I2C_Demo/I2C_V1.1/

### 第二步:修改 `app.c`

```c
#include "common.h"
#include "oled_ssd1306.h"   

#define I2C_CLK_SPEED400000

static unsigned char frame = 0;

void user_init(void)
{
    i2c_set_pin(I2C0, I2C_GPIO_SDA_PIN, I2C_GPIO_SCL_PIN);
    i2c_master_init(I2C0);
    i2c_set_master_clk(I2C0, (unsigned char)(sys_clk.pclk * 1000 * 1000 / (4 * I2C_CLK_SPEED)));
    oled_init();   //初始化 OLED
   
}

void main_loop(void)
{
    oled_clear();
    oled_draw_string(0, 0, "SSD1306 OLED");
    oled_draw_string(0, 10, "TL322X I2C0");
    // 绘制帧计数器、进度条、交替文本
    oled_refresh();
    delay_ms(200);
    frame++;
}
```

### oled_ssd1306 — 驱动实现

整个初始化流程与其他平台开源没有太大区别 只需要把驱动层换成TL自己的API即可 关于SSD1306驱动原理再此不过多赘述 感兴趣的朋友可以移步bilibili学习

!(//m.qjumbo.com/forum/data/attachment/forum/202606/28/180122oi3w5558epb3upif.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202606/28/180133rpljro8ujpntjbot.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202606/28/180141j0n6onkdnmmz010w.png)



### 第三步:将 `oled_ssd1306.c` 加入编译

> 这是整个移植中**最容易出问题的一步**。Eclipse CDT 在生成 Makefile 时会缓存文件列表,后加入的 `.c` 文件可能不会被自动发现。

打开文件:

```
project/tlsr_riscv/tl322x/I2C_Demo/vendor/I2C_Demo/subdir.mk

```

在 `C_SRCS`、`OBJS`、`C_DEPS` 三段中各加一行,并追加编译规则。修改后如下:

```makefile
C_SRCS += \
../../../../demo/vendor/I2C_Demo/I2C_V1.1/app.c \
../../../../demo/vendor/I2C_Demo/I2C_V1.1/app_dma.c \
../../../../demo/vendor/I2C_Demo/I2C_V1.1/main.c \
../../../../demo/vendor/I2C_Demo/I2C_V1.1/oled_ssd1306.c    #

OBJS += \
./vendor/I2C_Demo/app.o \
./vendor/I2C_Demo/app_dma.o \
./vendor/I2C_Demo/main.o \
./vendor/I2C_Demo/oled_ssd1306.o    #

C_DEPS += \
./vendor/I2C_Demo/app.d \
./vendor/I2C_Demo/app_dma.d \
./vendor/I2C_Demo/main.d \
./vendor/I2C_Demo/oled_ssd1306.d    #
```

完成以上步骤后 需要在TLK的IDE中refresh一下文件 让编译器看到所有文件
!(//m.qjumbo.com/forum/data/attachment/forum/202606/28/174905ersrflchshyrrwxx.png)

编译build
!(//m.qjumbo.com/forum/data/attachment/forum/202606/28/174925rfid8030p460ippk.png)

正常编译烧录即可



<iframe src="//player.bilibili.com/player.html?bvid=BV16CTT6kEXg&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>

页: [1]
查看完整版本: 【Telink - TL322X 开发板测评】--使用I2C外设驱动OLED显示

Baidu
map