一、前言
最近想用 3861 做個(gè)有意思的東西,記錄一下開(kāi)發(fā)過(guò)程。今天使用 3861 的硬件 i2c 驅(qū)動(dòng) oled。
硬件平臺(tái):Bearpi-Nano
軟件SDK:潤(rùn)和sdk

二、搬一個(gè) OLED 輪子
我之前寫(xiě)過(guò)一篇基于 stm32cubemx 快速使用 iic 接口 oled 的過(guò)程,里面有現(xiàn)成的 oled 接口,我們只要直接拿過(guò)來(lái)替換掉底層接口就行。
?STM32CubeMX驅(qū)動(dòng)4腳OLED模塊
替換的接口位置如下位置:
三、Hi3861 i2c 接口
SDK提供了兩層接口封裝,一層是芯片級(jí)的 driver 驅(qū)動(dòng),由原廠sdk提供:
另一層 open Harmony 級(jí)的驅(qū)動(dòng),是操作系統(tǒng)對(duì)原廠sdk的封裝,主要為了兼容不同芯片開(kāi)發(fā):
原廠的 driver 接口更加細(xì)致,系統(tǒng)層的driver其實(shí)就是對(duì)原廠的一層封裝,簡(jiǎn)單開(kāi)發(fā)可以直接使用系統(tǒng)提供的driver接口,復(fù)雜開(kāi)發(fā)則推薦研究一下原廠的接口,因?yàn)閟dk不是很完善,不符合需求的可以直接改原廠的sdk。
我們簡(jiǎn)單驅(qū)動(dòng)個(gè)i2c,使用系統(tǒng)封裝的接口:
unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate); unsigned int IoTI2cDeinit(unsigned int id); unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen); unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate); |
用上面的讀寫(xiě)接口替換掉 oled 輪子里面的 i2c 接口

四、使用驅(qū)動(dòng)代碼
在主函數(shù)中創(chuàng)建一個(gè)線程,調(diào)用 i2c、oled初始化接口,將初始化代碼注冊(cè)到系統(tǒng)運(yùn)行回調(diào)中
#include <unistd.h> #include "stdio.h" #include "ohos_init.h" #include "cmsis_os2.h" #include "hi_io.h" #include "hi_i2c.h" #include "iot_errno.h" #include "iot_i2c.h" #include "iot_gpio.h" #define OLED_I2C_BAUDRATE 400000 static void iot_i2c_init(void) { ? ? IoTGpioInit(HI_IO_NAME_GPIO_0); ? ? IoTGpioInit(HI_IO_NAME_GPIO_1); ? ? //將引腳功能設(shè)置為 I2C 引腳 ? ? hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_I2C1_SDA); ? ? hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_I2C1_SCL); ? ? //初始化 I2C0 ? ? uint32_t ret = IoTI2cInit(HI_I2C_IDX_1, OLED_I2C_BAUDRATE); ? ? if (ret != IOT_SUCCESS) { ? ? ? ? printf("[OLED_TASK] Init i2c Fail. ret = %d\n", ret); ? ? } ? ? printf("[OLED_TASK] Init i2c succ.\n"); } void oled_i2c_init(void) { ? ? iot_i2c_init(); ? ? OLED_Init(); ? ? OLED_Clear(); } void *oled_demo(const char *arg) { ? ? (void)arg; ? ? char i = 0; ? ? char dat[10] = { 0 }; ? ? oled_i2c_init(); ? ? while (1) { ? ? ? ? printf("[OLED_TASK] i = %d!\n", i); ? ? ? ? OLED_ShowNum(10, 10, i++, 1, 8); ? ? ? ? osDelay(100); ? ? } } void oled_demo_init(void) { ? ? osThreadAttr_t attr; ? ? attr.name = "OLED_Task"; ? ? attr.attr_bits = 0U; ? ? attr.cb_mem = NULL; ? ? attr.cb_size = 0U; ? ? attr.stack_mem = NULL; ? ? attr.stack_size = 2048; ? ? attr.priority = 26; ? ? if (osThreadNew((osThreadFunc_t)oled_demo, NULL, &attr) == NULL) { ? ? ? ? printf("[OLED_TASK] Falied to create OLED_TASK!\n"); ? ? } } SYS_RUN(oled_demo_init); |
編譯后通過(guò) uart 下載代碼
hb build -f文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-422989.html

五、調(diào)試現(xiàn)象
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422989.html
到了這里,關(guān)于Hi3861 硬件 i2c 驅(qū)動(dòng) oled的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!