当前位置: 首页 > wzjs >正文

广告设计公司的未来许昌网站优化

广告设计公司的未来,许昌网站优化,国人经典wordpress主题liveo,百度推广联系方式文章目录 参考资料:一、硬件1.1 原理图1.2 扩展板连接图 二、 OLED显示原理2.1 显存和像素2.2 显存寻址模式 三、OLED显示操作过程3.1 初始化3.2 设置显存地址3.3 往显存写入数据 四、使用spidev操作SPI_OLED模块4.1 编写设备树4.2 编译spidev.c4.3 编写APP4.3.1怎么…

文章目录

  • 参考资料:
  • 一、硬件
    • 1.1 原理图
    • 1.2 扩展板连接图
  • 二、 OLED显示原理
    • 2.1 显存和像素
    • 2.2 显存寻址模式
  • 三、OLED显示操作过程
    • 3.1 初始化
    • 3.2 设置显存地址
    • 3.3 往显存写入数据
  • 四、使用spidev操作SPI_OLED模块
    • 4.1 编写设备树
    • 4.2 编译spidev.c
    • 4.3 编写APP
      • 4.3.1怎么控制CD引脚
      • 4.3.2基于spidev编写APP
  • 五、上机实验
    • 5.1 修改,编译,替换设备树。
    • 5.2 编译spidev.c
    • 5.3 编译APP
    • 5.4 执行测试程序


参考资料:

参考资料:

  • 内核驱动:drivers\spi\spidev.c
  • 内核提供的测试程序:tools\spi\spidev_fdx.c
  • 内核文档:Documentation\spi\spidev
  • OLEDC芯片手册:SPEC UG-2864TMBEG01 .pdfSSD1306-Revision 1.1 (Charge Pump).pdf

一、硬件

1.1 原理图

在这里插入图片描述

1.2 扩展板连接图

在这里插入图片描述

二、 OLED显示原理

原理图简化如下:
在这里插入图片描述
要操作OLED,只需使用SPI接口发送数据,并不需要使用SPI接口读取数据。除此之外,还需要控制D/C引脚:

  • 当DC引脚是低电平时,是命令:比如复位、打开显示、设置地址
  • 当DC引脚是高电平时,是数据:写入要显示的数据

2.1 显存和像素

OLED上有128*64个像素,每个像素只有2种状态:亮、灭
在这里插入图片描述
怎么控制屏幕上每个像素的状态?OLED内部有显存GDDRAM(Graphic Display Data RAM):
在这里插入图片描述
显存中,每位对应一个像素,如下图所示:
在这里插入图片描述

  • byte0的8位数据对应屏幕上角左侧、竖向排列的8个像素,即COL0的像素,bit0对应第0行,bit1对应第1行,……
  • byte0对应COL1那列第0~第7行的8个像素
  • ……
  • byte127对应COL127那列第0~第7行的8个像素
  • byte128对应COL0那列第0~第7行的8个像素(页地址模式 )

2.2 显存寻址模式

显存被分为8页、127列,要写某个字节时,需要先指定地址(哪个page,哪个col),然后写入1字节的数据。

OLED有三种寻址模式:

(1)页地址模式(Page addressing mode):每写入1个字节,行地址不变,列地址增1,列地址达到127后会从0开始。
在这里插入图片描述
(2)水平地址模式(Horizontal addressing mode)

  • 每写入1个字节,行地址不变,列地址增1
  • 列地址达到127后从0开始,行地址指向下一页
  • 列地址达到127、行地址达到7时,列地址和行地址都被复位为0,指向左上角

在这里插入图片描述
(3)垂直地址模式(Vertical addressing mode):

  • 每写入1个字节,行地址增1,列地址不变
  • 行地址达到7后从0开始,列地址指向下一列
  • 列地址达到127、行地址达到7时,列地址和行地址都被复位为0,指向左上角

在这里插入图片描述

三、OLED显示操作过程

