一、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#