rk3328点spi-oled屏(单色OLED)

2024-05-13 19:08
文章标签 oled spi 单色 rk3328

本文主要是介绍rk3328点spi-oled屏(单色OLED),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍:spi-单色oled  IC=sh1106 分辨率128x64

1:DTS

&spi0{status = "okay";//max-freq = <1200000>;//dma-name = "tx","rx";  //enable dmapinctrl-names = "default";pinctrl-0 = <&spi0m2_clk &spi0m2_cs0 &spi0m2_tx &spi0m2_rx>;st7789v@0 {status = "disabled"; //status = "okay";compatible = "sitronix,st7789v";reg = <0>;spi-max-frequency = <32000000>;           bgr;fps = <30>;rotate = <90>;buswidth = <8>; dc-gpios = <&gpio3 RK_PA5 GPIO_ACTIVE_HIGH>;  /* gpio3 A5 */reset-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; /* gpio3 A6 */led-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>;  /* gpio3 A4 */ //注意背光io集性          debug = <0>; //等级0~7 越高信息越多};sh1106@0 {status = "okay";compatible = "sinowealth,sh1106";reg = <0>;	spi-max-frequency = <12000000>;           bgr;fps = <30>;//rotate = <90>;buswidth = <8>; dc-gpios = <&gpio3 RK_PA5 GPIO_ACTIVE_HIGH>;  /* gpio3 A5 */reset-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; /* gpio3 A6 */led-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>;  /* gpio3 A4 */ //注意背光io集性          debug = <0>; //等级0~7 越高信息越多}; };

2:C-code  linux自带 没有动

// SPDX-License-Identifier: GPL-2.0+
/** FB driver for the SH1106 OLED Controller* Based on the SSD1306 driver by Noralf Tronnes** Copyright (C) 2017 Heiner Kallweit*/#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gpio/consumer.h>
#include <linux/delay.h>#include "fbtft.h"#define DRVNAME		"fb_sh1106"
#define WIDTH		128
#define HEIGHT		64/* Init sequence based on the Adafruit SSD1306 Arduino library */
static int init_display(struct fbtft_par *par)
{if (!par->info->var.xres || par->info->var.xres > WIDTH ||!par->info->var.yres || par->info->var.yres > HEIGHT ||par->info->var.yres % 8) {dev_err(par->info->device, "Invalid screen size\n");return -EINVAL;}if (par->info->var.rotate) {dev_err(par->info->device, "Display rotation not supported\n");return -EINVAL;}par->fbtftops.reset(par);/* Set Display OFF */write_reg(par, 0xAE);/* Set Display Clock Divide Ratio/ Oscillator Frequency */write_reg(par, 0xD5, 0x80);/* Set Multiplex Ratio */write_reg(par, 0xA8, par->info->var.yres - 1);/* Set Display Offset */write_reg(par, 0xD3, 0x00);/* Set Display Start Line */write_reg(par, 0x40 | 0x0);/* Set Segment Re-map *//* column address 127 is mapped to SEG0 */write_reg(par, 0xA0 | 0x1);/* Set COM Output Scan Direction *//* remapped mode. Scan from COM[N-1] to COM0 */write_reg(par, 0xC8);/* Set COM Pins Hardware Configuration */if (par->info->var.yres == 64)/* A[4]=1b, Alternative COM pin configuration */write_reg(par, 0xDA, 0x12);else if (par->info->var.yres == 48)/* A[4]=1b, Alternative COM pin configuration */write_reg(par, 0xDA, 0x12);else/* A[4]=0b, Sequential COM pin configuration */write_reg(par, 0xDA, 0x02);/* Set Pre-charge Period */write_reg(par, 0xD9, 0xF1);/* Set VCOMH Deselect Level */write_reg(par, 0xDB, 0x40);/* Set Display ON */write_reg(par, 0xAF);msleep(150);return 0;
}static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye)
{
}static int blank(struct fbtft_par *par, bool on)
{fbtft_par_dbg(DEBUG_BLANK, par, "(%s=%s)\n",__func__, on ? "true" : "false");write_reg(par, on ? 0xAE : 0xAF);return 0;
}/* Gamma is used to control Contrast */
static int set_gamma(struct fbtft_par *par, u32 *curves)
{/* apply mask */curves[0] &= 0xFF;/* Set Contrast Control for BANK0 */write_reg(par, 0x81, curves[0]);return 0;
}static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
{u16 *vmem16 = (u16 *)par->info->screen_buffer;u32 xres = par->info->var.xres;int page, page_start, page_end, x, i, ret;u8 *buf = par->txbuf.buf;/* offset refers to vmem with 2 bytes element size */page_start = offset / (8 * 2 * xres);page_end = DIV_ROUND_UP(offset + len, 8 * 2 * xres);for (page = page_start; page < page_end; page++) {/* set page and set column to 2 because of vidmem width 132 */write_reg(par, 0xb0 | page, 0x00 | 2, 0x10 | 0);memset(buf, 0, xres);for (x = 0; x < xres; x++)for (i = 0; i < 8; i++)if (vmem16[(page * 8 + i) * xres + x])buf[x] |= BIT(i);/* Write data */ret = fbtft_write_buf_dc(par, buf, xres, 1);if (ret < 0)return ret;}return 0;
}static void write_register(struct fbtft_par *par, int len, ...)
{va_list args;int i;va_start(args, len);for (i = 0; i < len; i++)par->buf[i] = va_arg(args, unsigned int);/* keep DC low for all command bytes to transfer */fbtft_write_buf_dc(par, par->buf, len, 0);va_end(args);
}static struct fbtft_display display = {.regwidth = 8,.width = WIDTH,.height = HEIGHT,.txbuflen = WIDTH,.gamma_num = 1,.gamma_len = 1,/* set default contrast to 0xcd = 80% */.gamma = "cd",.fbtftops = {.write_vmem = write_vmem,.write_register = write_register,.init_display = init_display,.set_addr_win = set_addr_win,.blank = blank,.set_gamma = set_gamma,},
};FBTFT_REGISTER_DRIVER(DRVNAME, "sinowealth,sh1106", &display);MODULE_ALIAS("spi:" DRVNAME);
MODULE_ALIAS("platform:" DRVNAME);
MODULE_ALIAS("spi:sh1106");
MODULE_ALIAS("platform:sh1106");MODULE_DESCRIPTION("SH1106 OLED Driver");
MODULE_AUTHOR("Heiner Kallweit");
MODULE_LICENSE("GPL");

