使用 Shell 调试 I2C 设备
概述
板:hi3516ev200
oled:连接I2C2,Pin30(i2c2_scl),Pin31(i2c2_sda)
寄存器
Pin I2C2_SCL IO Config Register
地址0x112C003C,默认值0x1C00,当bit[3:0]为0x01时使用i2c功能。
Pin I2C2_SDA IO Config Register
地址0x112C0038,默认值0x1C00,当bit[3:0]为0x01时使用i2c功能。
功能配置
配置I2C2_SCL管脚
# devmem 0x112C003C
0x00001C00
# devmem 0x112C003C 32 0x1C01
配置I2C2_SDA管脚
# devmem 0x112C0038
0x00001C00
# devmem 0x112C0038 32 0x1C01
调试命令
检测系统上的i2c总线
# i2cdetect -l
i2c-1 i2c hibvt-i2c I2C adapter
i2c-2 i2c hibvt-i2c I2C adapter
i2c-0 i2c hibvt-i2c I2C adapter
检测i2c总线上挂载的器件
# i2cdetect -y -r 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: -- -- -- -- -- -- -- --
查看器件所有寄存器的值
# i2cdump -f -y 2 0x3c
设置器件寄存器值(设置i2c-2总线上0x3c器件的0x00寄存器值为0xAE)
# i2cset -f -y 2 0x3c 0x00 0xAE
OLED调试脚本
写命令与数据
Wc(){
i2cset -f -y 2 0x3c 0x00 $1
}
Wd(){
i2cset -f -y 2 0x3c 0x40 $1
}
设备初始化
oledInit(){
Wc 0xAE
Wc 0x20
Wc 0x10
Wc 0xb0
Wc 0xc8
Wc 0x00
Wc 0x10
Wc 0x40
Wc 0x81
Wc 0xff
Wc 0xa1
Wc 0xa6
Wc 0xa8
Wc 0x3f
Wc 0xa4
Wc 0xd3
Wc 0x00
Wc 0xd5
Wc 0xf0
Wc 0xd9
Wc 0x22
Wc 0xda
Wc 0x12
Wc 0xdb
Wc 0x20
Wc 0x8d
Wc 0x14
Wc 0xaf
}
设置坐标位置
oledSetPos(){
y=$1
x=$2
Wc $((0xb0 + $y))
Wc $(((($x & 0xf0) >> 4) | 0x10))
Wc $((($x & 0x0f) | 0x01))
}
清除屏幕
oledClear(){
for((i=1;i<=10;i++))
do
Wc $((0xb0 + $i))
Wc 0x00
Wc 0x10
for((n = 0; n < 128; n++))
do
Wd 0x00
done
done
}
显示字符
oledShow(){
Wd 0x00; Wd 0x3E; Wd 0x41; Wd 0x41; Wd 0x41; Wd 0x3E
Wd 0x00; Wd 0x7F; Wd 0x08; Wd 0x14; Wd 0x22; Wd 0x41
}
程序逻辑
oledInit
oledClear
oledSetPos 1 1
oledShow