I2C总线是PHILIPS公司推出的一种在电子通信控制领域常用的串行通信总线,是一种简单、双向 通信、二线制、同步的串行总线,具有连接线少、控制简单、通信速率高等优点。
端口检测
cd /dev
ls
I2C读写操作
使用i2cdetect命令检测i2c总线
i2cdetect -l
如果红色部分出现unknown,则大概率为硬件问题,需要检查线路的连接
具体读写操作见附录
运行测试代码
配置环境
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
#观察现象(车轮转动,运行环境的命令行中打印出运行结果)
附录1
用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 [email protected]
#执行以下命令以禁用终端登录程序的自动启动:
sudo systemctl disable [email protected]
附录2
小车轮子不转问题检测顺序
1、检测电池供驱动板的电压,要保证在10v以上的电压才能驱动电机。
2、检测驱动板上12伏的电池端输入以及驱动板上3.3V、5V电压输出是否正常。
3、通过上位机I2C发送数据给驱动板,观察是否出现发送失败(发送失败的可能有多种,我们遇
到的只有两种:一种是摄像头反接,导致3.3V与GND短接导致了发送失败;另一种是I2C的发送地
址错误,需要手动修改地址),如果没有出现发送错误的问题正常可以排除Atlas开发板的问题了。
4、在上位机给驱动板发送运动指令后,测量电机的两相电源输入电压,如果为0,则可粗定问题
在驱动板,反之,如果电压有几伏的电压,那么可以确定是电机损坏。
5、正常问题均会出现在电机或者驱动板上,如果这两个元件排除故障后,可以通过示波器接I2C
的SDA信号线,观察波形,如果没有波形则应该粗定问题出现在Atlas开发板,如果要确定问题所在,
还可以通过更换别人的开发板来尝试一下。到这里基本就完成了信号传输到驱动模块的所有问题检
测,基本上能定位所有的故障。