I2C总线是PHILIPS公司推出的一种在电子通信控制领域常用的串行通信总线,是一种简单、双向 通信、二线制、同步的串行总线,具有连接线少、控制简单、通信速率高等优点。
端口检测
cd /dev
ls
I2C读写操作
使用i2cdetect命令检测i2c总线
i2cdetect -l
如果红色部分出现unknown,则大概率为硬件问题,需要检查线路的连接
具体读写操作见附录
运行测试代码
- cplusplus/level1_single_api/5_200dk_peripheral/i2c · Ascend/samples - 码云 - 开源中国 (gitee.com)
配置环境
sudo vim /etc/rc.local#在exit0前增加如下指令后,重启运行环境。
echo 504 >/sys/class/gpio/export
echo 444 >/sys/class/gpio/export
chown -R HwHiAiUser /sys/class/gpio/gpio444
chown -R HwHiAiUser /sys/class/gpio/gpio504
chown -R HwHiAiUser /sys/class/gpio/gpio444/direction
chown -R HwHiAiUser /sys/class/gpio/gpio504/direction
chown -R HwHiAiUser /sys/class/gpio/gpio444/value
chown -R HwHiAiUser /sys/class/gpio/gpio504/value
chown -R HwHiAiUser /dev/i2c-1
chown -R HwHiAiUser /dev/i2c-2
chown -R HwHiAiUser /dev/ttyAMA0
chown -R HwHiAiUser /dev/ttyAMA1
usermod -aG HwHiAiUser HwHiAiUser#重启使用指令sudo reboot,直接拔插电源线容易损坏镜像!!!
cd $HOME/samples/cplusplus/level1_single_api/5_200dk_peripheral/i2c/out
./main
#观察现象(车轮转动,运行环境的命令行中打印出运行结果)
附录
用i2cdump查看器件所有寄存器的值
#查看i2c-1的0x20器件的所有寄存器值:
i2cdump -f -y 1 0x20
#i2c_num: I2C控制器编号
#device_addr: 外围设备地址
#reg_addr: 外围设备寄存器的地址
#value: 写外围设备寄存器操作的数据
用i2cset设置单个寄存器值
# i2cset -f -y <i2c_num> <device_addr> <reg_addr> <value>
#设置i2c-1上0x20器件的0x05寄存器值为0x01
i2cset -f -y 1 0x20 0x05 0x01
用i2cget读取单个寄存器值
#i2cset -f -y <i2c_num> <device_addr> <reg_addr>
i2cget -f -y 1 0x20 0x05
打开 I2C 总线对应的设备文件,获取文件描述符
fd = open("/dev/i2c-2", O_RDWR);
如果fd的返回值为-1,则代表有问题,可能解决步骤如下:
ls -l /dev/ttyAMA0
#如果该设备节点存在并且具有相应的权限,表示该串口设备已被占用。如果没有显示任何结果,表示该串口设备当前没有被占用。
#执行下面的命令查看是被哪个进程占用了
fuser /dev/ttyAMA0
#查看这个进程的信息
ps 1423
#执行以下命令以停止终端登录程序:
sudo systemctl stop serial-getty@ttyAMA0.service#执行以下命令以禁用终端登录程序的自动启动:
sudo systemctl disable serial-getty@ttyAMA0.service