想让OLED显示内容,首先需要初始化OLED模块,接着设置现存地址,最后往现存写入数据。

3.1 初始化

对于OLED的初始化,在参考手册SPEC UG-2864TMBEG01 .pdf中列出的流程图:
在这里插入图片描述

3.2 设置显存地址

分为下面3步:

  • 设置地址模式
  • 设置page
  • 设置col

以页地址模式为例:

  • 设置地址模式:DC引脚保持低电平,表示写命令,先写命令0x20,告诉芯片开始设置地址模式,再写命令0x02,表示页地址模式。页地址模式是默认的,可以不设置。
    在这里插入图片描述
  • 设置页地址:有0~7页,想设置哪一页(n)就发出命令:0xB0 | n ,(B0-B7表示0-7页)
    在这里插入图片描述
    设置列地址:列地址范围是0~127,需要使用2个命令来设置列地址。
    在这里插入图片描述

3.3 往显存写入数据

让DC引脚为高,发起SPI写操作即可。

四、使用spidev操作SPI_OLED模块

要做的事情:

  • 编写设备树
  • 编译spidev.c
  • 编写APP
    在这里插入图片描述

4.1 编写设备树

DC引脚使用GPIO4_20,不过只需要在APP里直接控制DC引脚,无需在设备树里指定。

修改设备树文件\arch\arm\boot\dts\100ask_imx6ull-14x14.dts

&ecspi1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_ecspi1>;fsl,spi-num-chipselects = <2>;cs-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>, <&gpio4 24 GPIO_ACTIVE_LOW>;status = "okay";oled: oled {compatible = "spidev";reg = <0>;spi-max-frequency = <10000000>; //最大时钟,查看芯片手册计算};
};

4.2 编译spidev.c

内核把SPI_SPIDEV选择上。
在这里插入图片描述

4.3 编写APP

4.3.1怎么控制CD引脚

查看原理图,确认引脚,然后参考如下文档即可使用APP操作GPIO,假设引脚号码为100,C语言代码如下:

system("echo 100  > /sys/class/gpio/export"); //导出引脚
system("echo out > /sys/class/gpio/gpio100/direction"); //设置方向
system("echo 1 > /sys/class/gpio/gpio100/value"); //拉高
system("echo 0 > /sys/class/gpio/gpio100/value"); //拉低
system("echo 100 > /sys/class/gpio/unexport"); //去除引脚

