趁着热劲直接将以应用方式驱动OLED模块做个小结(稍后再将以应用方式点灯的过程总结一下,并将与python/内核模块方式等点灯操作作个比较总结)。总所周知(岂马在我的认知里),在嵌入式世界里使用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对应的头文件
前期工作确定了以后,接下来的任务就是以工程方式组织对应的文件,如图5所示,其中图5中红色框中的内容是编译对应生成的文件。
图5 工程目录
#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(); //初始化oled
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); //测试6*8字符
OLED_ShowStr(0, 3, (unsigned char *)"Welcome to", 1); //测试6*8字符
OLED_ShowStr(0, 4, (unsigned char *)"Loongson world!", 2); //测试8*16字符
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(); //清屏
//OLED_DrawBMP(0, 0, 128, 8, (unsigned char *)BMP1); //测试BMP位图显示
//sleep(1);
//OLED_CLS(); //清屏
}
close(fd);
}
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蜂鸟板中,执行操作演示如下视频所示。
更多回帖