龙芯技术社区
直播中

马博

13年用户 64经验值
擅长:操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟与电源 基础元器件 操作系统/软件 EDA/IC/PCB设计 微处理器/微控制 数字及可编程逻辑 模拟
私信 关注
[2K系列]

【龙芯2K0300蜂鸟板试用】第三篇 龙芯2K0300蜂鸟板--驱动OLED

趁着热劲直接将以应用方式驱动OLED模块做个小结(稍后再将以应用方式点灯的过程总结一下,并将与python/内核模块方式等点灯操作作个比较总结)。总所周知(岂马在我的认知里),在嵌入式世界里使用I2C总线驱动器件一般是相对折磨人的事情,如果单纯想直接套用代码硬来移植,那么想必会劝退大部分初学者。如果想拿捏好I2C总线,个人的总结就是理解时序+使用示波器/逻辑分析仪,多多尝试,掌握好规律,就能轻松拿捏I2C移植部分了。

一. 确认I2C及地址

一般大家都不会从无到有的写I2C驱动代码的,我也是拿现成的来改,但是改之前先确认I2C总线地址要与代码的地址相一致。此次实验,将OLED模块连接到了I2C0接口上,而I2C0接口对应的引脚如图1所示,龙芯系统对应的I2C资源(如果龙芯系统占用了I2Cx资源,那么要么修改对应资源并重新编译内核,要么就是选择其他可用的接口资源)如图2所示,该接口对应的系统物理地址如图3所示。
2.png
图1 原理图I2C0位置
4.png
图2 龙芯系统开发的I2C资源1.png
图3 系统中I2C0对应的地址

从上图3中可以看到与OLED连接后的I2C0地址为0x3C,这个就是代码中要修改的位置(如果连接到其它I2Cx接口,就用这个方式查找修改)。对应的代码一般就是OLED对应的头文件.h(与I2C接口连接的模块头文件),如图4所示。
3.png
图4 I2C0对应的头文件

二. 想要显示的内容

  1. 显示中文,可以通过字模软件进行修改,我这里直接用的是网站https://www.23bei.com/tool/218.html
  2. 显示图像,可以通过image2Lcd软件。本来想显示图标777.jpg,可惜没有成功(OLED不支持)。

三. 对应的文件

前期工作确定了以后,接下来的任务就是以工程方式组织对应的文件,如图5所示,其中图5中红色框中的内容是编译对应生成的文件。
6.png
图5 工程目录

  1. oled_app.h头文件:相应的OLED地址及函数声明
  2. oled_app.c文件:相应的OLED操作函数
  3. oled_code_table.c文件:相应的字模文件
  4. 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(); //初始化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);
}
  1. 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蜂鸟板中,执行操作演示如下视频所示。

驱动oled

回帖(1)

jf_38522704

2024-8-15 16:57:50
举报

更多回帖

发帖
×
20
完善资料,
赚取积分