OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕 原创 精华

连志安
发布于 2020-10-3 11:35
浏览
21收藏

摘要:本文简单介绍如何操作I2C去显示OLED屏幕,并且实现动画播放、中文英文显示、绘图等功能

适合群体:适用于润和Hi3861开发板,L0轻量系统驱动开发

文中所有代码仓库:https://gitee.com/qidiyun/hihope-3861-smart-home-kit 

本文参考许思维老师的文章,许思维老师主页是:

https://harmonyos.51cto.com/user/posts/6631823 

感谢许思维老师~

 

7.1实验效果

Hispark WiFi开发套件又提供一个oled屏幕,但是鸿蒙源码中没有这个屏幕的驱动,我们需要自己去移植。

以下是移植效果:

OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕-鸿蒙开发者社区

 

OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕-鸿蒙开发者社区

接口:I2C

使用引脚:HI_IO_NAME_GPIO_13 、 HI_IO_NAME_GPIO_14

 

 

7.2代码

这里我直接用许思维老师之前移植好的代码,不过由于鸿蒙版本更新过快,许思维老师之前的代码是基于1.0版本,直接拿到3.0以上版本编译会出错,这里我修改了编译错误。放在我的仓库中。

整个代码目录如下:

  

主要是3个文件夹:

(1)examples

测试代码,里面有一个ssd1306_demo.c文件,是我们的入口函数。

(2)libm_port

从musl libc中抽取的`sin`和`cos`的实现。

(3)ssd1306

相关驱动代码部分。

接下来我们来重点看下代码部分:

 

(1)初始化入口函数

入口函数是 Ssd1306TestDemo ,它创建了Ssd1306TestTask线程,所以我们重点看 Ssd1306TestTask线程。

void Ssd1306TestTask(void* arg)
{
    (void) arg;
    //先初始化引脚
    IoTGpioInit(HI_IO_NAME_GPIO_13);
    IoTGpioInit(HI_IO_NAME_GPIO_14);

    //将引脚功能设置为I2C引脚
    hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA);
    hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL);

    //初始化I2C0
    IoTI2cInit(0, OLED_I2C_BAUDRATE);

    //WatchDogDisable();

    usleep(20*1000);
    //初始化SSD1306
    ssd1306_Init();
    //全部清空
    ssd1306_Fill(Black);
    ssd1306_SetCursor(0, 0);
    //显示 Hello HarmonyOS!
    ssd1306_DrawString("Hello HarmonyOS!", Font_7x10, White);

    uint32_t start = HAL_GetTick();
    ssd1306_UpdateScreen();
    uint32_t end = HAL_GetTick();
    printf("ssd1306_UpdateScreen time cost: %d ms.\r\n", end - start);

    TestDrawChinese1();
    TestDrawChinese2();

    TestGetTick();
    while (1) {
        //进行所有用例测试
        ssd1306_TestAll();
        usleep(10000);
    }
}

 

(2)I2C发送函数

我们要操作OLED屏幕,就需要使用I2C发送数据给OLED屏幕,代码使用

ssd1306_SendData函数发送I2C数据,该函数原型如下,直接调用的hi3861的i2c接口函数:

static uint32_t ssd1306_SendData(uint8_t* data, size_t size)
{
    int id = SSD1306_I2C_IDX;

    return IoTI2cWrite(id, SSD1306_I2C_ADDR, data, size);
}

 

(3)修改 usr_config.mk文件

注意,默认代码是没有打开i2c功能的,直接编译会提示相关的i2c函数没有定义,我们需要打开i2c的功能,具体是修改usr_config.mk文件 ,目前版本(3.1)的路径是:

device\soc\hisilicon\hi3861v100\sdk_liteos\build\config\usr_config.mk

但是代码结构可能会调整,路径可能会变。

增加 CONFIG_I2C_SUPPORT=y

  OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕-鸿蒙开发者社区

 

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2022-1-21 16:33:13修改
17
收藏 21
回复
举报
17条回复
按时间正序
/
按时间倒序
鸿蒙开发者社区官方账号
鸿蒙开发者社区官方账号

这个值得推一推哦。

回复
2020-10-3 13:08:34
Wxueyan
Wxueyan

全网首发,👍

