OpenHarmony Neptune开发板I2C驱动OLED屏幕显示 原创 精华

远道可思
发布于 2021-8-31 15:32
浏览
11收藏

前言:

    由于Neptune开发板openharmony SDK版本的更新,我发现在之前示例代码中驱动OLED屏幕显示以在现版本中无法使用,故此修改示例代码以支持对当前版本(openharmony V1.1.0 LTS)IoT接口使用I2C驱动OLED屏幕显示,并把修改代码和调试过程中出现的一些问题在做说明。

 

1.环境准备

1.1 开发环境、编译环境搭建,参考官方文档,参考链接如下:

 Neptune开发板的环境搭建及使用

1.2 Neptune开发板 openharmony V1.1.0 LTS 版本获取:

git clone https://gitee.com/hihopeorg_group/neptune-harmony-os1.1-iot.git

2.材料准备

1、Neptune HarmonyOS物联网 IOT模组

2、0.96寸OLED显示屏(SSD1306)

3、杜邦线若干

 

3.开发调试

3.1 IoT相关基础知识介绍

openHarmony IoT硬件子系统提供了一些外设相关的接口,目录位于:

base/iot_hardware/peripheral/interfaces/kits

I2C相关接口,接口头文件为iot_i2c.h,其中I2C写入函数接口为:

unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen)

3.2 获取HiHope官方Neptune开发板OLED示例程序

Neptune开发板OLED示例程序

3.3将OLED示例程序复制到 openharmony V1.1.0 LTS 版本SDK中

3.4 修改示例程序

1、修改头文件->oled_ssd1306.c

#include <stddef.h>
#include <stdio.h>
#include "oled_ssd1306.h"
#include "iot_i2c.h"
#include "iot_errno.h"
#include "oled_fonts.h"

2、修改OLED_I2C_IDX定义->oled_ssd1306.c

#define OLED_I2C_IDX  0

3、修改I2cWiteByte函数->oled_ssd1306.c

static uint32_t I2cWiteByte(uint8_t regAddr, uint8_t byte)
{
     uint8_t buffer[] = {regAddr, byte};
     return IoTI2cWrite(0,OLED_I2C_ADDR,buffer,sizeof(buffer));
}

4、修改IIC初始化函数->oled_ssd1306.c

IoTI2cInit(OLED_I2C_IDX, OLED_I2C_BAUDRATE);

5、将WIFI_IOT_SUCCESS修改为IOT_SUCCESS

6.修改头文件->oled_demo.c

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "oled_ssd1306.h"

7.修改BUILD.gn

static_library("oled_sample") {
    sources = [
        "oled_demo.c", 
        "oled_ssd1306.c",
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/kal/cmsis",
        "//base/iot_hardware/peripheral/interfaces/kits",
    ]
}

3.5、编译将固件烧录到Neptune开发板中

(BUG) 将固件烧录到开发板后按RST键后串口返回应答错误命令, OLED屏无显示。

4、问题解决方案

4.1、分析问题:

    由于我们使用的是IOT接口的I2C驱动,考虑到串口返回ACK错误的情况,可能会是I2C连续写入时序问题.........................

4.2、找到问题原因:

  使用逻辑分析仪分析I2C信号,发现I2C连续写入时序问题,由于I2C连续写入过快,没有适当延时造成ACK应答错误,此图逻辑分析仪捕获I2C信号:

OpenHarmony Neptune开发板I2C驱动OLED屏幕显示-鸿蒙开发者社区4.3、解决问题:

  修改I2cWiteByte函数:

static uint32_t I2cWiteByte(uint8_t regAddr, uint8_t byte)
{
     uint8_t buffer[] = {regAddr, byte};
     IoTI2cWrite(0,OLED_I2C_ADDR,buffer,sizeof(buffer));
     tls_os_time_delay(1);    //此函数大概延时2ms
}

 修改WriteCmd与WriteData函数:

static uint32_t WriteCmd(uint8_t cmd)
{
    I2cWiteByte(OLED_I2C_CMD, cmd);
}

static uint32_t WriteData(uint8_t data)
{
	I2cWiteByte(OLED_I2C_DATA, data);
}

4.4、编译将固件烧录到Neptune开发板中

           OLED能正常显示,串口无异常情况产生。

OpenHarmony Neptune开发板I2C驱动OLED屏幕显示-鸿蒙开发者社区

 

   

5、总结

        以上,完成一个基于openharmony V1.1.0 LTS 版本 Neptune开发板I2C驱动OLED屏幕显示示例代码的修改以完成,对于其中所产生的一些问题做了解决,同时还发现一些问题,例如延时函数时间过长,使OLED屏幕刷新过慢,在一定条件下显示不流畅,对此产生的问题我将延时函数以降至us级别,达到流畅显示的目的。限于篇幅,延时函数就不介绍了,还没整理先在gitte新建一个库,后续会把代码上传gitte地址

     以下是本次修改的代码

 

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
oled_sample.rar 9.34K 51次下载
已于2021-8-31 15:32:13修改
10
收藏 11
回复
举报
11条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

大佬的干货来了,赶快坐下学习一波

1
回复
2021-8-31 15:44:07
Der_带鱼
Der_带鱼

坐下学习!

1
回复
2021-9-2 19:58:56
ltkk12334
ltkk12334

非常收益,学习到了很多东西

回复
2021-9-3 21:29:50
txwtech
txwtech

请问鸿蒙开发板hi3861有中断引脚吗?

回复
2021-9-21 21:36:13
-_青艺丶梦之城。1?
-_青艺丶梦之城。1?

这个作业怎么抄?

 

回复
2021-9-24 23:57:51
远道可思
远道可思 回复了 -_青艺丶梦之城。1?
这个作业怎么抄?

怎么说?是不知道如何编译进开发板吗?还是其他问题?

回复
2021-9-25 00:27:13
-_青艺丶梦之城。1?
-_青艺丶梦之城。1?

编译的时候报了点错误 ,我在gitee上发了,,然后找到了润和发的一个案例代码 抄了过来 能跑了......我是在deveco tool 上下的代码

 

回复
2021-9-25 17:13:35
-_青艺丶梦之城。1?
-_青艺丶梦之城。1?

来来来 让我再看看你有没有ADC的作业能抄抄,实在是不会写,,,,,,

回复
2021-9-25 17:14:42
远道可思
远道可思 回复了 -_青艺丶梦之城。1?
来来来 让我再看看你有没有ADC的作业能抄抄,实在是不会写,,,,,,

 ADC只有两个,且它只能测量0~2.4伏的电压,如果需要进行更大的电压测量,需要使用高精度的电阻进行分压来进行测量,使用W800 内置的ADC 函数就行了

1
回复
2021-9-25 18:18:18
爱吃土豆丝的打工人
爱吃土豆丝的打工人

讲的很清楚,学习~

1
回复
2021-9-26 09:23:08
-_青艺丶梦之城。1?
-_青艺丶梦之城。1? 回复了 远道可思
ADC只有两个,且它只能测量0~2.4伏的电压,如果需要进行更大的电压测量,需要使用高精度的电阻进行分压来进行测量,使用W800 内置的ADC 函数就行了

他的精度怎么样就是能到0.000……V?我看了adc的示例代码了,因为只有几行,没有具体的案例,然后我就不知道接口啥的到底,,怎么用,看小熊的代码 中软的有的还是不太一样,润和的教程我又看的蒙蒙的.唉~

回复
2021-9-26 10:47:19
回复
    相关推荐