趁着热劲直接将以应用方式驱动OLED模块做个小结(稍后再将以应用方式点灯的过程总结一下,并将与python/内核模块方式等点灯操作作个比较总结)。总所周知(岂马在我的认知里),在嵌入式世界里使用I2C总线驱动器件一般是相对折磨人的事情,如果单纯想直接套用代码硬来移植,那么想必会劝退大部分初学者。如果想拿捏好I2C总线,个人的总结就是理解时序+使用示波器/逻辑分析仪,多多尝试,掌握好规律,就能轻松拿捏I2C移植部分了。
一. 确认I2C及地址
一般大家都不会从无到有的写I2C驱动代码的,我也是拿现成的来改,但是改之前先确认I2C总线地址要与代码的地址相一致。此次实验,将OLED模块连接到了I2C0接口上,而I2C0接口对应的引脚如图1所示,龙芯系统对应的I2C资源(如果龙芯系统占用了I2Cx资源,那么要么修改对应资源并重新编译内核,要么就是选择其他可用的接口资源)如图2所示,该接口对应的系统物理地址如图3所示。
图1 原理图I2C0位置
图2 龙芯系统开发的I2C资源
图3 系统中I2C0对应的地址
从上图3中可以看到与OLED连接后的I2C0地址为0x3C,这个就是代码中要修改的位置(如果连接到其它I2Cx接口,就用这个方式查找修改)。对应的代码一般就是OLED对应的头文件.h(与I2C接口连接的模块头文件),如图4所示。
图4 I2C0对应的头文件
二. 想要显示的内容
- 显示中文,可以通过字模软件进行修改,我这里直接用的是网站https://www.23bei.com/tool/218.html。
- 显示图像,可以通过image2Lcd软件。本来想显示图标,可惜没有成功(OLED不支持)。
三. 对应的文件
前期工作确定了以后,接下来的任务就是以工程方式组织对应的文件,如图5所示,其中图5中红色框中的内容是编译对应生成的文件。
图5 工程目录
- oled_app.h头文件:相应的OLED地址及函数声明
- oled_app.c文件:相应的OLED操作函数
- oled_code_table.c文件:相应的字模文件
- main文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
#include "oled_app.h"
extern int fd;
extern const unsigned char BMP1[];
int main(int argc, char *argv[])
{
int i = 0;
OLED_Init();
usleep(1000 * 100);
OLED_Fill(0xff);
while (1)
{
OLED_Fill(0xff);
sleep(1);
OLED_CLS();
sleep(1);
OLED_ShowStr(0, 0, (unsigned char *)"Bobbma", 2);
OLED_ShowStr(0, 3, (unsigned char *)"Welcome to", 1);
OLED_ShowStr(0, 4, (unsigned char *)"Loongson world!", 2);
sleep(1);
OLED_CLS();
for (i = 0; i < 4; i++)
{
OLED_ShowCN(22 + i * 16, 0, i);
}
for (i = 0; i < 7; i++)
{
OLED_ShowCN(i * 16, 3, i+4);
}
for (i = 0; i < 7; i++)
{
OLED_ShowCN(i * 16, 5, i+11);
}
sleep(1);
OLED_CLS();
}
close(fd);
}
- makefile文件
Target = oled_demo
ARCH = loongarch
CC = loongarch64-linux-gnu-gcc
build_dir = build_$(ARCH)
src_dir = sources
inc_dir = includes .
sources = $(foreach dir,$(src_dir),$(wildcard $(dir)/*.c))
objects = $(patsubst %.c,$(build_dir)/%.o,$(notdir $(sources)))
includes = $(foreach dir,$(inc_dir),$(wildcard $(dir)/*.h))
CFLAGS = $(patsubst %, -I%, $(inc_dir))
$(build_dir)/$(Target) : $(objects) | create_build
$(CC) $^ -o $@
$(build_dir)/%.o : $(src_dir)/%.c $(includes) | create_build
$(CC) -c $(CFLAGS) $< -o $@
.PHONY:clean cleanall check create_build
clean:
rm -rf $(build_dir)
cleanall:
rm -rf build_x86 build_arm
check:
[url=home.php?mod=space&uid=70594]@echo[/url] $(CFLAGS)
@echo $(CURDIR)
@echo $(src_dir)
@echo $(sources)
@echo $(objects)
create_build:
[url=home.php?mod=space&uid=2293869]@MKDIR[/url] -p $(build_dir)
三. 测试实验
将编译生成的文件拷贝到龙芯2K0300蜂鸟板中,执行操作演示如下视频所示。