sh1106加载OK

 

点亮效果--屏为单色OLED 所有只是白色!

 

这篇关于rk3328点spi-oled屏(单色OLED)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986571

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

stm32之软件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 SPI通信模块3.2 W25Q64模块3.3 主程序 前言 提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者 本案例使用软件SPI通信的方式实现了STM32与W25Q64 Flas

Flink1.10基于工厂模式的任务提交与SPI机制

《2021年最新版大数据面试题全面开启更新》 Flink任务执行模式包含了yarn-session、standalone、per-job、local, 在1.10中又增加k8s的执行模式,那么在任务提交过程中如何根据不同的执行模式进行任务提交呢?主要通过两个接口来实现:PipelineExecutorFactory 与 PipelineExecutor。PipelineExecutorF

转载 SPI的比喻理解

SPI 传输是一个虚拟的移位寄存器方式。 你这么理解就可以: 主机和从机之间有一条 16 格的传送带。主机一格一格拨动它转动(相当于发送时钟)。 如果是主机发送,它就把一个个的东西放在传送带上,转动 8 次,就传到从机一侧了。这时,从机可以从传送带上将东西取下。如果从机没有取东西,这些东西再转 8 次又回到主机一侧。 如果是主机接收,从机就要把 8 个东西一次放上传送带。当主机转动 8 次,东西就

STM32+DHT11+OLED显示

前言 使用STM32和DHT11温湿度传感器对环境进行的温湿度进行监测,将监测到的数据通过OLED进行显示。 一、前期准备 软件环境:Keil5 硬件设备:STM32F103ZET6、四针OLED显示屏、温湿度传感器DHT11、ST-Link仿真器 二、接线表 STM32ST-LINKOLEDDHT113V33.3VSWOSWDIOSWCLKSWCLKGNDGNDPB6SDAPB7SC

【STM32+HAL库】---- 硬件IIC驱动0.96OLED

硬件开发板:STM32G0B1RET6软件平台:cubemax+keil+VScode 内容原著声明 代码借鉴学习于以下文章: STM32 使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库) 1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置引脚 1.3 导出工程 略… 2 代码 2.1 OLED_IIC_Config.h /*** **

江协科技STM32学习- P9 OLED调试工具

🚀write in front🚀   🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​  💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚  🚀Projeet source code🚀    💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan

【嵌入式学习笔记】---- OLED屏幕工作原理

1 驱动芯片SSD1603简介 1.1 SSD1603芯片图 SSD1603是一款点阵显示屏控制器,可嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务驱动接口:128个SEG引脚和64个COM引脚,对应 128 × 64 128\times 64 128×64像素点阵显示屏内置显示存储器(GDDRAM): 128 × 64 B i t (或 128 × 64 B y t e ) S

集成电路学习:什么是OLED有机发光二极管

一、OLED:有机发光二极管         OLED,全称有机发光二极管(Organic Light-Emitting Diode),是一种电流型的有机发光器件。以下是关于OLED的详细介绍: 二、OLED的定义与原理         OLED是基于有机半导体材料和发光材料在电场驱动下的载流子注入与复合导致的发光现象。具体来说,在外加驱动电压的作用下,电子从阴极注入,而空穴(正电荷

Java SPI机制源码

文章目录 SPI简介使用案例SPI的应用SPI机制源码SPI与类加载器双亲委派机制 SPI简介 Java的SPI(Service Provider Interface)机制允许第三方为应用程序提供插件式的扩展,而不需要修改应用程序本身的代码,从而实现了解耦。Java标准库本身就提供了SPI机制,通常是通过在META-INF/services目录下放置文件来实现的。 S