【泰山派调试记录-i2c oled屏幕】

一、i2c屏幕型号

屏幕芯片的型号是ssd1306,屏幕尺寸是0.96寸,分辨率128*64,接口是i2c的,从设备地址0x78或0x7A,根据屏幕背面的电阻焊接来决定,我这块屏幕的从设备地址是0x78(这是个8bit的地址,转换成7bit地址是0x3C)

二、屏幕资料

屏幕厂商给的资料

三、屏幕与泰山派连接

参考ubuntu的i2c oled屏幕调试方式,文档地址
引脚连接参考图,虽然我这块屏幕是SD1306的,但是接线方式相同
在这里插入图片描述

四、上电

4.1、检测从设备地址

确认接线正确,可以检测到地址为0x3C的从设备
root@RK356X:/userdata# i2cdetect -y 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@RK356X:/userdata#

4.2、编写测试脚本

因为buildroot默认是没有gcc编译工具的,所以先使用i2c-tools来点亮屏幕
参考第二节的资料中的 V7.0_S11-IIC\V6.0_S11-IIC\例程\(02)STM32例程(STM32F103C8T6)\I2C_SSD1306_STM32(HW)\User\OLED_I2C.c来进行测试脚本编写
oled_test.sh脚本内容如下:
#! /bin/bash

log_debug(){
	# echo $1
	return
}

log_info(){
	echo $1
}

I2C_WriteByte(){
	log_debug "i2cset -y 2 0x3c $1 $2"
	i2cset -y 2 0x3c $1 $2 
	log_debug "ret = $?"
}

WriteCmd(){
	I2C_WriteByte 0x00 $1
}

WriteDat(){
	I2C_WriteByte 0x40 $1
}

OLED_Init(){
	log_info "OLED_Init start"
	WriteCmd  0xAE    # display off
	WriteCmd  0x20    # Set Memory Addressing Mode	
	WriteCmd  0x10    # 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode   RESET);11,Invalid
	WriteCmd  0xb0    # Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd  0xc8    # Set COM Output Scan Direction
	WriteCmd  0x00    # ---set low column address
	WriteCmd  0x10    # ---set high column address
	WriteCmd  0x40    # --set start line address
	WriteCmd  0x81    # --set contrast control register
	WriteCmd  0xff    # 亮度调节 0x00~0xff
	WriteCmd  0xa1    # --set segment re-map 0 to 127
	WriteCmd  0xa6    # --set normal display
	WriteCmd  0xa8    # --set multiplex ratio  1 to 64)
	WriteCmd  0x3F    # 
	WriteCmd  0xa4    # 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd  0xd3    # -set display offset
	WriteCmd  0x00    # -not offset
	WriteCmd  0xd5    # --set display clock divide ratio/oscillator frequency
	WriteCmd  0xf0    # --set divide ratio
	WriteCmd  0xd9    # --set pre-charge period
	WriteCmd  0x22    # 
	WriteCmd  0xda    # --set com pins hardware configuration
	WriteCmd  0x12    # 
	WriteCmd  0xdb    # --set vcomh
	WriteCmd  0x20    # 0x20,0.77xVcc
	WriteCmd  0x8d    # --set DC-DC enable
	WriteCmd  0x14    # 
	WriteCmd  0xaf    # --turn on oled panel
	log_info "OLED_Init end"
}

# 全屏填
OLED_Fill()
{
	for m in $(seq 0 7)
	do
		WriteCmd $((  0xb0+$m ))
		WriteCmd 0x00
		WriteCmd 0x10
		# 此处不知道什么原因,循环次数为127的时候屏幕右侧有一部分无法点亮
		# 所以循环次数修改为129次,之后在研究原因
		for n in $(seq 0 129) 
		do
			WriteDat $1
		done
	done
}

OLED_Init
OLED_Fill $1

4.3、运行脚本测试

  • 全部点亮,命令:bash oled_test.sh 0xff
root@RK356X:/userdata# 
root@RK356X:/userdata# bash oled_test.sh 0xff
OLED_Init start
OLED_Init end
root@RK356X:/userdata#

请添加图片描述

  • 全部关闭,命令:bash oled_test.sh 0x0
root@RK356X:/userdata# 
root@RK356X:/userdata# bash oled_test.sh 0x0 
OLED_Init start
OLED_Init end
root@RK356X:/userdata#

请添加图片描述

  • 条纹点亮,命令:bash oled_test.sh 0xf0
root@RK356X:/userdata# bash oled_test.sh 0xf0
OLED_Init start
OLED_Init end
root@RK356X:/userdata#

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值