WB2 SDK 使用I2C驱动SSD1306 128*64 oled屏幕

[复制链接]
查看893 | 回复8 | 2025-1-12 17:23:00 | 显示全部楼层 |阅读模式
本帖最后由 KevinLi 于 2025-1-13 15:48 编辑

此项目基于SHT30的I2C例程(applications / peripherals / demo_i2c /),整合LGVL引用的SSD1306驱动文件(新增部分函数),写了个简单的调用例子。


我的板子是WB2-12F-kit,I2C引脚选用SCL=12,SDA=3(没试其他引脚)。

借鉴lvgl的初始化函数:初始化方式是隐含的hal层调用,布局/方向 是头文件宏定义(可以180旋转),

演示视频【BV1dTcGeSEcj
压缩包附件为工程和编译好的固件。(欢迎试用!)
示例图.jpg
log_demo_i2c_SSD1306_version 0.5.1_2025-01-12..png
项目目录结构.PNG
(此处400K hz是SSD1306支持的最高频率)

demo_i2c_SSD1306.zip (7.19 KB, 下载次数: 1)
回复

使用道具 举报

HaydenHu | 2025-1-12 22:14:55 | 显示全部楼层
我都怕你电阻的脚互相短路了
回复 支持 反对

使用道具 举报

爱笑 | 2025-1-13 08:30:12 | 显示全部楼层
棒~
用心做好保姆工作
回复

使用道具 举报

KevinLi | 2025-1-13 13:00:45 | 显示全部楼层
HaydenHu 发表于 2025-1-12 22:14
我都怕你电阻的脚互相短路了

确实,我前两天就差点短路
回复 支持 反对

使用道具 举报

HaydenHu | 2025-1-13 13:49:56 | 显示全部楼层
KevinLi 发表于 2025-1-13 13:00
确实,我前两天就差点短路

折90度角,或者剪短
回复 支持 反对

使用道具 举报

KevinLi | 2025-1-13 15:36:39 | 显示全部楼层
HaydenHu 发表于 2025-1-13 13:49
折90度角,或者剪短

没事,我没用上电阻,随便放的owo
回复 支持 反对

使用道具 举报

HaydenHu | 2025-1-13 16:29:44 | 显示全部楼层
随便放的!
回复

使用道具 举报

KevinLi | 2025-1-14 20:06:23 | 显示全部楼层
本帖最后由 KevinLi 于 2025-1-14 20:07 编辑

这几天在学习用python将视频转为一帧帧图像的二维数组,今天尝试把最终输出的Byte数组导入到工程播放,发现画面啥都不是;
然后几个小时前发现了oled_drive_set_pixels函数有点不对劲,刚才才理解这个驱动的帧存储结构。
    给像素buff赋值的下标计算公式不对劲:
    函数下标计算方式.png

单色屏幕:像素数=64行*128列;单色,位深为1,所以每像素是1bit 。所以驱动文件中数组大小为 像素数除以8,将8个像素存为一个Byte,也文中就是uint8或uchar型的数组ssd1306_buff
    屏幕的buff数组:uint8_t ssd1306_buff[OLED_DISP_HOR_RES * OLED_DISP_VER_RES / 8];
    (一个元素1Byte取值是0~255)
    数组大小是64 * 128 / 8 = 1024,一帧是1KB。
假设坐标(x:水平左到右,y:竖直上到下)

原本我认为:
    每行横着每8个像素(0~7,*)存为1B,比如 第1行前8个像素存到buff[0],第1行 像素9~16存到buff[1];
    这样,64行,一行有128/8=16个元素;
    如图:
错误理解.png

我现在的理解如图:

    数组下标为0~127的int元素,其位号0bit存储的是第一行,1bit存储第二行...,7bit,存储第8行;

    数组下标为128的int元素,存储的8个像素为第一列的第9~16行像素。

驱动分析数组结构.png
测试代码与图片如下:

    对数组元素的0~127,128~255进行写入,对应1~8行与9~16行:


testCode.png

    注意看程序bit位,对应屏幕中 粗细线条的位置 :
        p1是 循环1 设置 前8行的效果(2根线) ,
        p2p~p4 是 循环2 设置 9~16行 的效果(多了3根线)
p0.jpg

p1.jpg p2.jpg p3-done.jpg

另外,RISC-V通常是小端存储,wb2是bl604是具有3级流水线的*&% 似乎也是小端存储。
小端存储.png

------
(溜了,我去修改我的视频导出程序)


回复 支持 反对

使用道具 举报

KevinLi | 2025-1-15 17:11:51 | 显示全部楼层
本帖最后由 KevinLi 于 2025-1-15 17:16 编辑

昨天晚上成功解决喽(给原程序的矩阵分块、转置、再合并),可以播放视频了;
i2c_gege.jpg
播放帧率上限没测,42ms间隔播放24fps视频没问题;
刚刚试了下我的python转换程序差不多31.95 fps>24,够用了。

感觉set_pixel函数效率不高,我才考虑直接操作数组的。

flash不太够用,没试上限是多少,反正1min视频最终导出的1.42MB数组是不能烧录的。



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则