XR806硬件上支持SPI,I2C等其他外设接口,且DDR和FLASH,满足常见应用场景的开发,适合开发者方案进行评估、DIY或小规模产品研究使用。本篇文章,将使用到I2C接口,去控制OLED屏幕的显示。
OLED屏幕规格: 0.96英寸主控SSD1306 I2C接口地址0x3C
XR806外设:I2C1
创建工程
参考device/xradio/xr806/ohosdemo目录下的wlan_demo,
复制wlan_demo为xr806_oled,并同步修改ohosdemo和xr806_oled目录下的BUILD.gn。
主要修改如下:
1、设备/xradio/xr806/ohosdemo/BUILD.gn
组(“ohosdemo”){
深度 = [
#“hello_demo:app_hello”,
#“iot_peripheral:app_peripheral”,
#“wlan_demo:app_WlanTest”,
“xr806_oled:app_oled”,#增加app_oled目标警告
]
}
2、设备/xradio/xr806/ohosdemo/xr806_oled/BUILD.gn
static_library(“app_oled”){
配置=[]
来源 = [
“main.c”,
]
cflags = board_cflags
include_dirs = board_include_dirs
include_dirs += [
“。”,
“第三方/ssd1306/ssd1306”,
“//utils/native/lite/include”,
“//foundation/communication/wifi_lite/interfaces/wifiservice”,
]
深度 = [
“第三方/ssd1306/ssd1306:oled_ssd1306”,
]
}
注意:
static_library代表生成动态库(.a)文件,其中包含main.c的头部但必须是app_打,如app_hello,否则可以编译成功,无法生效;
~~xr806_oled/BUILD.gn中海库app_oled的起源,需要和ohosdemo/BUILD.gn中的一致性;
thirdparty/ssd1306/ssd1306:oled_ssd1306 为依赖的开源库
工程编译
创建工程后,如果非首次编译,执行以下命令便可以编译:
建造
如果遇到以下错误:
[OHOS 错误] /*
[OHOS 错误] *
[OHOS ERROR] * 自动生成文件;不要编辑。
[OHOS ERROR] * XR806 SDK 配置
[OHOS 错误] *
[OHOS 错误]*/
[OHOS 错误] /*
[OHOS 错误] *
[OHOS ERROR] * 自动生成文件;不要编辑。
[OHOS ERROR] * XR806 SDK 配置
[OHOS 错误] *
[OHOS 错误]*/
[OHOS 错误]{
[OHOS ERROR]“魔法”:“AWIH”,
[OHOS ERROR]“版本”:“0.5”,
[OHOS ERROR]“图像”:{“max_size”:“1532K”},
[OHOS ERROR]“部分”:[
[OHOS ERROR] {“id”:“0xa5ff5a00”,“bin”:“boot_40M.bin”,“cert”:“null”,“flash_offs”:“0K”,“sram_offs”:“0x00230000”,“ep” : “0x00230101”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5fe5a01”,“bin”:“app.bin”,“cert”:“null”,“flash_offs”:“32K”,“sram_offs”:“0x00201000”,“ep” : “0x00201101”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5fd5a02”,“bin”:“app_xip.bin”,“cert”:“null”,“flash_offs”:“99K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x2”},
[OHOS ERROR] {“id”:“0xa5fa5a05”,“bin”:“wlan_bl.bin”,“cert”:“null”,“flash_offs”:“1170K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5f95a06”,“bin”:“wlan_fw.bin”,“cert”:“null”,“flash_offs”:“1173K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5f85a07”,“bin”:“sys_sdd_40M.bin”,“cert”:“null”,“flash_offs”:“1198K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS 错误] {}
[OHOS 错误] ]
[OHOS 错误] }
[OHOS 错误]
[OHOS ERROR] make[2]: *** [../../../../project/project.mk:520:image] 错误 255
[OHOS ERROR] make[2]:离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
[OHOS ERROR] make[1]: *** [../../../../project/project.mk:493:__build] 错误2
[OHOS ERROR] make[1]:离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
[OHOS ERROR] make: *** [Makefile:164:build] 错误 2
[OHOS ERROR]你可以在/home/algo/openharmony/xr806/out/xr806/wifi_skylark/build.log中查看构建日志
[OHOS ERROR] /home/algo/.local/bin/ninja -w dupbuild=warn -C /home/algo/openharmony/xr806/out/xr806/wifi_skylark 失败,返回码为1
执行以下命令后,再次放大:
cp设备/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image_auto_cal.cfg device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image.cfg
编译后生成的镜像,便可以烧录验证。
注:以上基础工程是基于wlan_demo,oled屏幕显示需要I2C外设和移植使用的库
库移植
实际上XR806制作了自带主控为SSD1306的驱动(采用SPI接口方式),移植基于I2C接口的库也相对简单,可以参考开源库Haronyos-ssd1306,将其中的I2C相关头文件和API替换为XR806 OpenHarmony中的相关头文件和API,编译通过了。
涉及到BUID.gn的修改如下:
static_library(“oled_ssd1306”){
来源 = [
“ssd1306.c”,
“ssd1306_fonts.c”,
]
include_dirs = [
“。”,
“//kernel/liteos_m/kernel/arch/include”,
“//utils/native/lite/include”,
“//base/iot_hardware/peripheral/interfaces/kits”,
]
}
开源库主要修改如下:
#include “iot_i2c.h”
#include “iot_errno.h”
/**
* @brief 定义 I2C 数据传输属性。
*/
类型定义结构{
/** 指向存储要发送数据的缓冲区的指针 */
无符号字符 *sendBuf;
/** 要发送的数据长度 */
无符号整数 sendLen;
/** 指向存放接收数据的缓冲区的指针 */
无符号字符 *receiveBuf;
/** 接收到的数据长度 */
无符号整数 receiveLen;
IotI2cData;
静态 uint32_t ssd1306_SendData(uint8_t* 数据, size_t 大小)
{
uint32_t id = SSD1306_I2C_IDX;
IotI2cData i2cData = {0};
i2cData.sendBuf = 数据;
i2cData.sendLen = 大小;
return IoTI2cWrite(id,SSD1306_I2C_ADDR,i2cData.sendBuf,i2cData.sendLen);
}
ssd1306.h头文件定义SSD1306_I2C_IDX为1
显示程序
程序部分参考了上面的OLED库,完整的测试程序,可以参考harmonyos-ssd1306里的例子。
/*
* 版权所有(c)2021-2031,AlgoIdeas
*
* SPDX-License-Identifier: Apache-2.0
*
* 更改日志:
* 日期作者注释
* 2020-12-13 AlgoIdeas 第一个版本
*/
#include 《stdio.h》
#include “ohos_init.h”
#include “kernel/os/os.h”
#include “ssd1306.h”
#define OLED_I2C_BAUDRATE 100000
静态 OS_Thread_t g_main_thread;
static void DrawChinese(void)
{
const uint32_t W = 12, H = 12, S = 16;
uint8_t 字体[][24] = {
{
/*-- ID:0,字符:“您”,ASCII编码:C4FA,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x14,0x00,0x24,0x00,0x2F,0xF0,0x71,0x20,0xA5,0x40,0x29,0x20,0x33,0x10,0x20,0x00,
0x54,0x40,0x52,0xA0,0x90,0x90,0x0F,0x80,
},{
/*-- ID:1,字符:“好”,ASCII编码:BAC3,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x20,0x00,0x27,0xE0,0x20,0x40,0xF8,0x80,0x48,0x80,0x48,0xA0,0x57,0xF0,0x50,0x80,
0x30,0x80,0x28,0x80,0x4A,0x80,0x81,0x00,
},{
/*-- ID:2,字符:“鸿”,ASCII编码:BAE8,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x00,0x40,0x80,0x80,0x5D,0xE0,0x09,0x20,0xC9,0xA0,0x09,0x60,0x29,0x00,0xCD,0xF0,
0x58,0x10,0x43,0xD0,0x40,0x10,0x40,0x60,
},{
/*-- ID:3,字符:“蒙”,ASCII编码:C3C9,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x09,0x00,0x7F,0xE0,0x09,0x00,0x7F,0xF0,0x80,0x10,0x7F,0xE0,0x0C,0x40,0x32,0x80,
0xC7,0x00,0x0A,0x80,0x32,0x70,0xC6,0x20
}
};
ssd1306_Fill(黑色);
对于(size_t i = 0; i 《 sizeof(字体)/sizeof(字体[0]); 我++){
ssd1306_DrawRegion(i * H + 32, 26, W, H, fonts[i], sizeof(fonts[0]), S);
}
ssd1306_UpdateScreen();
睡眠(1);
}
static void MainThread(void *arg)
{
IoTI2cInit(SSD1306_I2C_IDX,OLED_I2C_BAUDRATE);
使用睡眠(20*1000);
printf(“ssd1306_Init.n”);
ssd1306_Init();
ssd1306_Fill(黑色);
ssd1306_SetCursor(22, 27);
ssd1306_DrawString(“Hello XR806!”,Font_7x10,白色);
uint32_t start = HAL_GetTick();
ssd1306_UpdateScreen();
uint32_t end = HAL_GetTick();
printf(“ssd1306_UpdateScreen,时间成本:%d ms.n”,结束-开始);
usleep(2000*1000);
而(1) {
画中文();
}
}
void OledMain(void)
{
如果(OS_ThreadCreate(&g_main_thread, “MainThread”, MainThread, NULL,
OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
printf(“[ERR]创建主线程失败n”);
}
}
SYS_RUN(OledMain);
运行效果
最终OLED显示:您好鸿蒙
XR806硬件上支持SPI,I2C等其他外设接口,且DDR和FLASH,满足常见应用场景的开发,适合开发者方案进行评估、DIY或小规模产品研究使用。本篇文章,将使用到I2C接口,去控制OLED屏幕的显示。
OLED屏幕规格: 0.96英寸主控SSD1306 I2C接口地址0x3C
XR806外设:I2C1
创建工程
参考device/xradio/xr806/ohosdemo目录下的wlan_demo,
复制wlan_demo为xr806_oled,并同步修改ohosdemo和xr806_oled目录下的BUILD.gn。
主要修改如下:
1、设备/xradio/xr806/ohosdemo/BUILD.gn
组(“ohosdemo”){
深度 = [
#“hello_demo:app_hello”,
#“iot_peripheral:app_peripheral”,
#“wlan_demo:app_WlanTest”,
“xr806_oled:app_oled”,#增加app_oled目标警告
]
}
2、设备/xradio/xr806/ohosdemo/xr806_oled/BUILD.gn
static_library(“app_oled”){
配置=[]
来源 = [
“main.c”,
]
cflags = board_cflags
include_dirs = board_include_dirs
include_dirs += [
“。”,
“第三方/ssd1306/ssd1306”,
“//utils/native/lite/include”,
“//foundation/communication/wifi_lite/interfaces/wifiservice”,
]
深度 = [
“第三方/ssd1306/ssd1306:oled_ssd1306”,
]
}
注意:
static_library代表生成动态库(.a)文件,其中包含main.c的头部但必须是app_打,如app_hello,否则可以编译成功,无法生效;
~~xr806_oled/BUILD.gn中海库app_oled的起源,需要和ohosdemo/BUILD.gn中的一致性;
thirdparty/ssd1306/ssd1306:oled_ssd1306 为依赖的开源库
工程编译
创建工程后,如果非首次编译,执行以下命令便可以编译:
建造
如果遇到以下错误:
[OHOS 错误] /*
[OHOS 错误] *
[OHOS ERROR] * 自动生成文件;不要编辑。
[OHOS ERROR] * XR806 SDK 配置
[OHOS 错误] *
[OHOS 错误]*/
[OHOS 错误] /*
[OHOS 错误] *
[OHOS ERROR] * 自动生成文件;不要编辑。
[OHOS ERROR] * XR806 SDK 配置
[OHOS 错误] *
[OHOS 错误]*/
[OHOS 错误]{
[OHOS ERROR]“魔法”:“AWIH”,
[OHOS ERROR]“版本”:“0.5”,
[OHOS ERROR]“图像”:{“max_size”:“1532K”},
[OHOS ERROR]“部分”:[
[OHOS ERROR] {“id”:“0xa5ff5a00”,“bin”:“boot_40M.bin”,“cert”:“null”,“flash_offs”:“0K”,“sram_offs”:“0x00230000”,“ep” : “0x00230101”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5fe5a01”,“bin”:“app.bin”,“cert”:“null”,“flash_offs”:“32K”,“sram_offs”:“0x00201000”,“ep” : “0x00201101”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5fd5a02”,“bin”:“app_xip.bin”,“cert”:“null”,“flash_offs”:“99K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x2”},
[OHOS ERROR] {“id”:“0xa5fa5a05”,“bin”:“wlan_bl.bin”,“cert”:“null”,“flash_offs”:“1170K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5f95a06”,“bin”:“wlan_fw.bin”,“cert”:“null”,“flash_offs”:“1173K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS ERROR] {“id”:“0xa5f85a07”,“bin”:“sys_sdd_40M.bin”,“cert”:“null”,“flash_offs”:“1198K”,“sram_offs”:“0xffffffff”,“ep” : “0xffffffff”, “属性”:“0x1”},
[OHOS 错误] {}
[OHOS 错误] ]
[OHOS 错误] }
[OHOS 错误]
[OHOS ERROR] make[2]: *** [../../../../project/project.mk:520:image] 错误 255
[OHOS ERROR] make[2]:离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
[OHOS ERROR] make[1]: *** [../../../../project/project.mk:493:__build] 错误2
[OHOS ERROR] make[1]:离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
[OHOS ERROR] make: *** [Makefile:164:build] 错误 2
[OHOS ERROR]你可以在/home/algo/openharmony/xr806/out/xr806/wifi_skylark/build.log中查看构建日志
[OHOS ERROR] /home/algo/.local/bin/ninja -w dupbuild=warn -C /home/algo/openharmony/xr806/out/xr806/wifi_skylark 失败,返回码为1
执行以下命令后,再次放大:
cp设备/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image_auto_cal.cfg device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image.cfg
编译后生成的镜像,便可以烧录验证。
注:以上基础工程是基于wlan_demo,oled屏幕显示需要I2C外设和移植使用的库
库移植
实际上XR806制作了自带主控为SSD1306的驱动(采用SPI接口方式),移植基于I2C接口的库也相对简单,可以参考开源库Haronyos-ssd1306,将其中的I2C相关头文件和API替换为XR806 OpenHarmony中的相关头文件和API,编译通过了。
涉及到BUID.gn的修改如下:
static_library(“oled_ssd1306”){
来源 = [
“ssd1306.c”,
“ssd1306_fonts.c”,
]
include_dirs = [
“。”,
“//kernel/liteos_m/kernel/arch/include”,
“//utils/native/lite/include”,
“//base/iot_hardware/peripheral/interfaces/kits”,
]
}
开源库主要修改如下:
#include “iot_i2c.h”
#include “iot_errno.h”
/**
* @brief 定义 I2C 数据传输属性。
*/
类型定义结构{
/** 指向存储要发送数据的缓冲区的指针 */
无符号字符 *sendBuf;
/** 要发送的数据长度 */
无符号整数 sendLen;
/** 指向存放接收数据的缓冲区的指针 */
无符号字符 *receiveBuf;
/** 接收到的数据长度 */
无符号整数 receiveLen;
IotI2cData;
静态 uint32_t ssd1306_SendData(uint8_t* 数据, size_t 大小)
{
uint32_t id = SSD1306_I2C_IDX;
IotI2cData i2cData = {0};
i2cData.sendBuf = 数据;
i2cData.sendLen = 大小;
return IoTI2cWrite(id,SSD1306_I2C_ADDR,i2cData.sendBuf,i2cData.sendLen);
}
ssd1306.h头文件定义SSD1306_I2C_IDX为1
显示程序
程序部分参考了上面的OLED库,完整的测试程序,可以参考harmonyos-ssd1306里的例子。
/*
* 版权所有(c)2021-2031,AlgoIdeas
*
* SPDX-License-Identifier: Apache-2.0
*
* 更改日志:
* 日期作者注释
* 2020-12-13 AlgoIdeas 第一个版本
*/
#include 《stdio.h》
#include “ohos_init.h”
#include “kernel/os/os.h”
#include “ssd1306.h”
#define OLED_I2C_BAUDRATE 100000
静态 OS_Thread_t g_main_thread;
static void DrawChinese(void)
{
const uint32_t W = 12, H = 12, S = 16;
uint8_t 字体[][24] = {
{
/*-- ID:0,字符:“您”,ASCII编码:C4FA,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x14,0x00,0x24,0x00,0x2F,0xF0,0x71,0x20,0xA5,0x40,0x29,0x20,0x33,0x10,0x20,0x00,
0x54,0x40,0x52,0xA0,0x90,0x90,0x0F,0x80,
},{
/*-- ID:1,字符:“好”,ASCII编码:BAC3,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x20,0x00,0x27,0xE0,0x20,0x40,0xF8,0x80,0x48,0x80,0x48,0xA0,0x57,0xF0,0x50,0x80,
0x30,0x80,0x28,0x80,0x4A,0x80,0x81,0x00,
},{
/*-- ID:2,字符:“鸿”,ASCII编码:BAE8,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x00,0x40,0x80,0x80,0x5D,0xE0,0x09,0x20,0xC9,0xA0,0x09,0x60,0x29,0x00,0xCD,0xF0,
0x58,0x10,0x43,0xD0,0x40,0x10,0x40,0x60,
},{
/*-- ID:3,字符:“蒙”,ASCII编码:C3C9,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
0x09,0x00,0x7F,0xE0,0x09,0x00,0x7F,0xF0,0x80,0x10,0x7F,0xE0,0x0C,0x40,0x32,0x80,
0xC7,0x00,0x0A,0x80,0x32,0x70,0xC6,0x20
}
};
ssd1306_Fill(黑色);
对于(size_t i = 0; i 《 sizeof(字体)/sizeof(字体[0]); 我++){
ssd1306_DrawRegion(i * H + 32, 26, W, H, fonts[i], sizeof(fonts[0]), S);
}
ssd1306_UpdateScreen();
睡眠(1);
}
static void MainThread(void *arg)
{
IoTI2cInit(SSD1306_I2C_IDX,OLED_I2C_BAUDRATE);
使用睡眠(20*1000);
printf(“ssd1306_Init.n”);
ssd1306_Init();
ssd1306_Fill(黑色);
ssd1306_SetCursor(22, 27);
ssd1306_DrawString(“Hello XR806!”,Font_7x10,白色);
uint32_t start = HAL_GetTick();
ssd1306_UpdateScreen();
uint32_t end = HAL_GetTick();
printf(“ssd1306_UpdateScreen,时间成本:%d ms.n”,结束-开始);
usleep(2000*1000);
而(1) {
画中文();
}
}
void OledMain(void)
{
如果(OS_ThreadCreate(&g_main_thread, “MainThread”, MainThread, NULL,
OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
printf(“[ERR]创建主线程失败n”);
}
}
SYS_RUN(OledMain);
运行效果
最终OLED显示:您好鸿蒙
举报