OpenHarmony Neptune開發(fā)板I2C驅(qū)動OLED屏幕顯示
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
由于Neptune開發(fā)板openharmony SDK版本的更新,我發(fā)現(xiàn)在之前示例代碼中驅(qū)動OLED屏幕顯示以在現(xiàn)版本中無法使用,故此修改示例代碼以支持對當(dāng)前版本(openharmony V1.1.0 LTS)IoT接口使用I2C驅(qū)動OLED屏幕顯示,并把修改代碼和調(diào)試過程中出現(xiàn)的一些問題在做說明。
1.環(huán)境準(zhǔn)備
1.1 開發(fā)環(huán)境、編譯環(huán)境搭建,參考官方文檔,參考鏈接如下:
1.2 Neptune開發(fā)板 openharmony V1.1.0 LTS 版本獲取:
- git clone https://gitee.com/hihopeorg_group/neptune-harmony-os1.1-iot.git
2.材料準(zhǔn)備
- Neptune HarmonyOS物聯(lián)網(wǎng) IOT模組
- 0.96寸OLED顯示屏(SSD1306)
- 杜邦線若干
3.開發(fā)調(diào)試
3.1 IoT相關(guān)基礎(chǔ)知識介紹
openHarmony IoT硬件子系統(tǒng)提供了一些外設(shè)相關(guān)的接口,目錄位于:
- base/iot_hardware/peripheral/interfaces/kits
I2C相關(guān)接口,接口頭文件為iot_i2c.h,其中I2C寫入函數(shù)接口為:
- unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen)
3.2 獲取HiHope官方Neptune開發(fā)板OLED示例程序
3.3將OLED示例程序復(fù)制到 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函數(shù)->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初始化函數(shù)->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開發(fā)板中
(BUG) 將固件燒錄到開發(fā)板后按RST鍵后串口返回應(yīng)答錯誤命令, OLED屏無顯示。
4、問題解決方案
4.1、分析問題:
由于我們使用的是IOT接口的I2C驅(qū)動,考慮到串口返回ACK錯誤的情況,可能會是I2C連續(xù)寫入時序問題.........................
4.2、找到問題原因:
使用邏輯分析儀分析I2C信號,發(fā)現(xiàn)I2C連續(xù)寫入時序問題,由于I2C連續(xù)寫入過快,沒有適當(dāng)延時造成ACK應(yīng)答錯誤,此圖邏輯分析儀捕獲I2C信號:

4.3、解決問題:
修改I2cWiteByte函數(shù):
- 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); //此函數(shù)大概延時2ms
- }
修改WriteCmd與WriteData函數(shù):
- 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開發(fā)板中
OLED能正常顯示,串口無異常情況產(chǎn)生。

5、總結(jié)
以上,完成一個基于openharmony V1.1.0 LTS 版本 Neptune開發(fā)板I2C驅(qū)動OLED屏幕顯示示例代碼的修改以完成,對于其中所產(chǎn)生的一些問題做了解決,同時還發(fā)現(xiàn)一些問題,例如延時函數(shù)時間過長,使OLED屏幕刷新過慢,在一定條件下顯示不流暢,對此產(chǎn)生的問題我將延時函數(shù)以降至us級別,達到流暢顯示的目的。限于篇幅,延時函數(shù)就不介紹了,還沒整理先在gitte新建一個庫,后續(xù)會把代碼上傳gitte地址
以下是本次修改的代碼:
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)