回复
2020-10-3 13:08:52
鲜橙加冰
鲜橙加冰

国庆强档。。。。

回复
2020-10-3 13:12:37
老克
老克

学习了

回复
2020-10-3 13:13:44
码工许师傅
码工许师傅

连老师,你这个调用的是LiteOS接口,hi_ 开头的接口是 LiteOS 内核API,不是鸿蒙系统接口

我移植了一个鸿蒙的 SSD1306驱动:https://github.com/xusiwei/harmonyos-ssd1306

已于2020-10-3 17:11:58修改
3
回复
2020-10-3 13:41:58
HiHope
HiHope

官方淘宝店铺:【润和芯片社区HopeRun】

 

 HiSpark开发套件购买链接:
  ① HarmonyOS HiSpark AI Camera开发套件 (Hi3516DV300)    

https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-18447093278.18.46a24c57weAWXH&id=622922688823

  ② HarmonyOS HiSpark IPC DIY开发套件 (Hi3518EV300)  

https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-18447093278.21.46a24c57weAWXH&id=623376454933

  ③ HarmonyOS HiSpark Wi-Fi IoT智能家居开发套件 (Hi3861V100)     

 https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-18447093278.24.46a24c57weAWXH&id=622343426064

 

已于2020-10-3 16:39:43修改
回复
2020-10-3 13:50:21
连志安
连志安 回复了 码工许师傅
连老师,你这个调用的是LiteOS接口,hi_ 开头的接口是 LiteOS 内核API,不是鸿蒙系统接口 我移植了一个鸿蒙的 SSD1306驱动:https://github.com/xusiwei/harmonyos-ssd1306

感谢指正哈,多多交流~~~~我修改一下

回复
2020-10-3 14:31:58
码工许师傅
码工许师傅 回复了 连志安
感谢指正哈,多多交流~~~~我修改一下

文中描述的也没啥毛病,Hi3861平台是微控制器,本身代码都是编译到一起的,可以直接调用LiteOS内核接口。

已于2020-10-3 15:25:06修改
回复
2020-10-3 15:24:41
knmb99
knmb99

可以显示中文吗?

回复
2020-10-28 11:43:27
连志安
连志安 回复了 knmb99
可以显示中文吗?

中文的函数我没写,可以参考许思维老师的代码: https://harmonyos.51cto.com/posts/1148

回复
2020-10-28 11:58:35
knmb99
knmb99 回复了 连志安
中文的函数我没写,可以参考许思维老师的代码: https://harmonyos.51cto.com/posts/1148

您微信是多少呢?想请教您这个开发板怎么通过wifi UDP给机器人发送指令

回复
2020-10-28 14:40:22
连志安
连志安 回复了 knmb99
您微信是多少呢?想请教您这个开发板怎么通过wifi UDP给机器人发送指令

自己写个udp程序就可以,socket接口的

回复
2020-10-28 14:41:57
董昱
董昱

连老师,您好!请问初始化I2C引脚的代码可以不修改么?为什么我看到许多Demo没有修改这段代码也能够驱动OLED呢?

回复
2021-9-7 12:34:20
董昱
董昱 回复了 董昱
连老师,您好!请问初始化I2C引脚的代码可以不修改么?为什么我看到许多Demo没有修改这段代码也能够驱动OLED呢?

刚问完我自己解决了!

原来有的demo把初始化I2C引脚的代码直接写道ssd1306.c里面了。

 

老师解决了我的大问题,谢谢!

回复
2021-9-7 12:39:46
wx590726886001f
wx590726886001f

老师您好,请问在oled_demo.c里面是哪条语句把i2c引脚定义调用来的,也就是app_io_in it.c里面那个io_set_func是怎么调用到demo.c里的

回复
2021-9-11 17:25:22
wx61b241d809116
wx61b241d809116

老师您好,编译成功了 也烧录成功了 屏幕怎么没反应也不亮可能是什么原因呢

回复
2021-12-12 22:58:53
wx64831c0048677
wx64831c0048677

老师,请问,我把openharmony 3.2release 移植到rk3568的开发板上,用hdmi接入了一个分辨率1280X800的显示器上,开机logo亮后显示no support 


回复
2023-10-27 10:37:55
回复
    相关推荐