4.3.2基于spidev编写APP

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>#include <linux/types.h>
#include <linux/spi/spidev.h>#include "font.h"static int g_fd_spidev;
static int g_dc_pin_num;void OLED_DIsp_Set_Pos(int x, int y);void dc_pin_init(int number)
{// echo 509 > /sys/class/gpio/export// echo out > /sys/class/gpio/gpio509/direction	char cmd[100];g_dc_pin_num = number;sprintf(cmd, "echo %d > /sys/class/gpio/export", number);system(cmd);sprintf(cmd, "echo out > /sys/class/gpio/gpio%d/direction", number);system(cmd);	
}void oled_set_dc_pin(int val)
{/* echo 1 > /sys/class/gpio/gpio509/value* echo 0 > /sys/class/gpio/gpio509/value*/char cmd[100];sprintf(cmd, "echo %d > /sys/class/gpio/gpio%d/value", val, g_dc_pin_num);system(cmd);	
}/* spi写接口 */
void spi_write_datas(const unsigned char *buf, int len)
{write(g_fd_spidev, buf, len);
}/* oled写数据 */
void oled_write_datas(const unsigned char *buf, int len)
{oled_set_dc_pin(1);//拉高,表示写入数据spi_write_datas(buf, len);
}/* oled写命令 */
void oled_write_cmd(unsigned char uc_data)
{oled_set_dc_pin(0);//拉低,表示写入数据spi_write_datas(&uc_data, 1);//写入
}/* oled初始化 */
int oled_init(void)
{unsigned char uc_dev_id = 0;oled_write_cmd(0xae);//关闭显示oled_write_cmd(0x00);//设置 lower column addressoled_write_cmd(0x10);//设置 higher column addressoled_write_cmd(0x40);//设置 display start lineoled_write_cmd(0xB0);//设置page addressoled_write_cmd(0x81);// contract controloled_write_cmd(0x66);//128oled_write_cmd(0xa1);//设置 segment remapoled_write_cmd(0xa6);//normal /reverseoled_write_cmd(0xa8);//multiple ratiooled_write_cmd(0x3f);//duty = 1/64oled_write_cmd(0xc8);//com scan directionoled_write_cmd(0xd3);//set displat offsetoled_write_cmd(0x00);//oled_write_cmd(0xd5);//set osc divisionoled_write_cmd(0x80);//oled_write_cmd(0xd9);//ser pre-charge periodoled_write_cmd(0x1f);//oled_write_cmd(0xda);//set com pinsoled_write_cmd(0x12);//oled_write_cmd(0xdb);//set vcomholed_write_cmd(0x30);//oled_write_cmd(0x8d);//set charge pump disable oled_write_cmd(0x14);//oled_write_cmd(0xaf);//set dispkay onreturn 0;
}		  			 		  						  					  				 	   		  	  	 	  /* oled全灭 */
void OLED_DIsp_Clear(void)  
{unsigned char x, y;char buf[128];memset(buf, 0, 128);for (y = 0; y < 8; y++){OLED_DIsp_Set_Pos(0, y);oled_write_datas(buf, 128);}
}/* oled全亮 */
void OLED_DIsp_All(void)  
{unsigned char x, y;char buf[128];memset(buf, 0xff, 128);for (y = 0; y < 8; y++){OLED_DIsp_Set_Pos(0, y);oled_write_datas(buf, 128);}
}/* 寻址,哪一页,哪一列 */
void OLED_DIsp_Set_Pos(int x, int y)
{ 	oled_write_cmd(0xb0 + y);  //页oled_write_cmd((x & 0x0f)); //列低四位oled_write_cmd(((x & 0xf0) >> 4) | 0x10); //列高四位
}   	      	   			 void OLED_DIsp_Char(int x, int y, unsigned char c)
{int i = 0;/* 得到字模 */const unsigned char *dots = oled_asc2_8x16[c - ' '];/* 发给OLED */OLED_DIsp_Set_Pos(x, y);/* 发出8字节数据 */oled_write_datas(&dots[0], 8);OLED_DIsp_Set_Pos(x, y+1);/* 发出8字节数据 */oled_write_datas(&dots[8], 8);
}/* 写字符串 */
void OLED_DIsp_String(int x, int y, char *str)
{unsigned char j=0;while (str[j]){		OLED_DIsp_Char(x, y, str[j]);//显示单个字符x += 8;if(x > 127){x = 0;y += 2;}//移动显示位置j++;}
}/* 中文字符 */
void OLED_DIsp_CHinese(unsigned char x,unsigned char y,unsigned char no)
{      			    unsigned char t;OLED_DIsp_Set_Pos(x, y);	for(t=0; t<16; t++){//显示上半截字符	oled_write_datas(&hz_1616[no][t*2], 1);}	OLED_DIsp_Set_Pos(x, y+1);	for(t=0; t<16; t++){//显示下半截字符oled_write_datas(&hz_1616[no][t*2+1], 1);}					
}void OLED_DIsp_Test(void)
{ 	int i;OLED_DIsp_String(0, 0, "wiki.100ask.net");OLED_DIsp_String(0, 2, "book.100ask.net");OLED_DIsp_String(0, 4, "bbs.100ask.net");for(i = 0; i < 3; i++){   //显示汉字 百问网OLED_DIsp_CHinese(32+i*16, 6, i);}
} /* spi_oled /dev/spidevB.D <DC_pin_number> */
int main(int argc, char **argv)
{int dc_pin;if (argc != 3){printf("Usage: %s <dev/spidevB.D> <DC_pin_number>\n", argv[0]);return -1;}g_fd_spidev = open(argv[1], O_RDWR);if (g_fd_spidev < 0) {printf("open %s err\n", argv[1]);return -1;}dc_pin = strtoul(argv[2], NULL, 0);//DC引脚初始化dc_pin_init(dc_pin);//OLED 初始化oled_init();//清屏OLED_DIsp_Clear();//显示OLED_DIsp_Test();close(g_fd_spidev);return 0;
}

五、上机实验

5.1 修改,编译,替换设备树。

  • 修改设备树arch/arm/boot/dts/100ask_imx6ull-14x14.dts
&ecspi1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_ecspi1>;fsl,spi-num-chipselects = <2>;cs-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>, <&gpio4 24 GPIO_ACTIVE_LOW>;status = "okay";oled: oled {compatible = "spidev";reg = <0>;spi-max-frequency = <10000000>; //最大时钟,查看芯片手册计算};
};
  • 编译设备树:
make dtbs
  • 替换设备树:
//挂载nfs
mount -t nfs -o nolock 192.168.124.22:/home/zpz/share/ /mnt
//拷贝设备树到开发板
cp /mnt/imx6ullsdk/repo/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dtb /boot/
  • 重启开发板

5.2 编译spidev.c

首先要确定内核中已经含有spidev。在内核目录下执行make menuconfig,查看是否有改驱动,如下图:

-> Device Drivers-> SPI support (SPI [=y]) < >   User mode SPI device driver support  

如果User mode SPI device driver support前面不是<Y><M>,可以输入M表示把它编译为模块。

  • 如果已经是<Y>,则不用再做其他事情。
  • 如果你设置为<M>,在内核目录下执行make modules,把生成的drivers/spi/spidev.ko,复制到开发板手动加载。

5.3 编译APP

arm-buildroot-linux-gnueabihf-gcc -o spi_oled spi_oled.c

可执行文件拷贝到开发板。

5.4 执行测试程序

./spi_oled /dev/spidev0.0 116
http://www.dtcms.com/wzjs/574677.html

相关文章:

  • 拍卖网站模版西安企业查询
  • 做盗版电影网站犯法不安徽网络技术服务推广
  • dedecms 网站地图生成网站开发弹窗制作
  • 天津外贸公司网站制作京挑客网站怎么做
  • 众筹网站开发分析报告wordpress 百度插件怎么用
  • 哪个网站可以做医学基础知识题南昌市房产网
  • 网站托管什么意思代理网络服务器
  • 免费网站建设免代码永州商城网站建设
  • 做网站需要执照吗建设工程施工合同样本
  • 做网站排名的公司WordPress 数据库 缓存
  • 浙江金顶建设公司网站一个专门做视频配音的网站
  • 阿里云虚拟主机怎么建立网站学seo如何入门
  • 网站托管哪家好个人网站学生作业
  • 聚通装潢官网电话搜索引擎内部优化
  • 网站怎么建设及推广wordpress安装方式
  • 第一章 网站建设基本概述谷歌外贸网站
  • 任丘做网站价格手机可以看的网站
  • 建材手机网站王也夫
  • 免费网页设计制作网站网站霸屏对网站好吗
  • 网站开发后端用什么技术公司线上推广怎么做
  • 网站的页面布局是什么企业搭建什么样的平台
  • 青海建设厅网站特种作业网站的策划方案怎么写
  • 网站开发与设计岗位网站开发的程序平台
  • 版权申请网站人社部门网站建设
  • 网站建设的想法和意见建设部执业注册中心网站
  • 网站建设微信文章网上比较好的装修设计平台
  • 甘肃省建设厅官网站网站cms在线识别
  • 拍拍网站开发天气预报网站怎么做
  • 上海建设银行网站查询余额同一个域名网站做301
  • 新乡专业的网站建设公司视频网站如何推广