OpenHarmony Neptune开发板I2C驱动OLED屏幕显示

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

[[422673]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

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

1.环境准备

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

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

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

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

2.材料准备

  • Neptune HarmonyOS物联网 IOT模组
  • 0.96寸OLED显示屏(SSD1306)
  • 杜邦线若干

3.开发调试

3.1 IoT相关基础知识介绍

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

  1. base/iot_hardware/peripheral/interfaces/kits 

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

  1. 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

  1. #include <stddef.h> 
  2. #include <stdio.h> 
  3. #include "oled_ssd1306.h" 
  4. #include "iot_i2c.h" 
  5. #include "iot_errno.h" 
  6. #include "oled_fonts.h" 

(2)修改OLED_I2C_IDX定义->oled_ssd1306.c

  1. #define OLED_I2C_IDX  0 

(3)修改I2cWiteByte函数->oled_ssd1306.c

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

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

  1. IoTI2cInit(OLED_I2C_IDX, OLED_I2C_BAUDRATE); 

(5)将WIFI_IOT_SUCCESS修改为IOT_SUCCESS

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

  1. #include <stdio.h> 
  2. #include <unistd.h> 
  3. #include "ohos_init.h" 
  4. #include "cmsis_os2.h" 
  5. #include "oled_ssd1306.h" 

 (7)修改BUILD.gn

  1. static_library("oled_sample") { 
  2.     sources = [ 
  3.         "oled_demo.c",  
  4.         "oled_ssd1306.c"
  5.     ] 
  6.  
  7.     include_dirs = [ 
  8.         "//utils/native/lite/include"
  9.         "//kernel/liteos_m/kal/cmsis"
  10.         "//base/iot_hardware/peripheral/interfaces/kits"
  11.     ] 

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

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

4、问题解决方案

4.1、分析问题:

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

4.2、找到问题原因:

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

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

4.3、解决问题:

修改I2cWiteByte函数:

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

 修改WriteCmd与WriteData函数:

  1. static uint32_t WriteCmd(uint8_t cmd) 
  2.     I2cWiteByte(OLED_I2C_CMD, cmd); 
  3.  
  4. static uint32_t WriteData(uint8_t data) 
  5.     I2cWiteByte(OLED_I2C_DATA, data); 

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

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

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

5、总结

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

以下是本次修改的代码:

oled_sample.rar

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-09-10 10:01:04

鸿蒙HarmonyOS应用

2021-09-13 10:03:35

鸿蒙HarmonyOS应用

2023-09-13 15:33:57

I2C鸿蒙

2021-10-11 14:14:42

鸿蒙HarmonyOS应用

2022-06-13 09:21:45

I2C DriverI2C 子系统

2022-04-01 15:54:01

DHCP网络协议开发板

2022-01-07 21:11:27

鸿蒙HarmonyOS应用

2023-04-07 09:14:31

硬件通信串口通信实验

2021-05-10 09:40:29

鸿蒙HarmonyOS应用

2022-10-14 15:55:24

环境搭建鸿蒙

2017-03-16 08:30:19

Android ThAndroidI2C

2017-08-11 18:25:25

Linuxi2c

2010-07-01 16:45:05

I2C总线协议

2010-06-08 16:25:35

I2C总线协议

2022-05-27 09:00:09

I2C子系统协议

2022-06-12 07:30:13

I3C通讯协议

2020-12-02 11:55:40

OLED

2022-03-03 19:21:50

Harmony鸿蒙操作系统

2021-01-19 19:32:01

Cortex-A9 R嵌入式系统i2c 外设
点赞
收藏

51CTO技术栈公众号